From 3b8acc086eedee6c52cd9200522aab84dd12f046 Mon Sep 17 00:00:00 2001 From: "lperron@google.com" Date: Mon, 27 Aug 2012 14:10:15 +0000 Subject: [PATCH] new api with decision builder on solver::accept() --- examples/tests/testcp.cs | 36 ++++++++++++++++++++++ src/constraint_solver/constraint_solver.cc | 11 ++++++- src/constraint_solver/constraint_solver.h | 3 ++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/examples/tests/testcp.cs b/examples/tests/testcp.cs index f6ea68d4b7..9b79c4d285 100644 --- a/examples/tests/testcp.cs +++ b/examples/tests/testcp.cs @@ -398,6 +398,42 @@ public class CsTestCpOperator Console.WriteLine(y.ToString()); } + static void TestScheduling() + { + Solver solver = new Solver("Scheduling"); + IntervalVar[] tasks = new IntervalVar[taskCount]; + List all_ends = new List(); + int i = 0; + foreach(Task t in myTaskList) + { + tasks[i] = solver.MakeFixedInterval(0, (long)t.Duration, t.Name); + if (t.Successors.Count <= 0) + all_ends.Add(tasks[i].EndExpr().Var()); + //solver.Add(solver.MakeGreaterOrEqual(tasks[i].StartExpr(), 1)); // { 1 } + i++; + } + + IntVar objective_var = solver.MakeMax(all_ends.ToArray()).Var(); + OptimizeVar objective_monitor = solver.MakeMinimize(objective_var, 1); + DecisionBuilder obj_phase = solver.MakePhase(objective_var, Solver.CHOOSE_FIRST_UNBOUND, Solver.ASSIGN_MIN_VALUE); + + const int kLogFrequency = 999999999; + SearchMonitor search_log = solver.MakeSearchLog(kLogFrequency, objective_monitor); + + SolutionCollector collector = solver.MakeLastSolutionCollector(); + collector.AddObjective(objective_var); + + if (solver.Solve(obj_phase, objective_monitor)) + { + Console.Out.WriteLine("Solution: "); + foreach(IntervalVar t in tasks) + Console.Out.WriteLine(t.ToString()); + }else + { + Console.Out.WriteLine("Can not find a solution"); + } + } + static void Main() { TestConstructors(); diff --git a/src/constraint_solver/constraint_solver.cc b/src/constraint_solver/constraint_solver.cc index 95a0f7cace..41c21efbd7 100644 --- a/src/constraint_solver/constraint_solver.cc +++ b/src/constraint_solver/constraint_solver.cc @@ -1702,11 +1702,17 @@ void Solver::AddCastConstraint(CastConstraint* const constraint, void Solver::Accept(ModelVisitor* const visitor) const { std::vector monitors; - Accept(visitor, monitors); + Accept(visitor, monitors, NULL); } void Solver::Accept(ModelVisitor* const visitor, const std::vector& monitors) const { + Accept(visitor, monitors, NULL); +} + +void Solver::Accept(ModelVisitor* const visitor, + const std::vector& monitors, + DecisionBuilder* const db) const { visitor->BeginVisitModel(name_); for (int index = 0; index < constraints_list_.size(); ++index) { Constraint* const constraint = constraints_list_[index]; @@ -1719,6 +1725,9 @@ void Solver::Accept(ModelVisitor* const visitor, monitors[i]->Accept(visitor); } } + if (db != NULL) { + db->Accept(visitor); + } visitor->EndVisitModel(name_); } diff --git a/src/constraint_solver/constraint_solver.h b/src/constraint_solver/constraint_solver.h index 6dd18871be..ab9db85516 100644 --- a/src/constraint_solver/constraint_solver.h +++ b/src/constraint_solver/constraint_solver.h @@ -2743,6 +2743,9 @@ class Solver { // Accepts the given model visitor. void Accept(ModelVisitor* const visitor, const std::vector& monitors) const; + void Accept(ModelVisitor* const visitor, + const std::vector& monitors, + DecisionBuilder* const db) const; Decision* balancing_decision() const { return balancing_decision_.get(); }