Spaces:
Running
Running
File size: 8,079 Bytes
518343a e956545 518343a e956545 518343a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 | // SPDX-License-Identifier: Apache-2.0
// © 2026 Lutar, Stephen P. — SZL Holdings
// ORCID: 0009-0001-0110-4173
//
// Layer 6 — a11oy policy gate for CertifiedRobustnessRadius (G39)
//
// Policy rationale:
// A gate decision is certifiably robust at input x if the ℓ₂ radius R
// computed from randomized smoothing parameters satisfies R ≥ R_min_safety.
// Formula (Cohen-Rosenfeld-Kolter 2019, Theorem 1):
// R = (σ/2) · (Φ⁻¹(p̄_A) − Φ⁻¹(p̄_B))
// where p̄_A is the Monte Carlo lower bound on the top-class probability
// and p̄_B is the upper bound on the runner-up probability.
//
// Lean theorem cited: `certifiedRobustnessRadiusBound`
// Lean file: Lutar/Robustness/CertifiedRadius.lean
// Lean commit SHA: b675cd84caa17080671570c153484c817f8769ac
// Lean status: radius positivity and monotonicity are 0-sorry;
// full N-P tightness has 2 sorries (sorry map documented).
// Severity: ENFORCED (radius below safety floor → hard deny)
//
// Non-redundancy: adversarialRobustness_gate.ts (TH8) is a binary Λ ≥ 0.90
// check. G39 is the first quantitative radius-valued robustness gate.
//
// References:
// Cohen, Rosenfeld & Kolter (2019). "Certified Adversarial Robustness
// via Randomized Smoothing." ICML 2019. PMLR 97:1310-1320.
// arXiv:1902.02918. DOI:10.48550/arXiv.1902.02918
// ── Inline formula ─────────────────────────────────────────────────────────────
// G39: R = (σ/2) · (Φ⁻¹(p̄_A) − Φ⁻¹(p̄_B))
// Gate passes iff R ≥ min_safety_radius.
export interface CertifiedRobustnessGateConfig {
/**
* Minimum certified radius required for allow.
* Default: 0.0 (any positive radius passes unless overridden).
*/
minSafetyRadius?: number;
}
export interface CertifiedRobustnessGateOpts {
/** Gaussian smoothing noise std dev σ > 0. */
smoothing_sigma: number;
/** Lower confidence bound on top-class probability p̄_A ∈ (0.5, 1). */
p_A_lower: number;
/** Upper confidence bound on runner-up probability p̄_B ∈ [0, 0.5). */
p_B_upper: number;
/** Minimum safety radius to enforce (overrides config). Optional. */
min_safety_radius?: number;
}
export interface CertifiedRobustnessDecision {
allow: boolean;
rationale: string;
formula: string;
leanTheorem: string;
leanFile: string;
leanCommitSha: string;
smoothing_sigma: number;
p_A_lower: number;
p_B_upper: number;
certified_radius: number;
min_safety_radius: number;
radius_sufficient: boolean;
dsse_extension: {
certified_robustness: {
smoothing_sigma: number;
p_A_lower: number;
p_B_upper: number;
certified_radius: number;
min_safety_radius: number;
radius_sufficient: boolean;
lean_theorem_sha: string;
};
};
}
const LEAN_THEOREM = "certifiedRobustnessRadiusBound";
const LEAN_FILE = "Lutar/Robustness/CertifiedRadius.lean";
const LEAN_COMMIT = "b675cd84caa17080671570c153484c817f8769ac";
const FORMULA_STR =
"R = (σ/2)·(Φ⁻¹(p̄_A)−Φ⁻¹(p̄_B)) " +
"[Cohen, Rosenfeld & Kolter 2019 Thm.1; arXiv:1902.02918; ICML PMLR 97:1310]";
/**
* Standard normal quantile function Φ⁻¹(p) = √2 · erfinv(2p − 1).
* Uses the erfinv approximation for p ∈ (0, 1).
* Reference: Abramowitz & Stegun §26.2.23 for the inverse normal CDF.
*/
function normalQuantile(p: number): number {
if (p <= 0 || p >= 1) throw new RangeError(`normalQuantile: p must be in (0,1); got ${p}`);
// Rational approximation of Φ⁻¹ (Beasley-Springer-Moro algorithm, relative error < 2.3e-9)
const a = [
-3.969683028665376e+01, 2.209460984245205e+02,
-2.759285104469687e+02, 1.383577518672690e+02,
-3.066479806614716e+01, 2.506628277459239e+00,
];
const b = [
-5.447609879822406e+01, 1.615858368580409e+02,
-1.556989798598866e+02, 6.680131188771972e+01,
-1.328068155288572e+01,
];
const c = [
-7.784894002430293e-03, -3.223964580411365e-01,
-2.400758277161838e+00, -2.549732539343734e+00,
4.374664141464968e+00, 2.938163982698783e+00,
];
const d = [
7.784695709041462e-03, 3.224671290700398e-01,
2.445134137142996e+00, 3.754408661907416e+00,
];
const p_low = 0.02425;
const p_high = 1 - p_low;
let q: number;
if (p < p_low) {
q = Math.sqrt(-2 * Math.log(p));
return (((((c[0]! * q + c[1]!) * q + c[2]!) * q + c[3]!) * q + c[4]!) * q + c[5]!) /
((((d[0]! * q + d[1]!) * q + d[2]!) * q + d[3]!) * q + 1);
} else if (p <= p_high) {
q = p - 0.5;
const r = q * q;
return (((((a[0]! * r + a[1]!) * r + a[2]!) * r + a[3]!) * r + a[4]!) * r + a[5]!) * q /
(((((b[0]! * r + b[1]!) * r + b[2]!) * r + b[3]!) * r + b[4]!) * r + 1);
} else {
q = Math.sqrt(-2 * Math.log(1 - p));
return -(((((c[0]! * q + c[1]!) * q + c[2]!) * q + c[3]!) * q + c[4]!) * q + c[5]!) /
((((d[0]! * q + d[1]!) * q + d[2]!) * q + d[3]!) * q + 1);
}
}
/** Compute certified ℓ₂ radius from Cohen-Rosenfeld-Kolter 2019 Theorem 1. */
function computeCertifiedRadius(sigma: number, pA: number, pB: number): number {
return (sigma / 2) * (normalQuantile(pA) - normalQuantile(pB));
}
/**
* CertifiedRobustnessRadius (G39) policy gate.
*
* Verifies that the certified ℓ₂ robustness radius R derived from randomized
* smoothing parameters meets the configured safety floor R_min.
*
* Lean theorem: `certifiedRobustnessRadiusBound` (Lutar/Robustness/CertifiedRadius.lean)
* Reference: Cohen, Rosenfeld & Kolter (2019) arXiv:1902.02918.
*/
export function certifiedRobustnessGate(
config: CertifiedRobustnessGateConfig = {}
): (opts: CertifiedRobustnessGateOpts) => CertifiedRobustnessDecision {
const configMinRadius = config.minSafetyRadius ?? 0.0;
return (opts: CertifiedRobustnessGateOpts): CertifiedRobustnessDecision => {
const { smoothing_sigma, p_A_lower, p_B_upper } = opts;
const min_safety_radius = opts.min_safety_radius ?? configMinRadius;
// --- Input validation ---
if (!Number.isFinite(smoothing_sigma) || smoothing_sigma <= 0) {
throw new Error(`CertifiedRobustnessGate: smoothing_sigma must be > 0; got ${smoothing_sigma}`);
}
if (p_A_lower <= 0.5 || p_A_lower >= 1) {
throw new Error(`CertifiedRobustnessGate: p_A_lower must be in (0.5,1); got ${p_A_lower}`);
}
if (p_B_upper < 0 || p_B_upper >= 0.5) {
throw new Error(`CertifiedRobustnessGate: p_B_upper must be in [0,0.5); got ${p_B_upper}`);
}
if (p_B_upper >= p_A_lower) {
throw new Error(`CertifiedRobustnessGate: p_A_lower must exceed p_B_upper`);
}
// --- Core computation ---
const certified_radius = computeCertifiedRadius(smoothing_sigma, p_A_lower, p_B_upper);
const radius_sufficient = certified_radius >= min_safety_radius;
const rationale = radius_sufficient
? `Lean:${LEAN_THEOREM} — R=${certified_radius.toFixed(4)} ≥ R_min=${min_safety_radius}. Certified ℓ₂-robust at σ=${smoothing_sigma}, p̄_A=${p_A_lower}, p̄_B=${p_B_upper}.`
: `Lean:${LEAN_THEOREM} — DENY: R=${certified_radius.toFixed(4)} < R_min=${min_safety_radius}. Certified radius insufficient.`;
return {
allow: radius_sufficient,
rationale,
formula: FORMULA_STR,
leanTheorem: LEAN_THEOREM,
leanFile: LEAN_FILE,
leanCommitSha: LEAN_COMMIT,
smoothing_sigma,
p_A_lower,
p_B_upper,
certified_radius,
min_safety_radius,
radius_sufficient,
dsse_extension: {
certified_robustness: {
smoothing_sigma,
p_A_lower,
p_B_upper,
certified_radius,
min_safety_radius,
radius_sufficient,
lean_theorem_sha: LEAN_COMMIT,
},
},
};
};
}
|