Skip to content

Commit

Permalink
fix finding optimal solution
Browse files Browse the repository at this point in the history
  • Loading branch information
Dimosts committed Sep 15, 2023
1 parent ecf379b commit 8d34f71
Showing 1 changed file with 11 additions and 9 deletions.
20 changes: 11 additions & 9 deletions cpmpy/solvers/choco.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import numpy as np
import time

import cpmpy
from ..transformations.normalize import toplevel_list
from .solver_interface import SolverInterface, SolverStatus, ExitStatus
from ..exceptions import NotSupportedError
Expand Down Expand Up @@ -116,41 +117,41 @@ def solve(self, time_limit=None, **kwargs):
self.chc_solver = self.chc_model.get_solver()
start = time.time()
if self.has_objective():
self.chc_status = self.chc_solver.find_optimal_solution(maximize=self.maximize_obj,
sol = self.chc_solver.find_optimal_solution(maximize=self.maximize_obj,
objective=self.solver_var(self.obj))
else:
self.chc_status = self.chc_solver.solve()
sol = self.chc_solver.find_solution()
end = time.time()

# new status, get runtime
self.cpm_status = SolverStatus(self.name)
self.cpm_status.runtime = end - start

# translate exit status
if self.chc_status:
if sol is not None:
if self.has_objective() and (time_limit is None or self.cpm_status.runtime < time_limit):
self.cpm_status.exitstatus = ExitStatus.OPTIMAL
else:
self.cpm_status.exitstatus = ExitStatus.FEASIBLE
elif not self.chc_status and time_limit is not None and self.cpm_status.runtime >= time_limit:
elif (sol is None) and time_limit is not None and self.cpm_status.runtime >= time_limit:
self.cpm_status.exitstatus = ExitStatus.UNKNOWN
else:
self.cpm_status.exitstatus = ExitStatus.UNSATISFIABLE
# can happen when timeout is reached...

# True/False depending on self.chc_status
has_sol = self.chc_status
has_sol = sol is not None

# translate solution values (of user specified variables only)
self.objective_value_ = None
if has_sol:
# fill in variable values
for cpm_var in self.user_vars:
cpm_var._value = self.solver_var(cpm_var).get_value()
cpm_var._value = sol.get_int_val(self.solver_var(cpm_var))

# translate objective
if self.has_objective():
self.objective_value_ = self.solver_var(self.obj).get_value()
self.objective_value_ = sol.get_int_val(self.solver_var(self.obj))

return has_sol

Expand Down Expand Up @@ -243,9 +244,10 @@ def objective(self, expr, minimize):
(flat_obj, flat_cons) = flatten_objective(expr)
self += flat_cons # add potentially created constraints
get_variables(flat_obj, collect=self.user_vars) # add objvars to vars
lb, ub= flat_obj.get_bounds()
obj = cpmpy.intvar(lb, ub)
obj_con = flat_obj == obj

obj = self.chc_model.intvar()
obj_con = expr == obj
# add constraint for objective variable
self += obj_con

Expand Down

0 comments on commit 8d34f71

Please sign in to comment.