Skip to content

Commit e173cb5

Browse files
authored
Merge pull request #3723 from djlaky/parmest-doe-bugfixes
Pyomo.DoE - Measurement Error Convention Correction
2 parents 7134273 + f851727 commit e173cb5

File tree

4 files changed

+42
-43
lines changed

4 files changed

+42
-43
lines changed

pyomo/contrib/doe/doe.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -731,7 +731,7 @@ def _sequential_FIM(self, model=None):
731731
cov_y = np.zeros((len(model.measurement_error), len(model.measurement_error)))
732732
count = 0
733733
for k, v in model.measurement_error.items():
734-
cov_y[count, count] = 1 / v
734+
cov_y[count, count] = 1 / v**2
735735
count += 1
736736

737737
# Compute and record FIM
@@ -822,7 +822,7 @@ def _kaug_FIM(self, model=None):
822822
cov_y = np.zeros((len(model.measurement_error), len(model.measurement_error)))
823823
count = 0
824824
for k, v in model.measurement_error.items():
825-
cov_y[count, count] = 1 / v
825+
cov_y[count, count] = 1 / v**2
826826
count += 1
827827

828828
# TODO: need to add a covariance matrix for measurements (sigma inverse)
@@ -1055,6 +1055,7 @@ def fim_rule(m, p, q):
10551055
/ m.scenario_blocks[0].measurement_error[
10561056
pyo.ComponentUID(n).find_component_on(m.scenario_blocks[0])
10571057
]
1058+
** 2
10581059
* m.sensitivity_jacobian[n, p]
10591060
* m.sensitivity_jacobian[n, q]
10601061
for n in m.output_names
@@ -1779,7 +1780,7 @@ def compute_FIM_full_factorial(
17791780

17801781
FIM = self._computed_FIM
17811782

1782-
det_FIM, trace_FIM, E_vals, E_vecs, D_opt, A_opt, E_opt, ME_opt = (
1783+
(det_FIM, trace_FIM, E_vals, E_vecs, D_opt, A_opt, E_opt, ME_opt) = (
17831784
compute_FIM_metrics(FIM)
17841785
)
17851786

pyomo/contrib/doe/tests/test_doe_solve.py

Lines changed: 36 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,9 @@ def get_FIM_Q_L(doe_obj=None):
8383
for i in model.output_names
8484
for j in model.parameter_names
8585
]
86-
sigma_inv = [1 / v for k, v in model.scenario_blocks[0].measurement_error.items()]
86+
sigma_inv = [
87+
1 / v**2 for k, v in model.scenario_blocks[0].measurement_error.items()
88+
]
8789
param_vals = np.array(
8890
[[v for k, v in model.scenario_blocks[0].unknown_parameters.items()]]
8991
)
@@ -469,24 +471,24 @@ def test_reactor_grid_search_bad_model(self):
469471
class TestDoe(unittest.TestCase):
470472
def test_doe_full_factorial(self):
471473
log10_D_opt_expected = [
472-
3.7734377852467524,
473-
5.137792359070963,
474-
5.182167857710023,
475-
6.546522431509408,
474+
11.77343778527225,
475+
13.137792359064383,
476+
13.182167857699808,
477+
14.54652243150573,
476478
]
477479

478480
log10_A_opt_expected = [
479-
3.5935726800929695,
480-
3.6133186151486933,
481-
3.945755198204365,
482-
3.9655011332598367,
481+
5.59357268009304,
482+
5.613318615148643,
483+
5.945755198204368,
484+
5.965501133259909,
483485
]
484486

485487
log10_E_opt_expected = [
486-
-1.7201873126109162,
487-
-0.691340497355524,
488-
-1.3680047944877138,
489-
-0.3391579792516522,
488+
0.27981268741620413,
489+
1.3086595026369012,
490+
0.6319952055040333,
491+
1.6608420207466377,
490492
]
491493

492494
log10_ME_opt_expected = [
@@ -497,31 +499,31 @@ def test_doe_full_factorial(self):
497499
]
498500

499501
eigval_min_expected = [
500-
0.019046390638130666,
501-
0.20354456134677426,
502-
0.04285437893696232,
503-
0.45797526302234304,
502+
1.9046390638130666,
503+
20.354456134677426,
504+
4.285437893696232,
505+
45.797526302234304,
504506
]
505507

506508
eigval_max_expected = [
507-
3169.552855492114,
508-
3576.0292523637977,
509-
7131.493924857995,
510-
8046.0658178139165,
509+
316955.2855492114,
510+
357602.92523637977,
511+
713149.3924857995,
512+
804606.58178139165,
511513
]
512514

513515
det_FIM_expected = [
514-
5935.233170586055,
515-
137338.51875774842,
516-
152113.5345070818,
517-
3519836.021699428,
516+
593523317093.4525,
517+
13733851875566.766,
518+
15211353450350.424,
519+
351983602166961.56,
518520
]
519521

520522
trace_FIM_expected = [
521-
3922.5878617108597,
522-
4105.051549241871,
523-
8825.822688850109,
524-
9236.36598578955,
523+
392258.78617108597,
524+
410505.1549241871,
525+
882582.2688850109,
526+
923636.598578955,
525527
]
526528
ff = run_reactor_doe(
527529
n_points_for_design=2,
@@ -551,15 +553,11 @@ def test_doe_full_factorial(self):
551553
self.assertStructuredAlmostEqual(
552554
ff_results["eigval_min"], eigval_min_expected, abstol=1e-4
553555
)
554-
self.assertStructuredAlmostEqual(
555-
ff_results["eigval_max"], eigval_max_expected, abstol=1e-4
556-
)
557-
self.assertStructuredAlmostEqual(
558-
ff_results["det_FIM"], det_FIM_expected, abstol=1e-4
559-
)
560-
self.assertStructuredAlmostEqual(
561-
ff_results["trace_FIM"], trace_FIM_expected, abstol=1e-4
562-
)
556+
# abstol of 1e-4 removed for the following values as
557+
# their non-log values are large (e.g., >1e10)
558+
self.assertStructuredAlmostEqual(ff_results["eigval_max"], eigval_max_expected)
559+
self.assertStructuredAlmostEqual(ff_results["det_FIM"], det_FIM_expected)
560+
self.assertStructuredAlmostEqual(ff_results["trace_FIM"], trace_FIM_expected)
563561

564562

565563
if __name__ == "__main__":

pyomo/contrib/doe/tests/test_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def test_compute_FIM_metrics(self):
6868
# Create a sample Fisher Information Matrix (FIM)
6969
FIM = np.array([[10, 2], [2, 3]])
7070

71-
det_FIM, trace_FIM, E_vals, E_vecs, D_opt, A_opt, E_opt, ME_opt = (
71+
(det_FIM, trace_FIM, E_vals, E_vecs, D_opt, A_opt, E_opt, ME_opt) = (
7272
compute_FIM_metrics(FIM)
7373
)
7474

pyomo/contrib/doe/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ def get_FIM_metrics(FIM):
219219
log10(Modified E-optimality) metric
220220
"""
221221

222-
det_FIM, trace_FIM, E_vals, E_vecs, D_opt, A_opt, E_opt, ME_opt = (
222+
(det_FIM, trace_FIM, E_vals, E_vecs, D_opt, A_opt, E_opt, ME_opt) = (
223223
compute_FIM_metrics(FIM)
224224
)
225225

0 commit comments

Comments
 (0)