Skip to content

Commit

Permalink
Merge pull request #3084 from robfalck/i3081
Browse files Browse the repository at this point in the history
Fixed a bug where non-scalar scalers and adders caused exceptions due to any/all ambiguity in Driver.
  • Loading branch information
swryan committed Dec 4, 2023
2 parents 15b9bc9 + 918549e commit 2545bfe
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 2 deletions.
4 changes: 2 additions & 2 deletions openmdao/core/driver.py
Original file line number Diff line number Diff line change
Expand Up @@ -447,8 +447,8 @@ def _check_for_invalid_desvar_values(self):
val = np.array([_val]) if np.ndim(_val) == 0 else _val # Handle discrete desvars
idxs = meta['indices']() if meta['indices'] else None
flat_idxs = meta['flat_indices']
scaler = meta['scaler'] or 1.
adder = meta['adder'] or 0.
scaler = meta['scaler'] if meta['scaler'] is not None else 1.
adder = meta['adder'] if meta['adder'] is not None else 0.
lower = meta['lower'] / scaler - adder
upper = meta['upper'] / scaler - adder
flat_val = val.ravel()[idxs] if flat_idxs else val[idxs].ravel()
Expand Down
31 changes: 31 additions & 0 deletions openmdao/core/tests/test_driver.py
Original file line number Diff line number Diff line change
Expand Up @@ -1095,5 +1095,36 @@ def setup(self):
assert_near_equal(dvs['par_group.g0.dv.x'], 2)
assert_near_equal(dvs['par_group.g1.dv.x'], 2)

def test_scalar_scaler_and_adder(self):
# build the model
prob = om.Problem()
dvs = prob.model.add_subsystem('dv', om.IndepVarComp())
dvs.add_output("x_vec", [3.0, -4.0])
prob.model.add_subsystem('paraboloid', om.ExecComp('f = (x-3)**2 + x*y + (y+4)**2 - 3'))

# setup the optimization
prob.driver = om.ScipyOptimizeDriver()
prob.driver.options['optimizer'] = 'SLSQP'
prob.model.connect("dv.x_vec", 'paraboloid.x', src_indices=0)
prob.model.connect("dv.x_vec", 'paraboloid.y', src_indices=1)

# Passing scaler as a vector here causes the problem
prob.model.dv.add_design_var('x_vec', lower=-50, upper=50,
scaler=[0.5, 0.5], adder=[0.0, 0.0])
prob.model.add_objective('paraboloid.f')

prob.setup()

# run the optimization
prob.run_driver()

# location of the minimum
x_star = prob.get_val('paraboloid.x')
y_star = prob.get_val('paraboloid.y')

assert_near_equal(x_star, 6.6666, tolerance=1.0E-3)
assert_near_equal(y_star, -7.3333, tolerance=1.0E-3)


if __name__ == "__main__":
unittest.main()

0 comments on commit 2545bfe

Please sign in to comment.