support hinting literals in CP-SAT Python
This commit is contained in:
@@ -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."""
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user