diff --git a/examples/python/pyls_api.py b/examples/python/pyls_api.py index 6659c75b70..240d6391a7 100644 --- a/examples/python/pyls_api.py +++ b/examples/python/pyls_api.py @@ -55,9 +55,23 @@ class SumFilter(pywrapcp.IntVarLocalSearchFilter): def OnSynchronize(self, delta): self.__sum = sum(self.Value(index) for index in range(self.Size())) - + def Accept(self, delta, _): - return True + solution_delta = delta.IntVarContainer() + solution_delta_size = solution_delta.Size() + for i in range(solution_delta_size): + if not solution_delta.Element(i).Activated(): + return True + + new_sum = self.__sum + for i in range(solution_delta_size): + element = solution_delta.Element(index) + touched_var = self.FindIndex(element.Var()) + old_value = self.Value(touched_var) + new_value = element.Value() + new_sum += new_value - old_value + + return new_sum < self.__sum def IsIncremental(self): return False @@ -85,7 +99,7 @@ def Solve(type): print 'Local Search with Filter' move_one_var = MoveOneVar(vars) sum_filter = SumFilter(vars) - ls_params = solver.LocalSearchPhaseParameters(move_one_var, db, None, + ls_params = solver.LocalSearchPhaseParameters(move_one_var, db, None, [sum_filter]) ls = solver.LocalSearchPhase(vars, db, ls_params) diff --git a/src/constraint_solver/python/constraint_solver.swig b/src/constraint_solver/python/constraint_solver.swig index 165b7b0be2..cfec165e66 100644 --- a/src/constraint_solver/python/constraint_solver.swig +++ b/src/constraint_solver/python/constraint_solver.swig @@ -156,6 +156,7 @@ static bool PyCallbackBool(PyObject* pyfunc) { %feature("nodirector") operations_research::SequenceVarLocalSearchOperator::Start; %feature("director") operations_research::IntVarLocalSearchFilter; %feature("nodirector") operations_research::IntVarLocalSearchFilter::Start; +%ignore operations_research::IntVarLocalSearchFilter::FindIndex; // We *do* need to use SWIGTYPE_... descriptor directly in embedded C++ code: // the recommended replacement $descriptor(...) is only available within @@ -1119,6 +1120,14 @@ static void SetPythonFlags(bool trace_propagation, return self->Size(); } } + +%extend IntVarLocalSearchFilter { + int FindIndex(IntVar* const var) { + index = -1; + self->FindIndex(var, &index); + return index; + } +} } // namespace operations_research // ############ BEGIN DUPLICATED CODE BLOCK ############