diff --git a/examples/contrib/pyls_api.py b/examples/contrib/pyls_api.py index dfed2ed31b..f808ae9cb0 100644 --- a/examples/contrib/pyls_api.py +++ b/examples/contrib/pyls_api.py @@ -101,8 +101,9 @@ def Solve(type): print('Local Search with Filter') move_one_var = MoveOneVar(vars) sum_filter = SumFilter(vars) + filter_manager = pywrapcp.LocalSearchFilterManager([sum_filter]) ls_params = solver.LocalSearchPhaseParameters(sum_var, move_one_var, db, None, - [sum_filter]) + filter_manager) ls = solver.LocalSearchPhase(vars, db, ls_params) collector = solver.LastSolutionCollector() diff --git a/examples/cpp/dobble_ls.cc b/examples/cpp/dobble_ls.cc index e0e8eeabc3..59306934d7 100644 --- a/examples/cpp/dobble_ls.cc +++ b/examples/cpp/dobble_ls.cc @@ -723,6 +723,7 @@ void SolveDobble(int num_cards, int num_symbols, int num_symbols_per_card) { // Main decision builder that regroups the first solution decision // builder and the combination of local search operators and // filters. + LocalSearchFilterManager* filter_manager = solver.RevAlloc(new LocalSearchFilterManager(filters)); DecisionBuilder* const final_db = solver.MakeLocalSearchPhase( all_card_symbol_vars, build_db, solver.MakeLocalSearchPhaseParameters( @@ -731,7 +732,7 @@ void SolveDobble(int num_cards, int num_symbols, int num_symbols_per_card) { nullptr, // Limit the search for improving move, we will stop // the exploration of the local search at the first // improving solution (first accept). - filters)); + filter_manager)); std::vector monitors; // Optimize var search monitor. diff --git a/examples/dotnet/csls_api.cs b/examples/dotnet/csls_api.cs index 41e2a4bc58..8d9ac8ddf8 100644 --- a/examples/dotnet/csls_api.cs +++ b/examples/dotnet/csls_api.cs @@ -174,9 +174,10 @@ public class CsLsApi SumFilter filter = new SumFilter(vars); IntVarLocalSearchFilter[] filters = new IntVarLocalSearchFilter[] { filter }; + LocalSearchFilterManager filter_manager = new LocalSearchFilterManager(filters); LocalSearchPhaseParameters ls_params = solver.MakeLocalSearchPhaseParameters(sum_var, move_one_var, db, - null, filters); + null, filter_manager); DecisionBuilder ls = solver.MakeLocalSearchPhase(vars, db, ls_params); SolutionCollector collector = solver.MakeLastSolutionCollector(); collector.AddObjective(sum_var); diff --git a/examples/tests/TestConstraintSolver.java b/examples/tests/TestConstraintSolver.java index 305628f952..2ff9b3ee7e 100644 --- a/examples/tests/TestConstraintSolver.java +++ b/examples/tests/TestConstraintSolver.java @@ -20,6 +20,7 @@ import com.google.ortools.constraintsolver.IntVar; import com.google.ortools.constraintsolver.IntVarLocalSearchFilter; import com.google.ortools.constraintsolver.IntVarLocalSearchOperator; import com.google.ortools.constraintsolver.LocalSearchPhaseParameters; +import com.google.ortools.constraintsolver.LocalSearchFilterManager; import com.google.ortools.constraintsolver.OptimizeVar; import com.google.ortools.constraintsolver.SearchLog; import com.google.ortools.constraintsolver.SearchMonitor; @@ -173,8 +174,9 @@ public class TestConstraintSolver { SumFilter filter = new SumFilter(vars); IntVarLocalSearchFilter[] filters = new IntVarLocalSearchFilter[1]; filters[0] = filter; + LocalSearchFilterManager filter_manager = new LocalSearchFilterManager(filters); LocalSearchPhaseParameters lsParams = - solver.makeLocalSearchPhaseParameters(sumVar, moveOneVar, db, null, filters); + solver.makeLocalSearchPhaseParameters(sumVar, moveOneVar, db, null, filter_manager); DecisionBuilder ls = solver.makeLocalSearchPhase(vars, db, lsParams); SolutionCollector collector = solver.makeLastSolutionCollector(); collector.addObjective(sumVar); diff --git a/ortools/constraint_solver/csharp/constraint_solver.i b/ortools/constraint_solver/csharp/constraint_solver.i index 49f5e7ac35..4a7b0f9769 100644 --- a/ortools/constraint_solver/csharp/constraint_solver.i +++ b/ortools/constraint_solver/csharp/constraint_solver.i @@ -822,6 +822,13 @@ namespace operations_research { %unignore LocalSearchFilter::Synchronize; %unignore LocalSearchFilter::IsIncremental; +// LocalSearchFilterManager +%feature("director") LocalSearchFilterManager; +%unignore LocalSearchFilterManager; +// Methods: +%unignore LocalSearchFilterManager::Accept; +%unignore LocalSearchFilterManager::Synchronize; + // IntVarLocalSearchFilter %feature("director") IntVarLocalSearchFilter; %unignore IntVarLocalSearchFilter; diff --git a/ortools/constraint_solver/java/constraint_solver.i b/ortools/constraint_solver/java/constraint_solver.i index a6680d9935..44149566be 100644 --- a/ortools/constraint_solver/java/constraint_solver.i +++ b/ortools/constraint_solver/java/constraint_solver.i @@ -1423,6 +1423,12 @@ import java.util.function.LongToIntFunction; %rename (isIncremental) LocalSearchFilter::IsIncremental; %rename (synchronize) LocalSearchFilter::Synchronize; +// LocalSearchFilterManager +%feature("director") LocalSearchFilterManager; +%unignore LocalSearchFilterManager; +%rename (accept) LocalSearchFilterManager::Accept; +%rename (synchronize) LocalSearchFilterManager::Synchronize; + // IntVarLocalSearchFilter %feature("director") IntVarLocalSearchFilter; %unignore IntVarLocalSearchFilter; diff --git a/ortools/constraint_solver/python/constraint_solver.i b/ortools/constraint_solver/python/constraint_solver.i index e354a6fd2e..f38be733e0 100644 --- a/ortools/constraint_solver/python/constraint_solver.i +++ b/ortools/constraint_solver/python/constraint_solver.i @@ -114,6 +114,7 @@ PY_CONVERT_HELPER_PTR(IntervalVar); PY_CONVERT_HELPER_PTR(SequenceVar); PY_CONVERT_HELPER_PTR(LocalSearchOperator); PY_CONVERT_HELPER_PTR(LocalSearchFilter); +PY_CONVERT_HELPER_PTR(LocalSearchFilterManager); PY_CONVERT_HELPER_INTEXPR_OR_INTVAR(IntVar); PY_CONVERT_HELPER_INTEXPR_OR_INTVAR(IntExpr); @@ -128,6 +129,7 @@ PY_CONVERT(IntervalVar); PY_CONVERT(SequenceVar); PY_CONVERT(LocalSearchOperator); PY_CONVERT(LocalSearchFilter); +PY_CONVERT(LocalSearchFilterManager); // Support passing std::function as argument. // See ../utils/python/functions.i, from which this was copied and adapted. @@ -2053,6 +2055,12 @@ namespace operations_research { %unignore LocalSearchFilter::Synchronize; %unignore LocalSearchFilter::IsIncremental; +// LocalSearchFilterManager +%unignore LocalSearchFilterManager; +%unignore LocalSearchFilterManager::LocalSearchFilterManager; +%unignore LocalSearchFilterManager::~LocalSearchFilterManager; +%unignore LocalSearchFilterManager::Accept; +%unignore LocalSearchFilterManager::Synchronize; // IntVarLocalSearchFilter // Ignored: diff --git a/ortools/constraint_solver/samples/simple_ls_program.cc b/ortools/constraint_solver/samples/simple_ls_program.cc index a954f353e3..d1d5fb5483 100644 --- a/ortools/constraint_solver/samples/simple_ls_program.cc +++ b/ortools/constraint_solver/samples/simple_ls_program.cc @@ -180,10 +180,11 @@ void SolveProblem(SolveType solve_type) { MoveOneVar* const one_var_ls = s.RevAlloc(new MoveOneVar(vars)); std::vector filters; filters.push_back(s.RevAlloc(new SumFilter(vars))); + LocalSearchFilterManager* filter_manager = s.RevAlloc(new LocalSearchFilterManager(filters)); LocalSearchPhaseParameters* const ls_params = s.MakeLocalSearchPhaseParameters(sum_var, one_var_ls, db, - nullptr, filters); + nullptr, filter_manager); ls = s.MakeLocalSearchPhase(vars, db, ls_params); break; }