What: solve_discrete_riccati and solve_discrete_lyapunov fix MAXIMUM_PASSES = 64 as a
private constant and symmetric_eigendecomposition fixes max_sweeps = 60 as a local, so none of
the three can be tuned and none states its budget in its signature. An iterative API should take a
runtime budget with a documented default and a hard cap, which is what makes a worst-case execution
time computable for a caller running these at startup on a target. Take the
budget as an argument with the current values as the defaults, and report the passes taken on
success so a marginal design is distinguishable from a comfortable one.
Where: crates/multicalc/src/linear_algebra/riccati.rs, lyapunov.rs,
symmetric_eigendecomposition.rs.
How to test: cargo test -p multicalc; assert a problem needing more than a deliberately small
budget reports DidNotConverge, and that the default budget reproduces every existing result.
What:
solve_discrete_riccatiandsolve_discrete_lyapunovfixMAXIMUM_PASSES = 64as aprivate constant and
symmetric_eigendecompositionfixesmax_sweeps = 60as a local, so none ofthe three can be tuned and none states its budget in its signature. An iterative API should take a
runtime budget with a documented default and a hard cap, which is what makes a worst-case execution
time computable for a caller running these at startup on a target. Take the
budget as an argument with the current values as the defaults, and report the passes taken on
success so a marginal design is distinguishable from a comfortable one.
Where:
crates/multicalc/src/linear_algebra/riccati.rs,lyapunov.rs,symmetric_eigendecomposition.rs.How to test:
cargo test -p multicalc; assert a problem needing more than a deliberately smallbudget reports
DidNotConverge, and that the default budget reproduces every existing result.