Skip to content

Commit 75e6479

Browse files
authored
Bugfix for optimal objective value (#364)
* set objectives.value to fStar * add test * Update testing_utils.py * addressed comment
1 parent f56e159 commit 75e6479

File tree

2 files changed

+14
-9
lines changed

2 files changed

+14
-9
lines changed

pyoptsparse/pyOpt_solution.py

+10-2
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def __init__(self, optProb, xStar, fStar, lambdaStar, optInform, info):
3434
in the Solution object.
3535
"""
3636

37-
Optimization.__init__(self, optProb.name, None)
37+
super().__init__(optProb.name, None)
3838

3939
# Copy over the variables, constraints, and objectives
4040
self.variables = copy.deepcopy(optProb.variables)
@@ -43,11 +43,19 @@ def __init__(self, optProb, xStar, fStar, lambdaStar, optInform, info):
4343
xopt = optProb._mapXtoOpt(optProb.processXtoVec(xStar))
4444
# Now set the x-values:
4545
i = 0
46-
for dvGroup in self.variables:
46+
for dvGroup in self.variables.keys():
4747
for var in self.variables[dvGroup]:
4848
var.value = xopt[i]
4949
i += 1
5050

51+
# Now set the f-values
52+
if isinstance(fStar, float) or len(fStar) == 1:
53+
self.objectives[list(self.objectives.keys())[0]].value = float(fStar)
54+
fStar = float(fStar)
55+
else:
56+
for f_name, f in self.objectives.items():
57+
f.value = fStar[f_name]
58+
5159
self.optTime = info["optTime"]
5260
self.userObjTime = info["userObjTime"]
5361
self.userSensTime = info["userSensTime"]

tests/testing_utils.py

+4-7
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from baseclasses.testing.assertions import assert_dict_allclose, assert_equal
77
import numpy as np
88
from numpy.testing import assert_allclose
9-
from pkg_resources import parse_version
109

1110
# First party modules
1211
from pyoptsparse import OPT, History
@@ -121,16 +120,14 @@ def assert_solution_allclose(self, sol, tol, partial_x=False):
121120
self.sol_index = 0
122121
# now we assert against the closest solution
123122
# objective
124-
# sol.fStar was broken for earlier versions of SNOPT
125-
if self.optName == "SNOPT" and parse_version(self.optVersion) < parse_version("7.7.7"):
126-
sol_objectives = np.array([sol.objectives[key].value for key in sol.objectives])
127-
else:
128-
sol_objectives = sol.fStar
129-
assert_allclose(sol_objectives, self.fStar[self.sol_index], atol=tol, rtol=tol)
123+
assert_allclose(sol.fStar, self.fStar[self.sol_index], atol=tol, rtol=tol)
124+
# make sure fStar and sol.objectives values match
125+
assert_allclose(sol.fStar, [obj.value for obj in sol.objectives.values()], rtol=1e-12)
130126
# x
131127
assert_dict_allclose(sol.xStar, self.xStar[self.sol_index], atol=tol, rtol=tol, partial=partial_x)
132128
dv = sol.getDVs()
133129
assert_dict_allclose(dv, self.xStar[self.sol_index], atol=tol, rtol=tol, partial=partial_x)
130+
assert_dict_allclose(sol.xStar, dv, rtol=1e-12)
134131
# lambda
135132
if (
136133
hasattr(self, "lambdaStar")

0 commit comments

Comments
 (0)