diff --git a/pyomo/contrib/doe/doe.py b/pyomo/contrib/doe/doe.py index 0330c38b973..12599de7c60 100644 --- a/pyomo/contrib/doe/doe.py +++ b/pyomo/contrib/doe/doe.py @@ -551,6 +551,9 @@ def _sequential_FIM(self, model=None): "Model from experiment did not solve appropriately. Make sure the model is well-posed." ) + # Reset value of parameter to default value before computing finite difference perturbation + param.set_value(model.unknown_parameters[param]) + # Extract the measurement values for the scenario and append measurement_vals.append( [pyo.value(k) for k, v in model.experiment_outputs.items()] @@ -2140,7 +2143,7 @@ def get_unknown_parameter_values(self, model=None): if not hasattr(model, "unknown_parameters"): if not hasattr(model, "scenario_blocks"): raise RuntimeError( - "Model provided does not have expected structure. Please make sure model is built properly before calling `get_experiment_input_values`" + "Model provided does not have expected structure. Please make sure model is built properly before calling `get_unknown_parameter_values`" ) theta_vals = [ @@ -2174,15 +2177,15 @@ def get_experiment_output_values(self, model=None): if not hasattr(model, "experiment_outputs"): if not hasattr(model, "scenario_blocks"): raise RuntimeError( - "Model provided does not have expected structure. Please make sure model is built properly before calling `get_experiment_input_values`" + "Model provided does not have expected structure. Please make sure model is built properly before calling `get_experiment_output_values`" ) y_hat_vals = [ pyo.value(k) - for k, v in model.scenario_blocks[0].measurement_error.items() + for k, v in model.scenario_blocks[0].experiment_outputs.items() ] else: - y_hat_vals = [pyo.value(k) for k, v in model.measurement_error.items()] + y_hat_vals = [pyo.value(k) for k, v in model.experiment_outputs.items()] return y_hat_vals @@ -2210,7 +2213,7 @@ def get_measurement_error_values(self, model=None): if not hasattr(model, "measurement_error"): if not hasattr(model, "scenario_blocks"): raise RuntimeError( - "Model provided does not have expected structure. Please make sure model is built properly before calling `get_experiment_input_values`" + "Model provided does not have expected structure. Please make sure model is built properly before calling `get_measurement_error_values`" ) sigma_vals = [ diff --git a/pyomo/contrib/doe/tests/test_doe_errors.py b/pyomo/contrib/doe/tests/test_doe_errors.py index af1e6e6cafd..611cc7c31e9 100644 --- a/pyomo/contrib/doe/tests/test_doe_errors.py +++ b/pyomo/contrib/doe/tests/test_doe_errors.py @@ -498,7 +498,7 @@ def test_reactor_check_get_exp_outputs_without_model(self): with self.assertRaisesRegex( RuntimeError, - "Model provided does not have expected structure. Please make sure model is built properly before calling `get_experiment_input_values`", + "Model provided does not have expected structure. Please make sure model is built properly before calling `get_experiment_output_values`", ): doe_obj.get_experiment_output_values() @@ -517,7 +517,7 @@ def test_reactor_check_get_unknown_params_without_model(self): with self.assertRaisesRegex( RuntimeError, - "Model provided does not have expected structure. Please make sure model is built properly before calling `get_experiment_input_values`", + "Model provided does not have expected structure. Please make sure model is built properly before calling `get_unknown_parameter_values`", ): doe_obj.get_unknown_parameter_values() @@ -536,7 +536,7 @@ def test_reactor_check_get_meas_error_without_model(self): with self.assertRaisesRegex( RuntimeError, - "Model provided does not have expected structure. Please make sure model is built properly before calling `get_experiment_input_values`", + "Model provided does not have expected structure. Please make sure model is built properly before calling `get_measurement_error_values`", ): doe_obj.get_measurement_error_values() diff --git a/pyomo/contrib/parmest/parmest.py b/pyomo/contrib/parmest/parmest.py index ea4a9e0e943..ea9dfc00640 100644 --- a/pyomo/contrib/parmest/parmest.py +++ b/pyomo/contrib/parmest/parmest.py @@ -309,7 +309,10 @@ def __init__( for experiment in self.exp_list: model = experiment.get_labeled_model() theta_names.extend([k.name for k, v in model.unknown_parameters.items()]) - self.estimator_theta_names = list(set(theta_names)) + # Utilize list(dict.fromkeys(theta_names)) to preserve parameter + # order compared with list(set(theta_names)), which had + # nondeterministic ordering of parameters + self.estimator_theta_names = list(dict.fromkeys(theta_names)) self._second_stage_cost_exp = "SecondStageCost" # boolean to indicate if model is initialized using a square solve