docs: flag soundness, alpha-drift, saturation-hybrid in file headers
Three caveats surfaced during walkthrough lived only in the conversation transcript before this commit. Now they live where future agents and future-me will actually see them: - reach_operation.m and reachability/README.md state prominently that the current reach tube is an over-approximation of the LINEAR model, not a sound tube for the nonlinear plant. Thesis-blocking for a real safety claim. Upgrade paths documented. - ctrl_heatup.m header and plant-model/CLAUDE.md note that the feedback-linearization u_ff assumes exact alpha_f, alpha_c. Real plants drift (burnup ~20%, boron ~10x, xenon). Robust treatment = parametric reach with alpha as an interval. - ctrl_heatup.m header and plant-model/CLAUDE.md note that sat() is formally a 3-mode piecewise-affine sub-system. Operation-mode LQR is dormant (trivially); heatup will need either a dormancy proof or explicit hybrid modeling. README.md top-level now has a run-commands table for the reach artifacts and a pointer to the soundness status. Hacker-Split: raise caveats from transcript to artifact so the work is actually reviewable by people who weren't in the room. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
cb69290714
commit
bc3a6028a9
21
README.md
21
README.md
@ -22,8 +22,10 @@ pwr-hybrid-3-demo/
|
|||||||
figures/ Shared figures for thesis + talks
|
figures/ Shared figures for thesis + talks
|
||||||
fret-pipeline/ FRET → ltlsynt → AIGER → state machine
|
fret-pipeline/ FRET → ltlsynt → AIGER → state machine
|
||||||
plant-model/ PWR point kinetics + thermal-hydraulics
|
plant-model/ PWR point kinetics + thermal-hydraulics
|
||||||
reachability/ Continuous-mode verification (TBD)
|
reachability/ Continuous-mode verification (linear-model tube + Lyapunov barrier attempt; see README)
|
||||||
|
julia-port/ Parallel plant-model port + ReachabilityAnalysis.jl scaffold
|
||||||
hardware/ Ovation HIL artifacts (TBD)
|
hardware/ Ovation HIL artifacts (TBD)
|
||||||
|
claude_memory/ Session notes by AI agents (distilled up into CLAUDE.md over time)
|
||||||
thesis/ [submodule] PhD proposal
|
thesis/ [submodule] PhD proposal
|
||||||
presentations/
|
presentations/
|
||||||
2026DICE/ [submodule] DICE 2026 abstract
|
2026DICE/ [submodule] DICE 2026 abstract
|
||||||
@ -48,12 +50,25 @@ python3 scripts/trace_aiger.py circuits/PWR_HYBRID_3_DRC.aag diagrams
|
|||||||
dot -Tpng diagrams/PWR_HYBRID_3_DRC_states.dot -o diagrams/PWR_HYBRID_3_DRC_states.png
|
dot -Tpng diagrams/PWR_HYBRID_3_DRC_states.dot -o diagrams/PWR_HYBRID_3_DRC_states.png
|
||||||
```
|
```
|
||||||
|
|
||||||
Run the plant model (MATLAB or GNU Octave in `plant-model/`):
|
Run the plant model (MATLAB in `plant-model/` — Octave compatibility not tested since the LQR pieces landed):
|
||||||
|
|
||||||
```matlab
|
```matlab
|
||||||
main
|
main % original single-scenario demo (null vs operation)
|
||||||
|
main_mode_sweep % all five DRC modes back-to-back, writes to ../docs/figures/
|
||||||
|
test_linearize % Jacobian sanity check, saves linearization for reach
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Run the reach artifacts (`reachability/`):
|
||||||
|
|
||||||
|
```matlab
|
||||||
|
reach_operation % linear reach tube for operation-mode LQR
|
||||||
|
barrier_lyapunov % Lyapunov-ellipsoid barrier cert attempt (sweeps weights)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Soundness note:** the current reach tube is the LINEAR model's tube;
|
||||||
|
it is not yet a sound over-approximation of the nonlinear plant. See
|
||||||
|
`reachability/README.md` § Soundness status.
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
- Python 3.10+
|
- Python 3.10+
|
||||||
|
|||||||
@ -110,6 +110,28 @@ tight *only* along T_c without blowing out the other directions.
|
|||||||
**Logical next step for a thesis-strength barrier: SOS polynomial
|
**Logical next step for a thesis-strength barrier: SOS polynomial
|
||||||
barriers or polytopic (halfspace-intersection) invariants.**
|
barriers or polytopic (halfspace-intersection) invariants.**
|
||||||
|
|
||||||
|
## Soundness, α-drift, saturation — the three "this isn't actually rigorous yet" flags
|
||||||
|
|
||||||
|
Dane caught these during walkthrough. All three now documented in the
|
||||||
|
relevant file headers so they don't live only in the transcript:
|
||||||
|
|
||||||
|
- **Soundness**: `reachability/reach_operation.m` and
|
||||||
|
`reachability/README.md` now prominently state the current reach
|
||||||
|
tube is over-approximation of the LINEAR model, not the nonlinear
|
||||||
|
plant. Upgrade paths: nonlinear reach (CORA/JuliaReach
|
||||||
|
nonlinearSys) or linear reach + Taylor-remainder inflation. Either
|
||||||
|
is thesis-blocking for a real safety claim.
|
||||||
|
- **α-drift**: `ctrl_heatup.m` header and `plant-model/CLAUDE.md` now
|
||||||
|
note that the feedback-linearization cancellation assumes exact
|
||||||
|
α_f, α_c. Real reactors have α drifting (burnup ~20%, boron ~10x,
|
||||||
|
xenon). Robust treatment = α as interval, parametric reach.
|
||||||
|
- **Saturation semantics**: `ctrl_heatup.m` header now notes the
|
||||||
|
sat() is piecewise affine and must be either proven dormant or
|
||||||
|
modeled as a hybrid sub-mode in reach. Operation-mode LQR is
|
||||||
|
dormant (trivially); heatup will need explicit treatment.
|
||||||
|
|
||||||
|
Documented in `README.md` top-level under the reach commands too.
|
||||||
|
|
||||||
## Loose ends for the next session
|
## Loose ends for the next session
|
||||||
|
|
||||||
- Julia reach needs state rescaling. `S = diag(...)` chosen so all
|
- Julia reach needs state rescaling. `S = diag(...)` chosen so all
|
||||||
|
|||||||
@ -172,3 +172,25 @@ running example.
|
|||||||
power-spike overshoot in the simulation. Physical resolution: the
|
power-spike overshoot in the simulation. Physical resolution: the
|
||||||
reactor should be taken critical in shutdown mode (at ~0.1% power)
|
reactor should be taken critical in shutdown mode (at ~0.1% power)
|
||||||
before DRC transitions to heatup. `main_mode_sweep.m` uses this IC.
|
before DRC transitions to heatup. `main_mode_sweep.m` uses this IC.
|
||||||
|
|
||||||
|
## Robustness caveats (idealized in current artifacts)
|
||||||
|
|
||||||
|
- **α_f, α_c are treated as known exactly.** In reality α_f drifts
|
||||||
|
~20% over burnup; α_c spans ~10x across soluble-boron dilution over
|
||||||
|
a cycle; xenon adds 2-3 $ reactivity on its own timescale. The
|
||||||
|
feedback-linearization in `ctrl_heatup.m` assumes the controller's
|
||||||
|
α matches the plant's; if not, the clean `rho_total = Kp*e`
|
||||||
|
property degrades to `Kp*e + delta*alpha*dT`, and the P term must
|
||||||
|
absorb the residual. Stabilization still holds but reach analysis
|
||||||
|
should eventually treat α as a bounded parametric uncertainty.
|
||||||
|
- **Saturation is a hybrid sub-mode.** The `sat(u, u_min, u_max)` in
|
||||||
|
`ctrl_heatup.m` is formally piecewise affine. Current reach
|
||||||
|
treats it as dormant (true for operation/LQR, near-true for the
|
||||||
|
demo heatup trajectory). A rigorous heatup reach has to model
|
||||||
|
the saturation regions explicitly.
|
||||||
|
- **Linear-model reach is not sound for the nonlinear plant.** The
|
||||||
|
reach artifacts in `../reachability/` use the linearization; the
|
||||||
|
result is a sound over-approximation of the LINEAR model's reach,
|
||||||
|
not of the plant's. To upgrade: nonlinear reach directly, or
|
||||||
|
linear reach + Taylor-remainder inflation. See
|
||||||
|
`../reachability/README.md` § Soundness status.
|
||||||
|
|||||||
@ -13,6 +13,19 @@ function u = ctrl_heatup(t, x, plant, ref)
|
|||||||
% +0.5*beta guarantees rho_total < beta (below prompt), which in
|
% +0.5*beta guarantees rho_total < beta (below prompt), which in
|
||||||
% turn bounds the neutron-kinetics excursion rate for reachability.
|
% turn bounds the neutron-kinetics excursion rate for reachability.
|
||||||
%
|
%
|
||||||
|
% IMPORTANT for reach analysis:
|
||||||
|
% The sat() is a 3-mode piecewise-affine system (sat-low / linear /
|
||||||
|
% sat-high). Under linear reach assumptions it must either be
|
||||||
|
% (a) proven dormant (u_unsat stays in [u_min, u_max] across the
|
||||||
|
% reach set — trivial to check, expensive to over-approximate
|
||||||
|
% tightly), or
|
||||||
|
% (b) handled as an explicit hybrid automaton nested under the DRC
|
||||||
|
% mode, with transitions when u_unsat crosses the saturation
|
||||||
|
% bounds.
|
||||||
|
% The current reach_operation.m assumes (a) implicitly. Heatup
|
||||||
|
% reach will need option (b) because u_unsat is near the +0.5*beta
|
||||||
|
% bound during early ramp.
|
||||||
|
%
|
||||||
% Why no integrator:
|
% Why no integrator:
|
||||||
% Ramp tracking has a structural lag proportional to ramp_rate / Kp_eff.
|
% Ramp tracking has a structural lag proportional to ramp_rate / Kp_eff.
|
||||||
% Acceptable because the DRC exits heatup on a predicate window
|
% Acceptable because the DRC exits heatup on a predicate window
|
||||||
@ -20,6 +33,18 @@ function u = ctrl_heatup(t, x, plant, ref)
|
|||||||
% Adding PI would double-count the intrinsic plant integrator
|
% Adding PI would double-count the intrinsic plant integrator
|
||||||
% (thermal mass) and make anti-windup a hybrid transition.
|
% (thermal mass) and make anti-windup a hybrid transition.
|
||||||
%
|
%
|
||||||
|
% IMPORTANT caveat on the cancellation u_ff:
|
||||||
|
% The feedback linearization works only if the controller's values
|
||||||
|
% of alpha_f, alpha_c match the plant's. In reality alpha drifts:
|
||||||
|
% alpha_f ~20% over burnup, alpha_c by ~10x across boron dilution,
|
||||||
|
% plus xenon. With alpha_true = alpha_nom*(1+delta), the
|
||||||
|
% cancellation leaves residual reactivity delta*alpha*dT that the
|
||||||
|
% P term cleans up — stabilization still holds, but the clean
|
||||||
|
% "rho_total = Kp*e" property is gone. A robust deployment would
|
||||||
|
% treat alpha as an interval and propagate parametric uncertainty
|
||||||
|
% through reach (zonotope with parameter generators), or add
|
||||||
|
% adaptive alpha estimation. Idealized here.
|
||||||
|
%
|
||||||
% Inputs:
|
% Inputs:
|
||||||
% t - time [s]
|
% t - time [s]
|
||||||
% x - state vector (10 x 1)
|
% x - state vector (10 x 1)
|
||||||
|
|||||||
@ -2,7 +2,47 @@
|
|||||||
|
|
||||||
Continuous-mode verification for the PWR_HYBRID_3 hybrid controller.
|
Continuous-mode verification for the PWR_HYBRID_3 hybrid controller.
|
||||||
|
|
||||||
## Status
|
## Soundness status: APPROXIMATE
|
||||||
|
|
||||||
|
The current `reach_operation.m` result is **not a sound reach tube for
|
||||||
|
the physical plant**. It is a sound over-approximation of the
|
||||||
|
*linearized* closed-loop system (A_cl = A - BK around x_op) under
|
||||||
|
bounded disturbance. The linear model is itself an approximation of
|
||||||
|
the nonlinear plant (`../plant-model/pke_th_rhs.m`), and that
|
||||||
|
approximation error is not currently bounded or inflated into the tube.
|
||||||
|
|
||||||
|
Two paths to upgrade to a sound result:
|
||||||
|
|
||||||
|
1. **Nonlinear reach directly** — CORA `nonlinearSys`, JuliaReach
|
||||||
|
`BlackBoxContinuousSystem`, or equivalent. More expensive but the
|
||||||
|
honest answer.
|
||||||
|
2. **Linear reach + Taylor-remainder inflation** — compute an upper
|
||||||
|
bound on `||f_nl(x, u) - (A x + B u)||` over the reach set (via
|
||||||
|
Hessian norm estimate on each component of `f_nl`) and inflate the
|
||||||
|
linear tube by that bound. Less expensive, still rigorous.
|
||||||
|
|
||||||
|
Both are thesis-blocking for any safety claim. Deferred only until
|
||||||
|
the per-mode plumbing is solid; it is not a "nice to have".
|
||||||
|
|
||||||
|
The current 5-orders-of-margin buffer (reach envelope ~0.03 K against
|
||||||
|
a 5 K safety band) means linearization error would have to be huge to
|
||||||
|
invalidate the conclusion, but that is vibes, not a proof.
|
||||||
|
|
||||||
|
## Related open issues
|
||||||
|
|
||||||
|
- **Saturation semantics.** `ctrl_heatup.m` uses `sat(u, u_min, u_max)`.
|
||||||
|
Saturation is formally a 3-mode piecewise-affine system. For
|
||||||
|
heatup reach this has to be handled as (a) hybrid locations, or
|
||||||
|
(b) proven dormant via reach on `u_unsat`. Not modeled in the
|
||||||
|
current artifacts (operation-mode LQR saturation is dormant in
|
||||||
|
practice but the proof is implicit).
|
||||||
|
- **Parametric uncertainty in α_f, α_c.** Real plants have α drift
|
||||||
|
with burnup (~20%), boron (α_c ranges 10×), xenon. The
|
||||||
|
feedback-linearization in `ctrl_heatup.m` assumes exact α; a robust
|
||||||
|
treatment would make α an interval and propagate parametric reach.
|
||||||
|
Currently idealized — flag in the chapter.
|
||||||
|
|
||||||
|
## What's here
|
||||||
|
|
||||||
**Per-mode only.** Following the compositionality argument in the thesis:
|
**Per-mode only.** Following the compositionality argument in the thesis:
|
||||||
verify each continuous mode separately, let the DRC handle discrete
|
verify each continuous mode separately, let the DRC handle discrete
|
||||||
@ -48,8 +88,11 @@ options are CORA (MATLAB) or JuliaReach (port the plant to Julia).
|
|||||||
|
|
||||||
## What this does NOT do yet
|
## What this does NOT do yet
|
||||||
|
|
||||||
|
- Any sound reach tube (see top of this file).
|
||||||
- Nonlinear reach for the original P controller on operation.
|
- Nonlinear reach for the original P controller on operation.
|
||||||
- Heatup reach (the ramped reference makes x* time-varying — needs
|
- Heatup reach (ramped reference makes x* time-varying — needs
|
||||||
trajectory-LQR or a different formulation).
|
trajectory-LQR or a different formulation, and the saturation
|
||||||
|
semantics need to be made explicit).
|
||||||
- Shutdown, scram, initialization reach.
|
- Shutdown, scram, initialization reach.
|
||||||
- Hybrid-system level verification (mode switching validity).
|
- Hybrid-system level verification (mode switching validity).
|
||||||
|
- Parametric robustness to α_f, α_c drift.
|
||||||
|
|||||||
@ -1,9 +1,30 @@
|
|||||||
%% reach_operation.m — linear reach set for operation mode (LQR closed-loop)
|
%% reach_operation.m — linear reach set for operation mode (LQR closed-loop)
|
||||||
%
|
%
|
||||||
% Compute a sound over-approximation of the reach set starting from a
|
% *** SOUNDNESS STATUS: APPROXIMATE, NOT SOUND. ***
|
||||||
% box around x_op, under LQR feedback, with Q_sg in a specified
|
%
|
||||||
% interval. Check that T_avg stays inside the t_avg_in_range predicate
|
% This file computes a reach tube for the *linearized* closed-loop
|
||||||
% for all t in [0, T_final].
|
% system (A_cl = A - BK around x_op) under bounded Q_sg. The tube
|
||||||
|
% itself is a sound over-approximation of the LINEAR model's reach
|
||||||
|
% set — it uses conservative box hulls and elementwise-absolute-value
|
||||||
|
% matrix propagation. But the LINEAR MODEL is only an approximation
|
||||||
|
% of the real nonlinear plant (pke_th_rhs.m), so the result is not a
|
||||||
|
% sound reach tube for the actual plant.
|
||||||
|
%
|
||||||
|
% To upgrade to a sound result, pick one:
|
||||||
|
% (a) Nonlinear reach directly (CORA's nonlinearSys, JuliaReach's
|
||||||
|
% BlackBoxContinuousSystem). Expensive, honest.
|
||||||
|
% (b) Linear reach + Taylor-remainder inflation: compute an upper
|
||||||
|
% bound on ||f_nonlinear(x,u) - (A x + B u)|| over the reach
|
||||||
|
% set and inflate the linear tube by that bound. Cheaper,
|
||||||
|
% requires a Hessian-norm estimate.
|
||||||
|
% Tracked as a thesis-blocking todo. For now, the 5-orders-of-margin
|
||||||
|
% buffer (|dT_c| ~ 0.03 K vs safety band 5 K) gives us a lot of room
|
||||||
|
% to absorb linearization error, but that's not a proof.
|
||||||
|
%
|
||||||
|
% Compute a reach-tube over-approximation starting from a box around
|
||||||
|
% x_op, under LQR feedback, with Q_sg in a specified interval. Check
|
||||||
|
% that T_avg stays inside the t_avg_in_range predicate for all t in
|
||||||
|
% [0, T_final].
|
||||||
%
|
%
|
||||||
% This is the *continuous-mode obligation* for q_operation:
|
% This is the *continuous-mode obligation* for q_operation:
|
||||||
% X_entry := { x : |x - x_op| <= delta_entry }
|
% X_entry := { x : |x - x_op| <= delta_entry }
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user