0

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

1 Answers1

1

I tried

if sol is not None:
    print("kpi1:",sol.model.kpi_value_by_name("my_kpi"))

    print("kpi2:",sol.kpi_value_by_name("my_kpi"))

and that gave

kpi1: 238.0
kpi2: 238.0
Alex Fleischer
  • 9,276
  • 2
  • 12
  • 15
  • 1
    ok, I just looked at the changelist on PyPI and it says: Fixed a bug in SolveSolution.kpi_value_by_name, and I am using '2.21.207', that's why – GuglielmoSanchini Nov 12 '21 at 16:02