Fix issues with tracing builds (#7809)
authorGereon Kremer <gkremer@stanford.edu>
Tue, 14 Dec 2021 20:40:06 +0000 (12:40 -0800)
committerGitHub <noreply@github.com>
Tue, 14 Dec 2021 20:40:06 +0000 (20:40 +0000)
This PR fixes two issues that were revealed when analyzing decreased performance on trace-enabled builds.
hasIntegerModel() turns out to be a rather expensive method and should thus not be called in a Trace output.
Furthermore, the implementation of Rational::isIntegral() was generally bad because it used getDenominator() (which returns a copy of the denominator as an Integer) instead of directly checking the underlying denominator with equality for zero.

src/theory/arith/theory_arith_private.cpp
src/util/rational_cln_imp.h
src/util/rational_gmp_imp.h

index bf8798485078c895aedcc408292c3114b1e8876a..9b4623d37f01cbdc6cf15b6ee761f6d25c6621ab 100644 (file)
@@ -1839,7 +1839,6 @@ bool TheoryArithPrivate::attemptSolveInteger(Theory::Effort effortLevel, bool em
     << " " << effortLevel
     << " " << d_lastContextIntegerAttempted
     << " " << level
-    << " " << hasIntegerModel()
     << endl;
 
   if(d_qflraStatus == Result::UNSAT){ return false; }
@@ -3372,8 +3371,7 @@ bool TheoryArithPrivate::postCheck(Theory::Effort effortLevel)
 
   Debug("arith") << "integer? "
        << " conf/split " << emmittedConflictOrSplit
-       << " fulleffort " << Theory::fullEffort(effortLevel)
-       << " hasintmodel " << hasIntegerModel() << endl;
+       << " fulleffort " << Theory::fullEffort(effortLevel) << endl;
 
   if(!emmittedConflictOrSplit && Theory::fullEffort(effortLevel) && !hasIntegerModel()){
     Node possibleConflict = Node::null();
index 017fc3cb4af160034659aa33e6462bba081e4a5d..8f8552e9cacb39a61b51063bcff3f3b2dd9b9eb9 100644 (file)
@@ -193,7 +193,7 @@ class CVC5_EXPORT Rational
     }
   }
 
-  bool isIntegral() const { return getDenominator() == 1; }
+  bool isIntegral() const { return cln::denominator(d_value) == 1; }
 
   Integer floor() const { return Integer(cln::floor1(d_value)); }
 
index b3c8765335904059af48ba0272ab05815513e5cd..de3fcd03de76487d435fcdb1447fe4f4a7fcdda1 100644 (file)
@@ -286,7 +286,7 @@ class CVC5_EXPORT Rational
     return (*this);
   }
 
-  bool isIntegral() const { return getDenominator() == 1; }
+  bool isIntegral() const { return mpz_cmp_ui(d_value.get_den_mpz_t(), 1) == 0; }
 
   /** Returns a string representing the rational in the given base. */
   std::string toString(int base = 10) const { return d_value.get_str(base); }