Primal-Dual Active-Set Optimizer Filter
Implementation & benchmark of arXiv:2608.13841 — Real-Time In-Domain Congestion Control for the LWR Traffic Model via Control Barrier Functions
Source paper: Real-Time In-Domain Congestion Control for the LWR Traffic Model via Control Barrier Functions arXiv:2608.13841 ⓘ · analyzed Sep 1, 2026
AI-generated research hypothesis, automatically tested. Not peer-reviewed.
Idea description
Use the paper's structure-exploiting primal-dual active-set strategy to solve barrier-constrained neural updates without invoking a generic quadratic-program solver at every step. The active constraints identify which layers or state statistics are actually close to instability, while warm-started multipliers and active sets should make the safety correction nearly constant-cost when the training trajectory changes smoothly.
Formulas
Mathematical statement
Write the barrier-filter quadratic program as \(\min_v \frac12v^THv+c^Tv\) subject to \(Av\ge b\), where \(H=(1+\lambda)I\succ0\), \(c=-v_{\rm nom}\), row \(a_j^T=\nabla h_j(\theta)^T\), and \(b_j=-\alpha_jh_j(\theta)\). Introduce multipliers \(\mu\ge0\) for constraints \(Av-b\ge0\). The KKT conditions are \(Hv+c-A^T\mu=0\), \(Av-b\ge0\), \(\mu\ge0\), and \(\mu_j(Av-b)_j=0\). For a guessed active set \(\mathcal A\), solve the equality-constrained saddle system, then add violated inactive constraints or remove active constraints with negative multipliers. Warm starting from the previous \((v,\mu,\mathcal A)\) is the transferable real-time mechanism.
Implementation notes
1. Integration point: place the solver between gradient computation and the parameter update. Keep the neural update in a low-dimensional control space when possible: one velocity per layer, per residual branch, or per activation-statistic constraint. This makes the KKT system small even when the network has millions of parameters. If full-parameter constraints are required, use matrix-free products \(Av\) and \(A^T\mu\) through autodiff. 2. Pseudocode: initialize the active set and multipliers from the previous step; construct \(A\) from barrier gradients and \(b_j=-\alpha_jh_j\); solve the saddle system for the current active set; if any inactive residual \(a_j^Tv-b_j<0\), add the most violated row; if any active multiplier \(\mu_j<0\), remove the most negative row; repeat until primal residuals and multiplier violations are below tolerance; apply \(\theta\leftarrow\theta+\eta v\). 3. Computed exactly: KKT residuals, active-set changes, projected velocity, and dual multipliers. Estimated empirically: barrier gradients and the number of active constraints. Use diagonal or block-diagonal \(H\) so each KKT solve is cheap. 4. First cheap experiment: use a 4-layer MLP on CIFAR-10 with layerwise norm and activation barriers, comparing a generic projected-gradient approximation against the warm-started active-set solver. Measure wall-clock time, number of KKT iterations, active-set changes, constraint violations, and training loss. The quantitative prediction is that after an initial transient, consecutive minibatches will share the same active set and require at most 1-3 active-set corrections per step; solver iterations and active-set changes should spike precisely when the nominal optimizer crosses a barrier. Verify that KKT residuals stay below \(10^{-5}\) and that the active-set method reaches the same constrained solution as a reference OSQP solve while reducing per-step quadratic-program time.
Verification
Stage 1 · Toy mechanism gate: Passed ✓
Stage 2 · Mechanism transferred to benchmark: Confirmed ✓
Stage 2 · Practical benchmark result: Significantly worse ✗
Methodology: 8 paired seeds, permutation test (p<0.05) against a learning-rate-tuned baseline. How verification works
Stage 1 — Mechanism check agent confidence 8/10
Built a primal-dual active-set solver for strictly convex inequality QPs with warm-started active sets, multiplier checks, violated-constraint additions, and negative-multiplier removals. The activity transition matched the predicted alpha=0.4625 within the 0.05 sweep resolution, dual scaling matched the predicted slope 0.8 to machine precision, and smooth trajectories used one iteration on 92.5% of steps with 2 active-set changes and maximum KKT residual 5.6e-17. On the small toy comparison, PDAS reached the same objective as sequential projected gradient while averaging 1.59 ms versus 44.16 ms, but this is not evidence of a neural-training speedup.
- Agent confidence
- 8/10
- Baseline
- Sequential projected-gradient approximation: mean objective 1.1247975962, mean time 44.16 ms, max constraint violation 0
- Idea
- PDAS: mean objective 1.1247975962, mean time 1.59 ms, mean warm-start iterations 1.10, 92.5% one-iteration solves, max KKT residual 5.6e-17; independent SLSQP solution difference <1.9e-6
Limitations: Only small synthetic QPs were tested. No CIFAR-10/MLP integration, full-parameter or autodiff barrier gradients, OSQP comparison, GPU benchmark, scaling study, infeasibility handling, or high-dimensional matrix-free implementation was tested.
How to run: python3 run_experiment.py
Stage 2 — Benchmark vs. tuned baseline (arXiv:2608.13841)
Significantly WORSE than the tuned baseline (+1348.7%, p=0.0081, wins 0 / 8 paired seeds).
- Benchmark
- Tabular regression (Friedman)
- Model
- mlp_tiny
- Paired seeds
- 8
- Baseline mean
- 14.9502
- Idea mean
- 216.59
- Effect (Δ)
- 201.6398 (+1348.7%; negative = idea better)
- Wins
- 0 / 8 paired seeds
- p-value
- 0.0081 (permutation test, 20 000 shuffles)
- Smallest detectable effect
- ±67.4%
- Mechanism
- Confirmed ✓
- Practical effect
- Hurts
- Baseline tuning
- swept over 3 configs
Only the tabular track and mlp_tiny model were tested; no vision, sequence, or dynamics transfer was evaluated. The MVP used low-dimensional layerwise norm barriers rather than full-parameter autodiff constraint rows, and did not compare against OSQP or benchmark wall-clock speed at neural-training scale. The measured post-update barrier violation was nonzero, so constraint enforcement requires further engineering.
How to run: python3 pdas_bench.py
Verdict computed by deterministic test code from paired-seed statistics — not by the language model.
Stage 2 — Benchmark latest Failed ✗
Agent confidence: 9/10
Implemented the PDAS-filtered Adam update for the structurally matched tabular Friedman#1 regression track using the shared mlp_tiny architecture, 8 paired seeds, and a parity-preserving three-learning-rate sweep. The mechanism signature was confirmed: observed and predicted mean active constraints were both 3.9271, with 83.1% one-iteration solves. However, test MSE was significantly worse than baseline (paired delta +201.6398, permutation p=0.0081), so the idea did not win.
- Baseline
- Best Adam lr=0.006, 12 epochs: mean test MSE 14.9502, std 1.5514.
- Idea
- Best PDAS-filtered Adam lr=0.001, alpha=0.2, 12 epochs: mean test MSE 216.5900, std 10.7861; paired delta +201.6398, p=0.0081; 0/8 paired wins.
Benchmark result
Significantly WORSE than the tuned baseline (+1348.7%, p=0.0081, wins 0 / 8 paired seeds).
- Benchmark
- Tabular regression (Friedman)
- Model
- mlp_tiny
- Paired seeds
- 8
- Baseline mean
- 14.9502
- Idea mean
- 216.59
- Effect (Δ)
- 201.6398 (+1348.7%; negative = idea better)
- Wins
- 0 / 8 paired seeds
- p-value
- 0.0081 (permutation test, 20 000 shuffles)
- Smallest detectable effect
- ±67.4%
- Mechanism
- Confirmed ✓
- Practical effect
- Hurts
- Baseline tuning
- swept over 3 configs
Only the tabular track and mlp_tiny model were tested; no vision, sequence, or dynamics transfer was evaluated. The MVP used low-dimensional layerwise norm barriers rather than full-parameter autodiff constraint rows, and did not compare against OSQP or benchmark wall-clock speed at neural-training scale. The measured post-update barrier violation was nonzero, so constraint enforcement requires further engineering.
How to run: python3 pdas_bench.py
Artifacts
- bench_report.json 5.6 KB View Raw
- pdas_bench.py 6.5 KB View Raw
- pdas_filter.py 2.2 KB View Raw
- report.md 1.5 KB View
- report_bench_2026-09-01T135343.md 4.2 KB View
- results.json 1.1 KB View Raw
- run_experiment.py 4.0 KB View Raw