support hinting literals in CP-SAT Python

This commit is contained in:
Laurent Perron
2024-10-07 15:54:04 +02:00
parent f89f6a750f
commit bb06fafe00
2 changed files with 28 additions and 3 deletions

View File

@@ -2939,10 +2939,20 @@ class CpModel:
"""
return swig_helper.CpSatHelper.write_model_to_file(self.__model, file)
def add_hint(self, var: IntVar, value: int) -> None:
@overload
def add_hint(self, var: IntVar, value: int) -> None: ...
@overload
def add_hint(self, literal: BoolVarT, value: bool) -> None: ...
def add_hint(self, var, value) -> None:
"""Adds 'var == value' as a hint to the solver."""
self.__model.solution_hint.vars.append(self.get_or_make_index(var))
self.__model.solution_hint.values.append(value)
if var.index >= 0:
self.__model.solution_hint.vars.append(self.get_or_make_index(var))
self.__model.solution_hint.values.append(int(value))
else:
self.__model.solution_hint.vars.append(self.negated(var.index))
self.__model.solution_hint.values.append(int(not value))
def clear_hints(self):
"""Removes any solution hint from the model."""

View File

@@ -1428,6 +1428,21 @@ class CpModelTest(absltest.TestCase):
self.assertEqual(2, solver.value(x))
self.assertEqual(4, solver.value(y))
def testSolutionHintingWithBooleans(self):
print("testSolutionHintingWithBooleans")
model = cp_model.CpModel()
x = model.new_bool_var("x")
y = model.new_bool_var("y")
model.add_linear_constraint(x + y, 1, 1)
model.add_hint(x, True)
model.add_hint(~y, True)
solver = cp_model.CpSolver()
solver.parameters.cp_model_presolve = False
status = solver.solve(model)
self.assertEqual(cp_model.OPTIMAL, status)
self.assertTrue(solver.boolean_value(x))
self.assertFalse(solver.boolean_value(y))
def testStats(self):
print("testStats")
model = cp_model.CpModel()