Skip to content

Commit 69091fa

Browse files
committed
Corrected initialization when using only lower diagonal of FIM
1 parent f93501c commit 69091fa

File tree

1 file changed

+15
-1
lines changed

1 file changed

+15
-1
lines changed

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

+15-1
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,21 @@ def run_doe(self, model=None, results_file=None):
309309
(len(model.parameter_names), len(model.parameter_names))
310310
)
311311

312-
L_vals_sq = np.linalg.cholesky(fim_np)
312+
# Need to compute the full FIM before initializing the Cholesky factorization
313+
if self.only_compute_fim_lower:
314+
fim_np = fim_np + fim_np.T - np.diag(np.diag(fim_np))
315+
316+
# Check if the FIM is positive definite
317+
# If not, add jitter to the diagonal
318+
# to ensure positive definiteness
319+
min_eig = np.min(np.linalg.eigvals(fim_np))
320+
if min_eig < 1E-6:
321+
jitter = np.abs(min_eig) + 1e-6
322+
else:
323+
jitter = 0
324+
325+
# Add jitter to the diagonal to ensure positive definiteness
326+
L_vals_sq = np.linalg.cholesky(fim_np + jitter * np.eye(len(model.parameter_names)))
313327
for i, c in enumerate(model.parameter_names):
314328
for j, d in enumerate(model.parameter_names):
315329
model.L[c, d].value = L_vals_sq[i, j]

0 commit comments

Comments
 (0)