From 15597accad49301eeee0d3254e533ababef45aa5 Mon Sep 17 00:00:00 2001 From: Gravity Send Date: Tue, 27 Oct 2026 10:41:58 -0700 Subject: [PATCH 01/20] RFC 0011 round 1 (research): an amplitude register, an exact simulated qubit register on a CPU, as an optional solver tier behind a persona flag probbit-decide::amp (std and no_std + alloc; the state vector on the heap, 16 * 2^q bytes, q <= 16 on the host): gates H, X, Z, RX, RZ, CNOT, CZ, RZZ; evolve_ising (a Trotterised transverse-field sweep, fixed step count); qaoa; exact marginals; measure (the Born rule with Philox4x32); digest (sha256 of the state at 6 decimals). run::amplitude: a program whose variables have at most two allowed values and at most q_max two-valued ones is written exactly as an Ising program (Walsh transform; a term past pairwise declines), run on the register under the fixed default schedule tf-linear-16x4, and the rules are a projection onto the plans that obey them. The persona flag engine.tier: amplitude (off when absent; engine.q_max default 12) uses it for the turn's solves; otherwise the default tiers answer and engine.amplitude says why. Receipt in the stance document: engine.qubits, circuit, schedule, schedule_name, state, feasible_mass. Without the flag no byte of any stance or strand changes; an engine without the tier reads a strand that uses it as unsupported by this engine: engine.tier (exit 5). No quantum hardware, no speedup claim. Docs: docs/rfc/0011-amplitude-register.md (draft, round 1), docs/persona.md 2.7, CHANGELOG (Research). --- CHANGELOG.md | 11 ++ docs/persona.md | 12 ++ docs/rfc/0011-amplitude-register.md | 86 ++++++++++ probbit-decide/src/amp.rs | 235 ++++++++++++++++++++++++++++ probbit-decide/src/lib.rs | 1 + probbit-persona/src/persona.rs | 59 ++++++- probbit-persona/src/run.rs | 37 +++++ 7 files changed, 434 insertions(+), 7 deletions(-) create mode 100644 docs/rfc/0011-amplitude-register.md create mode 100644 probbit-decide/src/amp.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 15afa2d..619cd00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -103,6 +103,17 @@ All notable changes to this project are documented here. The format follows one (move the app, or Open Anyway), and that the bundled probbit serves several strands with a switcher; the plugin README names the second warning an older probbit gives; REPRODUCE.md no longer says only 0.12.0 replays the strand. +### Research + +- **RFC 0011, round 1: an amplitude register** (draft; docs/rfc/0011-amplitude-register.md): `probbit-decide::amp`, an exact + simulated qubit register on a CPU (q ≤ 16 on the host; 16 · 2^q bytes of amplitudes on the heap; std and no_std + alloc): + gates H, X, Z, RX, RZ, CNOT, CZ, RZZ, a Trotterised transverse-field sweep, QAOA layers, exact marginals, Born-rule + measurement with the engine's RNG, a sha256 digest of the state at 6 decimals. The persona flag `engine.tier: amplitude` + (off by default, `engine.q_max` default 12) solves a turn's program on it when every variable has at most two values; + otherwise the default tiers answer and the stance document says why. Receipt fields `engine.qubits`, `circuit`, + `schedule`, `schedule_name`, `state`, `feasible_mass`. Without the flag no byte of any stance or strand changes. No quantum + hardware, no speedup claim; the comparison with the default tier is the next round. + ## 0.13.0 - 2026-10-26 The monitor face and the Mac app, identity labels and many strands in one monitor, and the OpenClaw plugin 0.2.0. A persona diff --git a/docs/persona.md b/docs/persona.md index 195de27..ff051b4 100644 --- a/docs/persona.md +++ b/docs/persona.md @@ -230,12 +230,24 @@ engine: twin: true # also solve the habit-free twin in the same program, to report which habits changed the stance values: positional # positional (level i -> l: small pair tables, fast) | semantic (level names: readable programs) on_conflict: fallback # fallback | yield: when habits contradict, the lower-priority one yields (section 5.5) + # tier: amplitude # research (RFC 0011, draft): an exact simulated qubit register on a CPU; absent = the default tiers + # q_max: 12 # the most two-valued variables the amplitude tier takes (1-16) line: max_tokens: 40 # estimated tokens (max of chars / 4 and 4/3 per word) order: [verbosity, caution, directness, warmth, humour, initiative, formality, curiosity] prefix: "Stance: " ``` +**`engine.tier: amplitude` (research, off by default; docs/rfc/0011-amplitude-register.md).** The turn's program is solved by +an exact simulated qubit register on a CPU (one qubit per two-valued variable, 2^q complex amplitudes, a fixed transverse-field +sweep, the habits as a projection onto the plans that obey them) when every variable has at most two allowed values and the +two-valued ones number at most `q_max`; otherwise the default tiers answer and `engine.amplitude` says why +(`"declined: ..."`). With the tier, the stance document's `engine` carries `tier: "amplitude"`, `qubits`, `circuit`, +`schedule`, `schedule_name`, `state` (sha256 digests of the gate list, the schedule and the final amplitudes at 6 decimals) and +`feasible_mass`; `live verify` recomputes them from the strand. Without the key nothing changes, byte for byte. An engine +without the tier reports a strand that uses it as `unsupported by this engine: engine.tier` (exit 5). The register is a +simulation: no quantum hardware, no speedup claim; whether its stances agree with the default tier is measured, not assumed. + ### 2.8 Learning (optional) ```yaml diff --git a/docs/rfc/0011-amplitude-register.md b/docs/rfc/0011-amplitude-register.md new file mode 100644 index 0000000..8a12b3b --- /dev/null +++ b/docs/rfc/0011-amplitude-register.md @@ -0,0 +1,86 @@ +# RFC 0011: an amplitude register, an exact simulated qubit register as an optional solver tier for small stance programs + +Status: **draft, round 1** (research). Nothing in this RFC changes a release or `main`; the tier is off unless a persona asks +for it, and it may be removed by the round that measures it against the default tier (B4 below). + +## 1. What it is, in one paragraph + +A register of q qubits (q ≤ 16 on the host, q ≤ 12 on a small microcontroller) simulated **exactly** on a CPU as a state +vector of 2^q complex amplitudes: unitary gates with phase, interference between basis states, measurement by the Born rule, +every step logged so the strand replays byte for byte. It is a simulation of a tiny quantum system and nothing else: no +quantum hardware, no speedup claim, no scaling past what 2^q amplitudes allow (10 qubits 16 KB, 16 qubits 1 MB, 20 qubits +16 MB; a microcontroller with 8 MB of PSRAM reaches about 16; a laptop about 25-28). Sampling a thermal distribution cannot +produce this behaviour (amplitudes carry signs and phases that probabilities do not); the register gets it by paying 2^q +memory and time, which is fine for the programs probbit actually solves (tens of two-valued variables, most of them not +coupled all at once). + +## 2. Why bother (the question the measurement answers) + +probbit's stance is one exact program over coupled p-bits per turn: biases and couplings → exact marginals → a level per +trait with its odds → a stance line, habits as hard rules on top. The p-bit tier gives a thermal (Boltzmann) distribution. +An amplitude register fed the same program as a Hamiltonian gives a **coherent** distribution: options can cancel (destructive +interference) as well as add, and a short unitary evolution (a transverse-field sweep or a few QAOA-style layers) reaches its +distribution by dynamics, not by equilibrium. Two concrete things that might matter to an agent: + +1. **Conflict handling.** When two drives push a trait opposite ways, the thermal answer is a flattened mixture; a coherent + answer can be a sharpened choice or a cancellation. Whether that is better for a stance is exactly what has to be measured. +2. **Reflex arcs.** A sub-turn surge needs a cheap, deterministic, bounded state shift. A q-qubit register evolved by a fixed + small circuit is O(2^q · gates) with no sampling noise and no convergence question, which is a candidate mechanism for the + arc, to be compared with a rule-based register. + +It might also matter to nobody: the register may reproduce the p-bit marginals within noise, in which case it is a toy and the +RFC is closed with that number. Both outcomes are publishable with receipts. + +## 3. Design (minimal) + +- Module `probbit-decide::amp` (std, and no_std with `alloc`; the state vector on the heap): `Register::new(q)`, gates + `H, X, Z, RX(θ), RZ(θ), CNOT, CZ, RZZ(θ)` (enough for Ising-type programs and QAOA layers), `evolve_ising(program, + schedule)` (a Trotterised transverse-field sweep, fixed step count), `qaoa(program, p, params)`, `marginals()` (exact, no + sampling), `measure(seed)` (the Born rule with the engine's deterministic RNG), `digest()` (sha256 of the canonical state at + 6 decimals, like every other emitted float). Amplitudes are two f64: 16 · 2^q bytes exactly. +- A solver tier `amplitude` beside `components` / `knapsack` / `exact`: selected by the persona flag `engine.tier: amplitude` + (off when absent) and only when every variable of the program has at most two allowed values and the two-valued ones number + at most `engine.q_max` (default 12); otherwise the existing tiers run and the stance document says why + (`engine.amplitude: "declined: ..."`). +- How a program becomes a register (round 1): one qubit per two-valued variable (bit 0 = its first value). The program's log + weight over the 2^q basis states is written exactly as an Ising program (`log w = c + Σ a_i z_i + Σ b_ij z_i z_j`, by its + Walsh transform; a program with a term past pairwise declines). The register starts in |+…+> and runs the fixed default + schedule `tf-linear-16x4` (16 Trotter steps, total time 4, `H(s) = -(1-s) Σ X_i - s (Σ a_i Z_i + Σ b_ij Z_i Z_j)`). The rules + (habits, caps, clamps) are a projection: the Born probabilities of the plans that break one are set to 0 and the rest + renormalised, so a stance obeys every habit in force exactly as on the other tiers. Plan = the most probable feasible plan. +- Receipt fields in the stance document: `engine.tier = "amplitude"`, `engine.qubits`, `engine.circuit` (digest of the gate + list), `engine.schedule` (digest) and `engine.schedule_name`, `engine.state` (digest of the final amplitudes at 6 decimals), + `engine.feasible_mass` (the Born mass on plans that obey the rules), and the marginals at 6 decimals (the stance odds). + `live verify` recomputes all of it from the strand alone (the same rule as every other tier). An engine without the tier + reads the persona's `engine.tier` as a field it does not know: `unsupported by this engine` (exit 5), never a divergence. +- No change to habits (hard rules), the bound certificate (it is computed from the persona file, not from the sampler), the + strand format for other tiers, or any public wording. Public text, if any: "an exact simulated qubit register as an optional + solver tier for small programs; measured against the default tier; no quantum hardware". +- Round 1 scope: the tier answers the turn's solves (the stance and its habit checks). The rest position at the start, the + expectation's members and the trajectory stay on the existing tiers. + +## 4. Bars (registered before any run; PASS/FAIL per bar, failures printed as failures) + +- **B1 exactness.** Marginals from the register agree with an independent reference (a NumPy state-vector implementation + outside the repo) within 1e-9 for q ≤ 12 on 200 random programs and 20 designed ones; gates unitary to 1e-12. +- **B2 replay.** 100 strands with the amplitude tier replay byte for byte on x86_64 and on the no_std build; the 6-decimal + rounding rule holds for every emitted float; a strand recorded with the tier verifies on an engine without it with the + documented `unsupported by this engine` exit (5), never a false divergence. +- **B3 cost.** Host: µs per gate and per `evolve_ising` for q = 8, 12, 16; memory = 16 · 2^q bytes exactly; no_std stack + high-water for q = 8 and 12 ≤ 8 KB (the vector on the heap). Silicon numbers come later. +- **B4 agreement with the p-bit tier (the honest comparison).** On the recorded corpus (653 programs): the level chosen per + trait agrees with the exact p-bit tier in ≥ 90 % of trait decisions under the default schedule, and the cases that differ are + listed with both odds. KEEP as an optional tier if ≥ 90 %; DISCARD as a product tier if < 70 % (kept as a lab experiment); + in between, the verdict is "needs a schedule study", stated as such. +- **B5 interference exists and is bounded.** Three designed programs where two paths cancel: the register's odds differ from the + thermal odds by ≥ 0.2 at the designed node, and the persuadability bound still holds on every trait (0 exceedances on the + 247-program certificate set). +- **B6 the language.** Every public sentence uses "simulated", "exact", "on a CPU"; no claim of quantum hardware or of an + advantage over classical computation; no claim of experience. + +## 6. What this RFC does not claim + +That a CPU can do what quantum hardware does at scale (it cannot: section 1), that the register has experiences (it is +arithmetic), or that it beats the p-bit tier (B4 decides). What it can honestly give: superposition with real phases and +interference inside the agent's decision, exact and replayable, simulated on a CPU at a size a laptop and a small chip can +afford. diff --git a/probbit-decide/src/amp.rs b/probbit-decide/src/amp.rs new file mode 100644 index 0000000..b0b7215 --- /dev/null +++ b/probbit-decide/src/amp.rs @@ -0,0 +1,235 @@ +//! RFC 0011 (research, round 1): an amplitude register. A register of q qubits simulated exactly on a CPU as a state vector of +//! 2^q complex amplitudes (f64 pairs, on the heap: 16 * 2^q bytes): unitary gates with phase, interference between basis states, +//! exact marginals (no sampling), measurement by the Born rule with the engine's deterministic RNG, and a digest of the state at +//! 6 decimals (the rule for every emitted float). A simulation of a small quantum system and nothing else: no quantum hardware, +//! no speedup claim, no scaling past what 2^q amplitudes allow. +//! +//! Basis index x = sum of bit_i << i: qubit i is bit i. For a program over two-valued variables, bit 0 is the variable's first +//! value and bit 1 its second; z_i = +1 for bit 0, -1 for bit 1. +#[allow(unused_imports)] +use std::prelude::rust_2021::*; +use probbit_core::Philox4x32; + +/// The largest register on the host (16 qubits = 1 MiB of amplitudes) +pub const Q_MAX_HOST: usize = 16; +/// Bytes per amplitude: two f64 +pub const AMP_BYTES: usize = 16; + +/// A complex number (f64 parts) +#[derive(Clone, Copy, Debug, PartialEq)] +pub struct C { pub re: f64, pub im: f64 } +impl C { + pub const ZERO: C = C { re: 0.0, im: 0.0 }; + pub const ONE: C = C { re: 1.0, im: 0.0 }; + #[inline] pub fn new(re: f64, im: f64) -> C { C { re, im } } + #[inline] pub fn mul(self, o: C) -> C { C { re: self.re * o.re - self.im * o.im, im: self.re * o.im + self.im * o.re } } + #[inline] pub fn add(self, o: C) -> C { C { re: self.re + o.re, im: self.im + o.im } } + #[inline] pub fn conj(self) -> C { C { re: self.re, im: -self.im } } + #[inline] pub fn norm2(self) -> f64 { self.re * self.re + self.im * self.im } + /// e^{i t} + #[inline] pub fn cis(t: f64) -> C { C { re: t.cos(), im: t.sin() } } +} + +/// The gate set: enough for Ising-type programs and QAOA layers. Angles in radians; RX(t) = exp(-i t X / 2), +/// RZ(t) = exp(-i t Z / 2), RZZ(t) = exp(-i t Z⊗Z / 2). +#[derive(Clone, Copy, Debug, PartialEq)] +pub enum Gate { H(usize), X(usize), Z(usize), Rx(usize, f64), Rz(usize, f64), Cnot(usize, usize), Cz(usize, usize), Rzz(usize, usize, f64) } +impl Gate { + /// The gate as one canonical text line (angles at 6 decimals): what `circuit_text` joins and the circuit digest hashes + pub fn text(&self) -> String { + match *self { + Gate::H(a) => format!("h {a}"), Gate::X(a) => format!("x {a}"), Gate::Z(a) => format!("z {a}"), + Gate::Rx(a, t) => format!("rx {a} {}", f6(t)), Gate::Rz(a, t) => format!("rz {a} {}", f6(t)), + Gate::Cnot(a, b) => format!("cnot {a} {b}"), Gate::Cz(a, b) => format!("cz {a} {b}"), Gate::Rzz(a, b, t) => format!("rzz {a} {b} {}", f6(t)), + } + } + /// The gate's matrix on its own qubits (2x2, or 4x4 on (a, b) with basis index bit_a + 2 bit_b), row-major + pub fn matrix(&self) -> Vec { + let (r, z) = (core::f64::consts::FRAC_1_SQRT_2, C::ZERO); + let half = |t: f64| (C::new((t / 2.0).cos(), 0.0), (t / 2.0).sin()); + match *self { + Gate::H(_) => vec![C::new(r, 0.0), C::new(r, 0.0), C::new(r, 0.0), C::new(-r, 0.0)], + Gate::X(_) => vec![z, C::ONE, C::ONE, z], + Gate::Z(_) => vec![C::ONE, z, z, C::new(-1.0, 0.0)], + Gate::Rx(_, t) => { let (c, s) = half(t); vec![c, C::new(0.0, -s), C::new(0.0, -s), c] } + Gate::Rz(_, t) => vec![C::cis(-t / 2.0), z, z, C::cis(t / 2.0)], + Gate::Cnot(..) => { let mut m = vec![z; 16]; for (i, j) in [(0, 0), (1, 3), (2, 2), (3, 1)] { m[i * 4 + j] = C::ONE; } m } + Gate::Cz(..) => { let mut m = vec![z; 16]; for i in 0..4 { m[i * 5] = if i == 3 { C::new(-1.0, 0.0) } else { C::ONE }; } m } + Gate::Rzz(_, _, t) => { let mut m = vec![z; 16]; for i in 0..4 { let same = (i & 1) == (i >> 1); m[i * 5] = C::cis(if same { -t / 2.0 } else { t / 2.0 }); } m } + } + } +} + +/// max |U†U - I| over the entries of a gate's matrix +pub fn unitarity_error(g: &Gate) -> f64 { + let m = g.matrix(); let d = if m.len() == 4 { 2 } else { 4 }; let mut e: f64 = 0.0; + for i in 0..d { for j in 0..d { + let mut s = C::ZERO; for k in 0..d { s = s.add(m[k * d + i].conj().mul(m[k * d + j])); } + let want = if i == j { 1.0 } else { 0.0 }; e = e.max((s.re - want).abs()).max(s.im.abs()); } } + e +} + +/// A number at 6 decimals as the canonical text writes it (`-0` written `0`) +fn f6(x: f64) -> String { let s = format!("{x:.6}"); if s.trim_start_matches('-').bytes().all(|b| b == b'0' || b == b'.') { "0.000000".into() } else { s } } + +/// q qubits as 2^q complex amplitudes, and the list of gates applied (the circuit) +#[derive(Clone, Debug)] +pub struct Register { q: usize, amp: Vec, gates: Vec } +impl Register { + /// |0...0> on q qubits (q <= Q_MAX_HOST); the amplitudes take exactly 16 * 2^q bytes of heap + pub fn new(q: usize) -> Register { + assert!(q <= Q_MAX_HOST, "an amplitude register has at most {Q_MAX_HOST} qubits on the host"); + let mut amp = vec![C::ZERO; 1usize << q]; amp[0] = C::ONE; + let r = Register { q, amp, gates: vec![] }; + assert_eq!(r.bytes(), AMP_BYTES << q); r + } + pub fn qubits(&self) -> usize { self.q } + /// The amplitudes' bytes: 16 * 2^q + pub fn bytes(&self) -> usize { self.amp.len() * core::mem::size_of::() } + pub fn amplitudes(&self) -> &[C] { &self.amp } + pub fn gates(&self) -> &[Gate] { &self.gates } + /// The circuit as text, one gate per line (angles at 6 decimals) + pub fn circuit_text(&self) -> String { let mut s = String::new(); for g in &self.gates { s.push_str(&g.text()); s.push('\n'); } s } + + fn one(&mut self, a: usize, m: [C; 4]) { + let bit = 1usize << a; + for i in 0..self.amp.len() { if i & bit != 0 { continue; } let (x, y) = (self.amp[i], self.amp[i | bit]); + self.amp[i] = m[0].mul(x).add(m[1].mul(y)); self.amp[i | bit] = m[2].mul(x).add(m[3].mul(y)); } + } + /// Apply one gate (logged in the circuit) + pub fn apply(&mut self, g: Gate) { + let q = self.q; let ok = |a: usize| assert!(a < q, "qubit {a} out of range ({q} qubits)"); + match g { + Gate::H(a) | Gate::X(a) | Gate::Z(a) | Gate::Rx(a, _) | Gate::Rz(a, _) => { ok(a); let m = g.matrix(); self.one(a, [m[0], m[1], m[2], m[3]]); } + Gate::Cnot(c, t) => { ok(c); ok(t); assert_ne!(c, t); let (bc, bt) = (1usize << c, 1usize << t); + for i in 0..self.amp.len() { if i & bc != 0 && i & bt == 0 { self.amp.swap(i, i | bt); } } } + Gate::Cz(a, b) => { ok(a); ok(b); assert_ne!(a, b); let m = (1usize << a) | (1usize << b); + for i in 0..self.amp.len() { if i & m == m { self.amp[i] = C::new(-self.amp[i].re, -self.amp[i].im); } } } + Gate::Rzz(a, b, t) => { ok(a); ok(b); assert_ne!(a, b); let (same, diff) = (C::cis(-t / 2.0), C::cis(t / 2.0)); + for i in 0..self.amp.len() { let p = if ((i >> a) & 1) == ((i >> b) & 1) { same } else { diff }; self.amp[i] = p.mul(self.amp[i]); } } + } + self.gates.push(g); + } + /// The Born probabilities |a_x|^2 + pub fn probabilities(&self) -> Vec { self.amp.iter().map(|a| a.norm2()).collect() } + /// Exact marginals P(qubit i = 1), one per qubit (no sampling) + pub fn marginals(&self) -> Vec { + let mut m = vec![0.0; self.q]; + for (x, a) in self.amp.iter().enumerate() { let p = a.norm2(); for (i, mi) in m.iter_mut().enumerate() { if x >> i & 1 == 1 { *mi += p; } } } + m + } + /// One measurement of every qubit by the Born rule: the basis index, drawn with Philox4x32(seed, stream 0) + pub fn measure(&self, seed: u64) -> usize { + let u = Philox4x32::new(seed, 0).f64(); let mut c = 0.0; + for (x, a) in self.amp.iter().enumerate() { c += a.norm2(); if u < c { return x; } } + self.amp.iter().rposition(|a| a.norm2() > 0.0).unwrap_or(0) + } + /// The canonical state: one line per amplitude, `re im` at 6 decimals + pub fn canonical(&self) -> String { let mut s = String::new(); for a in &self.amp { s.push_str(&f6(a.re)); s.push(' '); s.push_str(&f6(a.im)); s.push('\n'); } s } + /// sha256 of the canonical state + pub fn digest(&self) -> [u8; 32] { sha256(self.canonical().as_bytes()) } +} + +/// An Ising program over q two-valued variables: log w(x) = c + sum_i a_i z_i + sum_(i, pub b: Vec<(usize, usize, f64)> } +impl Ising { + /// The program's log weight at basis index x, without the constant + pub fn logw(&self, x: usize) -> f64 { + let z = |i: usize| if x >> i & 1 == 0 { 1.0 } else { -1.0 }; + self.a.iter().enumerate().map(|(i, a)| a * z(i)).sum::() + self.b.iter().map(|&(i, j, b)| b * z(i) * z(j)).sum::() + } +} + +/// A transverse-field sweep: `steps` Trotter steps over total time `time`, s = (k + 1/2) / steps at step k, +/// H(s) = -(1 - s) sum X_i - s sum (a_i Z_i + b_ij Z_i Z_j), started from |+...+> +#[derive(Clone, Copy, Debug, PartialEq)] +pub struct Schedule { pub steps: usize, pub time: f64 } +impl Schedule { + /// The canonical text the schedule digest hashes + pub fn text(&self) -> String { format!("transverse-field linear steps {} time {}\n", self.steps, f6(self.time)) } + pub fn name(&self) -> String { format!("tf-linear-{}x{}", self.steps, f6(self.time)) } +} +/// The tier's fixed default schedule (round 1; schedules are round 2's study) +pub const DEFAULT_SCHEDULE: Schedule = Schedule { steps: 16, time: 4.0 }; + +/// The cost layer exp(-i g H_P) with H_P = -(sum a_i Z_i + sum b_ij Z_i Z_j): RZ(-2 g a_i), RZZ(-2 g b_ij) +fn cost_layer(r: &mut Register, p: &Ising, g: f64) { + for (i, &a) in p.a.iter().enumerate() { if a != 0.0 { r.apply(Gate::Rz(i, -2.0 * g * a)); } } + for &(i, j, b) in &p.b { if b != 0.0 { r.apply(Gate::Rzz(i, j, -2.0 * g * b)); } } +} +/// The mixer layer exp(-i t H_D) with H_D = -sum X_i: RX(-2 t) on every qubit +fn mixer_layer(r: &mut Register, t: f64) { for i in 0..r.q { r.apply(Gate::Rx(i, -2.0 * t)); } } + +/// The register (q = p.q, fresh) after H on every qubit and the Trotterised sweep of `s` +pub fn evolve_ising(p: &Ising, s: &Schedule) -> Register { + let mut r = Register::new(p.q); for i in 0..p.q { r.apply(Gate::H(i)); } + let dt = s.time / s.steps as f64; + for k in 0..s.steps { let x = (k as f64 + 0.5) / s.steps as f64; cost_layer(&mut r, p, dt * x); mixer_layer(&mut r, dt * (1.0 - x)); } + r +} +/// QAOA with p layers: H on every qubit, then per layer (gamma, beta) the cost layer and the mixer layer +pub fn qaoa(p: &Ising, layers: usize, params: &[(f64, f64)]) -> Register { + assert_eq!(params.len(), layers, "one (gamma, beta) per layer"); + let mut r = Register::new(p.q); for i in 0..p.q { r.apply(Gate::H(i)); } + for &(g, b) in params { cost_layer(&mut r, p, g); mixer_layer(&mut r, b); } + r +} + +/// sha256 (FIPS 180-4), one shot +pub fn sha256(data: &[u8]) -> [u8; 32] { + const K: [u32; 64] = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, + 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, + 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]; + let mut h: [u32; 8] = [0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19]; + let mut msg = data.to_vec(); msg.push(0x80); while msg.len() % 64 != 56 { msg.push(0); } msg.extend_from_slice(&((data.len() as u64) * 8).to_be_bytes()); + for blk in msg.chunks(64) { + let mut w = [0u32; 64]; + for i in 0..16 { w[i] = u32::from_be_bytes([blk[4 * i], blk[4 * i + 1], blk[4 * i + 2], blk[4 * i + 3]]); } + for i in 16..64 { let s0 = w[i - 15].rotate_right(7) ^ w[i - 15].rotate_right(18) ^ (w[i - 15] >> 3); let s1 = w[i - 2].rotate_right(17) ^ w[i - 2].rotate_right(19) ^ (w[i - 2] >> 10); + w[i] = w[i - 16].wrapping_add(s0).wrapping_add(w[i - 7]).wrapping_add(s1); } + let mut v = h; + for i in 0..64 { let s1 = v[4].rotate_right(6) ^ v[4].rotate_right(11) ^ v[4].rotate_right(25); let ch = (v[4] & v[5]) ^ (!v[4] & v[6]); + let t1 = v[7].wrapping_add(s1).wrapping_add(ch).wrapping_add(K[i]).wrapping_add(w[i]); + let s0 = v[0].rotate_right(2) ^ v[0].rotate_right(13) ^ v[0].rotate_right(22); let mj = (v[0] & v[1]) ^ (v[0] & v[2]) ^ (v[1] & v[2]); let t2 = s0.wrapping_add(mj); + v = [t1.wrapping_add(t2), v[0], v[1], v[2], v[3].wrapping_add(t1), v[4], v[5], v[6]]; } + for i in 0..8 { h[i] = h[i].wrapping_add(v[i]); } + } + let mut out = [0u8; 32]; for i in 0..8 { out[4 * i..4 * i + 4].copy_from_slice(&h[i].to_be_bytes()); } out +} +/// Lower-case hex +pub fn hex(b: &[u8]) -> String { b.iter().map(|x| format!("{x:02x}")).collect() } + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn every_gate_is_unitary_to_1e_12() { + for t in [0.0, 0.3, -1.7, 2.5, 3.14159, 10.0] { + for g in [Gate::H(0), Gate::X(0), Gate::Z(0), Gate::Rx(0, t), Gate::Rz(0, t), Gate::Cnot(0, 1), Gate::Cz(0, 1), Gate::Rzz(0, 1, t)] { assert!(unitarity_error(&g) < 1e-12, "{g:?}"); } + } + } + #[test] + fn memory_is_16_times_2_to_the_q() { for q in [0, 1, 8, 12] { assert_eq!(Register::new(q).bytes(), 16 << q); } } + #[test] + fn bell_state_interference_and_norm() { + let mut r = Register::new(2); r.apply(Gate::H(0)); r.apply(Gate::Cnot(0, 1)); + let p = r.probabilities(); assert!((p[0] - 0.5).abs() < 1e-15 && (p[3] - 0.5).abs() < 1e-15 && p[1] < 1e-30 && p[2] < 1e-30); + // H Z H = X; two H in a row cancel (destructive interference on |1>) + let mut r = Register::new(1); r.apply(Gate::H(0)); r.apply(Gate::H(0)); assert!(r.probabilities()[1] < 1e-30); + let mut r = Register::new(1); r.apply(Gate::H(0)); r.apply(Gate::Z(0)); r.apply(Gate::H(0)); assert!((r.probabilities()[1] - 1.0).abs() < 1e-15); + let p = Ising { q: 3, a: vec![0.4, -0.2, 0.1], b: vec![(0, 1, 0.6), (1, 2, -0.3)] }; + let r = evolve_ising(&p, &DEFAULT_SCHEDULE); assert!((r.probabilities().iter().sum::() - 1.0).abs() < 1e-12); + let r = qaoa(&p, 2, &[(0.4, 0.7), (0.2, 0.3)]); assert!((r.probabilities().iter().sum::() - 1.0).abs() < 1e-12); + } + #[test] + fn measure_and_digest_are_deterministic() { + let p = Ising { q: 4, a: vec![0.5, 0.1, -0.3, 0.2], b: vec![(0, 3, 0.4)] }; + let (r1, r2) = (evolve_ising(&p, &DEFAULT_SCHEDULE), evolve_ising(&p, &DEFAULT_SCHEDULE)); + assert_eq!(r1.digest(), r2.digest()); assert_eq!(r1.measure(7), r2.measure(7)); assert_eq!(r1.circuit_text(), r2.circuit_text()); + assert_eq!(hex(&sha256(b"abc")), "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"); + assert_eq!(f6(-0.0000001), "0.000000"); + } +} diff --git a/probbit-decide/src/lib.rs b/probbit-decide/src/lib.rs index c490c7d..add429c 100644 --- a/probbit-decide/src/lib.rs +++ b/probbit-decide/src/lib.rs @@ -21,6 +21,7 @@ use probbit_core::Philox4x32; use std::collections::HashMap; pub mod oracle; pub mod ir; +pub mod amp; /// Tasks up to which `Problem::logw` uses the pairwise loop. R19.8 re-measured (`examples/logw_threshold.rs`, 6 workers, groups /// of 4 / 8, median of 7 alternating rounds, load ~8.6): linear / pairwise ns per call = 1.52 / 1.25 at 96 tasks, 0.96 / 0.92 at diff --git a/probbit-persona/src/persona.rs b/probbit-persona/src/persona.rs index a66800c..f5faa3e 100644 --- a/probbit-persona/src/persona.rs +++ b/probbit-persona/src/persona.rs @@ -163,7 +163,9 @@ struct Hist { id: String, of: String, streak: bool, window: usize, cap: usize, s struct Habit { id: String, when: Vec<(String, Json)>, then: Vec<(String, Json)>, rules: Vec<(String, Vec)>, say: String, priority: f64 } /// engine settings (docs/persona.md §2.7) #[derive(Clone)] -struct Eng { op: String, sweeps: usize, polish_sweeps: usize, exact_limit: u64, chains: usize, twin: bool, positional: bool, yields: bool } +struct Eng { op: String, sweeps: usize, polish_sweeps: usize, exact_limit: u64, chains: usize, twin: bool, positional: bool, yields: bool, + /// RFC 0011 (research): `tier: amplitude` (off when absent) and its `q_max` (default 12) + amp: bool, q_max: usize } /// bounded learning (docs/persona.md §2.8): `from` = the reward flag, then (optional) the correction flag; the traits whose learned /// deltas move; the step and total caps (natural-log weights); `credit` = action-addressed feedback, when declared #[derive(Clone)] @@ -477,8 +479,8 @@ fn build_base(doc: &Json) -> R> { for (i, hb) in list(get(kv, "habits"), "habits")?.iter().enumerate() { habits.push(habit_spec(hb, &ix("habits", i), &inputs, &history, &vars, &steps)?); } need((1..habits.len()).all(|i| habits[..i].iter().all(|h| h.id != habits[i].id)), "habits", "habit ids must be distinct")?; // engine - let mut eng = Eng { op: "decide".into(), sweeps: 2000, polish_sweeps: 200, exact_limit: 2_000_000, chains: 4, twin: true, positional: true, yields: false }; - if let Some(e) = get_t(kv, "engine") { let ekv = keys(e, "engine", &["op", "sweeps", "polish_sweeps", "exact_limit", "chains", "twin", "values", "on_conflict", "comment"], &[])?; + let mut eng = Eng { op: "decide".into(), sweeps: 2000, polish_sweeps: 200, exact_limit: 2_000_000, chains: 4, twin: true, positional: true, yields: false, amp: false, q_max: 12 }; + if let Some(e) = get_t(kv, "engine") { let ekv = keys(e, "engine", &["op", "sweeps", "polish_sweeps", "exact_limit", "chains", "twin", "values", "on_conflict", "tier", "q_max", "comment"], &[])?; for (k, x) in ekv { let p = at("engine", k); match k.as_str() { "op" => eng.op = x.as_str().filter(|o| ["decide", "sample"].contains(o)).ok_or_else(|| perr(&p, "decide | sample"))?.to_string(), @@ -486,6 +488,8 @@ fn build_base(doc: &Json) -> R> { "values" => eng.positional = match x.as_str() { Some("positional") => true, Some("semantic") => false, _ => return Err(perr(&p, "positional | semantic")) }, "on_conflict" => eng.yields = match x.as_str() { Some("fallback") => false, Some("yield") => true, _ => return Err(perr(&p, "fallback | yield")) }, "comment" => {} + "tier" => { need(x.as_str() == Some("amplitude"), &p, "amplitude (the one optional tier; absent = the default tiers)")?; eng.amp = true; } + "q_max" => eng.q_max = num(Some(x), &p, Some(1.0), Some(16.0), true)? as usize, "polish_sweeps" => eng.polish_sweeps = num(Some(x), &p, Some(0.0), Some(1e9), true)? as usize, "sweeps" => eng.sweeps = num(Some(x), &p, Some(1.0), Some(1e9), true)? as usize, "exact_limit" => eng.exact_limit = num(Some(x), &p, Some(1.0), Some(1e9), true)? as u64, @@ -2659,7 +2663,9 @@ struct Entry { level: String, p: f64, odds: Vec<(String, f64)>, released: bool, /// A stance document under construction (docs/persona.md §4) struct Out { status: String, verdict: Json, tier: Json, program: String, stance: Vec<(String, Entry)>, mood: Vec<(String, Entry)>, active: Vec, bound: Vec, violations: usize, conflict: Vec, yielded: Vec, unsure: Vec, escalate: Option, inputs: Vec<(String, Json)>, ignored: Vec, - line: String, why: String, agenda: Option>, state_digest: String, held: Vec, timing: Option, lift: Vec<(String, f64)> } + line: String, why: String, agenda: Option>, state_digest: String, held: Vec, timing: Option, lift: Vec<(String, f64)>, + /// RFC 0011: the amplitude tier's receipt (an object) or why it declined (a string); None without the flag + amp: Option } impl Out { fn to_json(&self, p: &Persona, st: &State) -> Json { let e = |m: &[(String, Entry)]| Json::Obj(m.iter().map(|(k, e)| { let odds = |o: &[(String, f64)]| Json::Obj(o.iter().map(|(l, x)| (l.clone(), Json::Num(*x))).collect()); @@ -2668,7 +2674,8 @@ impl Out { let s = |x: &str| Json::Str(x.to_string()); let mut v = vec![("probbit_persona_turn".to_string(), Json::Num(1.0)), ("persona".into(), Json::Obj(vec![("name".into(), s(&p.name)), ("version".into(), s(&p.version)), ("digest".into(), s(&p.digest))])), ("seed".into(), Json::Num(st.seed as f64)), ("turn".into(), Json::Num(st.turn as f64)), ("status".into(), s(&self.status)), - ("engine".into(), Json::Obj(vec![("verdict".into(), self.verdict.clone()), ("tier".into(), self.tier.clone()), ("program".into(), s(&self.program))])), + ("engine".into(), { let mut e = vec![("verdict".into(), self.verdict.clone()), ("tier".into(), self.tier.clone()), ("program".into(), s(&self.program))]; + match &self.amp { Some(Json::Obj(r)) => e.extend(r.iter().cloned()), Some(w) => e.push(("amplitude".into(), w.clone())), None => {} } Json::Obj(e) }), ("stance".into(), e(&self.stance)), ("mood".into(), e(&self.mood)), ("habits".into(), Json::Obj(vec![("active".into(), jstrs(&self.active)), ("bound".into(), jstrs(&self.bound)), ("violations".into(), Json::Num(self.violations as f64)), ("conflict".into(), jstrs(&self.conflict)), ("yielded".into(), jstrs(&self.yielded))])), @@ -2849,13 +2856,23 @@ fn decode(p: &Persona, st: &State, program: &str, meta: &Meta, doc: &Json, confl ns.seal(p); let out = Out { status, verdict: verdict.clone(), tier: doc.get("tier").cloned().unwrap_or(Json::Null), program: program.to_string(), stance, mood, active: meta.active.clone(), bound, violations: viol, conflict: conflict.to_vec(), yielded: yielded.to_vec(), unsure, escalate, inputs: meta.vals.iter().cloned().chain(meta.hist.iter().map(|(k, x)| (k.clone(), Json::Num(*x)))).collect(), - ignored: meta.ignored.clone(), line: ln, why: w, agenda: (!p.steps.is_empty()).then_some(order_steps), state_digest: ns.digest.clone(), held: vec![], timing: None, lift: meta.lift.clone() }; + ignored: meta.ignored.clone(), line: ln, why: w, agenda: (!p.steps.is_empty()).then_some(order_steps), state_digest: ns.digest.clone(), held: vec![], timing: None, lift: meta.lift.clone(), amp: doc.get("amplitude").cloned() }; (out, ns) } // ------------------------------------------------------------------------------------------------------------ turns fn solve(p: &Persona, st: &State, prog: &Json, eng: Engine, calls: &mut usize) -> Json { - *calls += 1; let was = crate::trace::enter(crate::trace::Phase::Solve); let r = eng(prog, &flags(p, st)); crate::trace::enter(was); r + *calls += 1; let was = crate::trace::enter(crate::trace::Phase::Solve); + let r = if p.eng.amp { amplitude_tier(prog, p.eng.q_max).unwrap_or_else(|why| declined(eng(prog, &flags(p, st)), &why)) } else { eng(prog, &flags(p, st)) }; + crate::trace::enter(was); r +} +/// RFC 0011 (research): the amplitude tier on a program (`run::amplitude`); Err(why) when it does not take it +#[cfg(feature = "decide")] +fn amplitude_tier(prog: &Json, q_max: usize) -> Result { crate::run::amplitude(prog, q_max) } +#[cfg(not(feature = "decide"))] +fn amplitude_tier(_: &Json, _: usize) -> Result { Err("this build has no amplitude tier (feature decide)".into()) } +/// The existing tiers' answer, with the receipt of why the amplitude tier did not run +fn declined(mut doc: Json, why: &str) -> Json { if let Json::Obj(v) = &mut doc { v.push(("amplitude".into(), Json::Str(format!("declined: {why}")))); } doc } fn ms(t: Instant) -> f64 { t.elapsed().as_secs_f64() * 1e3 } /// A minimal set of active habits that cannot hold together (deletion filter: drop each habit in turn, keep it only if the rest @@ -4446,6 +4463,34 @@ mod tests { for n in [0, 1, 55, 56, 57, 63, 64, 65, 119, 120, 128, 300] { let one = sha256(&data[..n]); for piece in [1, 3, 64, 100] { let mut h = Sha256::new(); for c in data[..n].chunks(piece) { h.update(c); } assert_eq!(h.finish(), one, "{n} bytes in pieces of {piece}"); } } } + /// RFC 0011 (research): `engine.tier: amplitude` on a persona of two-valued traits answers from the simulated register (its + /// receipt in the stance document, habits held, deterministic, a strand that verifies); on a persona with three-valued traits + /// it declines, the existing tiers answer and the receipt says why; absent, nothing changes + #[cfg(feature = "decide")] + #[test] + fn the_amplitude_tier_answers_two_valued_programs_and_declines_the_rest() { + use crate::strand::{self, Clock, Live}; + let text = include_str!("../../examples/persona/dispatch-policy.yaml").replace("engine:\n", "engine:\n tier: amplitude\n"); + let doc = crate::yaml::load(&text).ok().unwrap(); let p = build(&doc).unwrap(); let st = init(&p, Some(2), true, &run); + for raw in [r#"{"blast":0}"#, r#"{"blast":0.9}"#, r#"{"blast":0.3,"error":true}"#] { + let raw = json::parse(raw).unwrap(); let (a, _) = turn(&p, &st, &raw, false, &run, false).unwrap(); let (b, _) = turn(&p, &st, &raw, false, &run, false).unwrap(); + assert_eq!(canon(&a), canon(&b)); assert_eq!(g(&a, &["engine", "tier"]).as_str(), Some("amplitude"), "{}", canon(&a)); + let q = g(&a, &["engine", "qubits"]).as_f64().unwrap(); assert!((1.0..=4.0).contains(&q)); + for k in ["circuit", "schedule", "state"] { assert!(g(&a, &["engine", k]).as_str().is_some_and(is_digest), "{k}"); } + assert_eq!(g(&a, &["habits", "violations"]).as_f64(), Some(0.0)); assert_eq!(g(&a, &["status"]).as_str(), Some("ok")); } + let (mut live, header) = Live::start(p.clone(), &doc, st.clone(), Clock::Fixed, "probbit test"); let mut lines = vec![header]; + for (i, raw) in [r#"{"blast":0}"#, r#"{"blast":0.9}"#, r#"{"error":true}"#, r#"{"error":true}"#, r#"{"praise":true,"src":"human"}"#].iter().enumerate() { + let (_, l) = live.event(&json::parse(raw).unwrap(), &run).unwrap_or_else(|e| panic!("event {i}: {}", e.msg)); lines.push(l); } + let strand_text = lines.join("\n") + "\n"; assert!(strand::verify(&strand_text, &run).is_ok()); + // three-valued traits: declined, the existing tier answers, the receipt says so + let q = build(&json::parse(&DOC.replace("LEARN", r#","engine":{"tier":"amplitude"}"#)).unwrap()).unwrap(); let s0 = init(&q, Some(3), true, &run); + let (d, _) = turn(&q, &s0, &inputs(false, false, false), false, &run, false).unwrap(); + assert!(g(&d, &["engine", "amplitude"]).as_str().is_some_and(|w| w.starts_with("declined: ") && w.contains("more than two values")), "{}", canon(&d)); + assert_ne!(g(&d, &["engine", "tier"]).as_str(), Some("amplitude")); + let plain = build(&json::parse(&DOC.replace("LEARN", "")).unwrap()).unwrap(); let (e, _) = turn(&plain, &init(&plain, Some(3), true, &run), &inputs(false, false, false), false, &run, false).unwrap(); + assert!(g(&e, &["engine", "amplitude"]).is_null() && g(&e, &["engine", "qubits"]).is_null()); + assert_eq!(err(build(&json::parse(&DOC.replace("LEARN", r#","engine":{"tier":"pbit"}"#)).unwrap())), "engine.tier: amplitude (the one optional tier; absent = the default tiers)"); + } /// The boxed setup API is the by-value one: the same persona, state, header and individual #[test] fn the_boxed_setup_is_the_by_value_setup() { diff --git a/probbit-persona/src/run.rs b/probbit-persona/src/run.rs index fca7c67..cbba6bd 100644 --- a/probbit-persona/src/run.rs +++ b/probbit-persona/src/run.rs @@ -446,3 +446,40 @@ pub fn exact_cap(xms: Option, reached: bool) -> Vec<(&'static str, Json)> { } /// Per item, the error bar the gate compares with `tv_tol`: z x max(MCSE short, MCSE long) (`Gate::released_tasks`). pub fn item_bars(g: &Gate) -> Vec { g.sig_tv.iter().zip(&g.sig_tv_long).map(|(&s, &l)| GATE.z * if s.is_nan() || l.is_nan() { f64::NAN } else { s.max(l) }).collect() } + +/// RFC 0011 (research): the `amplitude` tier, an exact simulated qubit register run on a CPU (`probbit_decide::amp`). Eligible +/// when every variable has at most two allowed values (after clamps) and the two-valued ones, one qubit each, number at most +/// `q_max`; Err(why) otherwise, and the caller runs the existing tiers. The program's log weight over the 2^q basis states is +/// written exactly as an Ising program by its Walsh transform (unary and pairwise terms; a residual past 1e-9 declines), the +/// register runs the default transverse-field sweep from |+...+>, and the rules (caps, clamps) are a projection: the Born +/// probabilities of the plans that break one are set to 0 and the rest renormalised. Plan = the most probable feasible plan +/// (probabilities at 6 decimals, then the lowest basis index); marginals exact. The receipt: qubits, the digests of the +/// circuit, the schedule and the final amplitudes (6 decimals), the schedule's name. +#[cfg(feature = "decide")] +pub fn amplitude(prog: &Json, q_max: usize) -> Result { + use probbit_decide::amp; + let p = from_json(prog).map_err(|e| format!("program {}: {}", e.path, e.msg))?; let m = &p.m; + let cand: Vec> = (0..m.n).map(|i| (0..m.k).filter(|&v| m.ok(i, v)).collect()).collect(); + if let Some(i) = cand.iter().position(Vec::is_empty) { return Err(format!("{} has no allowed value", p.vars[i])); } + if let Some(i) = cand.iter().position(|c| c.len() > 2) { return Err(format!("{} has more than two values", p.vars[i])); } + let qv: Vec = (0..m.n).filter(|&i| cand[i].len() == 2).collect(); let q = qv.len(); + if q > q_max.min(amp::Q_MAX_HOST) { return Err(format!("{q} two-valued variables, q_max {q_max}")); } + let plan_of = |x: usize| -> Vec { let mut a: Vec = cand.iter().map(|c| c[0]).collect(); for (b, &i) in qv.iter().enumerate() { a[i] = cand[i][x >> b & 1]; } a }; + let n = 1usize << q; let lw: Vec = (0..n).map(|x| m.logw(&plan_of(x))).collect(); + let z = |x: usize, i: usize| if x >> i & 1 == 0 { 1.0 } else { -1.0 }; + let a: Vec = (0..q).map(|i| (0..n).map(|x| lw[x] * z(x, i)).sum::() / n as f64).collect(); + let mut b = vec![]; for i in 0..q { for j in i + 1..q { let c = (0..n).map(|x| lw[x] * z(x, i) * z(x, j)).sum::() / n as f64; if c.abs() > 1e-15 { b.push((i, j, c)); } } } + let ising = amp::Ising { q, a, b }; let mean = lw.iter().sum::() / n as f64; + if let Some(x) = (0..n).find(|&x| (lw[x] - mean - ising.logw(x)).abs() > 1e-9) { return Err(format!("not pairwise at basis state {x}")); } + let s = amp::DEFAULT_SCHEDULE; let reg = amp::evolve_ising(&ising, &s); + let pr: Vec = reg.probabilities().iter().enumerate().map(|(x, &w)| if m.violations(&plan_of(x)) == 0 { w } else { 0.0 }).collect(); + let mass: f64 = pr.iter().sum(); if mass <= 0.0 || !mass.is_finite() { return Err("no feasible plan has weight in the register".into()); } + let r6 = |x: f64| (x * 1e6).round() / 1e6; + let best = (0..n).fold(0, |bx, x| if r6(pr[x] / mass) > r6(pr[bx] / mass) { x } else { bx }); let bp = plan_of(best); + let mut mg = vec![0.0; m.n * m.k]; for (x, &w) in pr.iter().enumerate() { if w > 0.0 { for (i, &v) in plan_of(x).iter().enumerate() { mg[i * m.k + v] += w / mass; } } } + let d = |t: &[u8]| jstr(&format!("sha256:{}", amp::hex(&::sha256(t)))); + Ok(obj(vec![("verdict", jstr("exact")), ("tier", jstr("amplitude")), ("plan", plan(&p, &bp)), ("plan_logw", num(m.logw(&bp))), ("violations", num(0.0)), + ("marginals", marginals(&p, &mg)), ("released", ids(&p, &vec![true; m.n], true)), ("escalated", Json::Arr(vec![])), + ("amplitude", obj(vec![("qubits", num(q as f64)), ("circuit", d(reg.circuit_text().as_bytes())), ("schedule", d(s.text().as_bytes())), ("schedule_name", jstr(&s.name())), + ("state", jstr(&format!("sha256:{}", amp::hex(®.digest())))), ("feasible_mass", num(r6(mass)))]))])) +} From 95e43cd666dba2073be73482ff552c90eb4d8711 Mon Sep 17 00:00:00 2001 From: Gravity Send Date: Tue, 27 Oct 2026 11:05:50 -0700 Subject: [PATCH 02/20] probbit-persona: the amplitude tier test reads the example persona with its line endings normalised (a Windows checkout has CRLF, so the flag was never inserted there) --- probbit-persona/src/persona.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/probbit-persona/src/persona.rs b/probbit-persona/src/persona.rs index f5faa3e..069b485 100644 --- a/probbit-persona/src/persona.rs +++ b/probbit-persona/src/persona.rs @@ -4470,7 +4470,7 @@ mod tests { #[test] fn the_amplitude_tier_answers_two_valued_programs_and_declines_the_rest() { use crate::strand::{self, Clock, Live}; - let text = include_str!("../../examples/persona/dispatch-policy.yaml").replace("engine:\n", "engine:\n tier: amplitude\n"); + let text = include_str!("../../examples/persona/dispatch-policy.yaml").replace("\r\n", "\n").replace("engine:\n", "engine:\n tier: amplitude\n"); let doc = crate::yaml::load(&text).ok().unwrap(); let p = build(&doc).unwrap(); let st = init(&p, Some(2), true, &run); for raw in [r#"{"blast":0}"#, r#"{"blast":0.9}"#, r#"{"blast":0.3,"error":true}"#] { let raw = json::parse(raw).unwrap(); let (a, _) = turn(&p, &st, &raw, false, &run, false).unwrap(); let (b, _) = turn(&p, &st, &raw, false, &run, false).unwrap(); From 20476557729c778815cb7fa4092c544988371a97 Mon Sep 17 00:00:00 2001 From: Gravity Send Date: Tue, 27 Oct 2026 12:07:17 -0700 Subject: [PATCH 03/20] RFC 0011 round 2 (research): multi-level traits on the amplitude register, an exact simulated qubit register on a CPU A variable with d allowed values takes ceil(log2 d) qubits (a three-level trait two, its fourth code unused and kept at amplitude 0, checked after every layer, never renormalised). The start is the uniform superposition over the valid codes; the mixer is the complete-graph mixer per variable (the identity on unused codes; exp(i t X) for two values, round 1's mixer exactly); the cost is one general diagonal phase layer exp(-i g E), E = -log w per basis state, so pair tables between three-level traits need no decomposition: round 1's Walsh transform, its residual decline and the RZ/RZZ cost layer are gone (the general layer measured 4-6x faster per layer). The tier runs one register per connected component of the program (exact: the state is the product of the components' states); engine.q_max bounds the largest component. Receipt: engine.qubits counts encoded qubits; new engine.components, engine.encoding, engine.mixer. Measured: 220 multi-level programs against an independent mixed-radix reference, max |delta marginal| 2.7e-13; 100 tutor strands with the tier replay byte for byte on x86_64 and the no_std build; an engine without the tier exits 5. Off by default: every recorded corpus is byte-identical. Simulated exactly on a CPU; no quantum hardware, no speedup claim. --- CHANGELOG.md | 10 ++ docs/persona.md | 14 ++- docs/rfc/0011-amplitude-register.md | 57 +++++++-- probbit-decide/src/amp.rs | 178 +++++++++++++++++++++++----- probbit-persona/src/persona.rs | 26 +++- probbit-persona/src/run.rs | 87 +++++++++----- 6 files changed, 288 insertions(+), 84 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 619cd00..13e3572 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -105,6 +105,16 @@ All notable changes to this project are documented here. The format follows ### Research +- **RFC 0011, round 2: multi-level traits on the amplitude register** (draft, research; docs/rfc/0011-amplitude-register.md): + a variable with d allowed values takes ⌈log2 d⌉ qubits (`amp::Encoding`; a three-level trait two qubits, its fourth code + unused), the start is the uniform superposition over the valid codes, the mixer is the complete-graph mixer per variable + (`amp::MIXER`, the identity on unused codes; exp(i t X) for two values, round 1's mixer exactly), and the cost is one general + diagonal phase layer exp(−iγE), E = −log w per basis state (`Register::phase`), so pair tables between three-level traits + need no decomposition (round 1's Walsh transform and its decline are gone). The unused codes keep amplitude 0, checked after + every layer, never renormalised. The tier runs one register per connected component of the program (exact: the state is the + product of the components' states); `engine.q_max` bounds the largest component's encoded qubits. New receipt fields + `engine.components`, `encoding`, `mixer`; `qubits` counts encoded qubits. Measured against an independent mixed-radix + reference: max |Δ marginal| 2.7e-13 on 220 programs. Simulated exactly on a CPU; no quantum hardware, no speedup claim. - **RFC 0011, round 1: an amplitude register** (draft; docs/rfc/0011-amplitude-register.md): `probbit-decide::amp`, an exact simulated qubit register on a CPU (q ≤ 16 on the host; 16 · 2^q bytes of amplitudes on the heap; std and no_std + alloc): gates H, X, Z, RX, RZ, CNOT, CZ, RZZ, a Trotterised transverse-field sweep, QAOA layers, exact marginals, Born-rule diff --git a/docs/persona.md b/docs/persona.md index ff051b4..eb817f8 100644 --- a/docs/persona.md +++ b/docs/persona.md @@ -231,7 +231,7 @@ engine: values: positional # positional (level i -> l: small pair tables, fast) | semantic (level names: readable programs) on_conflict: fallback # fallback | yield: when habits contradict, the lower-priority one yields (section 5.5) # tier: amplitude # research (RFC 0011, draft): an exact simulated qubit register on a CPU; absent = the default tiers - # q_max: 12 # the most two-valued variables the amplitude tier takes (1-16) + # q_max: 12 # the most encoded qubits (ceil(log2 d) per variable) in one component the amplitude tier takes (1-16) line: max_tokens: 40 # estimated tokens (max of chars / 4 and 4/3 per word) order: [verbosity, caution, directness, warmth, humour, initiative, formality, curiosity] @@ -239,11 +239,13 @@ line: ``` **`engine.tier: amplitude` (research, off by default; docs/rfc/0011-amplitude-register.md).** The turn's program is solved by -an exact simulated qubit register on a CPU (one qubit per two-valued variable, 2^q complex amplitudes, a fixed transverse-field -sweep, the habits as a projection onto the plans that obey them) when every variable has at most two allowed values and the -two-valued ones number at most `q_max`; otherwise the default tiers answer and `engine.amplitude` says why -(`"declined: ..."`). With the tier, the stance document's `engine` carries `tier: "amplitude"`, `qubits`, `circuit`, -`schedule`, `schedule_name`, `state` (sha256 digests of the gate list, the schedule and the final amplitudes at 6 decimals) and +an exact simulated qubit register on a CPU: a variable with d allowed values takes ⌈log2 d⌉ qubits (a three-level trait two, +its fourth code unused and kept at amplitude 0), one register per connected component of the program (2^q complex +amplitudes each), a fixed transverse-field sweep with a general diagonal phase layer, the habits as a projection onto the +plans that obey them, when the largest component has at most `q_max` encoded qubits; otherwise the default tiers answer and +`engine.amplitude` says why (`"declined: ..."`). With the tier, the stance document's `engine` carries `tier: "amplitude"`, +`qubits`, `components`, `encoding`, `mixer`, `circuit`, `schedule`, `schedule_name`, `state` (sha256 digests of the encoding, +the layer list, the schedule and the final amplitudes at 6 decimals) and `feasible_mass`; `live verify` recomputes them from the strand. Without the key nothing changes, byte for byte. An engine without the tier reports a strand that uses it as `unsupported by this engine: engine.tier` (exit 5). The register is a simulation: no quantum hardware, no speedup claim; whether its stances agree with the default tier is measured, not assumed. diff --git a/docs/rfc/0011-amplitude-register.md b/docs/rfc/0011-amplitude-register.md index 8a12b3b..77a10ae 100644 --- a/docs/rfc/0011-amplitude-register.md +++ b/docs/rfc/0011-amplitude-register.md @@ -1,6 +1,6 @@ # RFC 0011: an amplitude register, an exact simulated qubit register as an optional solver tier for small stance programs -Status: **draft, round 1** (research). Nothing in this RFC changes a release or `main`; the tier is off unless a persona asks +Status: **draft, round 2** (research). Nothing in this RFC changes a release or `main`; the tier is off unless a persona asks for it, and it may be removed by the round that measures it against the default tier (B4 below). ## 1. What it is, in one paragraph @@ -39,24 +39,38 @@ RFC is closed with that number. Both outcomes are publishable with receipts. sampling), `measure(seed)` (the Born rule with the engine's deterministic RNG), `digest()` (sha256 of the canonical state at 6 decimals, like every other emitted float). Amplitudes are two f64: 16 · 2^q bytes exactly. - A solver tier `amplitude` beside `components` / `knapsack` / `exact`: selected by the persona flag `engine.tier: amplitude` - (off when absent) and only when every variable of the program has at most two allowed values and the two-valued ones number - at most `engine.q_max` (default 12); otherwise the existing tiers run and the stance document says why - (`engine.amplitude: "declined: ..."`). -- How a program becomes a register (round 1): one qubit per two-valued variable (bit 0 = its first value). The program's log - weight over the 2^q basis states is written exactly as an Ising program (`log w = c + Σ a_i z_i + Σ b_ij z_i z_j`, by its - Walsh transform; a program with a term past pairwise declines). The register starts in |+…+> and runs the fixed default - schedule `tf-linear-16x4` (16 Trotter steps, total time 4, `H(s) = -(1-s) Σ X_i - s (Σ a_i Z_i + Σ b_ij Z_i Z_j)`). The rules - (habits, caps, clamps) are a projection: the Born probabilities of the plans that break one are set to 0 and the rest - renormalised, so a stance obeys every habit in force exactly as on the other tiers. Plan = the most probable feasible plan. -- Receipt fields in the stance document: `engine.tier = "amplitude"`, `engine.qubits`, `engine.circuit` (digest of the gate - list), `engine.schedule` (digest) and `engine.schedule_name`, `engine.state` (digest of the final amplitudes at 6 decimals), + (off when absent) and only when every variable has an allowed value and the largest connected component of the program + has at most `engine.q_max` encoded qubits (default 12, 1-16); otherwise the existing tiers run and the stance document says + why (`engine.amplitude: "declined: ..."`). +- How a program becomes registers (round 2). **Encoding:** a variable with d candidate values (allowed, and the clamp) + takes ⌈log2 d⌉ qubits; code c < d is its c-th value, the codes ≥ d are unused (d = 3: codes 00, 01, 10; 11 unused). The start + is the uniform superposition over the valid codes (for two-valued variables, H on every qubit). **Mixer** (`complete-graph`, + fixed): per variable exp(i t A_d) with A_d = J − I, the adjacency of the complete graph on its d codes, and the identity on + the unused codes; closed form e^{−it}(I + (e^{itd} − 1)/d · J), O(d) per block; for d = 2 it is exp(i t X), round 1's mixer + exactly. **Phase layer:** one general diagonal layer, a_x ← e^{−iγE(x)} a_x with E = −log w of the plan x encodes, on every + valid basis state (O(2^q) per layer). Pair tables between multi-level variables give 3- and 4-body terms in any qubit + encoding; the diagonal layer takes them as they are, with no Walsh transform, no residual and no decline. Round 1's RZ/RZZ + decomposition of the cost is gone: on a 16-variable two-valued chain one general phase layer took 333 µs against 1,938 µs + for the RZ/RZZ layer, and the whole sweep 48.4 ms against 51.9 ms (x86_64, median of 20); the gates stay in the module. The unused codes keep amplitude exactly 0: the + engine checks their mass (≤ 1e-15) after every layer and never renormalises. **Components:** the program is split into its + connected components (two variables are linked by a pair or by sharing a capacity rule, as the `components` tier splits + it) and each component runs its own register. This is exact: E is a sum over components and the mixer acts per variable, + so the joint state is the product of the components' states (the repository's example personas need 52-70 encoded qubits + as one register, 10-15 in their largest component). The sweep is the fixed default `tf-linear-16x4` (16 Trotter steps, + total time 4, `H(s) = −(1−s) Σ A_i + s E`). The rules (habits, caps, clamps) are a projection per component: the Born + probabilities of the plans that break one are set to 0 and the rest renormalised, so a stance obeys every habit in force + exactly as on the other tiers. Plan = per component its most probable feasible plan. +- Receipt fields in the stance document: `engine.tier = "amplitude"`, `engine.qubits` (encoded qubits, summed over the + components), `engine.components` (each component's qubits), `engine.encoding` (digest of the variable → qubits map with each + variable's number of valid codes), `engine.mixer` (`complete-graph`), `engine.circuit` (digest of the layer list), + `engine.schedule` (digest) and `engine.schedule_name`, `engine.state` (digest of the final amplitudes at 6 decimals), `engine.feasible_mass` (the Born mass on plans that obey the rules), and the marginals at 6 decimals (the stance odds). `live verify` recomputes all of it from the strand alone (the same rule as every other tier). An engine without the tier reads the persona's `engine.tier` as a field it does not know: `unsupported by this engine` (exit 5), never a divergence. - No change to habits (hard rules), the bound certificate (it is computed from the persona file, not from the sampler), the strand format for other tiers, or any public wording. Public text, if any: "an exact simulated qubit register as an optional solver tier for small programs; measured against the default tier; no quantum hardware". -- Round 1 scope: the tier answers the turn's solves (the stance and its habit checks). The rest position at the start, the +- Scope (rounds 1-2): the tier answers the turn's solves (the stance and its habit checks). The rest position at the start, the expectation's members and the trajectory stay on the existing tiers. ## 4. Bars (registered before any run; PASS/FAIL per bar, failures printed as failures) @@ -78,6 +92,23 @@ RFC is closed with that number. Both outcomes are publishable with receipts. - **B6 the language.** Every public sentence uses "simulated", "exact", "on a CPU"; no claim of quantum hardware or of an advantage over classical computation; no claim of experience. +## 5. Measurements so far + +Round 1 (two-valued programs only) and round 2 (multi-level) results are recorded in the change log's Research entries and +the pull request; the verdict on B4 and B5 belongs to round 3. + +Round 2 (multi-level programs, simulated exactly on a CPU; x86_64 host, median of 20): + +| bar | measured | +|---|---| +| B1 exactness | 220 programs mixing two- and three-level variables (q ≤ 12 encoded; 20 designed, among them one where the unused code would be favoured if it were allowed) against an independent mixed-radix reference (one tensor axis of size d per variable, mixer from an eigendecomposition): max \|Δ marginal\| per level 2.7e-13 (bar 1e-9); unused-code mass after every layer 0 (bar 1e-15); mixer unitarity 8.9e-16 for d = 1-8 (bar 1e-12); round 1's 220 two-valued programs through the new layers: 5.3e-15 | +| B2 replay | 100 strands of the tutor example with the tier (three-level traits; 60 encoded qubits in 12 components, the largest 10): recorded twice byte-equal 100/100, verify 100/100 on x86_64 and on the no_std build, re-written byte-equal 100/100, 0 floats past 6 decimals; an engine without the tier: exit 5 on 100/100 | +| B3 cost | one sweep of 16 steps with level marginals: 42 µs (q 8, four three-level traits), 0.82 ms (q 12, six), 16.3 ms (q 16, eight); all two-valued: 97 µs, 2.1 ms, 43 ms; memory 16 · 2^q bytes of amplitudes plus 8 · 2^q of energies; no_std stack high-water 2,016 B at q 8 and 12 | + +The Born mass on plans that obey the rules can be small after the default sweep (as low as 7.3e-05 on the tutor example: +the product over its 12 components; its four-step order component alone allows 24 of its 256 codes); the projection renormalises it. B4 (agreement with the default +tiers, its first pass recorded with the pull request) and B5 have their verdict in round 3. + ## 6. What this RFC does not claim That a CPU can do what quantum hardware does at scale (it cannot: section 1), that the register has experiences (it is diff --git a/probbit-decide/src/amp.rs b/probbit-decide/src/amp.rs index b0b7215..f6ce394 100644 --- a/probbit-decide/src/amp.rs +++ b/probbit-decide/src/amp.rs @@ -1,11 +1,14 @@ -//! RFC 0011 (research, round 1): an amplitude register. A register of q qubits simulated exactly on a CPU as a state vector of +//! RFC 0011 (research, rounds 1-2): an amplitude register. A register of q qubits simulated exactly on a CPU as a state vector of //! 2^q complex amplitudes (f64 pairs, on the heap: 16 * 2^q bytes): unitary gates with phase, interference between basis states, //! exact marginals (no sampling), measurement by the Born rule with the engine's deterministic RNG, and a digest of the state at //! 6 decimals (the rule for every emitted float). A simulation of a small quantum system and nothing else: no quantum hardware, //! no speedup claim, no scaling past what 2^q amplitudes allow. //! -//! Basis index x = sum of bit_i << i: qubit i is bit i. For a program over two-valued variables, bit 0 is the variable's first -//! value and bit 1 its second; z_i = +1 for bit 0, -1 for bit 1. +//! Basis index x = sum of bit_i << i: qubit i is bit i. Round 2: a variable with d allowed values takes ceil(log2 d) qubits +//! (`Encoding`; d = 3: codes 00, 01, 10, code 11 unused), the start is the uniform superposition over the valid codes, the +//! mixer is block-diagonal per variable (`MIXER`, the identity on unused codes) and the cost is one general diagonal phase +//! layer exp(-i g E) with E = -log w per basis state, so pair tables between multi-level variables (3- and 4-body terms in +//! the qubits) need no decomposition. The unused codes keep amplitude 0 (checked after every layer). #[allow(unused_imports)] use std::prelude::rust_2021::*; use probbit_core::Philox4x32; @@ -72,24 +75,91 @@ pub fn unitarity_error(g: &Gate) -> f64 { /// A number at 6 decimals as the canonical text writes it (`-0` written `0`) fn f6(x: f64) -> String { let s = format!("{x:.6}"); if s.trim_start_matches('-').bytes().all(|b| b == b'0' || b == b'.') { "0.000000".into() } else { s } } -/// q qubits as 2^q complex amplitudes, and the list of gates applied (the circuit) +/// One step of a circuit: a gate, a diagonal phase layer exp(-i g E) (`Register::phase`), or a mixer layer on every variable +/// (`Register::mix`) +#[derive(Clone, Copy, Debug, PartialEq)] +pub enum Op { Gate(Gate), Phase(f64), Mix(f64) } +impl Op { + /// One canonical text line (angles at 6 decimals) + pub fn text(&self) -> String { match self { Op::Gate(g) => g.text(), Op::Phase(g) => format!("phase {}", f6(*g)), Op::Mix(t) => format!("mix {}", f6(*t)) } } +} + +/// The mixer every round-2 layer uses, by name (the receipt's `engine.mixer`) +pub const MIXER: &str = "complete-graph"; + +/// Round 2: how variables with d allowed values are packed into qubits. Variable i (d_i >= 1 values) takes b_i = ceil(log2 d_i) +/// qubits, packed in variable order (its code is bits o_i..o_i + b_i of the basis index); code c < d_i is its c-th value, codes +/// c >= d_i are unused (d = 3: code 11) and keep amplitude 0 for the whole evolution. +#[derive(Clone, Debug, PartialEq)] +pub struct Encoding { pub levels: Vec } +impl Encoding { + /// Qubits for d values: ceil(log2 d) (0 for d = 1) + pub fn bits(d: usize) -> usize { assert!(d >= 1, "a variable needs at least one value"); (usize::BITS - (d - 1).leading_zeros()) as usize } + /// Every variable two-valued (round 1's programs) + pub fn two_valued(q: usize) -> Encoding { Encoding { levels: vec![2; q] } } + /// The encoded qubits, sum of ceil(log2 d_i) + pub fn qubits(&self) -> usize { self.levels.iter().map(|&d| Encoding::bits(d)).sum() } + /// Per variable its first qubit + pub fn offsets(&self) -> Vec { let mut o = 0; self.levels.iter().map(|&d| { let r = o; o += Encoding::bits(d); r }).collect() } + /// Variable i's code in basis index x + pub fn code(&self, x: usize, i: usize) -> usize { let o = self.offsets()[i]; (x >> o) & ((1usize << Encoding::bits(self.levels[i])) - 1) } + /// The codes of every variable in x, or None when one is unused + pub fn decode(&self, x: usize) -> Option> { + let mut o = 0; let mut v = Vec::with_capacity(self.levels.len()); + for &d in &self.levels { let b = Encoding::bits(d); let c = (x >> o) & ((1usize << b) - 1); if c >= d { return None; } v.push(c); o += b; } + Some(v) + } + /// The canonical text the encoding digest hashes: one line per variable, `var levels qubits ..` + pub fn text(&self) -> String { + let mut s = String::new(); for (i, (&d, o)) in self.levels.iter().zip(self.offsets()).enumerate() { s.push_str(&format!("var {i} levels {d} qubits {o}..{}\n", o + Encoding::bits(d))); } s + } +} + +/// The complete-graph mixer on d levels as a d x d matrix (row-major): exp(i t A) with A = J - I the adjacency of the complete +/// graph K_d. Closed form (J^2 = d J): e^{-it} (I + (e^{itd} - 1)/d J). d = 2 is exp(i t X) = RX(-2t); d = 1 is the identity. +pub fn mixer_matrix(d: usize, t: f64) -> Vec { + let (ph, c) = mixer_coef(d, t); (0..d * d).map(|k| { let off = c.mul(ph); if k / d == k % d { ph.add(off) } else { off } }).collect() +} +/// (e^{-it}, (e^{itd} - 1)/d) +fn mixer_coef(d: usize, t: f64) -> (C, C) { let e = C::cis(t * d as f64); (C::cis(-t), C::new((e.re - 1.0) / d as f64, e.im / d as f64)) } +/// max |U^dagger U - I| of the mixer on the whole 2^b block of a d-level variable (the mixer on the valid codes, the identity on +/// the unused ones) +pub fn mixer_unitarity_error(d: usize, t: f64) -> f64 { + let n = 1usize << Encoding::bits(d); let m = mixer_matrix(d, t); + let u = |i: usize, j: usize| if i < d && j < d { m[i * d + j] } else if i == j { C::ONE } else { C::ZERO }; + let mut e: f64 = 0.0; + for i in 0..n { for j in 0..n { let mut s = C::ZERO; for k in 0..n { s = s.add(u(k, i).conj().mul(u(k, j))); } + e = e.max((s.re - if i == j { 1.0 } else { 0.0 }).abs()).max(s.im.abs()); } } + e +} + +/// q qubits as 2^q complex amplitudes, and the ops applied (the circuit) #[derive(Clone, Debug)] -pub struct Register { q: usize, amp: Vec, gates: Vec } +pub struct Register { q: usize, amp: Vec, ops: Vec } impl Register { /// |0...0> on q qubits (q <= Q_MAX_HOST); the amplitudes take exactly 16 * 2^q bytes of heap pub fn new(q: usize) -> Register { assert!(q <= Q_MAX_HOST, "an amplitude register has at most {Q_MAX_HOST} qubits on the host"); let mut amp = vec![C::ZERO; 1usize << q]; amp[0] = C::ONE; - let r = Register { q, amp, gates: vec![] }; + let r = Register { q, amp, ops: vec![] }; assert_eq!(r.bytes(), AMP_BYTES << q); r } + /// Round 2: the uniform superposition over the valid codes of every variable, 1/sqrt(prod d_i) on each valid basis state and + /// 0 on the rest (for an all-two-valued encoding this is H on every qubit) + pub fn uniform(enc: &Encoding) -> Register { + let mut r = Register::new(enc.qubits()); let a = 1.0 / (enc.levels.iter().map(|&d| d as f64).product::()).sqrt(); + for (x, v) in r.amp.iter_mut().enumerate() { *v = if enc.decode(x).is_some() { C::new(a, 0.0) } else { C::ZERO }; } + r + } pub fn qubits(&self) -> usize { self.q } /// The amplitudes' bytes: 16 * 2^q pub fn bytes(&self) -> usize { self.amp.len() * core::mem::size_of::() } pub fn amplitudes(&self) -> &[C] { &self.amp } - pub fn gates(&self) -> &[Gate] { &self.gates } - /// The circuit as text, one gate per line (angles at 6 decimals) - pub fn circuit_text(&self) -> String { let mut s = String::new(); for g in &self.gates { s.push_str(&g.text()); s.push('\n'); } s } + pub fn ops(&self) -> &[Op] { &self.ops } + /// The gates among the ops + pub fn gates(&self) -> Vec { self.ops.iter().filter_map(|o| if let Op::Gate(g) = o { Some(*g) } else { None }).collect() } + /// The circuit as text, one op per line (angles at 6 decimals) + pub fn circuit_text(&self) -> String { let mut s = String::new(); for o in &self.ops { s.push_str(&o.text()); s.push('\n'); } s } fn one(&mut self, a: usize, m: [C; 4]) { let bit = 1usize << a; @@ -108,8 +178,30 @@ impl Register { Gate::Rzz(a, b, t) => { ok(a); ok(b); assert_ne!(a, b); let (same, diff) = (C::cis(-t / 2.0), C::cis(t / 2.0)); for i in 0..self.amp.len() { let p = if ((i >> a) & 1) == ((i >> b) & 1) { same } else { diff }; self.amp[i] = p.mul(self.amp[i]); } } } - self.gates.push(g); + self.ops.push(Op::Gate(g)); + } + /// Round 2: the general diagonal phase layer, a_x <- e^{-i g E(x)} a_x for every basis state with a finite E(x) (E = -log w + /// of its plan); E(x) = NaN marks an unused code, left untouched (its amplitude is 0). O(2^q), any order of interaction. + pub fn phase(&mut self, e: &[f64], g: f64) { + assert_eq!(e.len(), self.amp.len(), "one energy per basis state"); + for (a, &ex) in self.amp.iter_mut().zip(e) { if !ex.is_nan() { *a = C::cis(-g * ex).mul(*a); } } + self.ops.push(Op::Phase(g)); + } + /// Round 2: the mixer layer, the complete-graph mixer exp(i t A_d) on the valid codes of every variable (`mixer_matrix`), + /// the identity on its unused codes: block-diagonal, O(d) per block by the closed form. + pub fn mix(&mut self, enc: &Encoding, t: f64) { + assert_eq!(enc.qubits(), self.q, "the encoding's qubits"); + let mut buf: Vec = vec![]; + for (&d, o) in enc.levels.iter().zip(enc.offsets()) { + if d < 2 { continue; } let b = Encoding::bits(d); let mask = ((1usize << b) - 1) << o; let (ph, c) = mixer_coef(d, t); + for x in 0..self.amp.len() { if x & mask != 0 { continue; } + buf.clear(); let mut s = C::ZERO; for k in 0..d { let a = self.amp[x | (k << o)]; buf.push(a); s = s.add(a); } let cs = c.mul(s); + for (k, &a) in buf.iter().enumerate() { self.amp[x | (k << o)] = ph.mul(a.add(cs)); } } + } + self.ops.push(Op::Mix(t)); } + /// The Born mass on unused codes (the basis states whose E is NaN) + pub fn invalid_mass(&self, e: &[f64]) -> f64 { self.amp.iter().zip(e).filter(|(_, x)| x.is_nan()).map(|(a, _)| a.norm2()).sum() } /// The Born probabilities |a_x|^2 pub fn probabilities(&self) -> Vec { self.amp.iter().map(|a| a.norm2()).collect() } /// Exact marginals P(qubit i = 1), one per qubit (no sampling) @@ -118,6 +210,13 @@ impl Register { for (x, a) in self.amp.iter().enumerate() { let p = a.norm2(); for (i, mi) in m.iter_mut().enumerate() { if x >> i & 1 == 1 { *mi += p; } } } m } + /// Round 2: exact marginals per variable and level, P(variable i has code c), concatenated in variable order (sum d_i entries) + pub fn level_marginals(&self, enc: &Encoding) -> Vec { + let base: Vec = enc.levels.iter().scan(0, |s, &d| { let r = *s; *s += d; Some(r) }).collect(); + let mut m = vec![0.0; enc.levels.iter().sum()]; + for (x, a) in self.amp.iter().enumerate() { if let Some(v) = enc.decode(x) { let p = a.norm2(); for (i, c) in v.into_iter().enumerate() { m[base[i] + c] += p; } } } + m + } /// One measurement of every qubit by the Born rule: the basis index, drawn with Philox4x32(seed, stream 0) pub fn measure(&self, seed: u64) -> usize { let u = Philox4x32::new(seed, 0).f64(); let mut c = 0.0; @@ -139,10 +238,13 @@ impl Ising { let z = |i: usize| if x >> i & 1 == 0 { 1.0 } else { -1.0 }; self.a.iter().enumerate().map(|(i, a)| a * z(i)).sum::() + self.b.iter().map(|&(i, j, b)| b * z(i) * z(j)).sum::() } + /// E(x) = -log w(x) over the 2^q basis states (the phase layer's input) + pub fn energies(&self) -> Vec { (0..1usize << self.q).map(|x| -self.logw(x)).collect() } } /// A transverse-field sweep: `steps` Trotter steps over total time `time`, s = (k + 1/2) / steps at step k, -/// H(s) = -(1 - s) sum X_i - s sum (a_i Z_i + b_ij Z_i Z_j), started from |+...+> +/// H(s) = -(1 - s) sum_i A_i + s E (A_i the complete-graph mixer of variable i; E = -log w), started from the uniform +/// superposition over the valid codes #[derive(Clone, Copy, Debug, PartialEq)] pub struct Schedule { pub steps: usize, pub time: f64 } impl Schedule { @@ -150,30 +252,31 @@ impl Schedule { pub fn text(&self) -> String { format!("transverse-field linear steps {} time {}\n", self.steps, f6(self.time)) } pub fn name(&self) -> String { format!("tf-linear-{}x{}", self.steps, f6(self.time)) } } -/// The tier's fixed default schedule (round 1; schedules are round 2's study) +/// The tier's fixed default schedule (rounds 1 and 2; schedules are a later round's study) pub const DEFAULT_SCHEDULE: Schedule = Schedule { steps: 16, time: 4.0 }; -/// The cost layer exp(-i g H_P) with H_P = -(sum a_i Z_i + sum b_ij Z_i Z_j): RZ(-2 g a_i), RZZ(-2 g b_ij) -fn cost_layer(r: &mut Register, p: &Ising, g: f64) { - for (i, &a) in p.a.iter().enumerate() { if a != 0.0 { r.apply(Gate::Rz(i, -2.0 * g * a)); } } - for &(i, j, b) in &p.b { if b != 0.0 { r.apply(Gate::Rzz(i, j, -2.0 * g * b)); } } +/// The bar on the Born mass of the unused codes, checked after every layer (it is 0 by construction; never renormalised) +pub const INVALID_MASS_MAX: f64 = 1e-15; +fn checked(r: &Register, e: &[f64]) { let m = r.invalid_mass(e); assert!(m <= INVALID_MASS_MAX, "unused-code mass {m:e} after a layer"); } + +/// Round 2: the sweep `s` on an encoding and its energies (one per basis state, NaN on unused codes): the uniform start over +/// the valid codes, then per step the phase layer (g = dt s) and the mixer layer (t = dt (1 - s)) +pub fn sweep(enc: &Encoding, e: &[f64], s: &Schedule) -> Register { + let mut r = Register::uniform(enc); let dt = s.time / s.steps as f64; + for k in 0..s.steps { let x = (k as f64 + 0.5) / s.steps as f64; r.phase(e, dt * x); checked(&r, e); r.mix(enc, dt * (1.0 - x)); checked(&r, e); } + r } -/// The mixer layer exp(-i t H_D) with H_D = -sum X_i: RX(-2 t) on every qubit -fn mixer_layer(r: &mut Register, t: f64) { for i in 0..r.q { r.apply(Gate::Rx(i, -2.0 * t)); } } - -/// The register (q = p.q, fresh) after H on every qubit and the Trotterised sweep of `s` -pub fn evolve_ising(p: &Ising, s: &Schedule) -> Register { - let mut r = Register::new(p.q); for i in 0..p.q { r.apply(Gate::H(i)); } - let dt = s.time / s.steps as f64; - for k in 0..s.steps { let x = (k as f64 + 0.5) / s.steps as f64; cost_layer(&mut r, p, dt * x); mixer_layer(&mut r, dt * (1.0 - x)); } +/// Round 2: QAOA on an encoding: the uniform start, then per layer (gamma, beta) the phase layer and the mixer layer +pub fn qaoa_on(enc: &Encoding, e: &[f64], params: &[(f64, f64)]) -> Register { + let mut r = Register::uniform(enc); + for &(g, b) in params { r.phase(e, g); checked(&r, e); r.mix(enc, b); checked(&r, e); } r } -/// QAOA with p layers: H on every qubit, then per layer (gamma, beta) the cost layer and the mixer layer +/// The sweep on an Ising program (every variable two-valued): the same phase and mixer layers as `sweep` +pub fn evolve_ising(p: &Ising, s: &Schedule) -> Register { sweep(&Encoding::two_valued(p.q), &p.energies(), s) } +/// QAOA with p layers on an Ising program: the same layers as `qaoa_on` pub fn qaoa(p: &Ising, layers: usize, params: &[(f64, f64)]) -> Register { - assert_eq!(params.len(), layers, "one (gamma, beta) per layer"); - let mut r = Register::new(p.q); for i in 0..p.q { r.apply(Gate::H(i)); } - for &(g, b) in params { cost_layer(&mut r, p, g); mixer_layer(&mut r, b); } - r + assert_eq!(params.len(), layers, "one (gamma, beta) per layer"); qaoa_on(&Encoding::two_valued(p.q), &p.energies(), params) } /// sha256 (FIPS 180-4), one shot @@ -225,6 +328,23 @@ mod tests { let r = qaoa(&p, 2, &[(0.4, 0.7), (0.2, 0.3)]); assert!((r.probabilities().iter().sum::() - 1.0).abs() < 1e-12); } #[test] + fn three_level_codes_stay_empty_and_the_mixer_is_unitary() { + for d in 1..=8 { for t in [0.0, 0.3, -1.7, 2.5, 10.0] { assert!(mixer_unitarity_error(d, t) < 1e-12, "d {d} t {t}"); } } + assert_eq!((Encoding::bits(1), Encoding::bits(2), Encoding::bits(3), Encoding::bits(4), Encoding::bits(5)), (0, 1, 2, 2, 3)); + // d = 2: the complete-graph mixer is RX(-2t) exactly + let m = mixer_matrix(2, 0.7); let g = Gate::Rx(0, -1.4).matrix(); for k in 0..4 { assert!((m[k].re - g[k].re).abs() < 1e-15 && (m[k].im - g[k].im).abs() < 1e-15); } + // a three-level variable, a two-valued flag and a three-level variable with a pair table favouring the diagonal + let enc = Encoding { levels: vec![3, 2, 3] }; assert_eq!(enc.qubits(), 5); + let lw = |v: &[usize]| [0.4, -0.2, 0.9][v[0]] + if v[1] == 1 { 0.3 } else { 0.0 } + if v[0] == v[2] { 1.1 } else { 0.0 } + if v[1] == 1 && v[2] == 2 { -0.5 } else { 0.0 }; + let e: Vec = (0..32).map(|x| enc.decode(x).map_or(f64::NAN, |v| -lw(&v))).collect(); + let r = sweep(&enc, &e, &DEFAULT_SCHEDULE); assert!(r.invalid_mass(&e) == 0.0); + assert!((r.probabilities().iter().sum::() - 1.0).abs() < 1e-12); + let lm = r.level_marginals(&enc); assert_eq!(lm.len(), 8); for (o, d) in [(0, 3), (3, 2), (5, 3)] { assert!((lm[o..o + d].iter().sum::() - 1.0).abs() < 1e-12); } + let r = qaoa_on(&enc, &e, &[(0.4, 0.7), (0.9, 0.2)]); assert!(r.invalid_mass(&e) == 0.0); + // the uniform start over the valid codes: 18 of 32 basis states + assert_eq!(Register::uniform(&enc).probabilities().iter().filter(|&&p| p > 0.0).count(), 18); + } + #[test] fn measure_and_digest_are_deterministic() { let p = Ising { q: 4, a: vec![0.5, 0.1, -0.3, 0.2], b: vec![(0, 3, 0.4)] }; let (r1, r2) = (evolve_ising(&p, &DEFAULT_SCHEDULE), evolve_ising(&p, &DEFAULT_SCHEDULE)); diff --git a/probbit-persona/src/persona.rs b/probbit-persona/src/persona.rs index 069b485..22d6171 100644 --- a/probbit-persona/src/persona.rs +++ b/probbit-persona/src/persona.rs @@ -4464,11 +4464,12 @@ mod tests { for piece in [1, 3, 64, 100] { let mut h = Sha256::new(); for c in data[..n].chunks(piece) { h.update(c); } assert_eq!(h.finish(), one, "{n} bytes in pieces of {piece}"); } } } /// RFC 0011 (research): `engine.tier: amplitude` on a persona of two-valued traits answers from the simulated register (its - /// receipt in the stance document, habits held, deterministic, a strand that verifies); on a persona with three-valued traits - /// it declines, the existing tiers answer and the receipt says why; absent, nothing changes + /// receipt in the stance document, habits held, deterministic, a strand that verifies); round 2: three-valued traits are + /// answered too (two qubits each, one register per component), a component over `q_max` declines, the existing tiers answer + /// and the receipt says why; absent, nothing changes #[cfg(feature = "decide")] #[test] - fn the_amplitude_tier_answers_two_valued_programs_and_declines_the_rest() { + fn the_amplitude_tier_answers_multi_level_programs_and_declines_past_q_max() { use crate::strand::{self, Clock, Live}; let text = include_str!("../../examples/persona/dispatch-policy.yaml").replace("\r\n", "\n").replace("engine:\n", "engine:\n tier: amplitude\n"); let doc = crate::yaml::load(&text).ok().unwrap(); let p = build(&doc).unwrap(); let st = init(&p, Some(2), true, &run); @@ -4482,11 +4483,24 @@ mod tests { for (i, raw) in [r#"{"blast":0}"#, r#"{"blast":0.9}"#, r#"{"error":true}"#, r#"{"error":true}"#, r#"{"praise":true,"src":"human"}"#].iter().enumerate() { let (_, l) = live.event(&json::parse(raw).unwrap(), &run).unwrap_or_else(|e| panic!("event {i}: {}", e.msg)); lines.push(l); } let strand_text = lines.join("\n") + "\n"; assert!(strand::verify(&strand_text, &run).is_ok()); - // three-valued traits: declined, the existing tier answers, the receipt says so + // three-valued traits: answered (encoded qubits, the components, the encoding and the mixer in the receipt) let q = build(&json::parse(&DOC.replace("LEARN", r#","engine":{"tier":"amplitude"}"#)).unwrap()).unwrap(); let s0 = init(&q, Some(3), true, &run); - let (d, _) = turn(&q, &s0, &inputs(false, false, false), false, &run, false).unwrap(); - assert!(g(&d, &["engine", "amplitude"]).as_str().is_some_and(|w| w.starts_with("declined: ") && w.contains("more than two values")), "{}", canon(&d)); + let (d, _) = turn(&q, &s0, &inputs(false, false, false), false, &run, false).unwrap(); let (d2, _) = turn(&q, &s0, &inputs(false, false, false), false, &run, false).unwrap(); + assert_eq!(canon(&d), canon(&d2)); assert_eq!(g(&d, &["engine", "tier"]).as_str(), Some("amplitude"), "{}", canon(&d)); + assert_eq!(g(&d, &["engine", "mixer"]).as_str(), Some("complete-graph")); assert!(g(&d, &["engine", "encoding"]).as_str().is_some_and(is_digest)); + assert!(g(&d, &["engine", "qubits"]).as_f64().unwrap() >= 2.0); assert_eq!(g(&d, &["habits", "violations"]).as_f64(), Some(0.0)); + // a component past q_max: declined, the existing tier answers, the receipt says so + let q1 = build(&json::parse(&DOC.replace("LEARN", r#","engine":{"tier":"amplitude","q_max":1}"#)).unwrap()).unwrap(); + let (d, _) = turn(&q1, &init(&q1, Some(3), true, &run), &inputs(false, false, false), false, &run, false).unwrap(); + assert!(g(&d, &["engine", "amplitude"]).as_str().is_some_and(|w| w.starts_with("declined: ") && w.contains("encoded qubits, q_max 1")), "{}", canon(&d)); assert_ne!(g(&d, &["engine", "tier"]).as_str(), Some("amplitude")); + // the tutor example (three-level traits, 60 encoded qubits in components of at most 10): answered, and its strand verifies + let text = include_str!("../../examples/persona/tutor.yaml").replace("\r\n", "\n").replace("engine:\n", "engine:\n tier: amplitude\n"); + let doc = crate::yaml::load(&text).ok().unwrap(); let p = build(&doc).unwrap(); let st = init(&p, Some(2), true, &run); + let (mut live, header) = Live::start(p.clone(), &doc, st, Clock::Fixed, "probbit test"); let mut lines = vec![header]; + for raw in [r#"{"elapsed_hours":1,"praise":true}"#, r#"{"elapsed_hours":2}"#] { let (o, l) = live.event(&json::parse(raw).unwrap(), &run).unwrap(); lines.push(l); + assert_eq!(g(&o, &["engine", "tier"]).as_str(), Some("amplitude"), "{}", canon(&o)); } + assert!(strand::verify(&(lines.join("\n") + "\n"), &run).is_ok()); let plain = build(&json::parse(&DOC.replace("LEARN", "")).unwrap()).unwrap(); let (e, _) = turn(&plain, &init(&plain, Some(3), true, &run), &inputs(false, false, false), false, &run, false).unwrap(); assert!(g(&e, &["engine", "amplitude"]).is_null() && g(&e, &["engine", "qubits"]).is_null()); assert_eq!(err(build(&json::parse(&DOC.replace("LEARN", r#","engine":{"tier":"pbit"}"#)).unwrap())), "engine.tier: amplitude (the one optional tier; absent = the default tiers)"); diff --git a/probbit-persona/src/run.rs b/probbit-persona/src/run.rs index cbba6bd..ec0d8f4 100644 --- a/probbit-persona/src/run.rs +++ b/probbit-persona/src/run.rs @@ -447,39 +447,66 @@ pub fn exact_cap(xms: Option, reached: bool) -> Vec<(&'static str, Json)> { /// Per item, the error bar the gate compares with `tv_tol`: z x max(MCSE short, MCSE long) (`Gate::released_tasks`). pub fn item_bars(g: &Gate) -> Vec { g.sig_tv.iter().zip(&g.sig_tv_long).map(|(&s, &l)| GATE.z * if s.is_nan() || l.is_nan() { f64::NAN } else { s.max(l) }).collect() } -/// RFC 0011 (research): the `amplitude` tier, an exact simulated qubit register run on a CPU (`probbit_decide::amp`). Eligible -/// when every variable has at most two allowed values (after clamps) and the two-valued ones, one qubit each, number at most -/// `q_max`; Err(why) otherwise, and the caller runs the existing tiers. The program's log weight over the 2^q basis states is -/// written exactly as an Ising program by its Walsh transform (unary and pairwise terms; a residual past 1e-9 declines), the -/// register runs the default transverse-field sweep from |+...+>, and the rules (caps, clamps) are a projection: the Born -/// probabilities of the plans that break one are set to 0 and the rest renormalised. Plan = the most probable feasible plan -/// (probabilities at 6 decimals, then the lowest basis index); marginals exact. The receipt: qubits, the digests of the -/// circuit, the schedule and the final amplitudes (6 decimals), the schedule's name. +/// RFC 0011 (research): the `amplitude` tier, an exact simulated qubit register run on a CPU (`probbit_decide::amp`). Round 2: +/// a variable with d candidate values (allowed and clamp) takes ceil(log2 d) qubits (`amp::Encoding`; the unused codes keep +/// amplitude 0), and the program's log weight enters as one general diagonal phase layer (E = -log w per basis state), so +/// pair tables between multi-level variables need no decomposition. The program is split into its connected components +/// (two variables are linked by a pair or by sharing a capacity rule, as the `components` tier splits it) and each component +/// runs its own register: the phase is a sum over components and the mixer acts per variable, so the joint state is exactly +/// the product of the components' states. Eligible when every variable has an allowed value and the largest component has at +/// most `q_max` encoded qubits; Err(why) otherwise, and the caller runs the existing tiers. Each register runs the default +/// sweep from the uniform superposition over its valid codes; the rules are a projection: the Born probabilities of the +/// plans that break one are set to 0 and the rest renormalised (per component; the feasible mass is the product). Plan = per +/// component its most probable feasible plan (probabilities at 6 decimals, then the lowest basis index); marginals exact. The +/// receipt: qubits (encoded, summed), the components' qubits, the digests of the encoding, the circuit, the schedule and the +/// final amplitudes (6 decimals; the components' texts joined), the mixer's and the schedule's names, the feasible mass. #[cfg(feature = "decide")] pub fn amplitude(prog: &Json, q_max: usize) -> Result { use probbit_decide::amp; - let p = from_json(prog).map_err(|e| format!("program {}: {}", e.path, e.msg))?; let m = &p.m; - let cand: Vec> = (0..m.n).map(|i| (0..m.k).filter(|&v| m.ok(i, v)).collect()).collect(); + let p = from_json(prog).map_err(|e| format!("program {}: {}", e.path, e.msg))?; let m = &p.m; let (n, k) = (m.n, m.k); + let cand: Vec> = (0..n).map(|i| (0..k).filter(|&v| m.ok(i, v)).collect()).collect(); if let Some(i) = cand.iter().position(Vec::is_empty) { return Err(format!("{} has no allowed value", p.vars[i])); } - if let Some(i) = cand.iter().position(|c| c.len() > 2) { return Err(format!("{} has more than two values", p.vars[i])); } - let qv: Vec = (0..m.n).filter(|&i| cand[i].len() == 2).collect(); let q = qv.len(); - if q > q_max.min(amp::Q_MAX_HOST) { return Err(format!("{q} two-valued variables, q_max {q_max}")); } - let plan_of = |x: usize| -> Vec { let mut a: Vec = cand.iter().map(|c| c[0]).collect(); for (b, &i) in qv.iter().enumerate() { a[i] = cand[i][x >> b & 1]; } a }; - let n = 1usize << q; let lw: Vec = (0..n).map(|x| m.logw(&plan_of(x))).collect(); - let z = |x: usize, i: usize| if x >> i & 1 == 0 { 1.0 } else { -1.0 }; - let a: Vec = (0..q).map(|i| (0..n).map(|x| lw[x] * z(x, i)).sum::() / n as f64).collect(); - let mut b = vec![]; for i in 0..q { for j in i + 1..q { let c = (0..n).map(|x| lw[x] * z(x, i) * z(x, j)).sum::() / n as f64; if c.abs() > 1e-15 { b.push((i, j, c)); } } } - let ising = amp::Ising { q, a, b }; let mean = lw.iter().sum::() / n as f64; - if let Some(x) = (0..n).find(|&x| (lw[x] - mean - ising.logw(x)).abs() > 1e-9) { return Err(format!("not pairwise at basis state {x}")); } - let s = amp::DEFAULT_SCHEDULE; let reg = amp::evolve_ising(&ising, &s); - let pr: Vec = reg.probabilities().iter().enumerate().map(|(x, &w)| if m.violations(&plan_of(x)) == 0 { w } else { 0.0 }).collect(); - let mass: f64 = pr.iter().sum(); if mass <= 0.0 || !mass.is_finite() { return Err("no feasible plan has weight in the register".into()); } - let r6 = |x: f64| (x * 1e6).round() / 1e6; - let best = (0..n).fold(0, |bx, x| if r6(pr[x] / mass) > r6(pr[bx] / mass) { x } else { bx }); let bp = plan_of(best); - let mut mg = vec![0.0; m.n * m.k]; for (x, &w) in pr.iter().enumerate() { if w > 0.0 { for (i, &v) in plan_of(x).iter().enumerate() { mg[i * m.k + v] += w / mass; } } } + // the components: pairs and capacity rules link variables + let mut par: Vec = (0..n).collect(); + fn find(par: &mut [usize], mut x: usize) -> usize { while par[x] != x { par[x] = par[par[x]]; x = par[x]; } x } + fn join(par: &mut [usize], a: usize, b: usize) { let (a, b) = (find(par, a), find(par, b)); if a != b { par[a.max(b)] = a.min(b); } } + for q in &m.pairs { join(&mut par, q.i, q.j); } + for c in &m.caps { if let Some(&(i0, _)) = c.members.first() { for &(i, _) in &c.members { join(&mut par, i0, i); } } } + let mut slot = vec![usize::MAX; n]; let mut mems: Vec> = vec![]; + for i in 0..n { let r = find(&mut par, i); if slot[r] == usize::MAX { slot[r] = mems.len(); mems.push(vec![]); } mems[slot[r]].push(i); } + let comp_of: Vec = (0..n).map(|i| slot[find(&mut par, i)]).collect(); + let encs: Vec = mems.iter().map(|mem| amp::Encoding { levels: mem.iter().map(|&i| cand[i].len()).collect() }).collect(); + let qs: Vec = encs.iter().map(amp::Encoding::qubits).collect(); let qtop = qs.iter().copied().max().unwrap_or(0); + if qtop > q_max.min(amp::Q_MAX_HOST) { return Err(format!("a component of {qtop} encoded qubits, q_max {q_max}")); } + let s = amp::DEFAULT_SCHEDULE; let r6 = |x: f64| (x * 1e6).round() / 1e6; + let (mut enc_t, mut circ_t, mut state_t) = (String::new(), String::new(), String::new()); + let mut bp = vec![0usize; n]; let mut mg = vec![0.0; n * k]; let mut mass_all = 1.0; + for (c, mem) in mems.iter().enumerate() { + // the component's sub-model: its variables, pairs and capacity rules (local indices), as the components tier builds it + let mut loc = vec![usize::MAX; n]; for (q, &i) in mem.iter().enumerate() { loc[i] = q; } + let nn = mem.len(); let mut h = Vec::with_capacity(nn * k); let mut al = Vec::with_capacity(nn * k); + for &i in mem { h.extend_from_slice(&m.h[i * k..i * k + k]); al.extend_from_slice(&m.allowed[i * k..i * k + k]); } + let pairs: Vec = m.pairs.iter().filter(|q| comp_of[q.i] == c).map(|q| Pair { i: loc[q.i], j: loc[q.j], c: q.c.clone() }).collect(); + let caps: Vec = m.caps.iter().filter(|q| q.members.first().is_some_and(|&(i, _)| comp_of[i] == c)) + .map(|q| Cap { members: q.members.iter().map(|&(i, v)| (loc[i], v)).collect(), limit: q.limit, weights: q.weights.clone() }).collect(); + let sub = Model::new(nn, k, h, al, mem.iter().map(|&i| m.clamp[i]).collect(), pairs, caps).map_err(|e| format!("component {c}: {e}"))?; + let enc = &encs[c]; let nb = 1usize << qs[c]; + let plan_of = |codes: &[usize]| -> Vec { codes.iter().zip(mem).map(|(&cd, &i)| cand[i][cd]).collect() }; + let e: Vec = (0..nb).map(|x| enc.decode(x).map_or(f64::NAN, |cd| -sub.logw(&plan_of(&cd)))).collect(); + let reg = amp::sweep(enc, &e, &s); + let pr: Vec = reg.probabilities().iter().enumerate().map(|(x, &w)| match enc.decode(x) { Some(cd) if sub.violations(&plan_of(&cd)) == 0 => w, _ => 0.0 }).collect(); + let mass: f64 = pr.iter().sum(); if mass <= 0.0 || !mass.is_finite() { return Err(format!("component {c}: no feasible plan has weight in the register")); } + let best = (0..nb).fold(usize::MAX, |bx, x| if pr[x] > 0.0 && (bx == usize::MAX || r6(pr[x] / mass) > r6(pr[bx] / mass)) { x } else { bx }); + for (&i, v) in mem.iter().zip(plan_of(&enc.decode(best).expect("a feasible plan has valid codes"))) { bp[i] = v; } + for (x, &w) in pr.iter().enumerate() { if w > 0.0 { for (&i, v) in mem.iter().zip(plan_of(&enc.decode(x).expect("valid"))) { mg[i * k + v] += w / mass; } } } + mass_all *= mass; + for t in [&mut enc_t, &mut circ_t, &mut state_t] { t.push_str(&format!("component {c}\n")); } + enc_t.push_str(&enc.text()); circ_t.push_str(®.circuit_text()); state_t.push_str(®.canonical()); + } let d = |t: &[u8]| jstr(&format!("sha256:{}", amp::hex(&::sha256(t)))); - Ok(obj(vec![("verdict", jstr("exact")), ("tier", jstr("amplitude")), ("plan", plan(&p, &bp)), ("plan_logw", num(m.logw(&bp))), ("violations", num(0.0)), - ("marginals", marginals(&p, &mg)), ("released", ids(&p, &vec![true; m.n], true)), ("escalated", Json::Arr(vec![])), - ("amplitude", obj(vec![("qubits", num(q as f64)), ("circuit", d(reg.circuit_text().as_bytes())), ("schedule", d(s.text().as_bytes())), ("schedule_name", jstr(&s.name())), - ("state", jstr(&format!("sha256:{}", amp::hex(®.digest())))), ("feasible_mass", num(r6(mass)))]))])) + Ok(obj(vec![("verdict", jstr("exact")), ("tier", jstr("amplitude")), ("plan", plan(&p, &bp)), ("plan_logw", num(m.logw(&bp))), ("violations", num(m.violations(&bp) as f64)), + ("marginals", marginals(&p, &mg)), ("released", ids(&p, &vec![true; n], true)), ("escalated", Json::Arr(vec![])), + ("amplitude", obj(vec![("qubits", num(qs.iter().sum::() as f64)), ("components", Json::Arr(qs.iter().map(|&q| num(q as f64)).collect())), + ("encoding", d(enc_t.as_bytes())), ("mixer", jstr(amp::MIXER)), ("circuit", d(circ_t.as_bytes())), ("schedule", d(s.text().as_bytes())), ("schedule_name", jstr(&s.name())), + ("state", d(state_t.as_bytes())), ("feasible_mass", num(r6(mass_all)))]))])) } From bfa739412f168d4696acc109b6d6cbf1c98dab72 Mon Sep 17 00:00:00 2001 From: Gravity Send Date: Tue, 27 Oct 2026 15:09:59 -0700 Subject: [PATCH 04/20] RFC 0011 round 3 (research): the verdict, keep the amplitude register as an optional tier, an exact simulated qubit register on a CPU Measured on every program the recorded corpus's 653 outputs solve on the default tiers (338,567 exact solves, 0 declined, the corpus byte-identical with the comparison running beside it): the exact simulated register picks the same level as the exact default tier in 2,095,627 of 2,176,371 trait decisions (96.29 %, registered bar 90 %). The differing cases sit where the default tier's own level holds less than half the mass (91 % of them), and 99.1 % of them in components where most of the Born mass already obeys the rules, so they are not an artefact of the projection. B5: three designed two-path programs differ from the thermal odds by 0.252, 0.246 and 0.272 at the node (engine vs an independent reference within 1.4e-14). The bound harness with the tier on: 0 of 4,100 cases above a certificate computed with the tier, 1,598 above one computed without it, so the certificate must be computed with the tier (docs/persona.md). A rule-penalty term was measured and not adopted: it lifts the feasible mass but drops agreement to 83.44 %. No code change in this round; the tier stays off by default, so no recorded document moves. Simulated exactly on a CPU; no quantum hardware, no speedup claim. --- CHANGELOG.md | 10 ++++++++++ docs/persona.md | 4 +++- docs/rfc/0011-amplitude-register.md | 26 ++++++++++++++++++++++---- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13e3572..09b9bb1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -105,6 +105,16 @@ All notable changes to this project are documented here. The format follows ### Research +- **RFC 0011, round 3: the verdict, KEEP as an optional tier** (research, off by default; docs/rfc/0011-amplitude-register.md, + status "accepted as optional tier"). Measured on every program the recorded corpus's 653 outputs solve (338,567 exact solves, + 0 declined, the corpus byte-identical with the comparison beside it): the exact simulated register picks the same level as the + exact default tier in 2,095,627 of 2,176,371 trait decisions (96.29 %, bar 90 %); the differing cases sit where the default + tier's own level holds less than half the mass (91 % of them), not where the rules' projection does the work. Three designed + two-path programs differ from the thermal odds by 0.25-0.27 at the node (engine vs reference 1.4e-14). The bound harness with + the tier: 0 of 4,100 cases above a certificate computed with the tier, 1,598 above one computed without it, so `persona bound` + must run with the tier on (docs/persona.md says so). A rule-penalty term was measured and not adopted (it lifts the Born mass + on rule-abiding plans and drops agreement to 83 %). No code change in this round. Simulated exactly on a CPU; no quantum + hardware, no speedup claim. - **RFC 0011, round 2: multi-level traits on the amplitude register** (draft, research; docs/rfc/0011-amplitude-register.md): a variable with d allowed values takes ⌈log2 d⌉ qubits (`amp::Encoding`; a three-level trait two qubits, its fourth code unused), the start is the uniform superposition over the valid codes, the mixer is the complete-graph mixer per variable diff --git a/docs/persona.md b/docs/persona.md index eb817f8..500427d 100644 --- a/docs/persona.md +++ b/docs/persona.md @@ -248,7 +248,9 @@ plans that obey them, when the largest component has at most `q_max` encoded qub the layer list, the schedule and the final amplitudes at 6 decimals) and `feasible_mass`; `live verify` recomputes them from the strand. Without the key nothing changes, byte for byte. An engine without the tier reports a strand that uses it as `unsupported by this engine: engine.tier` (exit 5). The register is a -simulation: no quantum hardware, no speedup claim; whether its stances agree with the default tier is measured, not assumed. +simulation: no quantum hardware, no speedup claim; its stances agree with the default tier in 96 % of trait decisions on the +recorded corpus (RFC 0011, round 3). With the key, `persona bound` probes through the tier: compute the certificate again with +it, since one computed without the key does not cover the tier. ### 2.8 Learning (optional) diff --git a/docs/rfc/0011-amplitude-register.md b/docs/rfc/0011-amplitude-register.md index 77a10ae..85a1cd5 100644 --- a/docs/rfc/0011-amplitude-register.md +++ b/docs/rfc/0011-amplitude-register.md @@ -1,7 +1,10 @@ # RFC 0011: an amplitude register, an exact simulated qubit register as an optional solver tier for small stance programs -Status: **draft, round 2** (research). Nothing in this RFC changes a release or `main`; the tier is off unless a persona asks -for it, and it may be removed by the round that measures it against the default tier (B4 below). +Status: **accepted as optional tier (research; off by default)**, round 3. Verdict by the registered rule (B4 ≥ 90 %): 96.29 % +of 2,176,371 trait decisions on the recorded corpus agree with the exact default tier; B5 passes (three designed programs differ +from the thermal odds by 0.25-0.27 at the node; 0 of 4,100 bound cases exceed a certificate computed with the tier). Nothing in +this RFC changes a release or `main`; the tier stays off unless a persona asks for it. Turning it on changes the bound +certificate: compute it again with the tier (section 5). ## 1. What it is, in one paragraph @@ -67,8 +70,9 @@ RFC is closed with that number. Both outcomes are publishable with receipts. `engine.feasible_mass` (the Born mass on plans that obey the rules), and the marginals at 6 decimals (the stance odds). `live verify` recomputes all of it from the strand alone (the same rule as every other tier). An engine without the tier reads the persona's `engine.tier` as a field it does not know: `unsupported by this engine` (exit 5), never a divergence. -- No change to habits (hard rules), the bound certificate (it is computed from the persona file, not from the sampler), the - strand format for other tiers, or any public wording. Public text, if any: "an exact simulated qubit register as an optional +- No change to habits (hard rules), the strand format for other tiers, or any public wording. The bound certificate is + computed from the persona file, so with `engine.tier: amplitude` in the file `persona bound` probes through the tier and + its epsilon changes; a certificate computed without the flag does not cover the tier (measured in round 3, section 5). Public text, if any: "an exact simulated qubit register as an optional solver tier for small programs; measured against the default tier; no quantum hardware". - Scope (rounds 1-2): the tier answers the turn's solves (the stance and its habit checks). The rest position at the start, the expectation's members and the trajectory stay on the existing tiers. @@ -109,6 +113,20 @@ The Born mass on plans that obey the rules can be small after the default sweep the product over its 12 components; its four-step order component alone allows 24 of its 256 codes); the projection renormalises it. B4 (agreement with the default tiers, its first pass recorded with the pull request) and B5 have their verdict in round 3. +Round 3 (the verdict round; simulated exactly on a CPU, x86_64 host): + +| bar | measured | result | +|---|---|---| +| B4 agreement | every program the recorded corpus's 653 outputs solve on the default tiers (replay, live, init, lint, prove, fuzz, the continuation; strand verification left out), solved again by the tier at q_max 16: 338,567 exact solves (4,304 not exact on the default tiers, excluded), 0 declined; the level per trait agrees in **2,095,627 of 2,176,371 decisions = 96.29 %** (the stance path alone, replay and live, 96.52 %; distinct programs 95.94 %; worst traits valence 81.8 %, emoji 86.6 %, arousal 89.7 %). The corpus itself stays byte-identical with the comparison running beside it (653 outputs, 0 differ) | **PASS (≥ 90 %)** | +| B4 where they differ | 80,744 differing decisions, each listed with both odds. By the default tier's odds on its own level: ≥ 0.60 → 99.97 % agree, 0.50-0.60 → 98.3 %, 0.40-0.50 → 93.6 %, < 0.40 → 90.9 %; in 91 % of the differing cases the default level holds less than half the mass (median 0.385): the two disagree where the thermal answer is a plurality, not a majority. By the trait's component's feasible mass: 99.1 % of the differing cases sit in components with mass ≥ 0.1, so they are not an artefact of the projection | stated | +| feasible mass | the receipt's product over components is < 1e-2 on 36.7 % of the solves (min 2e-06), but per component on 0.04 % (min 2.6e-04, median 1): the product multiplies up to 12 components. A rule-penalty term (E' = E + 4 · violations, the projection kept) measured in the lab lifts every component above 7e-03 and drops B4 to 83.44 % (the order rules' step variables move most): not adopted; the projection stays | measured, not changed | +| B5 interference | three designed programs where two paths into a node differ in energy by D (the default sweep turns the difference into a relative phase), designed and predicted by the reference before the engine ran: register vs thermal odds at the node 0.748 vs 1.000, 0.744 vs 0.990, 0.697 vs 0.969 (gaps 0.252, 0.246, 0.272; the same programs at D = 0: 0.001, 0.000, 0.037); engine vs reference within 1.4e-14 | **PASS** | +| B5 bound | the bound harness (7 personas, seeds 0-9, greedy, mixed and self-sourced campaigns) with the tier on: certificate computed from the persona file with the flag, **0 of 4,100 (campaign, trait) cases above epsilon + r** (largest ratio 1.000), self-sourced events refused 10/10; with the certificate computed without the flag, 1,598 of 4,100 above (largest ratio 1.46): the tier moves resting odds further than the thermal tier, so a certificate must be computed with it. Tightness (≥ 0.9 of epsilon reached) fails on one fixture with the tier (0.85) | **PASS** (with that caveat) | + +Verdict: **KEEP as an optional tier** (research; off by default). It reproduces the stance semantics in 96 % of decisions and +differs where the thermal answer is nearly indifferent; it adds interference where designed programs have two paths. Not +verified: silicon cost and replay on a chip. + ## 6. What this RFC does not claim That a CPU can do what quantum hardware does at scale (it cannot: section 1), that the register has experiences (it is From 80890887667115dae1ab503c5738865856170651 Mon Sep 17 00:00:00 2001 From: Gravity Send Date: Tue, 27 Oct 2026 21:38:11 -0700 Subject: [PATCH 05/20] RFC 0011 round 4 (research): exact amplitude amplification in place of the projection, an exact simulated qubit register on a CPU probbit-decide::amp: Register::oracle (a phase on the plans marked good) and Register::diffuse (the diffusion about a stored state), logged as `oracle ` / `diffuse ` ops; amplify_exact(register, good): with the good mass a0 and theta = asin(sqrt(a0)), k = floor(pi / (4 theta) - 1/2) standard iterations and one phase-matched final iteration land the register on its normalised good part exactly (mass after asserted >= 1 - 1e-12). Every step stays in the plane of the good and bad parts of the swept state, so the Born probabilities on the feasible plans are the projection's. probbit-persona: `engine.amplify: true` (needs `tier: amplitude`; default false, so every stance and strand without it is byte-identical to round 3): run::amplitude rotates each component's register instead of projecting, reads plan and marginals from its Born probabilities, and the receipt adds `engine.amplify` (iterations and the final phases per component, the mass before and after; `feasible_mass` is the mass after). probbit-nostd: asin, acos, atan2 for the no_std build. Tests: amplification equals the projection to 1e-12 on 18 rules; the tutor example with amplify gives the projection's stances, logs the amplification, verifies its strand; amplify without the tier is refused. --- probbit-decide/src/amp.rs | 67 +++++++++++++++++++++++++++++++++- probbit-nostd/src/lib.rs | 3 ++ probbit-persona/src/persona.rs | 43 ++++++++++++++++++---- probbit-persona/src/run.rs | 27 ++++++++++++-- 4 files changed, 128 insertions(+), 12 deletions(-) diff --git a/probbit-decide/src/amp.rs b/probbit-decide/src/amp.rs index f6ce394..8eee6b0 100644 --- a/probbit-decide/src/amp.rs +++ b/probbit-decide/src/amp.rs @@ -78,10 +78,10 @@ fn f6(x: f64) -> String { let s = format!("{x:.6}"); if s.trim_start_matches('-' /// One step of a circuit: a gate, a diagonal phase layer exp(-i g E) (`Register::phase`), or a mixer layer on every variable /// (`Register::mix`) #[derive(Clone, Copy, Debug, PartialEq)] -pub enum Op { Gate(Gate), Phase(f64), Mix(f64) } +pub enum Op { Gate(Gate), Phase(f64), Mix(f64), Oracle(f64), Diffuse(f64) } impl Op { /// One canonical text line (angles at 6 decimals) - pub fn text(&self) -> String { match self { Op::Gate(g) => g.text(), Op::Phase(g) => format!("phase {}", f6(*g)), Op::Mix(t) => format!("mix {}", f6(*t)) } } + pub fn text(&self) -> String { match self { Op::Gate(g) => g.text(), Op::Phase(g) => format!("phase {}", f6(*g)), Op::Mix(t) => format!("mix {}", f6(*t)), Op::Oracle(p) => format!("oracle {}", f6(*p)), Op::Diffuse(p) => format!("diffuse {}", f6(*p)) } } } /// The mixer every round-2 layer uses, by name (the receipt's `engine.mixer`) @@ -200,6 +200,20 @@ impl Register { } self.ops.push(Op::Mix(t)); } + /// Round 4: the oracle, a_x <- e^{i phi} a_x on the basis states marked good (phi = pi: the sign flip) + pub fn oracle(&mut self, good: &[bool], phi: f64) { + assert_eq!(good.len(), self.amp.len(), "one mark per basis state"); let w = C::cis(phi); + for (a, &g) in self.amp.iter_mut().zip(good) { if g { *a = w.mul(*a); } } + self.ops.push(Op::Oracle(phi)); + } + /// Round 4: the diffusion about a stored state psi, I - (1 - e^{i phi}) |psi> f64 { self.amp.iter().zip(e).filter(|(_, x)| x.is_nan()).map(|(a, _)| a.norm2()).sum() } /// The Born probabilities |a_x|^2 @@ -279,6 +293,39 @@ pub fn qaoa(p: &Ising, layers: usize, params: &[(f64, f64)]) -> Register { assert_eq!(params.len(), layers, "one (gamma, beta) per layer"); qaoa_on(&Encoding::two_valued(p.q), &p.energies(), params) } +/// Round 4: what `amplify_exact` did: the iterations (standard ones + the final phase-matched one), the final step's two +/// phases (oracle, diffusion; radians), the Born mass on the good states before and after +#[derive(Clone, Copy, Debug, PartialEq)] +pub struct Amplified { pub iterations: usize, pub phases: (f64, f64), pub mass_before: f64, pub mass_after: f64 } +/// The bar on the good states' mass after `amplify_exact` (asserted) +pub const AMPLIFIED_MASS_MIN: f64 = 1.0 - 1e-12; +/// Round 4: exact amplitude amplification of the good states (`good(x)` per basis index; an unused code is never good) about +/// the register's current state psi, in place of a projection. With a0 = the good mass of psi and theta = asin(sqrt(a0)), +/// k = floor(pi / (4 theta) - 1/2) standard iterations (oracle phase pi, diffusion phase pi about psi) bring the state to angle +/// (2k + 1) theta <= pi/2 in the plane of |good> (psi's normalised good part) and |bad>; one final iteration with phases +/// (phi, varphi) chosen so that its bad component is 0 lands on |good> exactly (Long's exact search, one matched step). Every +/// step stays in that plane, so the result is e^{i chi} |good>: the good states keep psi's relative amplitudes, the Born +/// probabilities are psi's restricted to the good states and divided by a0 -- the projection's numbers, by a unitary +/// evolution. a0 = 1: nothing to do (0 iterations); a0 = 0: None (nothing to amplify). The mass after is asserted >= 1 - 1e-12. +pub fn amplify_exact(r: &mut Register, good: impl Fn(usize) -> bool) -> Option { + let g: Vec = (0..r.amp.len()).map(&good).collect(); let mass = |r: &Register| r.amp.iter().zip(&g).filter(|(_, &x)| x).map(|(a, _)| a.norm2()).sum::(); + let a0 = mass(r); if !(a0 > 0.0) { return None; } + if a0 >= 1.0 - 1e-15 { return Some(Amplified { iterations: 0, phases: (0.0, 0.0), mass_before: a0, mass_after: a0 }); } + let psi = r.amp.clone(); let pi = core::f64::consts::PI; + let th = a0.sqrt().asin(); let k = (pi / (4.0 * th) - 0.5).floor().max(0.0) as usize; + for _ in 0..k { r.oracle(&g, pi); r.diffuse(&psi, pi); } + // the final step: the state is +-(al |good> + be |bad>), al, be >= 0; with s = sin theta, c = cos theta, S_psi(varphi) + // S_f(phi) leaves be - (1 - e^{i varphi}) c (al s e^{i phi} + be c) on |bad>: it vanishes for + // cos phi = -(be / al) cos(2 theta) / sin(2 theta) (|cos phi| < 1 for this k) and 1 - e^{i varphi} = be / (c (al s e^{i phi} + be c)) + let a = mass(r).min(1.0); let (al, be) = (a.sqrt(), (1.0 - a).max(0.0).sqrt()); let (s, c) = (a0.sqrt(), (1.0 - a0).sqrt()); + let cphi = (-(be / al) * (1.0 - 2.0 * a0) / (2.0 * s * c)).clamp(-1.0, 1.0); let phi = cphi.acos(); + let w = C::new(al * s * phi.cos() + be * c, al * s * phi.sin()); let den = w.norm2() * c; // z = be / (c w) = be conj(w) / (c |w|^2) + let z = C::new(be * w.re / den, -be * w.im / den); let vphi = (-z.im).atan2(1.0 - z.re); + r.oracle(&g, phi); r.diffuse(&psi, vphi); + let m = mass(r); assert!(m >= AMPLIFIED_MASS_MIN, "amplified good mass {m:e} < 1 - 1e-12 (a0 {a0:e}, k {k})"); + Some(Amplified { iterations: k + 1, phases: (phi, vphi), mass_before: a0, mass_after: m }) +} + /// sha256 (FIPS 180-4), one shot pub fn sha256(data: &[u8]) -> [u8; 32] { const K: [u32; 64] = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, @@ -345,6 +392,22 @@ mod tests { assert_eq!(Register::uniform(&enc).probabilities().iter().filter(|&&p| p > 0.0).count(), 18); } #[test] + fn exact_amplification_lands_on_the_projection() { + // a three-level, a two-valued and a three-level variable; good = a rule over the plans; masses from 0.5 down to ~1e-3 + let enc = Encoding { levels: vec![3, 2, 3] }; + let lw = |v: &[usize]| [0.4, -0.2, 0.9][v[0]] + if v[1] == 1 { 0.3 } else { 0.0 } + if v[0] == v[2] { 1.1 } else { 0.0 } + if v[1] == 1 && v[2] == 2 { -0.5 } else { 0.0 }; + let e: Vec = (0..32).map(|x| enc.decode(x).map_or(f64::NAN, |v| -lw(&v))).collect(); + for rule in 0..18usize { + let good = |x: usize| enc.decode(x).is_some_and(|v| (v[0] * 6 + v[1] * 3 + v[2] + rule) % 18 < 1 + rule % 9); + let sw = sweep(&enc, &e, &DEFAULT_SCHEDULE); let p = sw.probabilities(); let a0: f64 = (0..32).filter(|&x| good(x)).map(|x| p[x]).sum(); + let mut r = sw.clone(); let am = amplify_exact(&mut r, good).unwrap(); assert!(am.mass_after >= AMPLIFIED_MASS_MIN && (am.mass_before - a0).abs() < 1e-15); + let q = r.probabilities(); for x in 0..32 { let want = if good(x) { p[x] / a0 } else { 0.0 }; assert!((q[x] - want).abs() < 1e-12, "rule {rule} x {x}: {} vs {want}", q[x]); } + assert_eq!(r.invalid_mass(&e), 0.0); + } + let mut r = Register::uniform(&enc); assert!(amplify_exact(&mut r, |_| false).is_none()); + let mut r = Register::uniform(&enc); assert_eq!(amplify_exact(&mut r, |x| enc.decode(x).is_some()).unwrap().iterations, 0); + } + #[test] fn measure_and_digest_are_deterministic() { let p = Ising { q: 4, a: vec![0.5, 0.1, -0.3, 0.2], b: vec![(0, 3, 0.4)] }; let (r1, r2) = (evolve_ising(&p, &DEFAULT_SCHEDULE), evolve_ising(&p, &DEFAULT_SCHEDULE)); diff --git a/probbit-nostd/src/lib.rs b/probbit-nostd/src/lib.rs index 92e9ddc..8df3cd7 100644 --- a/probbit-nostd/src/lib.rs +++ b/probbit-nostd/src/lib.rs @@ -127,6 +127,7 @@ pub trait FloatExt: Sized { fn exp(self) -> Self; fn exp_m1(self) -> Self; fn ln(self) -> Self; fn ln_1p(self) -> Self; fn log2(self) -> Self; fn log10(self) -> Self; fn sqrt(self) -> Self; fn powf(self, e: Self) -> Self; fn powi(self, n: i32) -> Self; fn tanh(self) -> Self; fn cos(self) -> Self; fn sin(self) -> Self; fn floor(self) -> Self; fn ceil(self) -> Self; fn round(self) -> Self; fn trunc(self) -> Self; fn fract(self) -> Self; + fn asin(self) -> Self; fn acos(self) -> Self; fn atan2(self, x: Self) -> Self; } /// `powi` as compiler-rt's `__powidf2` computes it (what `std`'s `f64::powi` lowers to), not `pow`: same bits as the host. fn powi64(mut a: f64, mut b: i32) -> f64 { @@ -141,6 +142,7 @@ impl FloatExt for f64 { fn tanh(self) -> f64 { libm::tanh(self) } fn cos(self) -> f64 { libm::cos(self) } fn sin(self) -> f64 { libm::sin(self) } fn floor(self) -> f64 { libm::floor(self) } fn ceil(self) -> f64 { libm::ceil(self) } fn round(self) -> f64 { libm::round(self) } fn trunc(self) -> f64 { libm::trunc(self) } fn fract(self) -> f64 { self - libm::trunc(self) } + fn asin(self) -> f64 { libm::asin(self) } fn acos(self) -> f64 { libm::acos(self) } fn atan2(self, x: f64) -> f64 { libm::atan2(self, x) } } impl FloatExt for f32 { fn exp(self) -> f32 { libm::expf(self) } fn exp_m1(self) -> f32 { libm::expm1f(self) } fn ln(self) -> f32 { libm::logf(self) } @@ -149,6 +151,7 @@ impl FloatExt for f32 { fn tanh(self) -> f32 { libm::tanhf(self) } fn cos(self) -> f32 { libm::cosf(self) } fn sin(self) -> f32 { libm::sinf(self) } fn floor(self) -> f32 { libm::floorf(self) } fn ceil(self) -> f32 { libm::ceilf(self) } fn round(self) -> f32 { libm::roundf(self) } fn trunc(self) -> f32 { libm::truncf(self) } fn fract(self) -> f32 { self - libm::truncf(self) } + fn asin(self) -> f32 { libm::asinf(self) } fn acos(self) -> f32 { libm::acosf(self) } fn atan2(self, x: f32) -> f32 { libm::atan2f(self, x) } } /// What a `no_std` module adds with one line (`use std::prelude::rust_2021::*;`) to see the names `std`'s prelude gives it. diff --git a/probbit-persona/src/persona.rs b/probbit-persona/src/persona.rs index 22d6171..efc938c 100644 --- a/probbit-persona/src/persona.rs +++ b/probbit-persona/src/persona.rs @@ -164,8 +164,8 @@ struct Habit { id: String, when: Vec<(String, Json)>, then: Vec<(String, Json)>, /// engine settings (docs/persona.md §2.7) #[derive(Clone)] struct Eng { op: String, sweeps: usize, polish_sweeps: usize, exact_limit: u64, chains: usize, twin: bool, positional: bool, yields: bool, - /// RFC 0011 (research): `tier: amplitude` (off when absent) and its `q_max` (default 12) - amp: bool, q_max: usize } + /// RFC 0011 (research): `tier: amplitude` (off when absent) and its `q_max` (default 12); round 4: `amplify` (default false) + amp: bool, q_max: usize, amplify: bool } /// bounded learning (docs/persona.md §2.8): `from` = the reward flag, then (optional) the correction flag; the traits whose learned /// deltas move; the step and total caps (natural-log weights); `credit` = action-addressed feedback, when declared #[derive(Clone)] @@ -479,8 +479,8 @@ fn build_base(doc: &Json) -> R> { for (i, hb) in list(get(kv, "habits"), "habits")?.iter().enumerate() { habits.push(habit_spec(hb, &ix("habits", i), &inputs, &history, &vars, &steps)?); } need((1..habits.len()).all(|i| habits[..i].iter().all(|h| h.id != habits[i].id)), "habits", "habit ids must be distinct")?; // engine - let mut eng = Eng { op: "decide".into(), sweeps: 2000, polish_sweeps: 200, exact_limit: 2_000_000, chains: 4, twin: true, positional: true, yields: false, amp: false, q_max: 12 }; - if let Some(e) = get_t(kv, "engine") { let ekv = keys(e, "engine", &["op", "sweeps", "polish_sweeps", "exact_limit", "chains", "twin", "values", "on_conflict", "tier", "q_max", "comment"], &[])?; + let mut eng = Eng { op: "decide".into(), sweeps: 2000, polish_sweeps: 200, exact_limit: 2_000_000, chains: 4, twin: true, positional: true, yields: false, amp: false, q_max: 12, amplify: false }; + if let Some(e) = get_t(kv, "engine") { let ekv = keys(e, "engine", &["op", "sweeps", "polish_sweeps", "exact_limit", "chains", "twin", "values", "on_conflict", "tier", "q_max", "amplify", "comment"], &[])?; for (k, x) in ekv { let p = at("engine", k); match k.as_str() { "op" => eng.op = x.as_str().filter(|o| ["decide", "sample"].contains(o)).ok_or_else(|| perr(&p, "decide | sample"))?.to_string(), @@ -490,11 +490,13 @@ fn build_base(doc: &Json) -> R> { "comment" => {} "tier" => { need(x.as_str() == Some("amplitude"), &p, "amplitude (the one optional tier; absent = the default tiers)")?; eng.amp = true; } "q_max" => eng.q_max = num(Some(x), &p, Some(1.0), Some(16.0), true)? as usize, + "amplify" => eng.amplify = if let Json::Bool(b) = x { *b } else { return Err(perr(&p, "true | false")) }, "polish_sweeps" => eng.polish_sweeps = num(Some(x), &p, Some(0.0), Some(1e9), true)? as usize, "sweeps" => eng.sweeps = num(Some(x), &p, Some(1.0), Some(1e9), true)? as usize, "exact_limit" => eng.exact_limit = num(Some(x), &p, Some(1.0), Some(1e9), true)? as u64, _ => eng.chains = num(Some(x), &p, Some(1.0), Some(MAX_CHAINS), true)? as usize, } } } + if eng.amplify && !eng.amp { return Err(perr(&at("engine", "amplify"), "true needs tier: amplitude (amplification acts on the amplitude register)")); } // line let lkv: &[(String, Json)] = match get_t(kv, "line") { Some(l) => keys(l, "line", &["max_tokens", "order", "prefix", "why_past", "block", "comment"], &[])?, None => &[] }; // RFC 0008 E: `line.block` puts the engine-rendered block in every stance document (a persona with a bound or a coupling has it) @@ -2863,14 +2865,14 @@ fn decode(p: &Persona, st: &State, program: &str, meta: &Meta, doc: &Json, confl // ------------------------------------------------------------------------------------------------------------ turns fn solve(p: &Persona, st: &State, prog: &Json, eng: Engine, calls: &mut usize) -> Json { *calls += 1; let was = crate::trace::enter(crate::trace::Phase::Solve); - let r = if p.eng.amp { amplitude_tier(prog, p.eng.q_max).unwrap_or_else(|why| declined(eng(prog, &flags(p, st)), &why)) } else { eng(prog, &flags(p, st)) }; + let r = if p.eng.amp { amplitude_tier(prog, p.eng.q_max, p.eng.amplify).unwrap_or_else(|why| declined(eng(prog, &flags(p, st)), &why)) } else { eng(prog, &flags(p, st)) }; crate::trace::enter(was); r } /// RFC 0011 (research): the amplitude tier on a program (`run::amplitude`); Err(why) when it does not take it #[cfg(feature = "decide")] -fn amplitude_tier(prog: &Json, q_max: usize) -> Result { crate::run::amplitude(prog, q_max) } +fn amplitude_tier(prog: &Json, q_max: usize, amplify: bool) -> Result { crate::run::amplitude(prog, q_max, amplify) } #[cfg(not(feature = "decide"))] -fn amplitude_tier(_: &Json, _: usize) -> Result { Err("this build has no amplitude tier (feature decide)".into()) } +fn amplitude_tier(_: &Json, _: usize, _: bool) -> Result { Err("this build has no amplitude tier (feature decide)".into()) } /// The existing tiers' answer, with the receipt of why the amplitude tier did not run fn declined(mut doc: Json, why: &str) -> Json { if let Json::Obj(v) = &mut doc { v.push(("amplitude".into(), Json::Str(format!("declined: {why}")))); } doc } @@ -4505,6 +4507,33 @@ mod tests { assert!(g(&e, &["engine", "amplitude"]).is_null() && g(&e, &["engine", "qubits"]).is_null()); assert_eq!(err(build(&json::parse(&DOC.replace("LEARN", r#","engine":{"tier":"pbit"}"#)).unwrap())), "engine.tier: amplitude (the one optional tier; absent = the default tiers)"); } + /// RFC 0011 round 4 (research): `engine.amplify: true` rotates each component's register onto its feasible plans by exact + /// amplitude amplification instead of projecting: the stance is the projection's (plan, odds, line), the receipt carries + /// `amplify` and feasible mass 1, the strand verifies; `amplify: false` is the round-3 behaviour; without the tier it is refused + #[cfg(feature = "decide")] + #[test] + fn amplify_lands_on_the_projection_and_logs_it() { + use crate::strand::{self, Clock, Live}; + let base = include_str!("../../examples/persona/tutor.yaml").replace("\r\n", "\n"); + let mk = |extra: &str| { let doc = crate::yaml::load(&base.replace("engine:\n", &format!("engine:\n tier: amplitude\n{extra}"))).ok().unwrap(); (build(&doc).unwrap(), doc) }; + let ((pj, _), (pf, _), (pa, doc)) = (mk(""), mk(" amplify: false\n"), mk(" amplify: true\n")); + let keep = |d: &Json| { let mut d = d.clone(); if let Json::Obj(v) = &mut d { v.retain(|(k, _)| !["persona", "engine", "state_digest"].contains(&k.as_str())); } canon(&d) }; + let (sj, sf, sa) = (init(&pj, Some(2), true, &run), init(&pf, Some(2), true, &run), init(&pa, Some(2), true, &run)); + for raw in [r#"{"elapsed_hours":1,"praise":true}"#, r#"{"elapsed_hours":2}"#, r#"{"elapsed_hours":1,"correction":true}"#] { + let raw = json::parse(raw).unwrap(); let (a, _) = turn(&pj, &sj, &raw, false, &run, false).unwrap(); let (f, _) = turn(&pf, &sf, &raw, false, &run, false).unwrap(); + let (b, _) = turn(&pa, &sa, &raw, false, &run, false).unwrap(); + assert_eq!(canon(&g(&a, &["engine"])), canon(&g(&f, &["engine"]))); assert!(g(&a, &["engine", "amplify"]).is_null()); + assert_eq!(keep(&a), keep(&b), "the stance with amplify is the projection's"); + assert_eq!(g(&b, &["engine", "feasible_mass"]).as_f64(), Some(1.0)); let am = g(&b, &["engine", "amplify"]); + let it = am.get("iterations").and_then(Json::as_arr).unwrap(); assert_eq!(it.len(), g(&b, &["engine", "components"]).as_arr().unwrap().len()); + assert!(it.iter().any(|x| x.as_f64().unwrap() >= 1.0), "{}", canon(&am)); assert_eq!(am.get("mass_after").and_then(Json::as_f64), Some(1.0)); + assert_eq!(am.get("mass_before").and_then(Json::as_f64), g(&a, &["engine", "feasible_mass"]).as_f64()); } + let (mut live, header) = Live::start(pa.clone(), &doc, sa, Clock::Fixed, "probbit test"); let mut lines = vec![header]; + for raw in [r#"{"elapsed_hours":1,"praise":true}"#, r#"{"elapsed_hours":2}"#] { let (_, l) = live.event(&json::parse(raw).unwrap(), &run).unwrap(); lines.push(l); } + assert!(strand::verify(&(lines.join("\n") + "\n"), &run).is_ok()); + let e = err(build(&crate::yaml::load(&base.replace("engine:\n", "engine:\n amplify: true\n")).ok().unwrap())); + assert!(e.starts_with("engine.amplify: true needs tier: amplitude"), "{e}"); + } /// The boxed setup API is the by-value one: the same persona, state, header and individual #[test] fn the_boxed_setup_is_the_by_value_setup() { diff --git a/probbit-persona/src/run.rs b/probbit-persona/src/run.rs index ec0d8f4..826d37f 100644 --- a/probbit-persona/src/run.rs +++ b/probbit-persona/src/run.rs @@ -460,8 +460,14 @@ pub fn item_bars(g: &Gate) -> Vec { g.sig_tv.iter().zip(&g.sig_tv_long).map /// component its most probable feasible plan (probabilities at 6 decimals, then the lowest basis index); marginals exact. The /// receipt: qubits (encoded, summed), the components' qubits, the digests of the encoding, the circuit, the schedule and the /// final amplitudes (6 decimals; the components' texts joined), the mixer's and the schedule's names, the feasible mass. +/// Round 4, `amplify` (`engine.amplify: true`): no projection; each component's swept state is rotated onto its feasible plans +/// by exact amplitude amplification (`amp::amplify_exact`: the rules as the oracle, the diffusion about the swept state, one +/// phase-matched final iteration), so the register itself holds feasible mass 1 (up to 1e-12) and the plan and marginals are +/// read from its Born probabilities; the receipt adds `amplify` (iterations and the final phases per component, the mass +/// before and after) and `feasible_mass` is the mass after. The relative amplitudes inside the feasible plans are the swept +/// state's, so the numbers equal the projection's (docs/rfc/0011-amplitude-register.md, "Amplification"). #[cfg(feature = "decide")] -pub fn amplitude(prog: &Json, q_max: usize) -> Result { +pub fn amplitude(prog: &Json, q_max: usize, amplify: bool) -> Result { use probbit_decide::amp; let p = from_json(prog).map_err(|e| format!("program {}: {}", e.path, e.msg))?; let m = &p.m; let (n, k) = (m.n, m.k); let cand: Vec> = (0..n).map(|i| (0..k).filter(|&v| m.ok(i, v)).collect()).collect(); @@ -481,6 +487,7 @@ pub fn amplitude(prog: &Json, q_max: usize) -> Result { let s = amp::DEFAULT_SCHEDULE; let r6 = |x: f64| (x * 1e6).round() / 1e6; let (mut enc_t, mut circ_t, mut state_t) = (String::new(), String::new(), String::new()); let mut bp = vec![0usize; n]; let mut mg = vec![0.0; n * k]; let mut mass_all = 1.0; + let (mut am_it, mut am_ph, mut am_before) = (vec![], vec![], 1.0); for (c, mem) in mems.iter().enumerate() { // the component's sub-model: its variables, pairs and capacity rules (local indices), as the components tier builds it let mut loc = vec![usize::MAX; n]; for (q, &i) in mem.iter().enumerate() { loc[i] = q; } @@ -493,7 +500,20 @@ pub fn amplitude(prog: &Json, q_max: usize) -> Result { let enc = &encs[c]; let nb = 1usize << qs[c]; let plan_of = |codes: &[usize]| -> Vec { codes.iter().zip(mem).map(|(&cd, &i)| cand[i][cd]).collect() }; let e: Vec = (0..nb).map(|x| enc.decode(x).map_or(f64::NAN, |cd| -sub.logw(&plan_of(&cd)))).collect(); - let reg = amp::sweep(enc, &e, &s); + let mut reg = amp::sweep(enc, &e, &s); + if amplify { + let ok: Vec = (0..nb).map(|x| enc.decode(x).is_some_and(|cd| sub.violations(&plan_of(&cd)) == 0)).collect(); + let a = amp::amplify_exact(&mut reg, |x| ok[x]).ok_or_else(|| format!("component {c}: no feasible plan has weight in the register"))?; + let pr = reg.probabilities(); + let best = (0..nb).fold(usize::MAX, |bx, x| if enc.decode(x).is_some() && pr[x] > 0.0 && (bx == usize::MAX || r6(pr[x]) > r6(pr[bx])) { x } else { bx }); + for (&i, v) in mem.iter().zip(plan_of(&enc.decode(best).expect("a plan with weight has valid codes"))) { bp[i] = v; } + for (x, &w) in pr.iter().enumerate() { if let Some(cd) = enc.decode(x) { for (&i, v) in mem.iter().zip(plan_of(&cd)) { mg[i * k + v] += w; } } } + mass_all *= a.mass_after; am_before *= a.mass_before; am_it.push(num(a.iterations as f64)); + am_ph.push(Json::Arr(if a.iterations == 0 { vec![] } else { vec![num(r6(a.phases.0)), num(r6(a.phases.1))] })); + for t in [&mut enc_t, &mut circ_t, &mut state_t] { t.push_str(&format!("component {c}\n")); } + enc_t.push_str(&enc.text()); circ_t.push_str(®.circuit_text()); state_t.push_str(®.canonical()); + continue; + } let pr: Vec = reg.probabilities().iter().enumerate().map(|(x, &w)| match enc.decode(x) { Some(cd) if sub.violations(&plan_of(&cd)) == 0 => w, _ => 0.0 }).collect(); let mass: f64 = pr.iter().sum(); if mass <= 0.0 || !mass.is_finite() { return Err(format!("component {c}: no feasible plan has weight in the register")); } let best = (0..nb).fold(usize::MAX, |bx, x| if pr[x] > 0.0 && (bx == usize::MAX || r6(pr[x] / mass) > r6(pr[bx] / mass)) { x } else { bx }); @@ -504,9 +524,10 @@ pub fn amplitude(prog: &Json, q_max: usize) -> Result { enc_t.push_str(&enc.text()); circ_t.push_str(®.circuit_text()); state_t.push_str(®.canonical()); } let d = |t: &[u8]| jstr(&format!("sha256:{}", amp::hex(&::sha256(t)))); + let amp_r = if amplify { vec![("amplify", obj(vec![("iterations", Json::Arr(am_it)), ("phases", Json::Arr(am_ph)), ("mass_before", num(r6(am_before))), ("mass_after", num(r6(mass_all)))]))] } else { vec![] }; Ok(obj(vec![("verdict", jstr("exact")), ("tier", jstr("amplitude")), ("plan", plan(&p, &bp)), ("plan_logw", num(m.logw(&bp))), ("violations", num(m.violations(&bp) as f64)), ("marginals", marginals(&p, &mg)), ("released", ids(&p, &vec![true; n], true)), ("escalated", Json::Arr(vec![])), ("amplitude", obj(vec![("qubits", num(qs.iter().sum::() as f64)), ("components", Json::Arr(qs.iter().map(|&q| num(q as f64)).collect())), ("encoding", d(enc_t.as_bytes())), ("mixer", jstr(amp::MIXER)), ("circuit", d(circ_t.as_bytes())), ("schedule", d(s.text().as_bytes())), ("schedule_name", jstr(&s.name())), - ("state", d(state_t.as_bytes())), ("feasible_mass", num(r6(mass_all)))]))])) + ("state", d(state_t.as_bytes())), ("feasible_mass", num(r6(mass_all)))].into_iter().chain(amp_r).collect()))])) } From 237fe78c507fb8f41ff3c96ba6d31e834431a56a Mon Sep 17 00:00:00 2001 From: Gravity Send Date: Tue, 27 Oct 2026 21:51:53 -0700 Subject: [PATCH 06/20] RFC 0011 round 4 (research): docs, the amplification argument and its numbers, an exact simulated qubit register on a CPU docs/rfc/0011-amplitude-register.md: the amplification design bullet and section 5 "Amplification (round 4)": why exact amplification lands on the projection's distribution (every step stays in the plane of the swept state's feasible and infeasible parts; the matched final step lands on the feasible part), measured: marginals equal to 1.1e-12 on 220 programs, the same plan on 220/220 and on all 339,389 solves of the recorded corpus (B4 unchanged, 96.29 %), 287/287 stance lines on a recorded day, cost 1.02x, no_std stack 2,016 B, 100 lives replay byte for byte. docs/persona.md: the `engine.amplify` key. CHANGELOG Research entry. Simulated exactly on a CPU; no quantum hardware, no speedup claim. --- CHANGELOG.md | 8 +++++++ docs/persona.md | 6 ++++- docs/rfc/0011-amplitude-register.md | 36 ++++++++++++++++++++++++++++- 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 09b9bb1..b1ea70a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -105,6 +105,14 @@ All notable changes to this project are documented here. The format follows ### Research +- **RFC 0011, round 4: exact amplitude amplification in place of the projection** (research, `engine.amplify: true`, off by + default; docs/rfc/0011-amplitude-register.md, "Amplification"). `amp::amplify_exact`: the rules as the oracle, the diffusion + about the swept state, k standard iterations and one phase-matched final one, so the simulated register lands on its + feasible plans exactly (mass ≥ 1 − 1e-12, asserted). The plane argument says the result is the projection's distribution; + measured: marginals equal to 1.1e-12 on 220 programs, the same plan on 220/220 and on all 339,389 solves of the recorded corpus (B4 unchanged, 96.29 %), + 287/287 stance lines on a recorded day; + cost 1.02× the projected solve. The receipt adds `engine.amplify` and `feasible_mass` becomes 1. Without the key every stance + and strand is byte-identical to round 3. Simulated exactly on a CPU; no quantum hardware, no speedup claim. - **RFC 0011, round 3: the verdict, KEEP as an optional tier** (research, off by default; docs/rfc/0011-amplitude-register.md, status "accepted as optional tier"). Measured on every program the recorded corpus's 653 outputs solve (338,567 exact solves, 0 declined, the corpus byte-identical with the comparison beside it): the exact simulated register picks the same level as the diff --git a/docs/persona.md b/docs/persona.md index 500427d..c6b4946 100644 --- a/docs/persona.md +++ b/docs/persona.md @@ -232,6 +232,7 @@ engine: on_conflict: fallback # fallback | yield: when habits contradict, the lower-priority one yields (section 5.5) # tier: amplitude # research (RFC 0011, draft): an exact simulated qubit register on a CPU; absent = the default tiers # q_max: 12 # the most encoded qubits (ceil(log2 d) per variable) in one component the amplitude tier takes (1-16) + # amplify: false # research (RFC 0011, round 4): with the tier, exact amplitude amplification in place of the projection line: max_tokens: 40 # estimated tokens (max of chars / 4 and 4/3 per word) order: [verbosity, caution, directness, warmth, humour, initiative, formality, curiosity] @@ -247,7 +248,10 @@ plans that obey them, when the largest component has at most `q_max` encoded qub `qubits`, `components`, `encoding`, `mixer`, `circuit`, `schedule`, `schedule_name`, `state` (sha256 digests of the encoding, the layer list, the schedule and the final amplitudes at 6 decimals) and `feasible_mass`; `live verify` recomputes them from the strand. Without the key nothing changes, byte for byte. An engine -without the tier reports a strand that uses it as `unsupported by this engine: engine.tier` (exit 5). The register is a +without the tier reports a strand that uses it as `unsupported by this engine: engine.tier` (exit 5). `engine.amplify: true` +(research, round 4; needs the tier) replaces the projection by exact amplitude amplification: the rules are the oracle, the +register is rotated onto the plans that obey them, the stance is the projection's (the same plan and odds, measured equal to +1.1e-12) and `engine.amplify` logs the iterations, the final phases and the mass before and after (`feasible_mass` 1). The register is a simulation: no quantum hardware, no speedup claim; its stances agree with the default tier in 96 % of trait decisions on the recorded corpus (RFC 0011, round 3). With the key, `persona bound` probes through the tier: compute the certificate again with it, since one computed without the key does not cover the tier. diff --git a/docs/rfc/0011-amplitude-register.md b/docs/rfc/0011-amplitude-register.md index 85a1cd5..3456aa3 100644 --- a/docs/rfc/0011-amplitude-register.md +++ b/docs/rfc/0011-amplitude-register.md @@ -4,7 +4,9 @@ Status: **accepted as optional tier (research; off by default)**, round 3. Verdi of 2,176,371 trait decisions on the recorded corpus agree with the exact default tier; B5 passes (three designed programs differ from the thermal odds by 0.25-0.27 at the node; 0 of 4,100 bound cases exceed a certificate computed with the tier). Nothing in this RFC changes a release or `main`; the tier stays off unless a persona asks for it. Turning it on changes the bound -certificate: compute it again with the tier (section 5). +certificate: compute it again with the tier (section 5). Round 4 adds `engine.amplify` (off by default): exact amplitude +amplification in place of the projection, which lands on the projection's numbers with feasible mass 1 (section 5, +"Amplification"). ## 1. What it is, in one paragraph @@ -74,6 +76,13 @@ RFC is closed with that number. Both outcomes are publishable with receipts. computed from the persona file, so with `engine.tier: amplitude` in the file `persona bound` probes through the tier and its epsilon changes; a certificate computed without the flag does not cover the tier (measured in round 3, section 5). Public text, if any: "an exact simulated qubit register as an optional solver tier for small programs; measured against the default tier; no quantum hardware". +- **Amplification (round 4, `engine.amplify: true`, off by default).** Instead of projecting, each component's swept state + |ψ⟩ is rotated onto its feasible plans: the rules are the oracle (a phase on the plans that obey them), the diffusion is + about the stored |ψ⟩, k = ⌊π/(4θ) − 1/2⌋ standard iterations with θ = asin √a₀ (a₀ the feasible mass) and one final + iteration whose two phases are chosen so that it lands exactly (`amp::amplify_exact`; mass after asserted ≥ 1 − 1e-12). + Plan and marginals are read from the register's own Born probabilities. The receipt adds `engine.amplify` (iterations and + the final phases per component, the mass before and after) and `feasible_mass` is the mass after (1.000000); the layer list + logs `oracle` and `diffuse` lines. The register holds a second copy of |ψ⟩ while it amplifies (16 · 2^q bytes more). - Scope (rounds 1-2): the tier answers the turn's solves (the stance and its habit checks). The rest position at the start, the expectation's members and the trajectory stay on the existing tiers. @@ -127,6 +136,31 @@ Verdict: **KEEP as an optional tier** (research; off by default). It reproduces differs where the thermal answer is nearly indifferent; it adds interference where designed programs have two paths. Not verified: silicon cost and replay on a chip. +### Amplification (round 4) + +Why it changes nothing in the stance, and why that is the point. Write the swept state as |ψ⟩ = sin θ |g⟩ + cos θ |b⟩, with +|g⟩ its normalised part on the plans that obey the rules and |b⟩ the rest. A phase on the feasible plans and the diffusion +about |ψ⟩ both map the plane of |g⟩ and |b⟩ into itself, so every state the amplification visits is α|g⟩ + β|b⟩; one final +iteration with matched phases makes β exactly 0, and the result is |g⟩ up to a global phase. Its Born probability on a +feasible plan x is |ψ_x|² / a₀, which is what the projection computes by renormalising. So the plan and the odds are the +projection's, and the feasible mass is 1: the projection was never an approximation layered over the register, it is the +distribution exact amplification produces by a unitary evolution, simulated exactly on a CPU. Nothing in the argument depends +on the program or the rules; it needs only the exact landing. + +Measured (x86_64 host): on 220 programs (200 random mixed two- and three-level programs and 20 designed ones, a rule each: +seeded random plan subsets at densities 0.03-0.8 or "at most one variable at its top level"; a₀ from 1.7e-06 to 1, 0 to 611 +iterations) the marginals with amplification differ from the projection's by at most 1.1e-12 (bar 1e-9), the feasible mass +after is at least 1 − 3.3e-13 (bar 1 − 1e-12; the largest drift, 1.1e-12 above 1, after 611 iterations), and the most +probable plan is the same on 220 of 220. On every program the recorded corpus solves (339,389 exact solves, each run both +ways) the plans are equal on 339,389 of 339,389 and the marginals differ by at most 2.1e-13, so B4 is round 3's to the +decision: 2,095,627 of 2,176,371 = 96.29 %. A 287-event recorded +day of a 52-qubit persona gives the same stance line on 287 of 287 events (per component 1-2 iterations: the per-component +mass is mostly near 1 and the receipt's small product, median 0.058, multiplies 11 components). Cost: 1.02× the projected +solve on that day (1.19 vs 1.17 ms per event) and 1.06× on a 16-qubit component at a₀ = 0.022 (5 iterations); no_std stack +high-water 2,016 B at q 8 and 12. 100 lives with amplification replay byte for byte on x86_64 and on the no_std build, 0 +floats past 6 decimals, and an engine without the tier exits 5. Turning it on therefore buys a receipt whose register holds feasible mass 1 and logs +how it got there; it does not buy a different stance. + ## 6. What this RFC does not claim That a CPU can do what quantum hardware does at scale (it cannot: section 1), that the register has experiences (it is From 1b2948137259f281514b5f871b2984e540bfa263 Mon Sep 17 00:00:00 2001 From: Gravity Send Date: Tue, 27 Oct 2026 21:53:40 -0700 Subject: [PATCH 07/20] RFC 0011 round 4 (research): docs/persona.md says the amplification is simulated on a CPU The engine.amplify sentence now names it as what it is: exact amplitude amplification of a simulated qubit register, run on a CPU. Docs only. --- docs/persona.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/persona.md b/docs/persona.md index c6b4946..4f33dc3 100644 --- a/docs/persona.md +++ b/docs/persona.md @@ -249,8 +249,8 @@ plans that obey them, when the largest component has at most `q_max` encoded qub the layer list, the schedule and the final amplitudes at 6 decimals) and `feasible_mass`; `live verify` recomputes them from the strand. Without the key nothing changes, byte for byte. An engine without the tier reports a strand that uses it as `unsupported by this engine: engine.tier` (exit 5). `engine.amplify: true` -(research, round 4; needs the tier) replaces the projection by exact amplitude amplification: the rules are the oracle, the -register is rotated onto the plans that obey them, the stance is the projection's (the same plan and odds, measured equal to +(research, round 4; needs the tier) replaces the projection by exact amplitude amplification, simulated on a CPU: the +rules are the oracle, the register is rotated onto the plans that obey them, the stance is the projection's (the same plan and odds, measured equal to 1.1e-12) and `engine.amplify` logs the iterations, the final phases and the mass before and after (`feasible_mass` 1). The register is a simulation: no quantum hardware, no speedup claim; its stances agree with the default tier in 96 % of trait decisions on the recorded corpus (RFC 0011, round 3). With the key, `persona bound` probes through the tier: compute the certificate again with From c06c9524a0f59f4bbbaad90fa5fc34a1e55305e7 Mon Sep 17 00:00:00 2001 From: Gravity Send Date: Wed, 28 Oct 2026 02:19:29 -0700 Subject: [PATCH 08/20] RFC 0011 round 5 (research): the register's schedule as a named option, an exact simulated qubit register on a CPU probbit-decide::amp: `Evolution` (a transverse-field sweep or QAOA layers) with `named`, `run`, `text`, `name`; three names in SCHEDULE_NAMES: tf-linear-16x4 (DEFAULT_SCHEDULE, unchanged), tf-linear-64x16 (LONG_SCHEDULE: 4x the steps and the time, about 4x the layers) and qaoa-p2 (QAOA_P2: two layers, gamma 0.500000 beta 0.500000, gamma 1.500000 beta 0.250000, fixed by a grid search on a held-out third of the recorded corpus's programs, then frozen). A sweep's schedule text and name are Schedule's, so the default's receipt is unchanged. probbit-persona: `engine.schedule: ` (needs `tier: amplitude`; an unknown name is refused like every other bad key); absent or `tf-linear-16x4` = the default sweep, byte for byte; run::amplitude_with(prog, q_max, amplify, evolution), and run::amplitude is it with the default. The receipt's `schedule` digest and `schedule_name` name the evolution. Tests: the named evolutions run what they name; the default name equals the absent key; the other two name themselves in the receipt, keep feasible mass 1 with amplify and their strands verify; an unknown name and the key without the tier are refused. --- probbit-decide/src/amp.rs | 41 ++++++++++++++++++++++++++++++ probbit-persona/src/persona.rs | 46 +++++++++++++++++++++++++++++----- probbit-persona/src/run.rs | 9 ++++--- 3 files changed, 87 insertions(+), 9 deletions(-) diff --git a/probbit-decide/src/amp.rs b/probbit-decide/src/amp.rs index 8eee6b0..1bcf591 100644 --- a/probbit-decide/src/amp.rs +++ b/probbit-decide/src/amp.rs @@ -268,6 +268,36 @@ impl Schedule { } /// The tier's fixed default schedule (rounds 1 and 2; schedules are a later round's study) pub const DEFAULT_SCHEDULE: Schedule = Schedule { steps: 16, time: 4.0 }; +/// Round 5: the longer sweep (`engine.schedule: tf-linear-64x16`): 4x the default's steps and time, so about 4x its layers +pub const LONG_SCHEDULE: Schedule = Schedule { steps: 64, time: 16.0 }; +/// Round 5: the two layers (gamma, beta) of `engine.schedule: qaoa-p2`, fixed by a grid search on a held-out third of the P0 +/// corpus programs (the largest median separation on the decisions the thermal tier is indifferent on, subject to agreement +/// >= 90 % on the others; docs/rfc/0011-amplitude-register.md, "Schedules and the indifferent set"), then frozen: gamma 0.500000, +/// beta 0.500000, then gamma 1.500000, beta 0.250000 +pub const QAOA_P2: [(f64, f64); 2] = [(0.5, 0.5), (1.5, 0.25)]; +/// Round 5: the names `engine.schedule` accepts (the first is the default) +pub const SCHEDULE_NAMES: [&str; 3] = ["tf-linear-16x4", "tf-linear-64x16", "qaoa-p2"]; +/// Round 5: the evolution the tier runs on each component: a transverse-field sweep or QAOA layers +#[derive(Clone, Debug, PartialEq)] +pub enum Evolution { Sweep(Schedule), Qaoa(Vec<(f64, f64)>) } +impl Evolution { + /// The evolution of a name in `SCHEDULE_NAMES` (None for any other name) + pub fn named(name: &str) -> Option { + match name { "tf-linear-16x4" => Some(Evolution::Sweep(DEFAULT_SCHEDULE)), "tf-linear-64x16" => Some(Evolution::Sweep(LONG_SCHEDULE)), + "qaoa-p2" => Some(Evolution::Qaoa(QAOA_P2.to_vec())), _ => None } + } + /// The register after the evolution from the uniform start + pub fn run(&self, enc: &Encoding, e: &[f64]) -> Register { match self { Evolution::Sweep(s) => sweep(enc, e, s), Evolution::Qaoa(p) => qaoa_on(enc, e, p) } } + /// The canonical text the schedule digest hashes (a sweep's is `Schedule::text`, unchanged) + pub fn text(&self) -> String { + match self { Evolution::Sweep(s) => s.text(), + Evolution::Qaoa(p) => { let mut t = format!("qaoa layers {}\n", p.len()); for &(g, b) in p { t.push_str(&format!("gamma {} beta {}\n", f6(g), f6(b))); } t } } + } + /// The receipt's `schedule_name` (a sweep's is `Schedule::name`, unchanged) + pub fn name(&self) -> String { + match self { Evolution::Sweep(s) => s.name(), Evolution::Qaoa(p) if p[..] == QAOA_P2[..] => "qaoa-p2".into(), Evolution::Qaoa(p) => format!("qaoa-p{}-lab", p.len()) } + } +} /// The bar on the Born mass of the unused codes, checked after every layer (it is 0 by construction; never renormalised) pub const INVALID_MASS_MAX: f64 = 1e-15; @@ -407,6 +437,17 @@ mod tests { let mut r = Register::uniform(&enc); assert!(amplify_exact(&mut r, |_| false).is_none()); let mut r = Register::uniform(&enc); assert_eq!(amplify_exact(&mut r, |x| enc.decode(x).is_some()).unwrap().iterations, 0); } + /// Round 5: the named evolutions: the default name is `sweep` with the default schedule (the same register, text and name), + /// the long sweep has 4x the layers, qaoa-p2 two layers with the frozen angles; an unknown name is None + #[test] + fn named_schedules_run_what_they_name() { + let enc = Encoding { levels: vec![3, 2] }; let e: Vec = (0..8).map(|x| enc.decode(x).map_or(f64::NAN, |v| -[0.4, -0.2, 0.9][v[0]] - 0.3 * v[1] as f64)).collect(); + let d = Evolution::named(SCHEDULE_NAMES[0]).unwrap(); assert_eq!(d, Evolution::Sweep(DEFAULT_SCHEDULE)); + assert_eq!(d.run(&enc, &e).amplitudes(), sweep(&enc, &e, &DEFAULT_SCHEDULE).amplitudes()); assert_eq!((d.text(), d.name()), (DEFAULT_SCHEDULE.text(), DEFAULT_SCHEDULE.name())); + let l = Evolution::named(SCHEDULE_NAMES[1]).unwrap(); assert_eq!(l.run(&enc, &e).circuit_text().lines().count(), 4 * d.run(&enc, &e).circuit_text().lines().count()); + let q = Evolution::named(SCHEDULE_NAMES[2]).unwrap(); assert_eq!(q.name(), "qaoa-p2"); assert_eq!(q.run(&enc, &e).amplitudes(), qaoa_on(&enc, &e, &QAOA_P2).amplitudes()); + assert_eq!(q.text(), "qaoa layers 2\ngamma 0.500000 beta 0.500000\ngamma 1.500000 beta 0.250000\n"); assert!(Evolution::named("tf-linear-8x2").is_none()); + } #[test] fn measure_and_digest_are_deterministic() { let p = Ising { q: 4, a: vec![0.5, 0.1, -0.3, 0.2], b: vec![(0, 3, 0.4)] }; diff --git a/probbit-persona/src/persona.rs b/probbit-persona/src/persona.rs index efc938c..79d7d1b 100644 --- a/probbit-persona/src/persona.rs +++ b/probbit-persona/src/persona.rs @@ -165,7 +165,9 @@ struct Habit { id: String, when: Vec<(String, Json)>, then: Vec<(String, Json)>, #[derive(Clone)] struct Eng { op: String, sweeps: usize, polish_sweeps: usize, exact_limit: u64, chains: usize, twin: bool, positional: bool, yields: bool, /// RFC 0011 (research): `tier: amplitude` (off when absent) and its `q_max` (default 12); round 4: `amplify` (default false) - amp: bool, q_max: usize, amplify: bool } + amp: bool, q_max: usize, amplify: bool, + /// round 5: `schedule` (a name in `amp::SCHEDULE_NAMES`; absent = the default sweep, the receipt unchanged) + schedule: Option } /// bounded learning (docs/persona.md §2.8): `from` = the reward flag, then (optional) the correction flag; the traits whose learned /// deltas move; the step and total caps (natural-log weights); `credit` = action-addressed feedback, when declared #[derive(Clone)] @@ -479,8 +481,8 @@ fn build_base(doc: &Json) -> R> { for (i, hb) in list(get(kv, "habits"), "habits")?.iter().enumerate() { habits.push(habit_spec(hb, &ix("habits", i), &inputs, &history, &vars, &steps)?); } need((1..habits.len()).all(|i| habits[..i].iter().all(|h| h.id != habits[i].id)), "habits", "habit ids must be distinct")?; // engine - let mut eng = Eng { op: "decide".into(), sweeps: 2000, polish_sweeps: 200, exact_limit: 2_000_000, chains: 4, twin: true, positional: true, yields: false, amp: false, q_max: 12, amplify: false }; - if let Some(e) = get_t(kv, "engine") { let ekv = keys(e, "engine", &["op", "sweeps", "polish_sweeps", "exact_limit", "chains", "twin", "values", "on_conflict", "tier", "q_max", "amplify", "comment"], &[])?; + let mut eng = Eng { op: "decide".into(), sweeps: 2000, polish_sweeps: 200, exact_limit: 2_000_000, chains: 4, twin: true, positional: true, yields: false, amp: false, q_max: 12, amplify: false, schedule: None }; + if let Some(e) = get_t(kv, "engine") { let ekv = keys(e, "engine", &["op", "sweeps", "polish_sweeps", "exact_limit", "chains", "twin", "values", "on_conflict", "tier", "q_max", "amplify", "schedule", "comment"], &[])?; for (k, x) in ekv { let p = at("engine", k); match k.as_str() { "op" => eng.op = x.as_str().filter(|o| ["decide", "sample"].contains(o)).ok_or_else(|| perr(&p, "decide | sample"))?.to_string(), @@ -491,12 +493,14 @@ fn build_base(doc: &Json) -> R> { "tier" => { need(x.as_str() == Some("amplitude"), &p, "amplitude (the one optional tier; absent = the default tiers)")?; eng.amp = true; } "q_max" => eng.q_max = num(Some(x), &p, Some(1.0), Some(16.0), true)? as usize, "amplify" => eng.amplify = if let Json::Bool(b) = x { *b } else { return Err(perr(&p, "true | false")) }, + "schedule" => eng.schedule = Some(x.as_str().filter(|n| SCHEDULE_NAMES.contains(n)).ok_or_else(|| perr(&p, "tf-linear-16x4 | tf-linear-64x16 | qaoa-p2"))?.to_string()), "polish_sweeps" => eng.polish_sweeps = num(Some(x), &p, Some(0.0), Some(1e9), true)? as usize, "sweeps" => eng.sweeps = num(Some(x), &p, Some(1.0), Some(1e9), true)? as usize, "exact_limit" => eng.exact_limit = num(Some(x), &p, Some(1.0), Some(1e9), true)? as u64, _ => eng.chains = num(Some(x), &p, Some(1.0), Some(MAX_CHAINS), true)? as usize, } } } if eng.amplify && !eng.amp { return Err(perr(&at("engine", "amplify"), "true needs tier: amplitude (amplification acts on the amplitude register)")); } + if eng.schedule.is_some() && !eng.amp { return Err(perr(&at("engine", "schedule"), "needs tier: amplitude (the schedule is the amplitude register's evolution)")); } // line let lkv: &[(String, Json)] = match get_t(kv, "line") { Some(l) => keys(l, "line", &["max_tokens", "order", "prefix", "why_past", "block", "comment"], &[])?, None => &[] }; // RFC 0008 E: `line.block` puts the engine-rendered block in every stance document (a persona with a bound or a coupling has it) @@ -2865,14 +2869,18 @@ fn decode(p: &Persona, st: &State, program: &str, meta: &Meta, doc: &Json, confl // ------------------------------------------------------------------------------------------------------------ turns fn solve(p: &Persona, st: &State, prog: &Json, eng: Engine, calls: &mut usize) -> Json { *calls += 1; let was = crate::trace::enter(crate::trace::Phase::Solve); - let r = if p.eng.amp { amplitude_tier(prog, p.eng.q_max, p.eng.amplify).unwrap_or_else(|why| declined(eng(prog, &flags(p, st)), &why)) } else { eng(prog, &flags(p, st)) }; + let r = if p.eng.amp { amplitude_tier(prog, p.eng.q_max, p.eng.amplify, p.eng.schedule.as_deref()).unwrap_or_else(|why| declined(eng(prog, &flags(p, st)), &why)) } else { eng(prog, &flags(p, st)) }; crate::trace::enter(was); r } /// RFC 0011 (research): the amplitude tier on a program (`run::amplitude`); Err(why) when it does not take it #[cfg(feature = "decide")] -fn amplitude_tier(prog: &Json, q_max: usize, amplify: bool) -> Result { crate::run::amplitude(prog, q_max, amplify) } +fn amplitude_tier(prog: &Json, q_max: usize, amplify: bool, schedule: Option<&str>) -> Result { + match schedule.and_then(probbit_decide::amp::Evolution::named) { Some(ev) => crate::run::amplitude_with(prog, q_max, amplify, &ev), None => crate::run::amplitude(prog, q_max, amplify) } +} #[cfg(not(feature = "decide"))] -fn amplitude_tier(_: &Json, _: usize, _: bool) -> Result { Err("this build has no amplitude tier (feature decide)".into()) } +fn amplitude_tier(_: &Json, _: usize, _: bool, _: Option<&str>) -> Result { Err("this build has no amplitude tier (feature decide)".into()) } +/// RFC 0011 round 5 (research): the names `engine.schedule` accepts (`probbit_decide::amp::SCHEDULE_NAMES`; checked by a test) +const SCHEDULE_NAMES: [&str; 3] = ["tf-linear-16x4", "tf-linear-64x16", "qaoa-p2"]; /// The existing tiers' answer, with the receipt of why the amplitude tier did not run fn declined(mut doc: Json, why: &str) -> Json { if let Json::Obj(v) = &mut doc { v.push(("amplitude".into(), Json::Str(format!("declined: {why}")))); } doc } @@ -4534,6 +4542,32 @@ mod tests { let e = err(build(&crate::yaml::load(&base.replace("engine:\n", "engine:\n amplify: true\n")).ok().unwrap())); assert!(e.starts_with("engine.amplify: true needs tier: amplitude"), "{e}"); } + /// RFC 0011 round 5 (research): `engine.schedule` names the register's evolution: the default name is the absent key (the + /// same documents, byte for byte), the other two name themselves in the receipt and their strands verify, an unknown name and + /// the key without the tier are refused; the name list is the decide crate's + #[cfg(feature = "decide")] + #[test] + fn the_schedule_key_names_the_evolution() { + use crate::strand::{self, Clock, Live}; + assert_eq!(SCHEDULE_NAMES, probbit_decide::amp::SCHEDULE_NAMES); + let base = include_str!("../../examples/persona/tutor.yaml").replace("\r\n", "\n"); + let mk = |extra: &str| { let doc = crate::yaml::load(&base.replace("engine:\n", &format!("engine:\n tier: amplitude\n amplify: true\n{extra}"))).ok().unwrap(); (build(&doc).unwrap(), doc) }; + let (p0, _) = mk(""); let (pd, _) = mk(" schedule: tf-linear-16x4\n"); let s0 = init(&p0, Some(2), true, &run); let sd = init(&pd, Some(2), true, &run); + let raw = json::parse(r#"{"elapsed_hours":1,"praise":true}"#).unwrap(); + let (a, _) = turn(&p0, &s0, &raw, false, &run, false).unwrap(); let (b, _) = turn(&pd, &sd, &raw, false, &run, false).unwrap(); + assert_eq!(canon(&g(&a, &["engine"])), canon(&g(&b, &["engine"]))); assert_eq!(g(&a, &["engine", "schedule_name"]).as_str(), Some("tf-linear-16x4.000000")); + for (name, shown) in [("tf-linear-64x16", "tf-linear-64x16.000000"), ("qaoa-p2", "qaoa-p2")] { + let (p, doc) = mk(&format!(" schedule: {name}\n")); let st = init(&p, Some(2), true, &run); + let (d, _) = turn(&p, &st, &raw, false, &run, false).unwrap(); assert_eq!(g(&d, &["engine", "schedule_name"]).as_str(), Some(shown)); + assert_eq!(g(&d, &["engine", "feasible_mass"]).as_f64(), Some(1.0)); + let (mut live, header) = Live::start(p.clone(), &doc, st, Clock::Fixed, "probbit test"); let mut lines = vec![header]; + for r in [r#"{"elapsed_hours":1,"praise":true}"#, r#"{"elapsed_hours":2}"#] { let (_, l) = live.event(&json::parse(r).unwrap(), &run).unwrap(); lines.push(l); } + assert!(strand::verify(&(lines.join("\n") + "\n"), &run).is_ok(), "{name}"); } + let e = err(build(&crate::yaml::load(&base.replace("engine:\n", "engine:\n tier: amplitude\n schedule: tf-linear-8x2\n")).ok().unwrap())); + assert_eq!(e, "engine.schedule: tf-linear-16x4 | tf-linear-64x16 | qaoa-p2"); + let e = err(build(&crate::yaml::load(&base.replace("engine:\n", "engine:\n schedule: qaoa-p2\n")).ok().unwrap())); + assert!(e.starts_with("engine.schedule: needs tier: amplitude"), "{e}"); + } /// The boxed setup API is the by-value one: the same persona, state, header and individual #[test] fn the_boxed_setup_is_the_by_value_setup() { diff --git a/probbit-persona/src/run.rs b/probbit-persona/src/run.rs index 826d37f..28cc760 100644 --- a/probbit-persona/src/run.rs +++ b/probbit-persona/src/run.rs @@ -467,7 +467,10 @@ pub fn item_bars(g: &Gate) -> Vec { g.sig_tv.iter().zip(&g.sig_tv_long).map /// before and after) and `feasible_mass` is the mass after. The relative amplitudes inside the feasible plans are the swept /// state's, so the numbers equal the projection's (docs/rfc/0011-amplitude-register.md, "Amplification"). #[cfg(feature = "decide")] -pub fn amplitude(prog: &Json, q_max: usize, amplify: bool) -> Result { +pub fn amplitude(prog: &Json, q_max: usize, amplify: bool) -> Result { amplitude_with(prog, q_max, amplify, &probbit_decide::amp::Evolution::Sweep(probbit_decide::amp::DEFAULT_SCHEDULE)) } +/// Round 5: `amplitude` with the evolution `ev` in place of the default sweep (`engine.schedule`; the receipt names it) +#[cfg(feature = "decide")] +pub fn amplitude_with(prog: &Json, q_max: usize, amplify: bool, ev: &probbit_decide::amp::Evolution) -> Result { use probbit_decide::amp; let p = from_json(prog).map_err(|e| format!("program {}: {}", e.path, e.msg))?; let m = &p.m; let (n, k) = (m.n, m.k); let cand: Vec> = (0..n).map(|i| (0..k).filter(|&v| m.ok(i, v)).collect()).collect(); @@ -484,7 +487,7 @@ pub fn amplitude(prog: &Json, q_max: usize, amplify: bool) -> Result = mems.iter().map(|mem| amp::Encoding { levels: mem.iter().map(|&i| cand[i].len()).collect() }).collect(); let qs: Vec = encs.iter().map(amp::Encoding::qubits).collect(); let qtop = qs.iter().copied().max().unwrap_or(0); if qtop > q_max.min(amp::Q_MAX_HOST) { return Err(format!("a component of {qtop} encoded qubits, q_max {q_max}")); } - let s = amp::DEFAULT_SCHEDULE; let r6 = |x: f64| (x * 1e6).round() / 1e6; + let s = ev; let r6 = |x: f64| (x * 1e6).round() / 1e6; let (mut enc_t, mut circ_t, mut state_t) = (String::new(), String::new(), String::new()); let mut bp = vec![0usize; n]; let mut mg = vec![0.0; n * k]; let mut mass_all = 1.0; let (mut am_it, mut am_ph, mut am_before) = (vec![], vec![], 1.0); @@ -500,7 +503,7 @@ pub fn amplitude(prog: &Json, q_max: usize, amplify: bool) -> Result Vec { codes.iter().zip(mem).map(|(&cd, &i)| cand[i][cd]).collect() }; let e: Vec = (0..nb).map(|x| enc.decode(x).map_or(f64::NAN, |cd| -sub.logw(&plan_of(&cd)))).collect(); - let mut reg = amp::sweep(enc, &e, &s); + let mut reg = s.run(enc, &e); if amplify { let ok: Vec = (0..nb).map(|x| enc.decode(x).is_some_and(|cd| sub.violations(&plan_of(&cd)) == 0)).collect(); let a = amp::amplify_exact(&mut reg, |x| ok[x]).ok_or_else(|| format!("component {c}: no feasible plan has weight in the register"))?; From cfab1fe9b2fecb16e440b4b11ee01516c6dec3c9 Mon Sep 17 00:00:00 2001 From: Gravity Send Date: Wed, 28 Oct 2026 02:33:09 -0700 Subject: [PATCH 09/20] RFC 0011 round 5 (research): a missed amplification landing declines instead of panicking, simulated exactly on a CPU amp::amplify_exact returned its result after asserting the mass after >= 1 - 1e-12; with the long sweep (tf-linear-64x16) a few components of the recorded corpus's programs reach a tiny feasible mass (a0 ~ 5e-5) and 100+ iterations, where rounding drift leaves the mass after about 1e-12 short and the assert panicked a persona turn (165 of 130,088 distinct programs in the round-5 study; 0 with the default schedule and 0 with qaoa-p2). It now returns None there, and the tier declines to the default tiers with `component : amplification missed its 1 - 1e-12 landing` in the receipt (a component with no feasible weight keeps its old message). Nothing changes where the landing meets the bar, which is every solve of round 4. --- probbit-decide/src/amp.rs | 6 ++++-- probbit-persona/src/run.rs | 5 ++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/probbit-decide/src/amp.rs b/probbit-decide/src/amp.rs index 1bcf591..4196d13 100644 --- a/probbit-decide/src/amp.rs +++ b/probbit-decide/src/amp.rs @@ -336,7 +336,9 @@ pub const AMPLIFIED_MASS_MIN: f64 = 1.0 - 1e-12; /// (phi, varphi) chosen so that its bad component is 0 lands on |good> exactly (Long's exact search, one matched step). Every /// step stays in that plane, so the result is e^{i chi} |good>: the good states keep psi's relative amplitudes, the Born /// probabilities are psi's restricted to the good states and divided by a0 -- the projection's numbers, by a unitary -/// evolution. a0 = 1: nothing to do (0 iterations); a0 = 0: None (nothing to amplify). The mass after is asserted >= 1 - 1e-12. +/// evolution. a0 = 1: nothing to do (0 iterations); a0 = 0: None (nothing to amplify). Round 5: a landing whose mass after is +/// below 1 - 1e-12 (rounding drift over many iterations at a tiny a0, measured with the long sweep) is also None, so the tier +/// declines to the default tiers instead of panicking; the register is then left mid-rotation and must not be read. pub fn amplify_exact(r: &mut Register, good: impl Fn(usize) -> bool) -> Option { let g: Vec = (0..r.amp.len()).map(&good).collect(); let mass = |r: &Register| r.amp.iter().zip(&g).filter(|(_, &x)| x).map(|(a, _)| a.norm2()).sum::(); let a0 = mass(r); if !(a0 > 0.0) { return None; } @@ -352,7 +354,7 @@ pub fn amplify_exact(r: &mut Register, good: impl Fn(usize) -> bool) -> Option= AMPLIFIED_MASS_MIN, "amplified good mass {m:e} < 1 - 1e-12 (a0 {a0:e}, k {k})"); + let m = mass(r); if m < AMPLIFIED_MASS_MIN { return None; } Some(Amplified { iterations: k + 1, phases: (phi, vphi), mass_before: a0, mass_after: m }) } diff --git a/probbit-persona/src/run.rs b/probbit-persona/src/run.rs index 28cc760..d09fadf 100644 --- a/probbit-persona/src/run.rs +++ b/probbit-persona/src/run.rs @@ -506,7 +506,10 @@ pub fn amplitude_with(prog: &Json, q_max: usize, amplify: bool, ev: &probbit_dec let mut reg = s.run(enc, &e); if amplify { let ok: Vec = (0..nb).map(|x| enc.decode(x).is_some_and(|cd| sub.violations(&plan_of(&cd)) == 0)).collect(); - let a = amp::amplify_exact(&mut reg, |x| ok[x]).ok_or_else(|| format!("component {c}: no feasible plan has weight in the register"))?; + let Some(a) = amp::amplify_exact(&mut reg, |x| ok[x]) else { + // round 5: None after a rotation (good mass near 1) = the landing missed its bar: decline, never panic + let m: f64 = reg.probabilities().iter().zip(&ok).filter(|(_, &g)| g).map(|(p, _)| p).sum(); + return Err(if m > 0.5 { format!("component {c}: amplification missed its 1 - 1e-12 landing") } else { format!("component {c}: no feasible plan has weight in the register") }); }; let pr = reg.probabilities(); let best = (0..nb).fold(usize::MAX, |bx, x| if enc.decode(x).is_some() && pr[x] > 0.0 && (bx == usize::MAX || r6(pr[x]) > r6(pr[bx])) { x } else { bx }); for (&i, v) in mem.iter().zip(plan_of(&enc.decode(best).expect("a plan with weight has valid codes"))) { bp[i] = v; } From 337696c2cc803d4022f5043cd9fda84b03e51aa0 Mon Sep 17 00:00:00 2001 From: Gravity Send Date: Wed, 28 Oct 2026 02:54:56 -0700 Subject: [PATCH 10/20] RFC 0011 round 5 (research): docs, schedules and the indifferent set, an exact simulated qubit register on a CPU docs/rfc/0011-amplitude-register.md, "Schedules and the indifferent set": on the recorded corpus the thermal tier is indifferent (top two levels within 0.05) on 10.72 % of 2,183,612 trait decisions; there the simulated register's top-two gap has median 0.048628 with the default sweep, 0.151709 with tf-linear-64x16 and 0.094292 with qaoa-p2 (measured on the two thirds of programs the angle search did not see; noise 0.000697), and agreement on the other decisions is 97.58 / 98.17 / 92.99 %. The registered rule picks the long sweep; the default stays tf-linear-16x4. What it buys and what it does not, the cost (1.5x per event on a recorded day), the missed-landing decline, and an arm64 replay note. docs/persona.md: the `engine.schedule` key. CHANGELOG: Research entry. --- CHANGELOG.md | 7 +++++ docs/persona.md | 6 ++++- docs/rfc/0011-amplitude-register.md | 40 ++++++++++++++++++++++++++++- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1ea70a..dbd84bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -105,6 +105,13 @@ All notable changes to this project are documented here. The format follows ### Research +- **RFC 0011, round 5: schedules and the indifferent set** (research, `engine.schedule`, absent = the default sweep; + docs/rfc/0011-amplitude-register.md, "Schedules and the indifferent set"). Three names: `tf-linear-16x4` (default), + `tf-linear-64x16` (four times the layers), `qaoa-p2` (two layers, angles fixed on a held-out third of the corpus). On the 10.7 % + of the recorded corpus's trait decisions where the thermal tier is indifferent, the simulated register's top-two gap has median + 0.049 (default), 0.152 (long sweep), 0.094 (qaoa-p2); agreement elsewhere 97.6 / 98.2 / 93.0 %; noise 0.0007. The long sweep + is the rule's choice (1.5× the solve per event on a recorded day). A missed amplification landing (165 programs under the long sweep) now declines to the + default tiers instead of panicking. Without the key every stance and strand is byte-identical to round 4. Exact, on a CPU. - **RFC 0011, round 4: exact amplitude amplification in place of the projection** (research, `engine.amplify: true`, off by default; docs/rfc/0011-amplitude-register.md, "Amplification"). `amp::amplify_exact`: the rules as the oracle, the diffusion about the swept state, k standard iterations and one phase-matched final one, so the simulated register lands on its diff --git a/docs/persona.md b/docs/persona.md index 4f33dc3..42af136 100644 --- a/docs/persona.md +++ b/docs/persona.md @@ -233,6 +233,7 @@ engine: # tier: amplitude # research (RFC 0011, draft): an exact simulated qubit register on a CPU; absent = the default tiers # q_max: 12 # the most encoded qubits (ceil(log2 d) per variable) in one component the amplitude tier takes (1-16) # amplify: false # research (RFC 0011, round 4): with the tier, exact amplitude amplification in place of the projection + # schedule: tf-linear-16x4 # research (RFC 0011, round 5): the register's evolution: tf-linear-16x4 | tf-linear-64x16 | qaoa-p2 line: max_tokens: 40 # estimated tokens (max of chars / 4 and 4/3 per word) order: [verbosity, caution, directness, warmth, humour, initiative, formality, curiosity] @@ -251,7 +252,10 @@ the layer list, the schedule and the final amplitudes at 6 decimals) and without the tier reports a strand that uses it as `unsupported by this engine: engine.tier` (exit 5). `engine.amplify: true` (research, round 4; needs the tier) replaces the projection by exact amplitude amplification, simulated on a CPU: the rules are the oracle, the register is rotated onto the plans that obey them, the stance is the projection's (the same plan and odds, measured equal to -1.1e-12) and `engine.amplify` logs the iterations, the final phases and the mass before and after (`feasible_mass` 1). The register is a +1.1e-12) and `engine.amplify` logs the iterations, the final phases and the mass before and after (`feasible_mass` 1). `engine.schedule` +(research, round 5; needs the tier; absent = `tf-linear-16x4`) names the evolution of the register, simulated exactly on a CPU: `tf-linear-64x16` (four times +the layers) separates the top two levels where the thermal tier is a near tie (median gap 0.152 vs 0.049 on the recorded corpus) and +agrees more elsewhere; `qaoa-p2` is two fixed QAOA layers (RFC 0011, "Schedules and the indifferent set"). The register is a simulation: no quantum hardware, no speedup claim; its stances agree with the default tier in 96 % of trait decisions on the recorded corpus (RFC 0011, round 3). With the key, `persona bound` probes through the tier: compute the certificate again with it, since one computed without the key does not cover the tier. diff --git a/docs/rfc/0011-amplitude-register.md b/docs/rfc/0011-amplitude-register.md index 3456aa3..add1b54 100644 --- a/docs/rfc/0011-amplitude-register.md +++ b/docs/rfc/0011-amplitude-register.md @@ -6,7 +6,8 @@ from the thermal odds by 0.25-0.27 at the node; 0 of 4,100 bound cases exceed a this RFC changes a release or `main`; the tier stays off unless a persona asks for it. Turning it on changes the bound certificate: compute it again with the tier (section 5). Round 4 adds `engine.amplify` (off by default): exact amplitude amplification in place of the projection, which lands on the projection's numbers with feasible mass 1 (section 5, -"Amplification"). +"Amplification"). Round 5 adds `engine.schedule` (absent = the default sweep): a longer sweep separates the top two levels +where the thermal tier is indifferent and agrees more elsewhere (section 5, "Schedules and the indifferent set"). ## 1. What it is, in one paragraph @@ -161,6 +162,43 @@ high-water 2,016 B at q 8 and 12. 100 lives with amplification replay byte for b floats past 6 decimals, and an engine without the tier exits 5. Turning it on therefore buys a receipt whose register holds feasible mass 1 and logs how it got there; it does not buy a different stance. +### Schedules and the indifferent set (round 5) + +Round 4 showed amplification computes what the projection computed, so the only place the register can decide differently is +its evolution. `engine.schedule` names it (needs the tier; absent = `tf-linear-16x4`, byte for byte): `tf-linear-16x4` (the +default sweep, 16 steps over time 4), `tf-linear-64x16` (the same transverse-field sweep, 64 steps over time 16: four times the +layers) or `qaoa-p2` (two QAOA layers, γ 0.500000 β 0.500000 then γ 1.500000 β 0.250000, fixed by a grid search on a held-out +third of the corpus's programs and then frozen). The receipt's `schedule` digest and `schedule_name` name it; an unknown name +is refused. + +The study: on the recorded corpus (339,389 exact solves, 130,088 distinct programs, 2,183,612 trait decisions), the thermal +tier is **indifferent** (its top two levels' odds within 0.05; its own gap a median 0.028) on **234,004 decisions = 10.72 %** +(fuzz 9.9 %, replay and live 15.5-15.7 %, lint 17.5 %). On those decisions, measured on the two thirds of programs the grid +did not see, the register's gap between its top two levels: + +| schedule | median gap | gap > 0.10 | gap > 0.25 | agreement where the thermal tier is not indifferent | +|---|---|---|---|---| +| tf-linear-16x4 (default) | 0.048628 | 9.5 % | 0.1 % | 97.58 % | +| tf-linear-64x16 | **0.151709** | **64.6 %** | **16.0 %** | **98.17 %** | +| qaoa-p2 | 0.094292 | 47.4 % | 7.0 % | 92.99 % | + +Two disjoint samples of programs give medians within 0.000697 of each other, so the long sweep's margin (0.103) is about 150 +times the noise. By the registered rule (the largest median gap subject to agreement ≥ 90 % on the decisions that are not +indifferent) the choice is `tf-linear-64x16`; it is not the default, because the default is what every strand recorded so far +replays. What the longer sweep buys a decision, stated plainly: a slower sweep keeps more of the simulated register's amplitude +on the most probable plans, so it commits where the thermal answer is a near tie (it takes the thermal plurality on 78.5 % of +those decisions, the runner-up on 20.1 %, a third level on 1.4 %), and it keeps the thermal choice where there is one. It does +not create a preference the weights do not hold. Its cost is the layers: 1.5× the default solve per event on a recorded day of a +52-qubit persona (3.1-3.5× on a lone 8-12 qubit component), 0.8× for `qaoa-p2`; no_std stack at most 2,960 B on every schedule. With amplification on, 165 of the 130,088 +programs reach a component mass near 5e-5 under the long sweep and 100+ iterations, where rounding leaves the landing about +1e-12 short of its bar; that component now declines to the default tiers (`amplification missed its 1 - 1e-12 landing`) +instead of stopping the turn (0.12 % of decisions; 0 with the other two schedules). Every number here is a register simulated exactly on a CPU; +the gap is a property of the evolution's length and phases, not a claim about any device. +Replay: 100 lives per schedule record twice byte for byte and verify (arm64 host), with 0 floats past 6 decimals; an engine +without the tier exits 5. Measured on the way: on an arm64 host the no_std build does not reproduce the tier's strands written +by the std build (the last bits of the platform's math functions differ from the no_std math library's, and a 6-decimal odd +flips); this holds for the default schedule exactly as on round 4's code, so it is not new; round 4 measured 100 of 100 on x86_64. + ## 6. What this RFC does not claim That a CPU can do what quantum hardware does at scale (it cannot: section 1), that the register has experiences (it is From 9570435dc1ee5d122703303c7294d6d8543d5f65 Mon Sep 17 00:00:00 2001 From: Gravity Send Date: Wed, 28 Oct 2026 03:02:11 -0700 Subject: [PATCH 11/20] RFC 0011 round 5 (research): docs, the no_std replay of non-default schedules fails and says so, simulated exactly on a CPU Measured on x86_64: the no_std build re-verifies 100 lives of the default schedule 100/100, of tf-linear-64x16 0/100 and of qaoa-p2 98/100 (the recording build verifies all 300, an engine without the tier exits 5 on all). The platform's math functions and the no_std library differ in the last bits and over four times the layers a 6-decimal odd flips. The RFC, docs/persona.md and the CHANGELOG entry now state it: the long sweep is the study's answer, not yet a schedule to record strands with. On arm64 the default fails the same way on round 4's own path (not new). --- CHANGELOG.md | 4 +++- docs/persona.md | 3 ++- docs/rfc/0011-amplitude-register.md | 11 +++++++---- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dbd84bc..56841a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -111,7 +111,9 @@ All notable changes to this project are documented here. The format follows of the recorded corpus's trait decisions where the thermal tier is indifferent, the simulated register's top-two gap has median 0.049 (default), 0.152 (long sweep), 0.094 (qaoa-p2); agreement elsewhere 97.6 / 98.2 / 93.0 %; noise 0.0007. The long sweep is the rule's choice (1.5× the solve per event on a recorded day). A missed amplification landing (165 programs under the long sweep) now declines to the - default tiers instead of panicking. Without the key every stance and strand is byte-identical to round 4. Exact, on a CPU. + default tiers instead of panicking. Failure, stated: the no_std build re-verifies the long sweep's strands 0/100 (qaoa-p2 98/100; + the default 100/100): last-bit math differences, so non-default schedules replay only on the recording build for now. Without + the key every stance and strand is byte-identical to round 4. Exact, on a CPU. - **RFC 0011, round 4: exact amplitude amplification in place of the projection** (research, `engine.amplify: true`, off by default; docs/rfc/0011-amplitude-register.md, "Amplification"). `amp::amplify_exact`: the rules as the oracle, the diffusion about the swept state, k standard iterations and one phase-matched final one, so the simulated register lands on its diff --git a/docs/persona.md b/docs/persona.md index 42af136..0a78a84 100644 --- a/docs/persona.md +++ b/docs/persona.md @@ -255,7 +255,8 @@ rules are the oracle, the register is rotated onto the plans that obey them, the 1.1e-12) and `engine.amplify` logs the iterations, the final phases and the mass before and after (`feasible_mass` 1). `engine.schedule` (research, round 5; needs the tier; absent = `tf-linear-16x4`) names the evolution of the register, simulated exactly on a CPU: `tf-linear-64x16` (four times the layers) separates the top two levels where the thermal tier is a near tie (median gap 0.152 vs 0.049 on the recorded corpus) and -agrees more elsewhere; `qaoa-p2` is two fixed QAOA layers (RFC 0011, "Schedules and the indifferent set"). The register is a +agrees more elsewhere; `qaoa-p2` is two fixed QAOA layers (RFC 0011, "Schedules and the indifferent set"). Strands recorded with a +non-default schedule do not yet replay on the no_std build (last-bit math differences; the default does). The register is a simulation: no quantum hardware, no speedup claim; its stances agree with the default tier in 96 % of trait decisions on the recorded corpus (RFC 0011, round 3). With the key, `persona bound` probes through the tier: compute the certificate again with it, since one computed without the key does not cover the tier. diff --git a/docs/rfc/0011-amplitude-register.md b/docs/rfc/0011-amplitude-register.md index add1b54..c27eb7b 100644 --- a/docs/rfc/0011-amplitude-register.md +++ b/docs/rfc/0011-amplitude-register.md @@ -194,10 +194,13 @@ programs reach a component mass near 5e-5 under the long sweep and 100+ iteratio 1e-12 short of its bar; that component now declines to the default tiers (`amplification missed its 1 - 1e-12 landing`) instead of stopping the turn (0.12 % of decisions; 0 with the other two schedules). Every number here is a register simulated exactly on a CPU; the gap is a property of the evolution's length and phases, not a claim about any device. -Replay: 100 lives per schedule record twice byte for byte and verify (arm64 host), with 0 floats past 6 decimals; an engine -without the tier exits 5. Measured on the way: on an arm64 host the no_std build does not reproduce the tier's strands written -by the std build (the last bits of the platform's math functions differ from the no_std math library's, and a 6-decimal odd -flips); this holds for the default schedule exactly as on round 4's code, so it is not new; round 4 measured 100 of 100 on x86_64. +Replay, measured, and a failure printed as one: 100 lives per schedule record twice byte for byte, verify on the same build and +emit 0 floats past 6 decimals; an engine without the tier exits 5. The no_std build (the chip's math library) re-verifies +the default schedule's lives 100 of 100 on x86_64, but **the long sweep's 0 of 100 and qaoa-p2's 98 of 100**: the platform's +math functions and the no_std library differ in the last bits, and over four times the layers a 6-decimal odd flips. On an arm64 +host even the default fails there (0 of 5 on round 4's own path), so that part is not new. Until the tier computes with the same +math functions on every build, a non-default schedule replays only on the build that recorded it: the long sweep is the study's +answer, not a schedule to record strands with yet. ## 6. What this RFC does not claim From e31d0c464732e677e0dee0ce6e20ef1fb38eb93e Mon Sep 17 00:00:00 2001 From: Gravity Send Date: Wed, 28 Oct 2026 21:53:46 -0700 Subject: [PATCH 12/20] RFC 0011 round 6 (research): the demo persona, a tutor reduced to its humour component, simulated exactly on a CPU examples/persona/demo/register.yaml: a fictional tutor reduced to the humour component (warmth, humour, formality, emoji, the valence mood, their couplings and the two habits that bind them) and the two opposed drives that pull humour: praise raises it, criticism (a correction) lowers it. engine: {tier: amplitude, amplify: true, schedule: tf-linear-64x16}: each turn is solved by an exact simulated qubit register on a CPU with the long sweep and exact amplification. No names, no ids. examples/persona/demo/thermal.yaml: the same persona on the default tiers (the thermal face). The engine block is absent as a whole: engine.amplify and engine.schedule need engine.tier (a persona error, exit 2, without it), so removing the tier removes all three. Every engine since 0.13.0 runs this copy. README.md: the decision the demo shows (event 9: thermal top-two gap 0.007412, register gap 0.494808 on the same program), how to record and check the lives, the receipts, and the caveat: the long sweep replays on the recording (std) build only for now; the default schedule stays the one for every recorded strand. Simulated, exact, on a CPU; no quantum hardware. --- examples/persona/demo/README.md | 50 ++++++++++++++++++ examples/persona/demo/register.yaml | 78 +++++++++++++++++++++++++++++ examples/persona/demo/thermal.yaml | 71 ++++++++++++++++++++++++++ 3 files changed, 199 insertions(+) create mode 100644 examples/persona/demo/README.md create mode 100644 examples/persona/demo/register.yaml create mode 100644 examples/persona/demo/thermal.yaml diff --git a/examples/persona/demo/README.md b/examples/persona/demo/README.md new file mode 100644 index 0000000..d29885d --- /dev/null +++ b/examples/persona/demo/README.md @@ -0,0 +1,50 @@ +# The amplitude register demo (research, RFC 0011) + +One decision, shown twice. A fictional tutor reduced to its humour component lives the same 17 events twice: once on the +default tiers (`thermal.yaml`, the thermal face) and once on the amplitude register (`register.yaml`), an exact simulated +qubit register on a CPU, run with the long sweep (`tf-linear-64x16`) and exact amplification onto the plans its habits allow. +No quantum hardware is involved and no speedup is claimed: every number below is arithmetic, exact and replayable, simulated +on a CPU. + +Two opposed drives pull humour: praise raises it (with valence and emoji), criticism, a correction, lowers it. The life +(`life.jsonl`, seed 1, fixed clock) opens with a run of corrections; at **event 9** praise and a correction arrive together. + +| event 9 (strand line 10), humour | none | light | playful | top two gap | +|---|---|---|---|---| +| thermal (default tiers) | 0.059462 | 0.466563 | 0.473975 | **0.007412** | +| register, default sweep (`tf-linear-16x4`, for comparison) | 0.013180 | 0.566151 | 0.420670 | 0.145481 | +| register, long sweep (`tf-linear-64x16`, this copy) | 0.007171 | 0.249010 | 0.743818 | **0.494808** | + +On the same decision the thermal odds of the top two humour levels sit 0.007412 apart (a near tie: the drives cancel), and +the simulated register separates them by 0.494808: it commits to `playful`, the thermal plurality (the default sweep, four +times shorter, leans the other way, to `light`, by 0.145481). It does not invent a preference the weights do not hold; a +slower sweep keeps more of the register's amplitude on the most probable plans (docs/rfc/0011-amplitude-register.md, +"Schedules and the indifferent set" and "The demo"). Events 2 and 11 are near ties of the same kind (praise and a correction +together: thermal gaps 0.033093 and 0.048852, register gaps 0.656343 and 0.725300); the register is not always the more +decisive face (event 14: thermal gap 0.072051, register gap 0.009221). + +## Files + +| file | what | +|---|---| +| `register.yaml` | the persona with `engine: {tier: amplitude, amplify: true, schedule: tf-linear-64x16}` | +| `thermal.yaml` | the same persona without the engine block (`amplify` and `schedule` need the tier, so all three go) | +| `life.jsonl` | the 17 events | +| `register.strand`, `thermal.strand` | the two recorded lives (`probbit live verify` checks each); event 9 is line 10 of both | + +Record and check them again: + +```sh +probbit live examples/persona/demo/register.yaml --seed 1 --clock fixed --events examples/persona/demo/life.jsonl --strand register.strand +probbit live examples/persona/demo/thermal.yaml --seed 1 --clock fixed --events examples/persona/demo/life.jsonl --strand thermal.strand +probbit live verify register.strand +probbit monitor register.strand --open # the Mood Monitor (docs/persona.md, section 5.8); thermal.strand beside it +``` + +The register strand's documents carry the receipts: `engine.tier` `amplitude`, `engine.schedule_name` `tf-linear-64x16`, +`engine.amplify` (iterations, phases, the mass before and after), `feasible_mass` 1.000000 and the `state` digest of the final +amplitudes at 6 decimals. + +**Caveat.** The long sweep replays on the recording (std) build only for now: the no_std build's math library differs from the +platform's in the last bits, and over four times the layers a 6-decimal odd can flip. The default schedule stays the one for +every recorded strand; an engine without the tier (0.13.0) refuses `register.strand` (exit 5) and verifies `thermal.strand`. diff --git a/examples/persona/demo/register.yaml b/examples/persona/demo/register.yaml new file mode 100644 index 0000000..bc4c3da --- /dev/null +++ b/examples/persona/demo/register.yaml @@ -0,0 +1,78 @@ +# A fictional persona for the RFC 0011 demo (research, off by default elsewhere): a tutor reduced to its humour component. +# probbit persona format 1 (docs/persona.md). Two opposed drives pull humour: praise raises it, criticism (a correction) +# lowers it. This copy solves each turn on the amplitude register: an exact simulated qubit register on a CPU, run with the +# long sweep (tf-linear-64x16) and exact amplification onto the plans the habits allow. thermal.yaml is the same persona on +# the default tiers. No quantum hardware, no speedup claim. See README.md and docs/rfc/0011-amplitude-register.md, "The demo". +probbit_persona: 1 +identity: + name: demo-tutor + version: 0.1.0 + seed: 1 + summary: a tutor reduced to its humour component, for the amplitude register demo + +traits: + - id: warmth + levels: [cool, neutral, warm] + prior: [0.05, 0.3, 0.65] + spread: 0.5 + say: [plain, "", warm and encouraging] + - id: humour + levels: [none, light, playful] + prior: [0.15, 0.45, 0.4] + spread: 0.6 + say: [no jokes, a light joke is welcome, playful] + - id: formality + levels: [casual, neutral, formal] + prior: [0.6, 0.35, 0.05] + spread: 0.3 + say: [casual, "", formal] + - id: emoji + levels: [none, sparse, rich] + prior: [0.2, 0.5, 0.3] + spread: 0.5 + say: [no emoji, one emoji at most, emoji welcome] + +moods: + - id: valence + levels: [down, even, up] + prior: [0.1, 0.5, 0.4] + spread: 0.4 + inertia: 0.5 + half_life_hours: 12 + +couplings: + - {vars: [valence, humour], align: 1.0} + - {vars: [valence, emoji], align: 0.6} + - {vars: [warmth, formality], align: -0.6} + - {vars: [humour, formality], align: -0.6} + - {vars: [humour, emoji], align: 0.4} + +inputs: + - id: praise + kind: flag + say: praise + reactivity_spread: 0.4 + effects: {valence: 1.2, humour: 0.5, emoji: 0.5} + - id: criticism + kind: flag + say: criticism + effects: {valence: -0.6, humour: -0.4} + +habits: + - id: flourish_budget + rules: + linear: [{terms: [[humour, playful, 2], [humour, light, 1], [emoji, rich, 2], [emoji, sparse, 1]], limit: 3}] + say: one flourish at a time + - id: no_formal_emoji + rules: + tables: [{vars: [formality, emoji], forbid: [[formal, rich], [formal, sparse]]}] + say: no emoji when formal + +engine: + tier: amplitude # research (RFC 0011): an exact simulated qubit register on a CPU + amplify: true # research (round 4): exact amplification onto the plans the habits allow (a receipt change) + schedule: tf-linear-64x16 # research (round 5): the long sweep; replays on the recording (std) build only for now + +line: + max_tokens: 40 + order: [humour, warmth, emoji, formality] diff --git a/examples/persona/demo/thermal.yaml b/examples/persona/demo/thermal.yaml new file mode 100644 index 0000000..503f652 --- /dev/null +++ b/examples/persona/demo/thermal.yaml @@ -0,0 +1,71 @@ +# A fictional persona for the RFC 0011 demo: register.yaml on the default tiers (the thermal face). probbit persona format 1. +# Identical to register.yaml except that the engine block is absent: engine.amplify and engine.schedule need engine.tier, so +# removing the tier removes all three. Every engine since 0.13.0 runs this copy. See README.md. +probbit_persona: 1 +identity: + name: demo-tutor + version: 0.1.0 + seed: 1 + summary: a tutor reduced to its humour component, for the amplitude register demo + +traits: + - id: warmth + levels: [cool, neutral, warm] + prior: [0.05, 0.3, 0.65] + spread: 0.5 + say: [plain, "", warm and encouraging] + - id: humour + levels: [none, light, playful] + prior: [0.15, 0.45, 0.4] + spread: 0.6 + say: [no jokes, a light joke is welcome, playful] + - id: formality + levels: [casual, neutral, formal] + prior: [0.6, 0.35, 0.05] + spread: 0.3 + say: [casual, "", formal] + - id: emoji + levels: [none, sparse, rich] + prior: [0.2, 0.5, 0.3] + spread: 0.5 + say: [no emoji, one emoji at most, emoji welcome] + +moods: + - id: valence + levels: [down, even, up] + prior: [0.1, 0.5, 0.4] + spread: 0.4 + inertia: 0.5 + half_life_hours: 12 + +couplings: + - {vars: [valence, humour], align: 1.0} + - {vars: [valence, emoji], align: 0.6} + - {vars: [warmth, formality], align: -0.6} + - {vars: [humour, formality], align: -0.6} + - {vars: [humour, emoji], align: 0.4} + +inputs: + - id: praise + kind: flag + say: praise + reactivity_spread: 0.4 + effects: {valence: 1.2, humour: 0.5, emoji: 0.5} + - id: criticism + kind: flag + say: criticism + effects: {valence: -0.6, humour: -0.4} + +habits: + - id: flourish_budget + rules: + linear: [{terms: [[humour, playful, 2], [humour, light, 1], [emoji, rich, 2], [emoji, sparse, 1]], limit: 3}] + say: one flourish at a time + - id: no_formal_emoji + rules: + tables: [{vars: [formality, emoji], forbid: [[formal, rich], [formal, sparse]]}] + say: no emoji when formal + +line: + max_tokens: 40 + order: [humour, warmth, emoji, formality] From debae5d2b1e825462bbda2f84b4741df34feb127 Mon Sep 17 00:00:00 2001 From: Gravity Send Date: Wed, 28 Oct 2026 21:54:08 -0700 Subject: [PATCH 13/20] RFC 0011 round 6 (research): the demo life, the thermal and the register strands, simulated exactly on a CPU examples/persona/demo/life.jsonl: 17 events (seed 1, fixed clock): a run of corrections, then at event 9 praise and a correction together, then praise, and corrections again. thermal.strand and register.strand: the life recorded on each copy; both verify (live verify ok, 17 events), record twice byte for byte, and carry 0 floats past 6 decimals. Event 9 is line 10 of both strands; the two documents solve the same program (the same program digest). Event 9, humour (none / light / playful): thermal 0.059462 / 0.466563 / 0.473975 (top-two gap 0.007412, a near tie); the register, an exact simulated qubit register on a CPU with the long sweep, 0.007171 / 0.249010 / 0.743818 (gap 0.494808). Receipts of that document: tier amplitude, schedule_name tf-linear-64x16, amplify iterations [10, 1] with mass before 0.006196 and after 1, feasible_mass 1, the state digest of the final amplitudes at 6 decimals. 0.13.0 refuses the register strand (unsupported by this engine: engine.tier) and verifies the thermal one. Simulated, exact, on a CPU. --- examples/persona/demo/life.jsonl | 17 +++++++++++++++++ examples/persona/demo/register.strand | 18 ++++++++++++++++++ examples/persona/demo/thermal.strand | 18 ++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 examples/persona/demo/life.jsonl create mode 100644 examples/persona/demo/register.strand create mode 100644 examples/persona/demo/thermal.strand diff --git a/examples/persona/demo/life.jsonl b/examples/persona/demo/life.jsonl new file mode 100644 index 0000000..6906ae8 --- /dev/null +++ b/examples/persona/demo/life.jsonl @@ -0,0 +1,17 @@ +{"elapsed_hours":2} +{"criticism":true,"elapsed_hours":4,"praise":true} +{"criticism":true,"elapsed_hours":1} +{"criticism":true,"elapsed_hours":1} +{"criticism":true,"elapsed_hours":4} +{"criticism":true,"elapsed_hours":1} +{"criticism":true,"elapsed_hours":1} +{"criticism":true,"elapsed_hours":1} +{"criticism":true,"elapsed_hours":0,"praise":true} +{"elapsed_hours":1,"praise":true} +{"criticism":true,"elapsed_hours":2,"praise":true} +{"elapsed_hours":0,"praise":true} +{"elapsed_hours":0} +{"criticism":true,"elapsed_hours":1} +{"elapsed_hours":1} +{"criticism":true,"elapsed_hours":4} +{"criticism":true,"elapsed_hours":4} diff --git a/examples/persona/demo/register.strand b/examples/persona/demo/register.strand new file mode 100644 index 0000000..0e7df81 --- /dev/null +++ b/examples/persona/demo/register.strand @@ -0,0 +1,18 @@ +{"probbit_strand":1,"engine":"probbit 0.14.0-dev","persona":{"name":"demo-tutor","version":"0.1.0","digest":"sha256:0f90e48d4690395fb90aa16ca0b71d1cbb34c9aa411d880fe996ca487762d6d3"},"seed":1,"state":{"digest":"sha256:c84048d4325525a85d790f4a919c3226cf5a2c2ff97c274656445bb4adfa8ea7","genes":{"react":{"praise":0.7987},"shift":{"emoji":0.4947,"formality":0.3187,"humour":0.2479,"valence":0.0793,"warmth":0.6261}},"history":{},"mood":{"valence":[0,0,0]},"persona":{"digest":"sha256:0f90e48d4690395fb90aa16ca0b71d1cbb34c9aa411d880fe996ca487762d6d3","name":"demo-tutor","version":"0.1.0"},"prev":{"emoji":"sparse","formality":"casual","humour":"light","valence":"even","warmth":"warm"},"probbit_persona_state":1,"rest":{"emoji":"sparse","formality":"casual","humour":"playful","valence":"up","warmth":"warm"},"seed":1,"turn":0},"document":{"probbit_persona":1,"identity":{"name":"demo-tutor","version":"0.1.0","seed":1,"summary":"a tutor reduced to its humour component, for the amplitude register demo"},"traits":[{"id":"warmth","levels":["cool","neutral","warm"],"prior":[0.05,0.3,0.65],"spread":0.5,"say":["plain","","warm and encouraging"]},{"id":"humour","levels":["none","light","playful"],"prior":[0.15,0.45,0.4],"spread":0.6,"say":["no jokes","a light joke is welcome","playful"]},{"id":"formality","levels":["casual","neutral","formal"],"prior":[0.6,0.35,0.05],"spread":0.3,"say":["casual","","formal"]},{"id":"emoji","levels":["none","sparse","rich"],"prior":[0.2,0.5,0.3],"spread":0.5,"say":["no emoji","one emoji at most","emoji welcome"]}],"moods":[{"id":"valence","levels":["down","even","up"],"prior":[0.1,0.5,0.4],"spread":0.4,"inertia":0.5,"half_life_hours":12}],"couplings":[{"vars":["valence","humour"],"align":1},{"vars":["valence","emoji"],"align":0.6},{"vars":["warmth","formality"],"align":-0.6},{"vars":["humour","formality"],"align":-0.6},{"vars":["humour","emoji"],"align":0.4}],"inputs":[{"id":"praise","kind":"flag","say":"praise","reactivity_spread":0.4,"effects":{"valence":1.2,"humour":0.5,"emoji":0.5}},{"id":"criticism","kind":"flag","say":"criticism","effects":{"valence":-0.6,"humour":-0.4}}],"habits":[{"id":"flourish_budget","rules":{"linear":[{"terms":[["humour","playful",2],["humour","light",1],["emoji","rich",2],["emoji","sparse",1]],"limit":3}]},"say":"one flourish at a time"},{"id":"no_formal_emoji","rules":{"tables":[{"vars":["formality","emoji"],"forbid":[["formal","rich"],["formal","sparse"]]}]},"say":"no emoji when formal"}],"engine":{"tier":"amplitude","amplify":true,"schedule":"tf-linear-64x16"},"line":{"max_tokens":40,"order":["humour","warmth","emoji","formality"]}}} +{"inputs":{"elapsed_hours":2},"n":1,"prev":"sha256:f7f918deac79a089d818d078c2107af9a8551cf0c1e13f501880b1f0310f3055","stance":"sha256:0ea75eaaaad2925f1d840f8f244f15184767e5abb0893693e1c421b9843b293f","state":"sha256:96bd28501be3af6b52e55cb44312577d77bd48e3ff1580fec4dec25e77bcde91"} +{"inputs":{"criticism":true,"elapsed_hours":4,"praise":true},"n":2,"prev":"sha256:0d3c0f851600e4502ce2cd66f5bc3912cb2828a268c09eba4c8cf433e2a23b64","stance":"sha256:15d64c824bef92c0baea4d6217217b6b5ad66cdc52627ec094dcb2543668cd73","state":"sha256:9bae644f633fecbfb9860f19c648ccf991646b2024d60a4faee8a7c0909e9a0f"} +{"inputs":{"criticism":true,"elapsed_hours":1},"n":3,"prev":"sha256:69f5fe05b842eb256f07ef09992e352afd0d88722714dfeaafa3b793fb20d26d","stance":"sha256:558208d4b53faa28280b7c8e2a1ad5180d67caeb4dcebf9f9f223fa71a25995d","state":"sha256:5aebd4d81ef411cea573cf951c23455fa1308423461d10e45b9f3501d783eb06"} +{"inputs":{"criticism":true,"elapsed_hours":1},"n":4,"prev":"sha256:04621bc267dde076be8068938e9575c66a17ec6536f037f8dad3199a3e034492","stance":"sha256:2ad864a848ec499e8657c289c67b1d8e8afee3e5271eb2d24aeaecbf325f0987","state":"sha256:558b0ccd0cbf5a67d31ad9a991dfae9165536b689c4facba7210edb0ed7fc71d"} +{"inputs":{"criticism":true,"elapsed_hours":4},"n":5,"prev":"sha256:c4c9250a865415d3eb56da2fdb8762dd3b4fc05da37f0b70fd77151fa3352ee1","stance":"sha256:6fc813956b1e08708ee757b12409fbca5eed52fc21a3aa01c005cf5ba6ebba68","state":"sha256:5abdbb412a343850083273df229de2dfb644ee8ddf349e78d4f0b18148652403"} +{"inputs":{"criticism":true,"elapsed_hours":1},"n":6,"prev":"sha256:8481f42add2e7de64387488ad014b129612b554f7fdddaf67bb04adeb3c59bcf","stance":"sha256:6f0cc3ce009e3109f4b20452957596790000b4d44650b49d610eab7bc5dd3350","state":"sha256:eb93d29cfb413b01a34dccfa2a4a61f29b6be597de7da6a04ed2913a0c8ed5c8"} +{"inputs":{"criticism":true,"elapsed_hours":1},"n":7,"prev":"sha256:81394f399b0e08559d9c0714de9c14094631cf238c0c35faee58365de220a647","stance":"sha256:476759a6ca2e3202f9d25b85fa4da5e5c187f5dc8c6eed104180c4555906f267","state":"sha256:ca12842fe89b3d9ee78cb3244c8540dd600f9d3878e5fa948014e8b1d2502c02"} +{"inputs":{"criticism":true,"elapsed_hours":1},"n":8,"prev":"sha256:15d826747f1967a0bd7f7c81a51163b99d31601d87c0d7b3befe6ac356368915","stance":"sha256:2073a8a79dc30b3d012216e987d165b978cbfa35120c3ad537a8bd54490b95a9","state":"sha256:ef66448369e444c52d61d46f091397b0e5cb38bdd964aeda5431dac6742e6da2"} +{"inputs":{"criticism":true,"elapsed_hours":0,"praise":true},"n":9,"prev":"sha256:a9b010dc46e7b37094605c515f7942e38d6e12367ec44bc5e2118da5ed974da7","stance":"sha256:390469686dc6805079079259e69c8d6363cbc6f6a07790687bbc741ce631d641","state":"sha256:852c7969fde1a0ce103be8a354e6e69a2c399c3711be1e5c1e125fac22ab0b87"} +{"inputs":{"elapsed_hours":1,"praise":true},"n":10,"prev":"sha256:75e5cd3fe5f0e41c40adca3a193c766c214d752fd37e7f4119a4d1bc47c33127","stance":"sha256:7061e8197c0bb2cdeae248bafd3479ce2af83b370550f4a6aab2e5dfd6ff2a61","state":"sha256:e57e940272213655514b18d06079e24ab3793cc3a39a8b152c0a8b5756bbeda9"} +{"inputs":{"criticism":true,"elapsed_hours":2,"praise":true},"n":11,"prev":"sha256:3de8cb027dd83fe5b20af21e1b81f7ccfdd57a076528a60bc7b29b055ea95e93","stance":"sha256:9f2eb1cd70dacd6bc0fc1703823ed8705812ca8436806cf5e3163b7023b3f711","state":"sha256:9e3b37108bbe2459b25ca8b57bdbe224370d39780d271209f9be93819dab0fbd"} +{"inputs":{"elapsed_hours":0,"praise":true},"n":12,"prev":"sha256:c6abea7b6d9889993c1fb7d5ed0f08ee8d5c0dafb0dccebcafc52b0fcfda6b65","stance":"sha256:14a8c85a0c15bac274c20df42eea43c1624f617effcee960e4b0406cfb14959a","state":"sha256:5fc5e75832bf7d4f6cc41fd8e17b309c944ae5bf6b83adc1da3b405fb81c7a5e"} +{"inputs":{"elapsed_hours":0},"n":13,"prev":"sha256:81a906e06d49b7e2c4eda69967beeb6d5cd72ba05f65aa6f63f748ec1f76a0a8","stance":"sha256:f8435ba6ab5dc84b145acdafbb4991bec830f457acb113ab486198608112144f","state":"sha256:862d484cbab209ddc35e92f663d4d4df4e64c4fdbf46ede4f446197c5ece2466"} +{"inputs":{"criticism":true,"elapsed_hours":1},"n":14,"prev":"sha256:35edb356815aa9c4c0d93ff43fa18e110b8010acdcadae5cccb552d30d7eaa0b","stance":"sha256:27a6f948c0adb0921ed8889cb4462f7d496cb4718951776c4f0170354f9768dc","state":"sha256:d77a30a5c2a0a72569e41cd19fd9f9f9bb58f88c93a90937c397d496ddbe54de"} +{"inputs":{"elapsed_hours":1},"n":15,"prev":"sha256:abb69d92e54ee697203e354c08f423d8b2287d7e1e45d88f0a34173f82ea0b21","stance":"sha256:ab8a1ae0a39f34c8adc6fc22d8dc518d4d703fbea724d88c9447a00ede3fb829","state":"sha256:1cb4c8f07d6084365a1d5014605a004123d40afb218ecef33be5a0f4d696490f"} +{"inputs":{"criticism":true,"elapsed_hours":4},"n":16,"prev":"sha256:b817992a9ee62b66b8fe03c7e17ad829a19ae84483a807ff7411ceb7e4a065e2","stance":"sha256:bddc0d05e986a851acd237f66b6b05c7ab0faf1d5a116b76367d901837607e7a","state":"sha256:00948463ada05fad5d4874e98383cb471a1698fc08e526af423bf75703601925"} +{"inputs":{"criticism":true,"elapsed_hours":4},"n":17,"prev":"sha256:d85613c8c1c24c6b4d6670fff73593305807d9d6e6020a44dd98abe388d6ba15","stance":"sha256:4be10566f4e0e16ca456d04c82e4706005f88525959c58cd0af5aeae98360e51","state":"sha256:e63a0e17d618492147c7a573b28db4f70f893b1350f9e403b7dffe037cbf2201"} diff --git a/examples/persona/demo/thermal.strand b/examples/persona/demo/thermal.strand new file mode 100644 index 0000000..13d64e9 --- /dev/null +++ b/examples/persona/demo/thermal.strand @@ -0,0 +1,18 @@ +{"probbit_strand":1,"engine":"probbit 0.14.0-dev","persona":{"name":"demo-tutor","version":"0.1.0","digest":"sha256:f63a2a990dce5c0290a3fb9d3148f945b9ba985b9a50897b33ac7e9589f44f47"},"seed":1,"state":{"digest":"sha256:8442eba81d5ab11311bd7367c272ef54da3963c18e0b6f7a044e788588202f2c","genes":{"react":{"praise":0.7987},"shift":{"emoji":0.4947,"formality":0.3187,"humour":0.2479,"valence":0.0793,"warmth":0.6261}},"history":{},"mood":{"valence":[0,0,0]},"persona":{"digest":"sha256:f63a2a990dce5c0290a3fb9d3148f945b9ba985b9a50897b33ac7e9589f44f47","name":"demo-tutor","version":"0.1.0"},"prev":{"emoji":"sparse","formality":"casual","humour":"light","valence":"even","warmth":"warm"},"probbit_persona_state":1,"rest":{"emoji":"sparse","formality":"casual","humour":"playful","valence":"up","warmth":"warm"},"seed":1,"turn":0},"document":{"probbit_persona":1,"identity":{"name":"demo-tutor","version":"0.1.0","seed":1,"summary":"a tutor reduced to its humour component, for the amplitude register demo"},"traits":[{"id":"warmth","levels":["cool","neutral","warm"],"prior":[0.05,0.3,0.65],"spread":0.5,"say":["plain","","warm and encouraging"]},{"id":"humour","levels":["none","light","playful"],"prior":[0.15,0.45,0.4],"spread":0.6,"say":["no jokes","a light joke is welcome","playful"]},{"id":"formality","levels":["casual","neutral","formal"],"prior":[0.6,0.35,0.05],"spread":0.3,"say":["casual","","formal"]},{"id":"emoji","levels":["none","sparse","rich"],"prior":[0.2,0.5,0.3],"spread":0.5,"say":["no emoji","one emoji at most","emoji welcome"]}],"moods":[{"id":"valence","levels":["down","even","up"],"prior":[0.1,0.5,0.4],"spread":0.4,"inertia":0.5,"half_life_hours":12}],"couplings":[{"vars":["valence","humour"],"align":1},{"vars":["valence","emoji"],"align":0.6},{"vars":["warmth","formality"],"align":-0.6},{"vars":["humour","formality"],"align":-0.6},{"vars":["humour","emoji"],"align":0.4}],"inputs":[{"id":"praise","kind":"flag","say":"praise","reactivity_spread":0.4,"effects":{"valence":1.2,"humour":0.5,"emoji":0.5}},{"id":"criticism","kind":"flag","say":"criticism","effects":{"valence":-0.6,"humour":-0.4}}],"habits":[{"id":"flourish_budget","rules":{"linear":[{"terms":[["humour","playful",2],["humour","light",1],["emoji","rich",2],["emoji","sparse",1]],"limit":3}]},"say":"one flourish at a time"},{"id":"no_formal_emoji","rules":{"tables":[{"vars":["formality","emoji"],"forbid":[["formal","rich"],["formal","sparse"]]}]},"say":"no emoji when formal"}],"line":{"max_tokens":40,"order":["humour","warmth","emoji","formality"]}}} +{"inputs":{"elapsed_hours":2},"n":1,"prev":"sha256:67aef832803e96fc96d37f73fe25d8c26effc0a8c43ce9d4d2a613607017a2bc","stance":"sha256:838aefc4a6cae9d87efd37366f83697fb07c0f09d8b319cb279df92b48af7699","state":"sha256:961f1e5a1e85c4f904a997dbddc194406c40153d6bfc35c72fc2a47eec4e2e28"} +{"inputs":{"criticism":true,"elapsed_hours":4,"praise":true},"n":2,"prev":"sha256:684c4505b81eaa3d095c0356fdcf2032a848889d3b956ca3bfdaef584b654d84","stance":"sha256:a11cf3d94c1397aa720ec97b9ec0061f5c1ae2a4abd3b9eb25f415e8e1e3c3ab","state":"sha256:2a54fbe4288035defa4bf85e00017631062f1813d047bb5626051a144921ee05"} +{"inputs":{"criticism":true,"elapsed_hours":1},"n":3,"prev":"sha256:a5e8b2ccf957d240cd780eda5de1b3fd3ea2555fa0b4e3d9645aa42647e373ca","stance":"sha256:3df181cb189f1e8d55f8c68b95db7ec1dd29084e9ac7d545100d527dad863462","state":"sha256:4ccb76820044ec00bbde3741e4a840639369a14e06fc4b848cd81f2ab377e331"} +{"inputs":{"criticism":true,"elapsed_hours":1},"n":4,"prev":"sha256:90297f13f0eaeb0e349aabf0cf9ce67cd427928f0b08bf5a35c627af1d42903d","stance":"sha256:06141011e3c0aaba94fb6b8d7810a14a87b139d4a00486a2696742802993c943","state":"sha256:52510a0e4fea2f04196846b2d02953473ffd0948b0e237936ba2b33430b86605"} +{"inputs":{"criticism":true,"elapsed_hours":4},"n":5,"prev":"sha256:89268a6942a74765a9272176f884894490e9b7f3198c93ba154900a3da840c79","stance":"sha256:e966521e32cadcbf9b6602499935f5bae877eb9904b1a4b37931e99d3234c471","state":"sha256:947106cafbed21b56cea4b100e2d28910063801192112a325b11d9c76e38fe6a"} +{"inputs":{"criticism":true,"elapsed_hours":1},"n":6,"prev":"sha256:62fefaeeb8143826f699f4e30d6013963273ee6eee71cf618120fe0726beb2b0","stance":"sha256:e4b1dbe7aa9da19d39b93c66bce25b951fba68f74d017971dbc1a1af35e7cbfe","state":"sha256:c86b66ef6d7b2ad86c471b729c4cc8ef20b236d131eabf12125c861ec67f6a40"} +{"inputs":{"criticism":true,"elapsed_hours":1},"n":7,"prev":"sha256:5507d0ecd8ae5252fde735d41766b5210158cb768c810f740b611aa69eadb908","stance":"sha256:39ed1c3015adf01cc7acd31447d0e68dfaadcd921f5c7f4c300f8dac309b50e0","state":"sha256:15a93dec6649e8761ff6988bdf375eaddc3ef4ece242265d408144039d77c8f6"} +{"inputs":{"criticism":true,"elapsed_hours":1},"n":8,"prev":"sha256:676480fca7616f81bb0cfbbc626c0ff5f5e22afe4eb0e0080effbbcf430a0d9f","stance":"sha256:27e0f52ebe689dc3c99fc394b1cb95dda66326412c1f434878ed0ca30d311e40","state":"sha256:70d7f743627196ec4045afe54bb3b0f0f1de2e75697a543075e4ff48517490c3"} +{"inputs":{"criticism":true,"elapsed_hours":0,"praise":true},"n":9,"prev":"sha256:bc04904c165cfe76b8c59f226c01e8357b32bbd34783d4d450b19f0640b828fc","stance":"sha256:944c0a26385c27a5ccf35b0e21459b1cc5f5f60f3320a5fbaad22aa50552930a","state":"sha256:7e35e79810e249b30af48a8c6457028a0455a8ec25d3fc84a45e3261f7d08d43"} +{"inputs":{"elapsed_hours":1,"praise":true},"n":10,"prev":"sha256:1f6de80d7bdb4fdd26baec686f120d9916c346951e8c796eb99440466e603768","stance":"sha256:00e1ac558fc6fbf6c04fab4bf406a4dd4da3f1ca9070471a8044a23d4a6dfc1b","state":"sha256:df0cf433b0c57044e3d9edfa1e9f521d1f7d6fa49dd71e7d3df37899420bbb76"} +{"inputs":{"criticism":true,"elapsed_hours":2,"praise":true},"n":11,"prev":"sha256:6335744d8462b3905ced3cc0981affc24e56ce1998764b018aa35893067b6516","stance":"sha256:ef62f91b701fc242b26b9992780d97b4c28084d01754b90eef3bef7ae0acef39","state":"sha256:3579d66c48d8cf50df61c9ab1bd4fffc0002e7225e9db3e3ae08f35ce73c91cd"} +{"inputs":{"elapsed_hours":0,"praise":true},"n":12,"prev":"sha256:25aa44fb4fe28fe86b62641afeb4157882a5554a3db23e7e1fe231481d06f79e","stance":"sha256:01cb4eca2af8d84540275cbea13364903342fe663755a950d4f341a186243786","state":"sha256:ed8b0c8dd993f2541cdfe986ee16b7f304af5dd28f818a808f0ebf54937a9023"} +{"inputs":{"elapsed_hours":0},"n":13,"prev":"sha256:cb5a0222b37e05c37bfe2b1414d4916dc0d28b2c6bbcc9c0a634a83e7995260d","stance":"sha256:106891ba89bdb843de3ac3990f3fe2d9cb4fdbf430270a13b6b44589aeb89abe","state":"sha256:e304fc76b0218fb96bfdd691e34a224acf47ee100527b325d160c266b8c651af"} +{"inputs":{"criticism":true,"elapsed_hours":1},"n":14,"prev":"sha256:4fa4c61ee945583a8f7e469ada36992374a36c665e35ce4db5ca0c6abd08ecf5","stance":"sha256:738deedd442f853a783f9e9d8622ef230c38e665f878114cbdaf1c0c47d3fc4a","state":"sha256:c21e698198fa9034915279a26974ab54faabfa11c6b5dde1c8e94a1a8e81e699"} +{"inputs":{"elapsed_hours":1},"n":15,"prev":"sha256:1689bbc90fd8f3bc326167de45536deb549351c7e6a22e8152b7036103c72db7","stance":"sha256:74ba46799b86f3174f9aa957fbb3f9016bb31175805c4ad13429f7122b28e5c8","state":"sha256:dba20f77fc79cc516040614baf77d9be139d316e0a71c22590963385a39d5fbe"} +{"inputs":{"criticism":true,"elapsed_hours":4},"n":16,"prev":"sha256:9238433fe1e0a0eff7592a1e5d15b45c6ab0e7176abdfc3c2462991c5ba2ffd4","stance":"sha256:b961d8cc9db2e80c4f264be1789c5a5fc39035af6bf68e6ab57bea2bb84506d5","state":"sha256:be90cd8467f85d215724231e1df674f74c12a57c47995fcb66c18d900311cdef"} +{"inputs":{"criticism":true,"elapsed_hours":4},"n":17,"prev":"sha256:6b75ed2e5ea4ac0c2c6d22eba956c12aa3c6d1d1536296676c33ba1d6235669b","stance":"sha256:89fe74fb1b8a54c0bdd346313fd0600f43036611a23fa815b8da96afae00a8a9","state":"sha256:fabd63a75c5564c24e68b015c5ffb8428de219888226d72f5c5f6534eb28e87f"} From 677c770998125e5ddc1edd1d166f5edc68782f1e Mon Sep 17 00:00:00 2001 From: Gravity Send Date: Wed, 28 Oct 2026 21:55:04 -0700 Subject: [PATCH 14/20] RFC 0011 round 6 (research): docs, the demo and the monitor's two faces, an exact simulated qubit register on a CPU docs/rfc/0011-amplitude-register.md, section 5 "The demo": the corpus program a7fae99b114ea2d2 regenerated (thermal humour gap 0.010516, default sweep 0.080846, long sweep 0.951467) and the runner-up 07d909f824f224e4 (long sweep 0.945965, the thermal runner-up taken); the demo persona and its 17-event life; event 9 on both strands (thermal gap 0.007412, register gap 0.494808, default sweep 0.145481 for comparison) with the register document's receipts; the Mood Monitor's two faces at that event (0011-demo-thermal.png, 0011-demo-register.png: "playful, slightly" at 47.4 % vs "playful, clearly" at 74.4 %); one sentence for the launch pack and its caveat (recording build only; the default schedule stays for every recorded strand); the cost on x86_64 (thermal 2,184, register long 1,822, register default 913 microseconds per event). CHANGELOG Research: round 6. No engine change. Simulated, exact, on a CPU; no quantum hardware, no speedup claim. --- CHANGELOG.md | 8 +++++ docs/rfc/0011-amplitude-register.md | 54 +++++++++++++++++++++++++++- docs/rfc/0011-demo-register.png | Bin 0 -> 176133 bytes docs/rfc/0011-demo-thermal.png | Bin 0 -> 175737 bytes 4 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 docs/rfc/0011-demo-register.png create mode 100644 docs/rfc/0011-demo-thermal.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 56841a3..ccf4c69 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -105,6 +105,14 @@ All notable changes to this project are documented here. The format follows ### Research +- **RFC 0011, round 6: the demo** (research; `examples/persona/demo/`, docs/rfc/0011-amplitude-register.md, "The demo"). A + fictional tutor reduced to its humour component, with praise and criticism pulling humour in opposite directions, in two + copies: `register.yaml` (`engine: {tier: amplitude, amplify: true, schedule: tf-linear-64x16}`) and `thermal.yaml` (no engine + block). One 17-event life recorded on each (both verify, twice byte for byte, 0 floats past 6 decimals). At event 9 (line 10 + of both strands, the same program) the thermal odds of the top two humour levels sit 0.007412 apart and the simulated + register separates them by 0.494808; the Mood Monitor's two faces at that event are in the RFC. On the corpus's own program + `a7fae99b114ea2d2`: thermal gap 0.010516, long sweep 0.951467. The long sweep replays on the recording build only; the + default schedule stays for every recorded strand. No engine change. Simulated, exact, on a CPU. - **RFC 0011, round 5: schedules and the indifferent set** (research, `engine.schedule`, absent = the default sweep; docs/rfc/0011-amplitude-register.md, "Schedules and the indifferent set"). Three names: `tf-linear-16x4` (default), `tf-linear-64x16` (four times the layers), `qaoa-p2` (two layers, angles fixed on a held-out third of the corpus). On the 10.7 % diff --git a/docs/rfc/0011-amplitude-register.md b/docs/rfc/0011-amplitude-register.md index c27eb7b..de01cf2 100644 --- a/docs/rfc/0011-amplitude-register.md +++ b/docs/rfc/0011-amplitude-register.md @@ -7,7 +7,8 @@ this RFC changes a release or `main`; the tier stays off unless a persona asks f certificate: compute it again with the tier (section 5). Round 4 adds `engine.amplify` (off by default): exact amplitude amplification in place of the projection, which lands on the projection's numbers with feasible mass 1 (section 5, "Amplification"). Round 5 adds `engine.schedule` (absent = the default sweep): a longer sweep separates the top two levels -where the thermal tier is indifferent and agrees more elsewhere (section 5, "Schedules and the indifferent set"). +where the thermal tier is indifferent and agrees more elsewhere (section 5, "Schedules and the indifferent set"). Round 6 shows +one such decision end to end, with a demo persona, its two recorded strands and the monitor's two faces (section 5, "The demo"). ## 1. What it is, in one paragraph @@ -202,6 +203,57 @@ host even the default fails there (0 of 5 on round 4's own path), so that part i math functions on every build, a non-default schedule replays only on the build that recorded it: the long sweep is the study's answer, not a schedule to record strands with yet. +### The demo (round 6) + +One decision where the thermal tier is a near tie, shown end to end on the recording (std) build: the program, the two odds, +the receipts and the monitor's two faces. Every number is a register simulated exactly on a CPU. + +**The program, from the corpus.** The recorded corpus's tutor fixture (seed 1, script 2, the 58th exact solve of its replay) +solves program `a7fae99b114ea2d2` (first 8 bytes of the sha256 of its compact JSON). Humour, regenerated from the corpus: +thermal `playful` 0.452774 vs `light` 0.442258 (gap 0.010516); the register with the default sweep, gap 0.080846; with the +long sweep, `playful` 0.975625 (gap 0.951467). The runner-up, `07d909f824f224e4` (the same fixture, script 3): thermal +`light` 0.444788 vs `playful` 0.425243 (gap 0.019545), long sweep `playful` 0.972868 (gap 0.945965): here the register takes +the thermal runner-up, as it does on 20.1 % of the indifferent decisions. + +**The persona and the life** (`examples/persona/demo/`). A fictional tutor reduced to its humour component (warmth, humour, +formality, emoji, the valence mood, their couplings and the two habits that bind them) and the two drives that pull humour +in opposite directions: praise up, criticism (a correction) down. `register.yaml` carries `engine: {tier: amplitude, amplify: +true, schedule: tf-linear-64x16}`; `thermal.yaml` is the same persona without the engine block (`amplify` and `schedule` need +the tier). The life, 17 events at seed 1 on a fixed clock, opens with a run of corrections; at event 9 praise and a correction +arrive together. Both strands verify, record twice byte for byte, emit 0 floats past 6 decimals; event 9 is line 10 of both, +and its two documents solve the same program. + +| event 9, humour | none | light | playful | top-two gap | +|---|---|---|---|---| +| thermal (default tiers) | 0.059462 | 0.466563 | 0.473975 | **0.007412** | +| register, default sweep (comparison) | 0.013180 | 0.566151 | 0.420670 | 0.145481 | +| register, long sweep (`register.yaml`) | 0.007171 | 0.249010 | 0.743818 | **0.494808** | + +The register document's receipts at event 9: `tier` amplitude, `qubits` 20 (`components` [10, 10]), `mixer` complete-graph, +`schedule_name` tf-linear-64x16, `amplify` iterations [10, 1] with the mass before 0.006196 and after 1, `feasible_mass` 1, the +`state` digest `sha256:6dbfd5a4…1bbe11`, the program digest `sha256:06517240…ab9a66` (the thermal document's too). Events 2 and +11 are near ties of the same kind (thermal gaps 0.033093 and 0.048852, register gaps 0.656343 and 0.725300). The register is not +always the more decisive face: at event 14 the thermal gap is 0.072051 and the register's 0.009221. At event 9 the default sweep +leans to `light` (gap 0.145481); the long sweep commits to `playful`, the thermal plurality. + +**The two faces.** The Mood Monitor (`probbit monitor`, section 5.8 of docs/persona.md) on each strand at event 9, replayed +from the strand alone ("replay verified"; the document it serves for event 9 is the recorded one, byte for byte), humour +selected. Thermal: `playful` 47.4 %, `light` 46.7 %, the panel's words "playful, slightly". Register: `playful` 74.4 %, +`light` 24.9 %, "playful, clearly". + +![The Mood Monitor on the thermal strand at event 9, humour selected](0011-demo-thermal.png) + +![The Mood Monitor on the register strand at event 9, humour selected](0011-demo-register.png) + +**The sentence.** On one recorded decision of a fictional tutor, the default solver's odds for its two leading humour levels +sit 0.007412 apart; the same program, solved by a qubit register simulated exactly on a CPU, separates them by 0.494808. +Caveat: the long sweep replays on the recording (std) build only, and the default schedule stays the one for every recorded +strand. + +**Cost** (x86_64, best of 5, the life repeated 20 times, 340 events): thermal 2,184 µs per event, the register with the long +sweep 1,822 µs (0.83× the thermal copy), the register with the default sweep 913 µs (the long sweep 2.00× the default sweep). +On this five-variable persona the thermal copy's exact enumeration costs more than the register. + ## 6. What this RFC does not claim That a CPU can do what quantum hardware does at scale (it cannot: section 1), that the register has experiences (it is diff --git a/docs/rfc/0011-demo-register.png b/docs/rfc/0011-demo-register.png new file mode 100644 index 0000000000000000000000000000000000000000..5356fc247f2d3cb998f7ee8612d5d71af040358b GIT binary patch literal 176133 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 >0g==*smI^p&D!xy_&qYYX--Pf>Lm#Vjd9gPR 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
r|jh%KdFmu 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 G^ZtLWiADSX literal 0 HcmV?d00001 diff --git a/docs/rfc/0011-demo-thermal.png b/docs/rfc/0011-demo-thermal.png new file mode 100644 index 0000000000000000000000000000000000000000..4fe8a481493a79ab8c0ce9b972776781004ea7a0 GIT binary patch literal 175737 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 literal 0 HcmV?d00001 From 34819097dc2b679f0969c7c063d86019c3161c80 Mon Sep 17 00:00:00 2001 From: Gravity Send Date: Thu, 29 Oct 2026 03:09:51 -0700 Subject: [PATCH 15/20] RFC 0011 round 7 (research): one math path for the simulated register on every build The amplitude register, an exact simulation on a CPU, now evaluates every function past + - * / (cos, sin, sqrt, asin, acos, atan2, floor) through the libm crate on the std and the no_std build alike: pure Rust, the same code and evaluation order on every target, no platform math library, no fused multiply-add. Round 5 measured the cost of two libraries: strands recorded with the long sweep re-verified 0/100 on the no_std build (qaoa-p2 98/100) because the platform's cos/sin and libm's differ in the last bits and over four times the layers a 6-decimal odd flips. libm becomes a direct dependency of probbit-decide (already in the lock through probbit-nostd, 0.2.16). Tier off: no code path changes. --- Cargo.lock | 1 + probbit-decide/Cargo.toml | 2 ++ probbit-decide/src/amp.rs | 31 +++++++++++++++++++++++-------- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4d8aba5..7b2e5f6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -59,6 +59,7 @@ dependencies = [ name = "probbit-decide" version = "0.14.0-dev" dependencies = [ + "libm", "probbit-core", "probbit-ir", "probbit-nostd", diff --git a/probbit-decide/Cargo.toml b/probbit-decide/Cargo.toml index 9da17e3..3638747 100644 --- a/probbit-decide/Cargo.toml +++ b/probbit-decide/Cargo.toml @@ -17,6 +17,8 @@ std = ["probbit-core/std", "probbit-ir/std"] nostd = ["dep:probbit-nostd", "probbit-core/nostd", "probbit-ir/nostd"] [dependencies] +# the amplitude register's one math path (cos, sin, sqrt, asin, acos, atan2) on the std and the no_std build alike (pure Rust) +libm = "0.2" probbit-nostd = { path = "../probbit-nostd", version = "0.14.0-dev", optional = true } probbit-core = { path = "../probbit-core", default-features = false, version = "0.14.0-dev" } probbit-ir = { path = "../probbit-ir", default-features = false, version = "0.14.0-dev" } diff --git a/probbit-decide/src/amp.rs b/probbit-decide/src/amp.rs index 4196d13..58da3a8 100644 --- a/probbit-decide/src/amp.rs +++ b/probbit-decide/src/amp.rs @@ -13,6 +13,21 @@ use std::prelude::rust_2021::*; use probbit_core::Philox4x32; +/// Round 7: the register's one math path. Every function past + - * / that the register evaluates (cos, sin, sqrt, asin, acos, +/// atan2, floor) is the `libm` crate's on every build, std and no_std alike: pure Rust, the same code and the same evaluation +/// order on every target, no platform libm and no fused multiply-add, so a strand recorded on one build replays bit for bit on +/// the other whatever the schedule's length (round 5: the platform's cos/sin against libm's flipped a 6-decimal odd over the +/// long sweep's layers). +mod m { + #[inline] pub fn cos(x: f64) -> f64 { libm::cos(x) } + #[inline] pub fn sin(x: f64) -> f64 { libm::sin(x) } + #[inline] pub fn sqrt(x: f64) -> f64 { libm::sqrt(x) } + #[inline] pub fn asin(x: f64) -> f64 { libm::asin(x) } + #[inline] pub fn acos(x: f64) -> f64 { libm::acos(x) } + #[inline] pub fn atan2(y: f64, x: f64) -> f64 { libm::atan2(y, x) } + #[inline] pub fn floor(x: f64) -> f64 { libm::floor(x) } +} + /// The largest register on the host (16 qubits = 1 MiB of amplitudes) pub const Q_MAX_HOST: usize = 16; /// Bytes per amplitude: two f64 @@ -30,7 +45,7 @@ impl C { #[inline] pub fn conj(self) -> C { C { re: self.re, im: -self.im } } #[inline] pub fn norm2(self) -> f64 { self.re * self.re + self.im * self.im } /// e^{i t} - #[inline] pub fn cis(t: f64) -> C { C { re: t.cos(), im: t.sin() } } + #[inline] pub fn cis(t: f64) -> C { C { re: m::cos(t), im: m::sin(t) } } } /// The gate set: enough for Ising-type programs and QAOA layers. Angles in radians; RX(t) = exp(-i t X / 2), @@ -49,7 +64,7 @@ impl Gate { /// The gate's matrix on its own qubits (2x2, or 4x4 on (a, b) with basis index bit_a + 2 bit_b), row-major pub fn matrix(&self) -> Vec { let (r, z) = (core::f64::consts::FRAC_1_SQRT_2, C::ZERO); - let half = |t: f64| (C::new((t / 2.0).cos(), 0.0), (t / 2.0).sin()); + let half = |t: f64| (C::new(m::cos(t / 2.0), 0.0), m::sin(t / 2.0)); match *self { Gate::H(_) => vec![C::new(r, 0.0), C::new(r, 0.0), C::new(r, 0.0), C::new(-r, 0.0)], Gate::X(_) => vec![z, C::ONE, C::ONE, z], @@ -147,7 +162,7 @@ impl Register { /// Round 2: the uniform superposition over the valid codes of every variable, 1/sqrt(prod d_i) on each valid basis state and /// 0 on the rest (for an all-two-valued encoding this is H on every qubit) pub fn uniform(enc: &Encoding) -> Register { - let mut r = Register::new(enc.qubits()); let a = 1.0 / (enc.levels.iter().map(|&d| d as f64).product::()).sqrt(); + let mut r = Register::new(enc.qubits()); let a = 1.0 / m::sqrt(enc.levels.iter().map(|&d| d as f64).product::()); for (x, v) in r.amp.iter_mut().enumerate() { *v = if enc.decode(x).is_some() { C::new(a, 0.0) } else { C::ZERO }; } r } @@ -344,15 +359,15 @@ pub fn amplify_exact(r: &mut Register, good: impl Fn(usize) -> bool) -> Option 0.0) { return None; } if a0 >= 1.0 - 1e-15 { return Some(Amplified { iterations: 0, phases: (0.0, 0.0), mass_before: a0, mass_after: a0 }); } let psi = r.amp.clone(); let pi = core::f64::consts::PI; - let th = a0.sqrt().asin(); let k = (pi / (4.0 * th) - 0.5).floor().max(0.0) as usize; + let th = m::asin(m::sqrt(a0)); let k = m::floor(pi / (4.0 * th) - 0.5).max(0.0) as usize; for _ in 0..k { r.oracle(&g, pi); r.diffuse(&psi, pi); } // the final step: the state is +-(al |good> + be |bad>), al, be >= 0; with s = sin theta, c = cos theta, S_psi(varphi) // S_f(phi) leaves be - (1 - e^{i varphi}) c (al s e^{i phi} + be c) on |bad>: it vanishes for // cos phi = -(be / al) cos(2 theta) / sin(2 theta) (|cos phi| < 1 for this k) and 1 - e^{i varphi} = be / (c (al s e^{i phi} + be c)) - let a = mass(r).min(1.0); let (al, be) = (a.sqrt(), (1.0 - a).max(0.0).sqrt()); let (s, c) = (a0.sqrt(), (1.0 - a0).sqrt()); - let cphi = (-(be / al) * (1.0 - 2.0 * a0) / (2.0 * s * c)).clamp(-1.0, 1.0); let phi = cphi.acos(); - let w = C::new(al * s * phi.cos() + be * c, al * s * phi.sin()); let den = w.norm2() * c; // z = be / (c w) = be conj(w) / (c |w|^2) - let z = C::new(be * w.re / den, -be * w.im / den); let vphi = (-z.im).atan2(1.0 - z.re); + let a = mass(r).min(1.0); let (al, be) = (m::sqrt(a), m::sqrt((1.0 - a).max(0.0))); let (s, c) = (m::sqrt(a0), m::sqrt(1.0 - a0)); + let cphi = (-(be / al) * (1.0 - 2.0 * a0) / (2.0 * s * c)).clamp(-1.0, 1.0); let phi = m::acos(cphi); + let w = C::new(al * s * m::cos(phi) + be * c, al * s * m::sin(phi)); let den = w.norm2() * c; // z = be / (c w) = be conj(w) / (c |w|^2) + let z = C::new(be * w.re / den, -be * w.im / den); let vphi = m::atan2(-z.im, 1.0 - z.re); r.oracle(&g, phi); r.diffuse(&psi, vphi); let m = mass(r); if m < AMPLIFIED_MASS_MIN { return None; } Some(Amplified { iterations: k + 1, phases: (phi, vphi), mass_before: a0, mass_after: m }) From ac1f76bd8a5e665e4b5b931267e1ff605283e77f Mon Sep 17 00:00:00 2001 From: Gravity Send Date: Thu, 29 Oct 2026 03:34:18 -0700 Subject: [PATCH 16/20] RFC 0011 round 7 (research): the simulated register's amplification lands on the long sweep too amplify_exact renormalises the swept state once before the iterations (its squared norm summed with Neumaier's compensation). The diffusion about a state of squared norm 1 + eps is not unitary: |D v|^2 = |v|^2 + 4 eps ||^2, so the error grows with every iteration, linearly in their number. The long sweep's four times the layers leave a larger eps, and at a tiny good mass (hundreds of iterations) that left 165 corpus programs about 1e-12 short of the landing's bar (round 5: they declined to the default tiers). A rotation in the 2-D plane would hide the cause; renormalising removes it and keeps every iteration the same unitary step. Test: a state of squared norm 1 + 1e-12 and one good state of 2^14 (100 iterations) lands within 1e-12 of mass 1. Exact, simulated on a CPU; tier off: no code path changes. --- probbit-decide/src/amp.rs | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/probbit-decide/src/amp.rs b/probbit-decide/src/amp.rs index 58da3a8..5b24275 100644 --- a/probbit-decide/src/amp.rs +++ b/probbit-decide/src/amp.rs @@ -354,11 +354,16 @@ pub const AMPLIFIED_MASS_MIN: f64 = 1.0 - 1e-12; /// evolution. a0 = 1: nothing to do (0 iterations); a0 = 0: None (nothing to amplify). Round 5: a landing whose mass after is /// below 1 - 1e-12 (rounding drift over many iterations at a tiny a0, measured with the long sweep) is also None, so the tier /// declines to the default tiers instead of panicking; the register is then left mid-rotation and must not be read. +/// Round 7: psi is renormalised once before the iterations (its squared norm summed with compensation). The sweep's layers +/// leave it 1 + eps, a larger eps the more layers; the diffusion about such a psi is not unitary (|D v|^2 = |v|^2 + 4 eps ||^2), +/// so the error grows with every iteration, linearly in k: that, not the rotation, was the ~1e-12 shortfall of the long sweep's +/// 165 corpus programs (k in the hundreds at a tiny a0), and the same eps of the other sign is round 4's drift above 1. pub fn amplify_exact(r: &mut Register, good: impl Fn(usize) -> bool) -> Option { let g: Vec = (0..r.amp.len()).map(&good).collect(); let mass = |r: &Register| r.amp.iter().zip(&g).filter(|(_, &x)| x).map(|(a, _)| a.norm2()).sum::(); let a0 = mass(r); if !(a0 > 0.0) { return None; } if a0 >= 1.0 - 1e-15 { return Some(Amplified { iterations: 0, phases: (0.0, 0.0), mass_before: a0, mass_after: a0 }); } - let psi = r.amp.clone(); let pi = core::f64::consts::PI; + let n2 = compensated_norm2(&r.amp); let u = 1.0 / m::sqrt(n2); for a in r.amp.iter_mut() { *a = C::new(a.re * u, a.im * u); } + let a0 = mass(r); let psi = r.amp.clone(); let pi = core::f64::consts::PI; let th = m::asin(m::sqrt(a0)); let k = m::floor(pi / (4.0 * th) - 0.5).max(0.0) as usize; for _ in 0..k { r.oracle(&g, pi); r.diffuse(&psi, pi); } // the final step: the state is +-(al |good> + be |bad>), al, be >= 0; with s = sin theta, c = cos theta, S_psi(varphi) @@ -373,6 +378,14 @@ pub fn amplify_exact(r: &mut Register, good: impl Fn(usize) -> bool) -> Option f64 { + let (mut s, mut c) = (0.0f64, 0.0f64); + for a in amp { let x = a.norm2(); let t = s + x; c += if s >= x { (s - t) + x } else { (x - t) + s }; s = t; } // s, x >= 0 + s + c +} + /// sha256 (FIPS 180-4), one shot pub fn sha256(data: &[u8]) -> [u8; 32] { const K: [u32; 64] = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, @@ -465,6 +478,17 @@ mod tests { let q = Evolution::named(SCHEDULE_NAMES[2]).unwrap(); assert_eq!(q.name(), "qaoa-p2"); assert_eq!(q.run(&enc, &e).amplitudes(), qaoa_on(&enc, &e, &QAOA_P2).amplitudes()); assert_eq!(q.text(), "qaoa layers 2\ngamma 0.500000 beta 0.500000\ngamma 1.500000 beta 0.250000\n"); assert!(Evolution::named("tf-linear-8x2").is_none()); } + /// Round 7: a psi whose squared norm is off by 1e-12 (a long sweep leaves ~1e-14) and one good state of 2^14, so about a + /// hundred iterations: without the renormalisation the landing drifts by ~2 k eps (~2e-10); with it the mass stays within + /// 1e-12 of 1 and the good state's probability is 1 + #[test] + fn a_landing_after_a_hundred_iterations_keeps_its_mass() { + let enc = Encoding::two_valued(14); let mut r = Register::uniform(&enc); let f = (1.0 + 1e-12f64).sqrt(); + for a in r.amp.iter_mut() { *a = C::new(a.re * f, a.im * f); } + let am = amplify_exact(&mut r, |x| x == 5).unwrap(); assert!(am.iterations > 90, "{}", am.iterations); + assert!((am.mass_after - 1.0).abs() <= 1e-12, "mass after {:e}", am.mass_after - 1.0); assert!((r.probabilities()[5] - 1.0).abs() <= 1e-12); + assert!((compensated_norm2(r.amplitudes()) - 1.0).abs() <= 1e-12); + } #[test] fn measure_and_digest_are_deterministic() { let p = Ising { q: 4, a: vec![0.5, 0.1, -0.3, 0.2], b: vec![(0, 3, 0.4)] }; From f132e5a1eb0f18d0886e17141eeff7dfe3324915 Mon Sep 17 00:00:00 2001 From: Gravity Send Date: Thu, 29 Oct 2026 03:53:22 -0700 Subject: [PATCH 17/20] RFC 0011 round 7 (research): the receipt's mass before stays the swept state's The previous commit reported the renormalised state's good mass as the amplification's mass before; it differs from the swept state's in the last bits, which the unit test exact_amplification_lands_on_the_projection caught (1e-15 bar, CI on ubuntu and macOS). The receipt keeps the swept state's mass, as since round 4; the rotation's angle uses the renormalised state's. Exact, simulated on a CPU; tier off: no code path changes. --- probbit-decide/src/amp.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/probbit-decide/src/amp.rs b/probbit-decide/src/amp.rs index 5b24275..60d8405 100644 --- a/probbit-decide/src/amp.rs +++ b/probbit-decide/src/amp.rs @@ -363,7 +363,8 @@ pub fn amplify_exact(r: &mut Register, good: impl Fn(usize) -> bool) -> Option 0.0) { return None; } if a0 >= 1.0 - 1e-15 { return Some(Amplified { iterations: 0, phases: (0.0, 0.0), mass_before: a0, mass_after: a0 }); } let n2 = compensated_norm2(&r.amp); let u = 1.0 / m::sqrt(n2); for a in r.amp.iter_mut() { *a = C::new(a.re * u, a.im * u); } - let a0 = mass(r); let psi = r.amp.clone(); let pi = core::f64::consts::PI; + // the receipt's mass before stays the swept state's (a0); the rotation uses the renormalised state's + let (mass_before, a0) = (a0, mass(r)); let psi = r.amp.clone(); let pi = core::f64::consts::PI; let th = m::asin(m::sqrt(a0)); let k = m::floor(pi / (4.0 * th) - 0.5).max(0.0) as usize; for _ in 0..k { r.oracle(&g, pi); r.diffuse(&psi, pi); } // the final step: the state is +-(al |good> + be |bad>), al, be >= 0; with s = sin theta, c = cos theta, S_psi(varphi) @@ -375,7 +376,7 @@ pub fn amplify_exact(r: &mut Register, good: impl Fn(usize) -> bool) -> Option Date: Thu, 29 Oct 2026 04:06:48 -0700 Subject: [PATCH 18/20] RFC 0011 round 7 (research): renormalise only before standard iterations; a non-finite mass declines CI on the previous head (persona tests amplify_lands_on_the_projection_and_logs_it and the_schedule_key_names_the_evolution, macOS) found the renormalisation's edge: a component whose plans are all feasible has a good mass a hair under 1, and after renormalising its naive sum can round above 1, so asin(sqrt) is NaN and the turn panicked reading the plan. The swept state is now renormalised only when there are standard iterations to drift over (k >= 1, so the good mass is at most 1/4); with none, the one matched step is round 4's, unchanged. A mass after that is not a number now declines to the default tiers like a missed landing, never a panic. Exact, simulated on a CPU; tier off: no code path changes. --- probbit-decide/src/amp.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/probbit-decide/src/amp.rs b/probbit-decide/src/amp.rs index 60d8405..6b29ac0 100644 --- a/probbit-decide/src/amp.rs +++ b/probbit-decide/src/amp.rs @@ -354,7 +354,8 @@ pub const AMPLIFIED_MASS_MIN: f64 = 1.0 - 1e-12; /// evolution. a0 = 1: nothing to do (0 iterations); a0 = 0: None (nothing to amplify). Round 5: a landing whose mass after is /// below 1 - 1e-12 (rounding drift over many iterations at a tiny a0, measured with the long sweep) is also None, so the tier /// declines to the default tiers instead of panicking; the register is then left mid-rotation and must not be read. -/// Round 7: psi is renormalised once before the iterations (its squared norm summed with compensation). The sweep's layers +/// Round 7: psi is renormalised once before the standard iterations, when there are any (its squared norm summed with +/// compensation; a NaN mass declines like a miss). The sweep's layers /// leave it 1 + eps, a larger eps the more layers; the diffusion about such a psi is not unitary (|D v|^2 = |v|^2 + 4 eps ||^2), /// so the error grows with every iteration, linearly in k: that, not the rotation, was the ~1e-12 shortfall of the long sweep's /// 165 corpus programs (k in the hundreds at a tiny a0), and the same eps of the other sign is round 4's drift above 1. @@ -362,10 +363,14 @@ pub fn amplify_exact(r: &mut Register, good: impl Fn(usize) -> bool) -> Option = (0..r.amp.len()).map(&good).collect(); let mass = |r: &Register| r.amp.iter().zip(&g).filter(|(_, &x)| x).map(|(a, _)| a.norm2()).sum::(); let a0 = mass(r); if !(a0 > 0.0) { return None; } if a0 >= 1.0 - 1e-15 { return Some(Amplified { iterations: 0, phases: (0.0, 0.0), mass_before: a0, mass_after: a0 }); } - let n2 = compensated_norm2(&r.amp); let u = 1.0 / m::sqrt(n2); for a in r.amp.iter_mut() { *a = C::new(a.re * u, a.im * u); } - // the receipt's mass before stays the swept state's (a0); the rotation uses the renormalised state's - let (mass_before, a0) = (a0, mass(r)); let psi = r.amp.clone(); let pi = core::f64::consts::PI; - let th = m::asin(m::sqrt(a0)); let k = m::floor(pi / (4.0 * th) - 0.5).max(0.0) as usize; + let pi = core::f64::consts::PI; let k_of = |a0: f64| m::floor(pi / (4.0 * m::asin(m::sqrt(a0))) - 0.5).max(0.0) as usize; + // renormalise only when there are standard iterations to drift over (k >= 1, so a0 <= 1/4): with none, the one matched step + // is round 4's, unchanged, and a mass near 1 cannot round above 1. The receipt's mass before stays the swept state's (a0); + // the rotation uses the renormalised state's. + let mass_before = a0; + let a0 = if k_of(a0) == 0 { a0 } else { let u = 1.0 / m::sqrt(compensated_norm2(&r.amp)); for a in r.amp.iter_mut() { *a = C::new(a.re * u, a.im * u); } mass(r) }; + let psi = r.amp.clone(); + let k = k_of(a0); for _ in 0..k { r.oracle(&g, pi); r.diffuse(&psi, pi); } // the final step: the state is +-(al |good> + be |bad>), al, be >= 0; with s = sin theta, c = cos theta, S_psi(varphi) // S_f(phi) leaves be - (1 - e^{i varphi}) c (al s e^{i phi} + be c) on |bad>: it vanishes for @@ -375,7 +380,7 @@ pub fn amplify_exact(r: &mut Register, good: impl Fn(usize) -> bool) -> Option= AMPLIFIED_MASS_MIN) { return None; } // a NaN declines too Some(Amplified { iterations: k + 1, phases: (phi, vphi), mass_before, mass_after: m }) } From 1301fceb4c09faef43e7c3c3be187b92d0d0d927 Mon Sep 17 00:00:00 2001 From: Gravity Send Date: Thu, 29 Oct 2026 04:12:14 -0700 Subject: [PATCH 19/20] RFC 0011 round 7 (research): docs, the simulated register replays on the std and the no_std build The RFC gains "One math path (round 7)": 100 fresh lives per schedule recorded on the std build re-verify on the no_std build 100/100 for tf-linear-16x4, tf-linear-64x16 (round 5: 0/100) and qaoa-p2 (98/100) on x86_64, the default schedule's strands byte-identical to the round-6 engine's, both demo strands re-recorded byte for byte, arm64 not measured; and the missed landing's cause and fix. docs/persona.md's engine.schedule paragraph and the demo README replace "recording build only" with that measured result; docs/persona.md section 5.8 now says the stance digest is the sha256 of /doc/N's JSON without the trailing newline (checked on both demo strands). CHANGELOG Research: one bullet per item. Exact, simulated on a CPU. --- CHANGELOG.md | 11 ++++++++++ docs/persona.md | 8 ++++--- docs/rfc/0011-amplitude-register.md | 34 ++++++++++++++++++++++++----- examples/persona/demo/README.md | 7 +++--- 4 files changed, 49 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3757aea..c93c060 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -197,6 +197,17 @@ checkpoint's `expect`, `expectation.rest`, the `identity` self keys) read as uns README names the second warning an older probbit gives; REPRODUCE.md no longer says only 0.12.0 replays the strand. ### Research +- **RFC 0011, round 7: one math path for the register** (research, `engine.tier: amplitude` stays opt-in; docs/rfc/0011-amplitude-register.md, + "One math path"). The simulated register evaluates cos, sin, sqrt, asin, acos, atan2 and floor through the `libm` crate on the std and + the no_std build alike (a direct dependency of probbit-decide). 100 fresh lives per schedule recorded on the std build re-verify on + the no_std build 100/100 for `tf-linear-16x4`, `tf-linear-64x16` (round 5: 0/100) and `qaoa-p2` (98/100), x86_64; the default + schedule's strands are byte-identical to before (100/100) and both demo strands re-record byte for byte. Exact, on a CPU. +- **RFC 0011, round 7: the amplification lands on the long sweep** (research). `amplify_exact` renormalises the swept state once + before the standard iterations: the diffusion about a state of squared norm 1 + eps is not unitary, so the shortfall grew with the + iterations and 165 corpus programs declined under the long sweep. The receipt's mass before is unchanged; a mass that is not a + number declines instead of panicking. Simulated, exact, on a CPU. +- **RFC 0011, round 7: docs** (research). docs/persona.md's `engine.schedule` paragraph and the demo README state the measured + replay on both builds; docs/persona.md section 5.8: the stance digest is the sha256 of `/doc/N`'s JSON without the trailing newline. - **RFC 0011, round 6: the demo** (research; `examples/persona/demo/`, docs/rfc/0011-amplitude-register.md, "The demo"). A fictional tutor reduced to its humour component, with praise and criticism pulling humour in opposite directions, in two copies: `register.yaml` (`engine: {tier: amplitude, amplify: true, schedule: tf-linear-64x16}`) and `thermal.yaml` (no engine diff --git a/docs/persona.md b/docs/persona.md index 0d49753..6c80260 100644 --- a/docs/persona.md +++ b/docs/persona.md @@ -255,8 +255,10 @@ rules are the oracle, the register is rotated onto the plans that obey them, the 1.1e-12) and `engine.amplify` logs the iterations, the final phases and the mass before and after (`feasible_mass` 1). `engine.schedule` (research, round 5; needs the tier; absent = `tf-linear-16x4`) names the evolution of the register, simulated exactly on a CPU: `tf-linear-64x16` (four times the layers) separates the top two levels where the thermal tier is a near tie (median gap 0.152 vs 0.049 on the recorded corpus) and -agrees more elsewhere; `qaoa-p2` is two fixed QAOA layers (RFC 0011, "Schedules and the indifferent set"). Strands recorded with a -non-default schedule do not yet replay on the no_std build (last-bit math differences; the default does). The register is a +agrees more elsewhere; `qaoa-p2` is two fixed QAOA layers (RFC 0011, "Schedules and the indifferent set"). Since round 7 the +register computes its math functions with one library (`libm`) on the std and the no_std build: 100 fresh lives per schedule +recorded on the std build re-verify on the no_std build 100 of 100 and re-write byte for byte, on each of the three schedules +(x86_64; arm64 not measured), and the default schedule's strands are byte-identical to before. The register is a simulation: no quantum hardware, no speedup claim; its stances agree with the default tier in 96 % of trait decisions on the recorded corpus (RFC 0011, round 3). With the key, `persona bound` probes through the tier: compute the certificate again with it, since one computed without the key does not cover the tier. @@ -1849,7 +1851,7 @@ cannot read the documents: |---|---| | `/` | the page: one file embedded in the binary (under 72 KB, styles and script inline; it fetches no fonts, styles or scripts), with a Content-Security-Policy that lets it connect to its own server and nowhere else | | `/events` | server-sent events: `meta` (the layout: the strand, the engine, the persona, its traits, moods, inputs and history features in the persona's order, and `face`, the two moods the face's meters show), the latest `frame`, then a frame per event: `{n, doc, given, learned, spark, diverges, note}` (with `engine.trajectory` also `trajectory` and `settle`, below), that is the stance document, the inputs as the strand logs them, the learned deltas, the moods' recent positions, the line that differs and a warning; a heartbeat comment after 15 quiet seconds; events that land within one poll (100 ms), or while a page falls behind, come as the latest frame | -| `/doc/N` | event N's stance document, canonical JSON and a newline, as `probbit live` printed it (its sha256 is the `stance` digest of the strand's line N + 1); the latest 10,000 are kept | +| `/doc/N` | event N's stance document, canonical JSON and a newline, as `probbit live` printed it (the sha256 of the JSON without that newline is the `stance` digest of the strand's line N + 1); the latest 10,000 are kept | | `/strands` | the strands served, canonical JSON: `{demo, dir, strands: [{id, strand, labels, persona, n, glyph, age_s, labels_error?, segment?}]}` (the file name, never its directory; `age_s`: seconds since the strand file was last written, a life in segments: its newest file; `segment`: that file's index, when it is not the first); the demo lists none | | `/s/ID/events`, `/s/ID/doc/N` | as `/events` and `/doc/N`, for strand ID; `/events` and `/doc/N` are the first strand's, so a single-strand page is as before | diff --git a/docs/rfc/0011-amplitude-register.md b/docs/rfc/0011-amplitude-register.md index de01cf2..ca4e0df 100644 --- a/docs/rfc/0011-amplitude-register.md +++ b/docs/rfc/0011-amplitude-register.md @@ -199,9 +199,9 @@ Replay, measured, and a failure printed as one: 100 lives per schedule record tw emit 0 floats past 6 decimals; an engine without the tier exits 5. The no_std build (the chip's math library) re-verifies the default schedule's lives 100 of 100 on x86_64, but **the long sweep's 0 of 100 and qaoa-p2's 98 of 100**: the platform's math functions and the no_std library differ in the last bits, and over four times the layers a 6-decimal odd flips. On an arm64 -host even the default fails there (0 of 5 on round 4's own path), so that part is not new. Until the tier computes with the same -math functions on every build, a non-default schedule replays only on the build that recorded it: the long sweep is the study's -answer, not a schedule to record strands with yet. +host even the default fails there (0 of 5 on round 4's own path), so that part is not new. Round 7 (below, "One math path") +makes the tier compute with the same math functions on every build: all three schedules now replay 100 of 100 on the no_std +build on x86_64. ### The demo (round 6) @@ -247,13 +247,37 @@ selected. Thermal: `playful` 47.4 %, `light` 46.7 %, the panel's words "playful, **The sentence.** On one recorded decision of a fictional tutor, the default solver's odds for its two leading humour levels sit 0.007412 apart; the same program, solved by a qubit register simulated exactly on a CPU, separates them by 0.494808. -Caveat: the long sweep replays on the recording (std) build only, and the default schedule stays the one for every recorded -strand. +Since round 7 both strands re-record byte for byte and re-verify on the no_std build as well ("One math path", below). **Cost** (x86_64, best of 5, the life repeated 20 times, 340 events): thermal 2,184 µs per event, the register with the long sweep 1,822 µs (0.83× the thermal copy), the register with the default sweep 913 µs (the long sweep 2.00× the default sweep). On this five-variable persona the thermal copy's exact enumeration costs more than the register. +### One math path (round 7) + +What an optional tier needs: the same odds on every build, no declines, the numbers re-measured. The register, simulated +exactly on a CPU, now evaluates every function past + − × ÷ (cos, sin, sqrt, asin, acos, atan2, floor) through the `libm` +crate on the std and the no_std build alike: pure Rust, the same code and evaluation order on every target, no platform math +library, no fused multiply-add. Measured on x86_64 (100 fresh tutor lives per schedule recorded on the std build, each +re-verified and re-written by a no_std build of the persona crate on the host): + +| schedule | recorded twice byte-equal | verify (std) | verify (no_std) | no_std re-write byte-equal | strands equal to the round-6 engine's | +|---|---|---|---|---|---| +| `tf-linear-16x4` (default) | 100/100 | 100/100 | **100/100** (round 5: 100/100) | 100/100 | 100/100 | +| `tf-linear-64x16` | 100/100 | 100/100 | **100/100** (round 5: 0/100) | 100/100 | 0/100 | +| `qaoa-p2` | 100/100 | 100/100 | **100/100** (round 5: 98/100) | 100/100 | 98/100 | + +The default schedule's strands are byte-identical to the round-6 engine's, so no recorded register strand moves; the long +sweep's do move (the math changed in the last bits, and the 6-decimal digests with it), which an unreleased tier allows. Both demo strands re-record byte for byte. The arm64 leg is not measured (no arm64 runner for the replay). + +The missed landing: the diffusion about a swept state of squared norm 1 + ε is not unitary (|Dv|² = |v|² + 4ε|⟨ψ|v⟩|²), so +the error grows with every iteration, linearly in their number; at a tiny feasible mass (hundreds of iterations) the long +sweep's ε left 165 corpus programs about 1e-12 short of the landing, and the same ε of the other sign is round 4's drift above +1. `amplify_exact` now renormalises the swept state once before the standard iterations (squared norm by a compensated sum; +only when there are iterations, so the one matched step of a mass above 1/4 is unchanged), and a mass that is not a number +declines like a miss. A rotation in the plane would have hidden the cause; renormalising keeps every iteration the same +unitary step. The receipt's mass before stays the swept state's; `feasible_mass` stays 1. + ## 6. What this RFC does not claim That a CPU can do what quantum hardware does at scale (it cannot: section 1), that the register has experiences (it is diff --git a/examples/persona/demo/README.md b/examples/persona/demo/README.md index d29885d..8539d19 100644 --- a/examples/persona/demo/README.md +++ b/examples/persona/demo/README.md @@ -45,6 +45,7 @@ The register strand's documents carry the receipts: `engine.tier` `amplitude`, ` `engine.amplify` (iterations, phases, the mass before and after), `feasible_mass` 1.000000 and the `state` digest of the final amplitudes at 6 decimals. -**Caveat.** The long sweep replays on the recording (std) build only for now: the no_std build's math library differs from the -platform's in the last bits, and over four times the layers a 6-decimal odd can flip. The default schedule stays the one for -every recorded strand; an engine without the tier (0.13.0) refuses `register.strand` (exit 5) and verifies `thermal.strand`. +**Replay on every build.** Since round 7 the register computes its math functions with one library on the std and the no_std +build, so the long sweep replays on both: 100 fresh lives per schedule recorded on the std build re-verify on the no_std build +100 of 100 (x86_64; arm64 not measured), and both strands here re-record byte for byte and verify on the no_std build. An +engine without the tier (0.13.0) refuses `register.strand` (exit 5) and verifies `thermal.strand`. From dc529b58be93925b75dde52d6633851114f8dc14 Mon Sep 17 00:00:00 2001 From: Gravity Send Date: Thu, 29 Oct 2026 04:35:10 -0700 Subject: [PATCH 20/20] RFC 0011 round 7 (research): docs, the study re-run and what the replay result does not cover The simulated register, exact on a CPU: round 5's study re-run on this tree declines 0 programs under any schedule (round 5: 165 under the long sweep); the long sweep's median gap 0.151709 and agreement 0.981671; cost 1.50x the default per event on a 52-qubit recorded day; no_std stack at most 2,944 B. The previous docs commit said the default schedule's strands are byte-identical to before: true for the tutor lives and the demo, not for every persona (that recorded day's default strands moved in the last bits). persona.md, the RFC and the CHANGELOG now say which. --- CHANGELOG.md | 10 ++++++---- docs/persona.md | 3 ++- docs/rfc/0011-amplitude-register.md | 9 +++++++-- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c93c060..71c326a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -200,12 +200,14 @@ checkpoint's `expect`, `expectation.rest`, the `identity` self keys) read as uns - **RFC 0011, round 7: one math path for the register** (research, `engine.tier: amplitude` stays opt-in; docs/rfc/0011-amplitude-register.md, "One math path"). The simulated register evaluates cos, sin, sqrt, asin, acos, atan2 and floor through the `libm` crate on the std and the no_std build alike (a direct dependency of probbit-decide). 100 fresh lives per schedule recorded on the std build re-verify on - the no_std build 100/100 for `tf-linear-16x4`, `tf-linear-64x16` (round 5: 0/100) and `qaoa-p2` (98/100), x86_64; the default - schedule's strands are byte-identical to before (100/100) and both demo strands re-record byte for byte. Exact, on a CPU. + the no_std build 100/100 for `tf-linear-16x4`, `tf-linear-64x16` (round 5: 0/100) and `qaoa-p2` (98/100), x86_64; the tutor's + default-schedule strands are byte-identical to before (100/100) and both demo strands re-record byte for byte (a 52-qubit + recorded day's default strands moved in the last bits). Cost on that day: long sweep 1.50x the default. Exact, on a CPU. - **RFC 0011, round 7: the amplification lands on the long sweep** (research). `amplify_exact` renormalises the swept state once before the standard iterations: the diffusion about a state of squared norm 1 + eps is not unitary, so the shortfall grew with the - iterations and 165 corpus programs declined under the long sweep. The receipt's mass before is unchanged; a mass that is not a - number declines instead of panicking. Simulated, exact, on a CPU. + iterations and 165 corpus programs declined under the long sweep; now 0 decline under any schedule (median gap 0.151709, agreement + 0.981671 on the corpus). The receipt's mass before is unchanged; a mass that is not a number declines instead of panicking. + Simulated, exact, on a CPU. - **RFC 0011, round 7: docs** (research). docs/persona.md's `engine.schedule` paragraph and the demo README state the measured replay on both builds; docs/persona.md section 5.8: the stance digest is the sha256 of `/doc/N`'s JSON without the trailing newline. - **RFC 0011, round 6: the demo** (research; `examples/persona/demo/`, docs/rfc/0011-amplitude-register.md, "The demo"). A diff --git a/docs/persona.md b/docs/persona.md index 6c80260..4040554 100644 --- a/docs/persona.md +++ b/docs/persona.md @@ -258,7 +258,8 @@ the layers) separates the top two levels where the thermal tier is a near tie (m agrees more elsewhere; `qaoa-p2` is two fixed QAOA layers (RFC 0011, "Schedules and the indifferent set"). Since round 7 the register computes its math functions with one library (`libm`) on the std and the no_std build: 100 fresh lives per schedule recorded on the std build re-verify on the no_std build 100 of 100 and re-write byte for byte, on each of the three schedules -(x86_64; arm64 not measured), and the default schedule's strands are byte-identical to before. The register is a +(x86_64; arm64 not measured). The math change is in the last bits: the tutor's and the demo's default-schedule strands are +byte-identical to before, a larger persona's can move. The register is a simulation: no quantum hardware, no speedup claim; its stances agree with the default tier in 96 % of trait decisions on the recorded corpus (RFC 0011, round 3). With the key, `persona bound` probes through the tier: compute the certificate again with it, since one computed without the key does not cover the tier. diff --git a/docs/rfc/0011-amplitude-register.md b/docs/rfc/0011-amplitude-register.md index ca4e0df..5d26c24 100644 --- a/docs/rfc/0011-amplitude-register.md +++ b/docs/rfc/0011-amplitude-register.md @@ -267,8 +267,13 @@ re-verified and re-written by a no_std build of the persona crate on the host): | `tf-linear-64x16` | 100/100 | 100/100 | **100/100** (round 5: 0/100) | 100/100 | 0/100 | | `qaoa-p2` | 100/100 | 100/100 | **100/100** (round 5: 98/100) | 100/100 | 98/100 | -The default schedule's strands are byte-identical to the round-6 engine's, so no recorded register strand moves; the long -sweep's do move (the math changed in the last bits, and the 6-decimal digests with it), which an unreleased tier allows. Both demo strands re-record byte for byte. The arm64 leg is not measured (no arm64 runner for the replay). +The tutor's default-schedule strands are byte-identical to the round-6 engine's and both demo strands re-record byte for byte, +but the change is in the last bits and a larger persona's default strands can move: on a recorded day of a 52-qubit persona +they did (qaoa-p2's did not); the long sweep's tutor strands all moved. An unreleased tier allows it; no shipped fixture moved. +The study of round 5 re-run on this tree: 0 programs decline under any schedule (round 5: 165 under the long sweep), the long +sweep's median gap on the indifferent decisions 0.151709 and agreement on the others 0.981671 (round 5: 0.151709, 0.981717, +now over the formerly declined decisions too), the default's and qaoa-p2's rows unchanged to 6 decimals; cost per event on that +day 1.50x the default for the long sweep (branch vs the round-6 engine 0.95-1.00x); no_std stack at most 2,944 B per schedule. Both demo strands re-record byte for byte. The arm64 leg is not measured (no arm64 runner for the replay). The missed landing: the diffusion about a swept state of squared norm 1 + ε is not unitary (|Dv|² = |v|² + 4ε|⟨ψ|v⟩|²), so the error grows with every iteration, linearly in their number; at a tiny feasible mass (hundreds of iterations) the long