summaryrefslogtreecommitdiff
path: root/src/theory/arith/nl/cad/cdcac.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/theory/arith/nl/cad/cdcac.cpp')
-rw-r--r--src/theory/arith/nl/cad/cdcac.cpp46
1 files changed, 26 insertions, 20 deletions
diff --git a/src/theory/arith/nl/cad/cdcac.cpp b/src/theory/arith/nl/cad/cdcac.cpp
index 9c58a0007..0dcf7f7a7 100644
--- a/src/theory/arith/nl/cad/cdcac.cpp
+++ b/src/theory/arith/nl/cad/cdcac.cpp
@@ -344,15 +344,16 @@ CACInterval CDCAC::intervalFromCharacterization(
}
}
-std::vector<CACInterval> CDCAC::getUnsatCover(std::size_t cur_variable)
+std::vector<CACInterval> CDCAC::getUnsatCover(std::size_t curVariable,
+ bool returnFirstInterval)
{
Trace("cdcac") << "Looking for unsat cover for "
- << d_variableOrdering[cur_variable] << std::endl;
- std::vector<CACInterval> intervals = getUnsatIntervals(cur_variable);
+ << d_variableOrdering[curVariable] << std::endl;
+ std::vector<CACInterval> intervals = getUnsatIntervals(curVariable);
if (Trace.isOn("cdcac"))
{
- Trace("cdcac") << "Unsat intervals for " << d_variableOrdering[cur_variable]
+ Trace("cdcac") << "Unsat intervals for " << d_variableOrdering[curVariable]
<< ":" << std::endl;
for (const auto& i : intervals)
{
@@ -362,30 +363,30 @@ std::vector<CACInterval> CDCAC::getUnsatCover(std::size_t cur_variable)
}
poly::Value sample;
- while (sampleOutsideWithInitial(intervals, sample, cur_variable))
+ while (sampleOutsideWithInitial(intervals, sample, curVariable))
{
- if (!checkIntegrality(cur_variable, sample))
+ if (!checkIntegrality(curVariable, sample))
{
// the variable is integral, but the sample is not.
Trace("cdcac") << "Used " << sample << " for integer variable "
- << d_variableOrdering[cur_variable] << std::endl;
- auto new_interval = buildIntegralityInterval(cur_variable, sample);
- Trace("cdcac") << "Adding integrality interval "
- << new_interval.d_interval << std::endl;
- intervals.emplace_back(new_interval);
+ << d_variableOrdering[curVariable] << std::endl;
+ auto newInterval = buildIntegralityInterval(curVariable, sample);
+ Trace("cdcac") << "Adding integrality interval " << newInterval.d_interval
+ << std::endl;
+ intervals.emplace_back(newInterval);
cleanIntervals(intervals);
continue;
}
- d_assignment.set(d_variableOrdering[cur_variable], sample);
+ d_assignment.set(d_variableOrdering[curVariable], sample);
Trace("cdcac") << "Sample: " << d_assignment << std::endl;
- if (cur_variable == d_variableOrdering.size() - 1)
+ if (curVariable == d_variableOrdering.size() - 1)
{
// We have a full assignment. SAT!
Trace("cdcac") << "Found full assignment: " << d_assignment << std::endl;
return {};
}
// Recurse to next variable
- auto cov = getUnsatCover(cur_variable + 1);
+ auto cov = getUnsatCover(curVariable + 1);
if (cov.empty())
{
// Found SAT!
@@ -396,12 +397,17 @@ std::vector<CACInterval> CDCAC::getUnsatCover(std::size_t cur_variable)
auto characterization = constructCharacterization(cov);
Trace("cdcac") << "Characterization: " << characterization << std::endl;
- d_assignment.unset(d_variableOrdering[cur_variable]);
+ d_assignment.unset(d_variableOrdering[curVariable]);
+
+ auto newInterval =
+ intervalFromCharacterization(characterization, curVariable, sample);
+ newInterval.d_origins = collectConstraints(cov);
+ intervals.emplace_back(newInterval);
- auto new_interval =
- intervalFromCharacterization(characterization, cur_variable, sample);
- new_interval.d_origins = collectConstraints(cov);
- intervals.emplace_back(new_interval);
+ if (returnFirstInterval)
+ {
+ return intervals;
+ }
Trace("cdcac") << "Added " << intervals.back().d_interval << std::endl;
Trace("cdcac") << "\tlower: " << intervals.back().d_lowerPolys
@@ -421,7 +427,7 @@ std::vector<CACInterval> CDCAC::getUnsatCover(std::size_t cur_variable)
if (Trace.isOn("cdcac"))
{
Trace("cdcac") << "Returning intervals for "
- << d_variableOrdering[cur_variable] << ":" << std::endl;
+ << d_variableOrdering[curVariable] << ":" << std::endl;
for (const auto& i : intervals)
{
Trace("cdcac") << "-> " << i.d_interval << std::endl;
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback