mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Recommended polarity callback.
This commit is contained in:
parent
f132e10155
commit
690ddb54f1
@ -109,11 +109,11 @@ void BooleanLPSolver::declareVariable(string const& _name, SortPointer const& _s
|
||||
|
||||
pair<CheckResult, vector<string>> BooleanLPSolver::check(vector<Expression> const&)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
//#ifdef DEBUG
|
||||
cerr << "Solving boolean constraint system" << endl;
|
||||
cerr << toString() << endl;
|
||||
cerr << "--------------" << endl;
|
||||
#endif
|
||||
//#endif
|
||||
|
||||
if (state().infeasible)
|
||||
{
|
||||
@ -156,7 +156,15 @@ pair<CheckResult, vector<string>> BooleanLPSolver::check(vector<Expression> cons
|
||||
// Is it even a problem if the indices overlap?
|
||||
for (auto&& [name, index]: state().variables)
|
||||
if (state().isBooleanVariable.at(index) || isConditionalConstraint(index))
|
||||
resizeAndSet(booleanVariables, index, name);
|
||||
{
|
||||
string innerName = name;
|
||||
if (isConditionalConstraint(index))
|
||||
{
|
||||
innerName = toString(state().conditionalConstraints.at(index));
|
||||
cerr << " - set name to " << innerName << endl;
|
||||
}
|
||||
resizeAndSet(booleanVariables, index, innerName);
|
||||
}
|
||||
else
|
||||
lpSolver.setVariableName(index, name);
|
||||
|
||||
@ -224,6 +232,15 @@ pair<CheckResult, vector<string>> BooleanLPSolver::check(vector<Expression> cons
|
||||
#endif
|
||||
};
|
||||
|
||||
auto constraintIndication = [&](size_t _variable)
|
||||
{
|
||||
#if LPIncremental
|
||||
lpSolver.recommendedPolarity(_variable);
|
||||
#else
|
||||
return std::nullopt;
|
||||
#endif
|
||||
};
|
||||
|
||||
auto optionalModel = CDCL{move(booleanVariables), clauses, theorySolver, backtrackNotify}.solve();
|
||||
if (!optionalModel)
|
||||
{
|
||||
|
@ -33,10 +33,12 @@ CDCL::CDCL(
|
||||
vector<string> _variables,
|
||||
vector<Clause> const& _clauses,
|
||||
std::function<std::optional<Clause>(size_t, std::map<size_t, bool> const&)> _theorySolver,
|
||||
std::function<void(size_t)> _backtrackNotify
|
||||
std::function<void(size_t)> _backtrackNotify,
|
||||
std::function<std::optional<bool>(size_t)> _constraintIndication
|
||||
):
|
||||
m_theorySolver(_theorySolver),
|
||||
m_backtrackNotify(_backtrackNotify),
|
||||
m_constraintIndication(_constraintIndication),
|
||||
m_variables(move(_variables)),
|
||||
m_order(VarOrderLt(m_activity))
|
||||
{
|
||||
@ -114,16 +116,24 @@ bool CDCL::solve_loop(const uint32_t max_conflicts, CDCL::Model& model, int& sol
|
||||
{
|
||||
if (auto variable = nextDecisionVariable())
|
||||
{
|
||||
// cout << "c Level " << currentDecisionLevel() << " - ";
|
||||
// cout << ((m_assignments.size() * 100) / m_variables.size()) << "% of variables assigned." << endl;
|
||||
cerr << "c Level " << currentDecisionLevel() << " - ";
|
||||
cerr << ((m_assignments.size() * 100) / m_variables.size()) << "% of variables assigned." << endl;
|
||||
m_decisionPoints.emplace_back(m_assignmentTrail.size());
|
||||
// cout << "Deciding on " << m_variables.at(*variable) << " @" << currentDecisionLevel() << endl;
|
||||
cerr << "Deciding on " << m_variables.at(*variable) << " @" << currentDecisionLevel() << endl;
|
||||
|
||||
// Polarity caching below
|
||||
bool positive = false;
|
||||
auto const& found = m_assignments_cache.find(*variable);
|
||||
if (found != m_assignments_cache.end()) positive = found->second;
|
||||
enqueue(Literal{positive, *variable}, nullptr);
|
||||
optional<bool> guess;
|
||||
if (m_constraintIndication)
|
||||
guess = m_constraintIndication(*variable);
|
||||
|
||||
if (!guess)
|
||||
{
|
||||
// Polarity caching below
|
||||
bool positive = false;
|
||||
auto const& found = m_assignments_cache.find(*variable);
|
||||
if (found != m_assignments_cache.end()) positive = found->second;
|
||||
guess = positive;
|
||||
}
|
||||
enqueue(Literal{*guess, *variable}, nullptr);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -60,7 +60,8 @@ public:
|
||||
std::vector<std::string> _variables,
|
||||
std::vector<Clause> const& _clauses,
|
||||
std::function<std::optional<Clause>(size_t, std::map<size_t, bool> const&)> _theorySolver = {},
|
||||
std::function<void(size_t)> _backtrackNotify = {}
|
||||
std::function<void(size_t)> _backtrackNotify = {},
|
||||
std::function<std::optional<bool>(size_t)> _constraintIndication = {}
|
||||
);
|
||||
|
||||
std::optional<Model> solve();
|
||||
@ -105,6 +106,7 @@ private:
|
||||
/// or a conflict clause, i.e. a clauses that is false in the theory with the given assignments.
|
||||
std::function<std::optional<Clause>(size_t, std::map<size_t, bool>)> m_theorySolver;
|
||||
std::function<void(size_t)> m_backtrackNotify;
|
||||
std::function<std::optional<bool>(size_t)> m_constraintIndication;
|
||||
|
||||
std::vector<std::string> m_variables;
|
||||
/// includes the learnt clauses
|
||||
|
@ -263,7 +263,15 @@ void LPSolver::setVariableName(size_t, string)
|
||||
}
|
||||
#endif
|
||||
|
||||
optional<bool> LPSolver::recommendedPolarity(size_t _reason) const
|
||||
{
|
||||
if (!reasonToBounds.count(_reason))
|
||||
return {};
|
||||
return {};
|
||||
// TODO: We cannot actually have a negative polarity for a reason / constraint!
|
||||
// We can recommend not to activate it, though...
|
||||
|
||||
}
|
||||
|
||||
pair<LPResult, ReasonSet> LPSolver::check()
|
||||
{
|
||||
|
@ -167,6 +167,8 @@ public:
|
||||
|
||||
void setVariableName(size_t _variable, std::string _name);
|
||||
|
||||
std::optional<bool> recommendedPolarity(size_t _reason) const;
|
||||
|
||||
std::pair<LPResult, ReasonSet> check();
|
||||
|
||||
std::string toString() const;
|
||||
|
Loading…
Reference in New Issue
Block a user