I think I found a very little bug in https://ibmdecisionoptimization.github.io/docplex-doc/mp/_modules/docplex/mp/solution.html#SolveSolution.kpi_value_by_name
Minimal reproducible example:
from docplex.mp.model import Model
mdl = Model("test")
a = mdl.integer_var(lb=0, ub=mdl.infinity, name="a")
b = mdl.integer_var(lb=0, ub=mdl.infinity, name="b")
mdl.add_constraint(3*a + 2*b >= 100)
mdl.minimize(a + b)
mdl.add_kpi(7*a-2*b, "my_kpi")
sol = mdl.solve()
if sol is not None:
print(sol.model.kpi_value_by_name("my_kpi"))
print(sol.kpi_value_by_name("my_kpi"))
output:
238.0
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
/var/folders/d1/zqvc60g1013bbmyhtrn3q8ym0000gn/T/ipykernel_8220/3312768846.py in <module>
14 print(sol.model.kpi_value_by_name("my_kpi"))
15
---> 16 print(sol.kpi_value_by_name("my_kpi"))
~/.../venv/lib/python3.7/site-packages/docplex/mp/solution.py in kpi_value_by_name(self, name, match_case)
1195 '''
1196 kpi = self.model.kpi_by_name(name, try_match=True, match_case=match_case)
-> 1197 return kpi._raw_solution_value(self)
1198
1199 @classmethod
AttributeError: 'DecisionKPI' object has no attribute '_raw_solution_value'
The method on the model works, while the one on the object does NOT.
Either use kpi._get_solution_value(self)
or,
as done in docplex/mp/model.py
, use kpi.compute()
.
my_kpi_fromModel = sol.model.kpi_by_name("my_kpi")
print(my_kpi_fromModel.compute())
print(my_kpi_fromModel._get_solution_value())
output:
238.0
238.0