rename ExtraMonitors to AppendMonitors

This commit is contained in:
lperron@google.com
2011-06-29 09:46:25 +00:00
parent 94be993f2c
commit 054b7dc58b
4 changed files with 48 additions and 25 deletions

View File

@@ -1688,7 +1688,7 @@ void Solver::NewSearch(DecisionBuilder* const db,
search->push_monitor(monitors[i]);
}
std::vector<SearchMonitor*> extras;
db->ExtraMonitors(this, &extras);
db->AppendMonitors(this, &extras);
for (ConstIter<std::vector<SearchMonitor*> > it(extras); !it.at_end(); ++it) {
search->push_monitor(*it);
}
@@ -2140,7 +2140,7 @@ bool Solver::NestedSolve(DecisionBuilder* const db,
new_search.push_monitor(monitors[i]);
}
std::vector<SearchMonitor*> extras;
db->ExtraMonitors(this, &extras);
db->AppendMonitors(this, &extras);
for (ConstIter<std::vector<SearchMonitor*> > it(extras); !it.at_end(); ++it) {
new_search.push_monitor(*it);
}
@@ -2225,6 +2225,15 @@ void PropagationBaseObject::set_name(const string& name) {
solver_->SetName(this, name);
}
// ---------- Decision Builder ----------
string DecisionBuilder::DebugString() const {
return "DecisionBuilder";
}
void DecisionBuilder::AppendMonitors(Solver* const solver,
std::vector<SearchMonitor*>* const extras) {}
// ---------- Decision and DecisionVisitor ----------
void Decision::Accept(DecisionVisitor* const visitor) const {

View File

@@ -2452,9 +2452,15 @@ class DecisionBuilder : public BaseObject {
// returns NULL, this means that the decision builder has finished
// its work.
virtual Decision* Next(Solver* const s) = 0;
virtual string DebugString() const { return "DecisionBuilder"; }
virtual void ExtraMonitors(Solver* const solver,
std::vector<SearchMonitor*>* const extras) {}
virtual string DebugString() const;
#if !defined(SWIG)
// This method will be called at the start of the search. It asks
// the decision builder if it wants to append search monitors to the
// list of active monitors for this search. Please note there are no
// checks at this point for duplication.
virtual void AppendMonitors(Solver* const solver,
std::vector<SearchMonitor*>* const extras);
#endif
private:
DISALLOW_COPY_AND_ASSIGN(DecisionBuilder);

View File

@@ -554,6 +554,9 @@ const double ImpactRecorder::kInitFailureImpact = 2.0;
// Default phase decision builder.
class ImpactDecisionBuilder : public DecisionBuilder {
public:
static const int kUninitializedVarIndex = -1;
static const uint64 kUninitializedFailStamp = 0;
ImpactDecisionBuilder(Solver* const solver,
const IntVar* const* vars,
int size,
@@ -562,8 +565,8 @@ class ImpactDecisionBuilder : public DecisionBuilder {
size_(size),
parameters_(parameters),
init_done_(false),
fail_stamp_(0),
current_var_index_(-1),
fail_stamp_(kUninitializedFailStamp),
current_var_index_(kUninitializedVarIndex),
current_value_(0),
heuristic_limit_(NULL),
random_(parameters_.random_seed),
@@ -604,11 +607,12 @@ class ImpactDecisionBuilder : public DecisionBuilder {
}
}
if (current_var_index_ == -1 && fail_stamp_ != 0) {
if (current_var_index_ == kUninitializedVarIndex &&
fail_stamp_ != kUninitializedFailStamp) {
// After solution or after heuristics.
impact_recorder_.RecordLogSearchSpace();
} else {
if (fail_stamp_ != 0) {
if (fail_stamp_ != kUninitializedFailStamp) {
if (solver->fail_stamp() == fail_stamp_) {
impact_recorder_.UpdateAfterAssignment(current_var_index_,
current_value_);
@@ -622,10 +626,10 @@ class ImpactDecisionBuilder : public DecisionBuilder {
++heuristic_branch_count_;
if (heuristic_branch_count_ % parameters_.heuristic_period == 0) {
current_var_index_ = -1;
current_var_index_ = kUninitializedVarIndex;
return &runner_;
}
current_var_index_ = -1;
current_var_index_ = kUninitializedVarIndex;
current_value_ = 0;
if (FindVarValue(&current_var_index_, &current_value_)) {
return solver->MakeAssignVariableValue(vars_[current_var_index_],
@@ -635,8 +639,10 @@ class ImpactDecisionBuilder : public DecisionBuilder {
}
}
virtual void ExtraMonitors(Solver* const solver,
std::vector<SearchMonitor*>* const extras) {
virtual void AppendMonitors(Solver* const solver,
std::vector<SearchMonitor*>* const extras) {
CHECK_NOTNULL(solver);
CHECK_NOTNULL(extras);
extras->push_back(solver->RevAlloc(new Monitor(solver, this)));
}
@@ -650,6 +656,7 @@ class ImpactDecisionBuilder : public DecisionBuilder {
virtual ~Monitor() {}
virtual void RefuteDecision(Decision* const d) {
CHECK_NOTNULL(d);
Solver* const s = solver();
if (db_->CheckRestart(s)) {
RestartCurrentSearch();
@@ -689,18 +696,19 @@ class ImpactDecisionBuilder : public DecisionBuilder {
class RunHeuristic : public Decision {
public:
explicit RunHeuristic(
ResultCallback1<bool, Solver*>* call_heuristics)
: call_heuristics_(call_heuristics) {}
virtual ~RunHeuristic() {}
explicit RunHeuristic(ResultCallback1<bool, Solver*>* call_heuristics)
: call_heuristics_(call_heuristics) {
CHECK_NOTNULL(call_heuristics);
}
virtual ~RunHeuristic() {}
virtual void Apply(Solver* const solver) {
if (!call_heuristics_->Run(solver)) {
solver->Fail();
}
virtual void Apply(Solver* const solver) {
if (!call_heuristics_->Run(solver)) {
solver->Fail();
}
}
virtual void Refute(Solver* const solver) {}
virtual void Refute(Solver* const solver) {}
private:
scoped_ptr<ResultCallback1<bool, Solver*> > call_heuristics_;

View File

@@ -361,12 +361,12 @@ class ComposeDecisionBuilder : public DecisionBuilder {
virtual Decision* Next(Solver* const s);
virtual string DebugString() const;
void add(DecisionBuilder* const db);
virtual void ExtraMonitors(Solver* const solver,
std::vector<SearchMonitor*>* const monitors) {
virtual void AppendMonitors(Solver* const solver,
std::vector<SearchMonitor*>* const monitors) {
for (ConstIter<std::vector<DecisionBuilder*> > it(builders_);
!it.at_end();
++it) {
(*it)->ExtraMonitors(solver, monitors);
(*it)->AppendMonitors(solver, monitors);
}
}