Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
442 commits
Select commit Hold shift + click to select a range
7a0f623
Fixed issues with merging changes
sscini Feb 15, 2026
31a61e9
Merge branch 'Pyomo:main' into parmest_obj_regularization
sscini Feb 15, 2026
d44f13d
L2 regularization working
sscini Feb 17, 2026
906f280
Merge branch 'Pyomo:main' into parmest_obj_regularization
sscini Feb 17, 2026
fec94fd
Made the theta_ref a series.
sscini Feb 17, 2026
6ecb2a3
Updated doc strings.
sscini Feb 17, 2026
865e51e
Update parmest.py
sscini Feb 17, 2026
5ffa566
added helper comments.
sscini Feb 17, 2026
53ca679
Updated implementation to add vectorized L2 calc, and reviewer questions
sscini Feb 19, 2026
ab583bb
Adjusted logging, ran black
sscini Feb 19, 2026
ac96277
Changed value to avoid zero for L2 term
sscini Feb 19, 2026
08bce8f
Commented out or removed print statements
sscini Feb 19, 2026
26bc6b6
Merge branch 'Pyomo:main' into parmest_obj_regularization
sscini Feb 19, 2026
854366b
Merge branch 'Pyomo:main' into Q_opt-redesign
sscini Feb 19, 2026
c55143d
Added in files from main now, removed example
sscini Feb 19, 2026
8f3a902
Merge branch 'Pyomo:main' into multistart-in-parmest
sscini Feb 19, 2026
3c87d7a
Added old files in temporarily for reference
sscini Feb 19, 2026
4e09d33
Ran black
sscini Feb 19, 2026
4f94329
Merge branch 'Q_opt-redesign' into multistart-in-parmest
sscini Feb 19, 2026
12d0af1
Made quick working example, and small modification for multistart
sscini Feb 19, 2026
72204d9
Merge branch 'Pyomo:main' into Q_opt-redesign
sscini Feb 23, 2026
7aa3b17
Merge branch 'main' into parmest_obj_regularization
sscini Feb 23, 2026
0833295
Add `lhs` iniatialization method and test
smondal13 Feb 23, 2026
ca0a4dd
Add tests for optimize_experiments(). All tests passed
smondal13 Feb 23, 2026
02aa81a
Remove cherry-picked example artifacts from DOE test changes
smondal13 Feb 23, 2026
d1493a5
Add more tests for warnings, combinations
smondal13 Feb 23, 2026
802438b
Refactor result dict in `optimize_experiments()`
smondal13 Feb 23, 2026
5ae8280
Add test of opt values with hardcoded values
smondal13 Feb 23, 2026
0a1167d
Merge branch 'main' into multistart-in-parmest
sscini Feb 24, 2026
476bc09
Going through`optimize_experiments`
smondal13 Feb 25, 2026
fe6ef62
Add parallel algorithm for initialization
smondal13 Feb 25, 2026
3879b1c
Enhance LHS initialization with diagnostics and parallel processing i…
smondal13 Feb 25, 2026
73d9387
Enhance diagnostics and error handling in LHS initialization; add tes…
smondal13 Feb 25, 2026
2f1f5a1
Enhance error handling and diagnostics in optimize_experiments; add c…
smondal13 Feb 26, 2026
7913222
Improve optimize_experiments robustness and docs
smondal13 Feb 26, 2026
65cc0cc
Refine optimize_experiments validation and review tracking
smondal13 Feb 26, 2026
72dd1eb
Enhance DesignOfExperiments with parallel processing for LHS scoring …
smondal13 Feb 26, 2026
ce032b5
Refactor DesignOfExperiments for improved LHS sampling and error hand…
smondal13 Feb 27, 2026
845de61
Refactor DesignOfExperiments to improve Cholesky rule handling and en…
smondal13 Feb 27, 2026
05097d5
Enhance DesignOfExperiments with timeout handling for LHS FIM evaluat…
smondal13 Feb 27, 2026
ec60888
Chose to apply in compute_covariance
sscini Mar 2, 2026
9531d73
Update parmest.py
sscini Mar 2, 2026
bc79da5
Made weight default 1
sscini Mar 2, 2026
0456910
Ran black
sscini Mar 2, 2026
23eb2ea
Adjusted doc strings, ran black
sscini Mar 2, 2026
933da0f
Update regularization_example.py
sscini Mar 2, 2026
c386945
Clean up the branch by removing the `.md` scripts
smondal13 Mar 2, 2026
859e214
Add `_spec.md`
smondal13 Jan 14, 2026
6f401ad
Add `optimize_experiment()`
smondal13 Jan 14, 2026
ce305a6
Add `experiment_list` in the `__init__` and a `DeprecationWarning`if …
smondal13 Jan 14, 2026
72df8e1
Rename finite difference `scenario_blocks` to `fd_scenario_blocks` an…
smondal13 Jan 14, 2026
dd86620
Add new objective method for multiple experiment.
smondal13 Jan 14, 2026
bcc833a
Add complete `doe.py` for multi experiment without testing /example
smondal13 Jan 15, 2026
82a8aad
Solve the `optimize_experiments()` for both 1 and 2 experiment case u…
smondal13 Jan 15, 2026
336ea3a
Solve `doe/examples/rooney_biegler_multiexperiment.py` and `reactor_m…
smondal13 Jan 15, 2026
2fda230
Add plot and the grid best and optimal point points to the same point
smondal13 Jan 15, 2026
da15eef
Add minor changes
smondal13 Jan 17, 2026
d5a2411
Add trace objective
smondal13 Jan 29, 2026
bb65dcf
Resolve the test failing issue for `scenario_blocks` does not exist.
smondal13 Jan 29, 2026
40381f7
Correct docstring
smondal13 Jan 29, 2026
786d8dd
Add `trace` and `pseudo_trace` in the plotting function for multiexpe…
smondal13 Jan 29, 2026
5947553
A-optimality gives different results for rooney_biegler_multiexperime…
smondal13 Jan 29, 2026
2919813
Add new directory for multiexperiment protype examples
smondal13 Jan 29, 2026
f37bc1d
Solve the error FIM not positive definite when prior_FIM is passed
smondal13 Jan 30, 2026
3338e8b
Solve `rooney_biegler_multiexperiment.py`
smondal13 Jan 30, 2026
0b2e546
Add FIM prior in multiexperiment
smondal13 Feb 2, 2026
490f8fe
Add `multiexperiment_prototype.ipynb` that gives the same result from…
smondal13 Feb 2, 2026
a9287e2
When no prior was used, D-opt and trace FIM gave he same result, but …
smondal13 Feb 2, 2026
afa7090
Solve 2 experiment case with same result from both grid and optimization
smondal13 Feb 2, 2026
e1db056
Add `local_name` of sym_break_cons
smondal13 Feb 6, 2026
6a429d2
Add log10 codiition number
smondal13 Feb 13, 2026
995f137
Add `lhs` iniatialization method and test
smondal13 Feb 23, 2026
dbfc6ba
Add tests for optimize_experiments(). All tests passed
smondal13 Feb 23, 2026
a62a67b
Remove cherry-picked example artifacts from DOE test changes
smondal13 Feb 23, 2026
e17a896
Add more tests for warnings, combinations
smondal13 Feb 23, 2026
489be46
Refactor result dict in `optimize_experiments()`
smondal13 Feb 23, 2026
33b5e66
Add test of opt values with hardcoded values
smondal13 Feb 23, 2026
25752c0
Going through`optimize_experiments`
smondal13 Feb 25, 2026
5657dab
Add parallel algorithm for initialization
smondal13 Feb 25, 2026
60c4a96
Enhance LHS initialization with diagnostics and parallel processing i…
smondal13 Feb 25, 2026
e09d340
Enhance diagnostics and error handling in LHS initialization; add tes…
smondal13 Feb 25, 2026
b7111a3
Enhance error handling and diagnostics in optimize_experiments; add c…
smondal13 Feb 26, 2026
3df6c9a
Improve optimize_experiments robustness and docs
smondal13 Feb 26, 2026
0bfc396
Refine optimize_experiments validation and review tracking
smondal13 Feb 26, 2026
4e3b72d
Enhance DesignOfExperiments with parallel processing for LHS scoring …
smondal13 Feb 26, 2026
290747e
Refactor DesignOfExperiments for improved LHS sampling and error hand…
smondal13 Feb 27, 2026
c76632f
Refactor DesignOfExperiments to improve Cholesky rule handling and en…
smondal13 Feb 27, 2026
4041693
Enhance DesignOfExperiments with timeout handling for LHS FIM evaluat…
smondal13 Feb 27, 2026
6be8b2f
Clean up the branch by removing the `.md` scripts
smondal13 Mar 2, 2026
d6ee86b
Merge remote-tracking branch 'refs/remotes/origin/add-multiexperiment…
smondal13 Mar 2, 2026
77f6ff7
Refactor imports and clean up unused code in DoE modules and tests
smondal13 Mar 2, 2026
f542882
Refactor and enhance tests for optimize_experiments()
smondal13 Mar 2, 2026
74eb4bc
Refactor LHS initialization parameters in DesignOfExperiments and rel…
smondal13 Mar 2, 2026
eabc592
Add test for optimize_experiments with multi-experiment trace option
smondal13 Mar 2, 2026
fe72c91
Cleaned up prototype scripts
smondal13 Mar 2, 2026
edaae02
Add tests for JSON encoder and optimize_experiments error handling in…
smondal13 Mar 2, 2026
0d236c4
Refine DOE optimize_experiments test coverage
smondal13 Mar 2, 2026
adf7de2
Add more tests. Remove symmetry breaking constraint suffix for multi-…
smondal13 Mar 3, 2026
b4a50e3
Refactor DOE tests and remove deprecated multi-experiment test file
smondal13 Mar 3, 2026
faa689c
Run black
smondal13 Mar 3, 2026
9ccfba4
Added theta generation and old multistart over
sscini Mar 3, 2026
78f65f3
Updated multistart example and code
sscini Mar 3, 2026
43a67ab
Added bounds to models, ran black
sscini Mar 3, 2026
eef390a
Update documentation and imports in DoE module for clarity and consis…
smondal13 Mar 3, 2026
280b01a
Run black
smondal13 Mar 3, 2026
c6be263
Refactor DesignOfExperiments to standardize initialization method nam…
smondal13 Mar 3, 2026
ed2cf54
Merge branch 'Pyomo:main' into Q_opt-redesign
sscini Mar 6, 2026
2b41ba5
Merge branch 'Pyomo:main' into multistart-in-parmest
sscini Mar 6, 2026
ec100ae
Merge branch 'Pyomo:main' into parmest_obj_regularization
sscini Mar 6, 2026
cc0513a
Updated interface, added block scenario tests.
sscini Mar 6, 2026
2e5ac42
Merge branch 'Q_opt-redesign' into multistart-in-parmest
sscini Mar 6, 2026
e20e457
Added validation for prior_FIM and fixed inconsistencies
sscini Mar 6, 2026
813a981
Adjusted implementation, added new tests in separate file
sscini Mar 6, 2026
96a4792
Initial implementation
sscini Mar 6, 2026
592d54c
Merge branch 'main' into add-multiexperiment
smondal13 Mar 6, 2026
850819c
Merge branch 'Pyomo:main' into parmest_obj_regularization
sscini Mar 6, 2026
44a0b83
Merge branch 'Pyomo:main' into multistart-in-parmest
sscini Mar 6, 2026
8b9db82
Merge branch 'Pyomo:main' into profile-likelihood
sscini Mar 6, 2026
9c0d0a3
Merge branch 'Pyomo:main' into Q_opt-redesign
sscini Mar 6, 2026
1f8f016
Fix multi-experiment compute_FIM aggregation
smondal13 Mar 8, 2026
ff5e465
Merge branch 'add-multiexperiment' of github.com:smondal13/pyomo into…
smondal13 Mar 8, 2026
f9c8e3a
Fixed issue with repeat thetas, ran black
sscini Mar 9, 2026
d6cfe37
Merge branch 'multistart-in-parmest' into profile-likelihood
sscini Mar 9, 2026
a025512
Applied changes based on changes to multistart
sscini Mar 9, 2026
967e790
Run black
smondal13 Mar 9, 2026
baadbf0
Added L1 reg support working prototype, black
sscini Mar 9, 2026
351920f
Fixed testing issue, and example issues
sscini Mar 9, 2026
8ee7b2b
Refactor `_enum_label` method placement and add review documentation …
smondal13 Mar 10, 2026
3c034b7
fix(doe): clarify lhs parallel fallback logs
smondal13 Mar 13, 2026
c4103d9
Remove the review file
smondal13 Mar 17, 2026
1518abe
Add comments to explain the test
smondal13 Mar 17, 2026
6444c54
Merge branch 'Pyomo:main' into profile-likelihood
sscini Mar 17, 2026
4df5b48
Merge branch 'main' into Q_opt-redesign
sscini Mar 17, 2026
a0decd0
Merge branch 'main' into parmest_obj_regularization
sscini Mar 17, 2026
e4fbf66
Refactor DesignOfExperiments to accept a single experiment or a list
smondal13 Mar 17, 2026
ee6e63f
- update init_method type hint in DesignOfExperiments constructor
smondal13 Mar 17, 2026
ebc7aa3
fix(doc): clarify design variables and FIM in multi-experiment docume…
smondal13 Mar 17, 2026
8f4732d
Rename documentation
smondal13 Mar 17, 2026
735762c
Merge branch 'main' into add-multiexperiment
smondal13 Mar 17, 2026
584091c
Rename
smondal13 Mar 17, 2026
3a52f2d
Merge branch 'add-multiexperiment' of github.com:smondal13/pyomo into…
smondal13 Mar 17, 2026
3678ecb
fix(doc): Test failure
smondal13 Mar 18, 2026
12a3c1b
Merge branch 'main' into multistart-in-parmest
sscini Mar 24, 2026
07c42e7
Merge branch 'main' into profile-likelihood
sscini Mar 24, 2026
4fc0336
Merge branch 'main' into Q_opt-redesign
sscini Mar 24, 2026
a7d1fb8
Merge branch 'main' into parmest_obj_regularization
sscini Mar 24, 2026
b372edd
Moved new tests into the main parmest testing file.
sscini Mar 24, 2026
41e8e98
Ran black
sscini Mar 24, 2026
9fe600f
Update test_parmest.py
sscini Mar 25, 2026
48ba6a6
Merge branch 'main' into Q_opt-redesign
sscini Mar 25, 2026
ba4091c
Merge branch 'Pyomo:main' into Q_opt-redesign
sscini Mar 27, 2026
eba10b3
Removed covariance functionality from theta_est, in progress
sscini Mar 27, 2026
c997944
Update simple_reaction_parmest_example.py
sscini Mar 27, 2026
d2b5d74
Update simple_reaction_parmest_example.py
sscini Mar 27, 2026
ae9808f
Update parameter_estimation_example.py
sscini Mar 27, 2026
9fa6528
Adjusted tests, ran black
sscini Mar 27, 2026
cb1ecea
Update test_parmest.py
sscini Mar 27, 2026
261a78f
Delete scenarios.csv
sscini Mar 27, 2026
990b812
feat(doe): add multiexp greybox support
smondal13 Mar 27, 2026
664d687
Merge branch 'Q_opt-redesign' into multistart-in-parmest
sscini Mar 27, 2026
ea876b1
Merge branch 'multistart-in-parmest' into profile-likelihood
sscini Mar 27, 2026
9786fc5
Merge branch 'Pyomo:main' into parmest_obj_regularization
sscini Mar 27, 2026
0266ca3
feat(tests): add tests for multi-experiment grey box optimization
smondal13 Mar 27, 2026
c1ca9c6
Merge branch 'Pyomo:main' into add-multiexperiment
smondal13 Mar 27, 2026
1e1c048
Merge branch 'Pyomo:main' into multiexp-greybox
smondal13 Mar 27, 2026
bc08c2a
feat(doe): enhance multi-experiment support and add synchronization f…
smondal13 Mar 27, 2026
35ee2f9
enforce consistency in unknown parameter values and order for multi-e…
smondal13 Mar 27, 2026
3e66a71
update error message for objective_option and improve test assertions
smondal13 Mar 27, 2026
6d46119
Added tests to correct files, ran black.
sscini Mar 29, 2026
293f9c6
Refactor greybox tests and optimize_experiments functionality
smondal13 Mar 30, 2026
b145e3c
refactor(tests): consolidate validation tests for optimize_experiment…
smondal13 Mar 30, 2026
f03a862
refactor(tests): streamline DoE test cases by removing redundant tests
smondal13 Mar 30, 2026
ecdde5a
test: add validation for non-greybox objectives in optimize_experiments
smondal13 Mar 30, 2026
4bb0a5a
refactor: update results structure to use param_scenarios and streaml…
smondal13 Mar 30, 2026
967d0fa
Run black
smondal13 Mar 30, 2026
a2d42dc
Merge pull request #2 from smondal13/multiexp-greybox
smondal13 Mar 30, 2026
f6ea71f
Rename rb_multi.py script and greybox tests documentation
smondal13 Mar 30, 2026
d927ed9
docs: update documentation to include GreyBox-based objectives and re…
smondal13 Mar 30, 2026
2b28bcb
fix: correct typos in error messages for rb_multi function
smondal13 Mar 30, 2026
74119bd
Merge branch 'profile-likelihood' into regularization-profilelikeliho…
sscini Mar 31, 2026
50cbc4a
Add symbolic gradient support to Pyomo.DoE
Apr 1, 2026
85116d5
Add symbolic DoE regression tests
Apr 1, 2026
12e5e95
Allow writeable in typos config
Apr 1, 2026
b35253a
Port polynomial and reactor symbolic tests
Apr 1, 2026
431b28e
Document symbolic gradient methods in DoE
Apr 1, 2026
f55a294
Refactor ExperimentGradients setup
Apr 1, 2026
ca66ac6
Add polynomial DoE regression coverage
Apr 1, 2026
8d8b8bd
Add broader gradient consistency tests
Apr 2, 2026
5c373fb
Add factorial results dataframe tests
Apr 2, 2026
103a121
Add reactor regression and CI fixes
Apr 2, 2026
76f53c4
Add plotting guard coverage tests
Apr 2, 2026
1c1c253
Update model in regularization core, reordered, ran black
sscini Apr 2, 2026
14bc329
Updated model structure, reordered, ran black
sscini Apr 2, 2026
3dca7d7
Merge branch 'main' into Q_opt-redesign
blnicho Apr 2, 2026
0f653a8
Refactor the result dict
smondal13 Apr 2, 2026
c85e4fb
Merge branch 'main' into add-multiexperiment
smondal13 Apr 2, 2026
f28d86d
Clarify cyipopt HSL skip reason
Apr 2, 2026
aeafe4d
Updated covariance.rst file
slilonfe5 Apr 3, 2026
f84786c
Merge branch 'Pyomo:main' into parmest_obj_regularization
sscini Apr 7, 2026
959d58e
Merge branch 'Pyomo:main' into Q_opt-redesign
sscini Apr 7, 2026
5530e9d
Merge branch 'Pyomo:main' into multistart-in-parmest
sscini Apr 7, 2026
aa6d670
Merge branch 'Pyomo:main' into regularization-profilelikelihood-combo
sscini Apr 7, 2026
74369fd
Added new files
slilonfe5 Apr 7, 2026
c3e5466
Merge branch 'main' into parmest-doe-doc-reorg
slilonfe5 Apr 7, 2026
1eb8c7f
Added and updated documentation files
slilonfe5 Apr 7, 2026
dbe9f2c
Added abstraction.rst and updated doe.rst
slilonfe5 Apr 7, 2026
b21c34d
Merge branch 'Pyomo:main' into Q_opt-redesign
sscini Apr 8, 2026
80552f2
Reuse polynomial example in DoE tests
Apr 9, 2026
d708d55
Drop unused data arg from polynomial example
Apr 9, 2026
f53fe17
Clarify symbolic sensitivity math comments
Apr 9, 2026
11d475e
Remove no-op polynomial finalization
Apr 9, 2026
e704f68
Simplify polynomial test imports
Apr 9, 2026
1b6c63a
Merge branch 'main' into Q_opt-redesign
sscini Apr 9, 2026
0d0a14f
Remove redundant polynomial FIM smoke test
Apr 10, 2026
401c03a
Strengthen polynomial DoE regression test
Apr 10, 2026
0dd08eb
Use symbolic path for dataframe tests
Apr 10, 2026
65571da
Align symbolic DoE test coverage
Apr 10, 2026
9eb4959
Guard DoE utils tests on ipopt
Apr 10, 2026
702dc89
Strengthen symbolic Jacobian tests
Apr 10, 2026
d652cea
Remove out-of-scope FIM metric test
Apr 10, 2026
b5ea7f1
Tighten Jacobian regression assertions
Apr 10, 2026
9a78180
Drop workflow changes from symbolic PR
Apr 10, 2026
c593f0b
Checkpoint reactor test conversions to RB/polynomial
Apr 11, 2026
36d5694
Checkpoint remaining reactor test cleanup
Apr 11, 2026
dae72f4
Replace remaining reactor DoE tests
Apr 11, 2026
0545dcf
Clarify GreyBox MA57 skip reason
Apr 11, 2026
270bf8c
Add symbolic DoE PR notes
Apr 11, 2026
33d0b98
Refactor Jacobian rule setup
Apr 11, 2026
4209df5
Tighten FD scenario validation
Apr 11, 2026
653e3be
Format DoE module with black
Apr 11, 2026
f768ea3
Merge branch 'main' into Q_opt-redesign
sscini Apr 13, 2026
5c856e2
Merge branch 'main' into add-multiexperiment
smondal13 Apr 14, 2026
8a95a60
Merge branch 'main' into add-multiexperiment
smondal13 Apr 14, 2026
867e642
Merge branch 'main' into Q_opt-redesign
sscini Apr 15, 2026
c83ea69
Merge branch 'main' into add-multiexperiment
smondal13 Apr 17, 2026
6d7eb7a
Merge branch 'main' into Q_opt-redesign
sscini Apr 21, 2026
a123706
Merge branch 'main' into parmest_obj_regularization
sscini Apr 21, 2026
0089ff1
Merge branch 'main' into add-multiexperiment
smondal13 Apr 22, 2026
a39d367
Merge branch 'main' into Q_opt-redesign
sscini Apr 22, 2026
98392ba
Merge branch 'Pyomo:main' into regularization-profilelikelihood-combo
sscini Apr 24, 2026
deb3c5a
Merge branch 'Pyomo:main' into Q_opt-redesign
sscini Apr 24, 2026
211f16c
Merge branch 'main' into add-multiexperiment
smondal13 Apr 24, 2026
24e086a
Merge branch 'Q_opt-redesign' into regularization-profilelikelihood-c…
sscini Apr 24, 2026
d45e04c
Merge branch 'multistart-in-parmest' into regularization-profilelikel…
sscini Apr 24, 2026
50de094
Merge pull request #2 from smondal13/add-multiexperiment
adowling2 Apr 24, 2026
b419cc0
Merge branch 'parmest_obj_regularization' into regularization-profile…
sscini Apr 24, 2026
61c4c26
Merge pull request #3 from slilonfe5/parmest-doe-doc-reorg
adowling2 Apr 24, 2026
cae4afb
Merge pull request #1 from sscini/regularization-profilelikelihood-combo
adowling2 Apr 24, 2026
e9e4f4e
Resolve DoE merge conflicts and restore fd_scenario_blocks architecture
Apr 24, 2026
0977386
Apply Black formatting to DoE files
Apr 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
202 changes: 202 additions & 0 deletions DOE_SYMBOLIC_PR_NOTES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@
# Symbolic DoE PR Notes

This note is intended to help reviewers understand the scope of the symbolic
Pyomo.DoE pull request, the mathematical background for the main changes, and
how those ideas map onto the implementation.

## Overview

This PR adds symbolic-gradient support to `pyomo.contrib.doe` on top of the
current DoE implementation while preserving the newer objective and GreyBox
structure already present on `main`.

At a high level, the PR:

- adds symbolic / `pynumero` gradient support alongside the existing
finite-difference workflow
- adds `ExperimentGradients` to organize the derivative information used by DoE
- keeps the newer DoE objective and GreyBox structure from current `main`
- adds a lightweight public `PolynomialExperiment` example for symbolic testing
- broadens test coverage for symbolic/automatic derivative consistency and DoE
regression behavior

The PR does **not** change the underlying Fisher information matrix mathematics.
The main change is how the derivative information needed for those calculations
can be assembled.

## Mathematical Background

For a model with outputs `y` and unknown parameters `theta`, DoE needs the
output sensitivity matrix

```math
Q = \frac{\partial y}{\partial \theta}
```

to build the Fisher information matrix

```math
\mathrm{FIM} = Q^T \Sigma^{-1} Q
```

where `Sigma` is the measurement-error covariance matrix.

For models defined implicitly by equations

```math
F(x, u, \theta) = 0
```

the state sensitivities follow from differentiating the implicit system:

```math
\frac{\partial F}{\partial x}\frac{\partial x}{\partial \theta}
+
\frac{\partial F}{\partial \theta}
= 0
```

so

```math
\frac{\partial x}{\partial \theta}
=
-\left(\frac{\partial F}{\partial x}\right)^{-1}
\frac{\partial F}{\partial \theta}
```

Those state sensitivities are then propagated to the experiment outputs to form
`Q`, and then to the FIM.

The symbolic path in this PR changes how those Jacobian terms are assembled; it
does not change the equations above.

## Implementation Mapping

### `gradient_method`

The symbolic behavior in this PR is selected through `gradient_method`.

- finite-difference setup still uses `fd_formula`
- symbolic / `pynumero` behavior is selected by `gradient_method`
- `fd_formula="central"` remains the shared setup convention in many tests even
when `gradient_method="pynumero"` is used

This means the symbolic path is not activated by changing the finite-difference
formula. Instead, the finite-difference configuration stays available while the
derivative backend is chosen independently.

### `ExperimentGradients`

`ExperimentGradients` is responsible for organizing the derivative information
used to build sensitivity matrices for DoE.

The important implementation detail in this PR is that the symbolic and
automatic derivative structures are prepared through a unified setup path. This
lets tests compare symbolic and automatic Jacobian entries directly while still
using the same overall experiment structure.

In other words, the PR moves the code toward:

- one shared setup path for Jacobian bookkeeping
- backend-specific derivative population within that structure

rather than maintaining more separate symbolic and automatic setup logic.

## Test Strategy

The test updates in this PR were aimed at checking both the mathematical path
and the practical DoE integration path.

### Polynomial

The polynomial example is the lightweight symbolic reference problem.

It is used for:

- exact gradient checks against hand-derived values
- symbolic vs automatic Jacobian consistency checks
- public example coverage
- generic 2D factorial / plotting coverage where a small two-design-variable
example is helpful

Because the polynomial example has one output and four parameters, some FIM
regression tests use an identity prior to avoid rank-deficient raw FIMs when the
test purpose is metric regression rather than singular-matrix behavior.

### Rooney-Biegler

Rooney-Biegler is used for most of the general-purpose solve and regression
coverage because it is lightweight and still exercises the full DoE flow.

It is used for:

- symbolic `run_doe()` regression tests
- symbolic objective-matrix consistency checks
- bad-model / error-path coverage
- perturbed-point Jacobian agreement checks in the non-reactor replacements
- GreyBox helper and solve-path coverage

Several Rooney-Biegler determinant tests use a prior FIM. This is not meant to
change the underlying mathematics; it is there to keep the determinant-based
solve path well-conditioned for the small Rooney-Biegler problem.

### GreyBox

The non-solve GreyBox helper tests now use the Rooney-Biegler path as well.

Those tests were updated to match a two-parameter FIM instead of the older
reactor-specific four-parameter setup. In particular:

- the test FIM used for GreyBox helper checks is now `2 x 2`
- the reduced-Hessian finite-difference helper was generalized to use the
current FIM dimension instead of assuming four parameters
- the build checks compare against the actual FIM carried by the GreyBox object
rather than a hard-coded reactor-specific reconstruction

The solve-path checks still use the `cyipopt` GreyBox route and therefore remain
subject to the MA57/HSL runtime availability for that path.

## Notes And Caveats

### Reactor initialization nuance

One important nuance that came up during review is that the reactor model
required more care for generalized symbolic/automatic correctness checks.

In particular:

- the raw reactor labeled model is not always the cleanest reduced test vehicle
for output-sensitivity checks
- some reactor-oriented checks were therefore replaced with lighter
Rooney-Biegler or polynomial coverage where the test purpose was generic

### MA57 / HSL on the GreyBox `cyipopt` path

The GreyBox `cyipopt` path is distinct from simply having a working standalone
IPOPT executable. In local debugging, the relevant failure mode was that
`cyipopt` could be present while the MA57/HSL runtime needed on that path was
not available. The test skip message and code comment call that out explicitly
so it is not confused with generic IPOPT availability.

## Validation Snapshot

The final focused DoE test bundle used during this review pass was:

```bash
python -m pytest -q \
pyomo/contrib/doe/tests/test_utils.py \
pyomo/contrib/doe/tests/test_doe_solve.py \
pyomo/contrib/doe/tests/test_doe_build.py \
pyomo/contrib/doe/tests/test_doe_errors.py \
pyomo/contrib/doe/tests/test_greybox.py
```

with local result:

```text
130 passed, 4 skipped, 5 warnings in 35.67s
```

The remaining warnings are the expected non-interactive matplotlib `Agg`
warnings from tests that call `draw_factorial_figure()`.
8 changes: 8 additions & 0 deletions doc/OnlineDocs/explanation/analysis/doe/abstraction.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
.. _abstractexp:

Experiment Abstraction
======================

.. note::

Detailed descriptions and example code for experiment abstraction in Pyomo.DoE will be added in a future update.
Loading
Loading