Skip to content

Commit 4a90ead

Browse files
authored
Merge pull request Pyomo#3512 from djlaky/parmest-doe-bugfixes
Bugfixes in ParmEst and DoE
2 parents 4da59c6 + 679f269 commit 4a90ead

File tree

3 files changed

+15
-9
lines changed

3 files changed

+15
-9
lines changed

Diff for: pyomo/contrib/doe/doe.py

+8-5
Original file line numberDiff line numberDiff line change
@@ -551,6 +551,9 @@ def _sequential_FIM(self, model=None):
551551
"Model from experiment did not solve appropriately. Make sure the model is well-posed."
552552
)
553553

554+
# Reset value of parameter to default value before computing finite difference perturbation
555+
param.set_value(model.unknown_parameters[param])
556+
554557
# Extract the measurement values for the scenario and append
555558
measurement_vals.append(
556559
[pyo.value(k) for k, v in model.experiment_outputs.items()]
@@ -2140,7 +2143,7 @@ def get_unknown_parameter_values(self, model=None):
21402143
if not hasattr(model, "unknown_parameters"):
21412144
if not hasattr(model, "scenario_blocks"):
21422145
raise RuntimeError(
2143-
"Model provided does not have expected structure. Please make sure model is built properly before calling `get_experiment_input_values`"
2146+
"Model provided does not have expected structure. Please make sure model is built properly before calling `get_unknown_parameter_values`"
21442147
)
21452148

21462149
theta_vals = [
@@ -2174,15 +2177,15 @@ def get_experiment_output_values(self, model=None):
21742177
if not hasattr(model, "experiment_outputs"):
21752178
if not hasattr(model, "scenario_blocks"):
21762179
raise RuntimeError(
2177-
"Model provided does not have expected structure. Please make sure model is built properly before calling `get_experiment_input_values`"
2180+
"Model provided does not have expected structure. Please make sure model is built properly before calling `get_experiment_output_values`"
21782181
)
21792182

21802183
y_hat_vals = [
21812184
pyo.value(k)
2182-
for k, v in model.scenario_blocks[0].measurement_error.items()
2185+
for k, v in model.scenario_blocks[0].experiment_outputs.items()
21832186
]
21842187
else:
2185-
y_hat_vals = [pyo.value(k) for k, v in model.measurement_error.items()]
2188+
y_hat_vals = [pyo.value(k) for k, v in model.experiment_outputs.items()]
21862189

21872190
return y_hat_vals
21882191

@@ -2210,7 +2213,7 @@ def get_measurement_error_values(self, model=None):
22102213
if not hasattr(model, "measurement_error"):
22112214
if not hasattr(model, "scenario_blocks"):
22122215
raise RuntimeError(
2213-
"Model provided does not have expected structure. Please make sure model is built properly before calling `get_experiment_input_values`"
2216+
"Model provided does not have expected structure. Please make sure model is built properly before calling `get_measurement_error_values`"
22142217
)
22152218

22162219
sigma_vals = [

Diff for: pyomo/contrib/doe/tests/test_doe_errors.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,7 @@ def test_reactor_check_get_exp_outputs_without_model(self):
498498

499499
with self.assertRaisesRegex(
500500
RuntimeError,
501-
"Model provided does not have expected structure. Please make sure model is built properly before calling `get_experiment_input_values`",
501+
"Model provided does not have expected structure. Please make sure model is built properly before calling `get_experiment_output_values`",
502502
):
503503
doe_obj.get_experiment_output_values()
504504

@@ -517,7 +517,7 @@ def test_reactor_check_get_unknown_params_without_model(self):
517517

518518
with self.assertRaisesRegex(
519519
RuntimeError,
520-
"Model provided does not have expected structure. Please make sure model is built properly before calling `get_experiment_input_values`",
520+
"Model provided does not have expected structure. Please make sure model is built properly before calling `get_unknown_parameter_values`",
521521
):
522522
doe_obj.get_unknown_parameter_values()
523523

@@ -536,7 +536,7 @@ def test_reactor_check_get_meas_error_without_model(self):
536536

537537
with self.assertRaisesRegex(
538538
RuntimeError,
539-
"Model provided does not have expected structure. Please make sure model is built properly before calling `get_experiment_input_values`",
539+
"Model provided does not have expected structure. Please make sure model is built properly before calling `get_measurement_error_values`",
540540
):
541541
doe_obj.get_measurement_error_values()
542542

Diff for: pyomo/contrib/parmest/parmest.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,10 @@ def __init__(
309309
for experiment in self.exp_list:
310310
model = experiment.get_labeled_model()
311311
theta_names.extend([k.name for k, v in model.unknown_parameters.items()])
312-
self.estimator_theta_names = list(set(theta_names))
312+
# Utilize list(dict.fromkeys(theta_names)) to preserve parameter
313+
# order compared with list(set(theta_names)), which had
314+
# nondeterministic ordering of parameters
315+
self.estimator_theta_names = list(dict.fromkeys(theta_names))
313316

314317
self._second_stage_cost_exp = "SecondStageCost"
315318
# boolean to indicate if model is initialized using a square solve

0 commit comments

Comments
 (0)