From 47c6b24c375109649139e34f56c9096ae5005c81 Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 07:52:40 -0700 Subject: [PATCH 01/15] bench/individuality: p0 passes repository-relative paths; EXPECTED re-recorded with 0.8.2 A fuzz document that finds a counterexample names the persona path as given in its explain and replay strings, so fuzz/adaptive-fixture depended on the clone's location. Every command already runs at the repository root; personas and rules are now passed relative to it. Re-recorded with the same released 0.8.2 binary: one line changed (fuzz/adaptive-fixture, 43,646 bytes). Logged in the bench README. --- bench/individuality/README.md | 7 +++++++ bench/individuality/fixtures/MANIFEST | 4 ++-- bench/individuality/fixtures/p0/EXPECTED | 2 +- bench/individuality/p0.py | 17 ++++++++++++----- 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/bench/individuality/README.md b/bench/individuality/README.md index 5403295..4da2b23 100644 --- a/bench/individuality/README.md +++ b/bench/individuality/README.md @@ -166,3 +166,10 @@ d 0 differing bytes over 240 strands, e 0 violations and 0 breaks over 9,442 sta outputs apart (`stderr_senses_warning_only`). The recorded outputs, scripts and strands are unchanged. Reason: the line is part of the senses release (an undeclared key is named once); it is not a document, and every document stays byte-identical. MANIFEST's p0.py line was updated with the change. +- `p0.py` and `fixtures/p0/EXPECTED`: the corpus now passes personas and rules by their paths relative to the repository + root, where every command runs. Reason: a fuzz document that finds a counterexample names the persona path as given in + its `explain` and `replay` strings, so `fuzz/adaptive-fixture` (43,726 bytes recorded from one clone) differed from a + clone at another path while the engine's bytes were the same. EXPECTED was re-recorded with the same released 0.8.2 + binary (sha256 in MANIFEST) using relative paths: one line changed (`fuzz/adaptive-fixture`, now 43,646 bytes); every + other output, the scripts and the strands are unchanged. MANIFEST's EXPECTED and p0.py lines were updated with the + change. diff --git a/bench/individuality/fixtures/MANIFEST b/bench/individuality/fixtures/MANIFEST index ea3e8ef..cdc799c 100644 --- a/bench/individuality/fixtures/MANIFEST +++ b/bench/individuality/fixtures/MANIFEST @@ -6,7 +6,7 @@ binary probbit-0.8.2 2c3455ef93092fd5036be766b19e96954cc4d164c15773f1411759fc26b93669 # Re-record: PROBBIT_BIN=<0.8.2 binary> python3 ../p0.py record (gives these bytes); check: python3 ../p0.py check 82bb5b3d140739addac6dcde8e3d31e70d15e46bdb7ece9bb48e2a712286f744 7029 gen.py -c68f9d2dff98e57cf43ebaa91d6737b497e6c04d67d1efc04e5503e529f08d16 65059 p0/EXPECTED +ac483b0746c79c4b1cebca2f357b8b85a97c37c5de961d700bff6a4c8033ddcd 65059 p0/EXPECTED 82e6748f463f6ab7f93a1959176fcf2c7a1cc709d271dd20cae14e0eb731f783 1300 p0/personas/scout.json d7b6541670ac26f143c757f5bcf4ef3151db3452fb80d7a2d604497394f13875 102 p0/props/retry.json c4b513d05a1e0273e8e865104ac8185fcc0648f60319129fc9f49f6a3751f5ee 122 p0/props/tutor.json @@ -53,7 +53,7 @@ a88d3b20b41e9843f2b9ac9b117d5b462ec6b1095c762da531cb98481ff48432 43389 p0/strand 615978432a80e6b8be7fdf6e2382438516dc67acae56c562221c89654cae479e 6815 p0/strands/tutor-s0-0.appended cf9073507dad98bedc4f09ca2e49f34862919240c64c548b7a1dcf58fda4804b 1160 p0/strands/tutor-s0-0.state.json 4db5f3d83a0e6df0ea632c35957cdb0970665422af9054fa50e5468e13a888ab 55008 p0/strands/tutor-s0-0.strand -81b67a8364ac4aa3a884ca1ff8222ac4904e3493cc66cb6d8c8246e8760dcf14 12370 ../p0.py +e2ffc0667ba2b5ccb6061c9bee43b4474a6568924404a14fe39f94c8e1018272 12841 ../p0.py # # Metrics a, b, d and e: frozen 2026-10-14 before their first run (personas, generator, streams, bars). # Re-generate the streams: python3 lives.py (gives these bytes). diff --git a/bench/individuality/fixtures/p0/EXPECTED b/bench/individuality/fixtures/p0/EXPECTED index 4fbdc59..5ce9d27 100644 --- a/bench/individuality/fixtures/p0/EXPECTED +++ b/bench/individuality/fixtures/p0/EXPECTED @@ -265,7 +265,7 @@ fb47f75a0b3445d1e702e061409249f56138df6511a6cc5a1b3ba0d6ad96b008 44703 0 live/tr a96ee464b86d944e1c4f7c11c872dd2129ba84440be21749de21ea1d72309080 56676 1 lint-props/adaptive 18d60819c1a02a1f728a83abb975020b1a9c2d798937136862850fc48cfefa11 19428 1 prove/adaptive 0d68b3964806df677843dd5bbdad11486b9de286e6f9904985807c504e7e0419 38190 1 fuzz/adaptive -3d1b673e8deb25141fc624e96fd7482921047820aa76a196df4b838bca9a7a7e 43726 1 fuzz/adaptive-fixture +162b3b619c8e511b0fd93ad95b4340ac0b9579c40d548382feebf3163f86025c 43646 1 fuzz/adaptive-fixture 49cbf7d0b001f2402878869fc3819f0f75d82566e59ae9b8736ebbd43d5abe1e 149 2 replay/adaptive/s0/0/stdout 85baec52b2402bb25cd588afe5cf6bc7968ead30e4946ebef90a72275aa770e2 118 2 replay/adaptive/s0/0/stderr 4abb654491c0478d2a4db69af040bfbe3986c615c1acee3c90eec8b8cca8696a 79162 2 live/adaptive/s0/0/stdout diff --git a/bench/individuality/p0.py b/bench/individuality/p0.py index 31a2f8e..dd8510d 100644 --- a/bench/individuality/p0.py +++ b/bench/individuality/p0.py @@ -7,9 +7,10 @@ The corpus: every persona of fixtures/gen.py's P0 list x seeds 0-2 x its committed random scripts, through `persona replay` and `live --clock fixed` (stances, error objects, final state, strand), plus `init`, `check`, `describe`, `compile`, `lint ---seeds 0-99`, and `lint`, `fuzz` and `prove` documents of the shipped rules. A strand differs between versions only in its -header's `engine` string and the `prev` hashes chained from it, so strands are compared with those masked; the recorded -strands of seed 0 must also verify, and the tutor's continues with 20 committed events to the recorded bytes. +--seeds 0-99`, and `lint`, `fuzz` and `prove` documents of the shipped rules; personas and rules are passed by their paths +relative to the repository root, so no document depends on where the clone lives. A strand differs between versions only +in its header's `engine` string and the `prev` hashes chained from it, so strands are compared with those masked; the +recorded strands of seed 0 must also verify, and the tutor's continues with 20 committed events to the recorded bytes. """ import json import os @@ -73,7 +74,13 @@ def without_senses_warning(name, data): def rel(path): - return os.path.join(common.REPO, path) + """A repository path as the corpus passes it: relative to the root, where every command runs (common.run's cwd). A + fuzz counterexample's `explain` and `replay` strings name the persona path as given, so an absolute path would tie the + recorded bytes to the clone's location.""" + return path + + +PROPS_DIR = os.path.relpath(os.path.join(P0, "props"), common.REPO).replace(os.sep, "/") def outputs(keep_strands=None): @@ -96,7 +103,7 @@ def outputs(keep_strands=None): code, out, _ = common.run(["persona", "lint", p, "--seeds", "0-99"]) yield "lint/%s" % key, code, out if key in PROPS: - props = os.path.join(P0, "props", PROPS[key]) + props = PROPS_DIR + "/" + PROPS[key] code, out, _ = common.run(["persona", "lint", p, "--props", props, "--seeds", "0-99"]) yield "lint-props/%s" % key, code, out code, out, _ = common.run(["persona", "prove", p, "--props", props, "--seeds", "0-99", "--json"]) From 67c49acd740ea11b0dc1f55baee2bfd6cd959289 Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 08:15:39 -0700 Subject: [PATCH 02/15] persona: learning.credit read strictly; await/for/cancel read and echoed; the credit step and B-R1..B-R6 (WIP) --- probbit-cli/src/persona.rs | 247 ++++++++++++++++++++++++++++++++----- 1 file changed, 214 insertions(+), 33 deletions(-) diff --git a/probbit-cli/src/persona.rs b/probbit-cli/src/persona.rs index ece0d6a..97fb4c6 100644 --- a/probbit-cli/src/persona.rs +++ b/probbit-cli/src/persona.rs @@ -133,9 +133,13 @@ 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 } /// 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) +/// deltas move; the step and total caps (natural-log weights); `credit` = action-addressed feedback, when declared #[derive(Clone)] -struct Learning { from: Vec, traits: Vec, rate: f64, step_cap: f64, total_cap: f64 } +struct Learning { from: Vec, traits: Vec, rate: f64, step_cap: f64, total_cap: f64, credit: Option } +/// `learning.credit` (§2.8): at most `max_open` decisions await an outcome; a payment's eligibility halves per `half_life_events` +/// of delay, and an open decision expires after 4 half-lives +#[derive(Clone)] +struct Credit { max_open: usize, half_life: f64 } /// Learned deltas or credits: per learned trait, one number per level (in `learning.traits` order) type Table = Vec<(String, Vec)>; #[derive(Clone)] @@ -147,6 +151,10 @@ impl Persona { fn why_past(&self) -> bool { self.why_past.unwrap_or(self.senses.is_some()) } /// A senses block (§2.11) pub fn has_senses(&self) -> bool { self.senses.is_some() } + /// A `learning.credit` block (§2.8) + fn credit(&self) -> Option<&Credit> { self.learning.as_ref().and_then(|l| l.credit.as_ref()) } + /// A `learning.credit` block (§2.8): `await`, `for` and `cancel` are read on every event + pub fn has_credit(&self) -> bool { self.credit().is_some() } fn var(&self, id: &str) -> Option<&Var> { self.vars.iter().find(|v| v.id == id) } fn input(&self, id: &str) -> Option<&Input> { self.inputs.iter().find(|x| x.id == id) } fn habit(&self, id: &str) -> &Habit { self.habits.iter().find(|h| h.id == id).expect("habit id") } @@ -408,9 +416,10 @@ fn habit_spec(hb: &Json, path: &str, inputs: &[Input], history: &[Hist], vars: & Ok(Habit { id, when, then, rules, say, priority }) } /// The `learning` block (docs/persona.md §2.8): `from` = 1-2 distinct flag inputs (the reward, then the correction), `traits` = -/// distinct trait ids (moods do not learn), `rate`, `step_cap` and `total_cap` positive, with step_cap <= total_cap <= 50 +/// distinct trait ids (moods do not learn), `rate`, `step_cap` and `total_cap` positive, with step_cap <= total_cap <= 50; `credit` +/// (optional): `max_open` a whole number 1-64 (default 8), `half_life_events` 1-10000 (default 32) fn learning_spec(l: &Json, vars: &[Var], inputs: &[Input]) -> R { - let kv = keys(l, "learning", &["from", "traits", "rate", "step_cap", "total_cap", "comment"], &["from", "traits", "rate", "step_cap", "total_cap"])?; + let kv = keys(l, "learning", &["from", "traits", "rate", "step_cap", "total_cap", "credit", "comment"], &["from", "traits", "rate", "step_cap", "total_cap"])?; let ids = |k: &str, max: usize, ok: &dyn Fn(&str) -> bool, what: &str| -> R> { let p = at("learning", k); let v = strs(get(kv, k).unwrap()).filter(|v| !v.is_empty() && v.len() <= max).ok_or_else(|| perr(&p, format!("a list of 1 to {max} ids")))?; for (i, x) in v.iter().enumerate() { need(ok(x), &ix(&p, i), what)?; need(!v[..i].contains(x), &ix(&p, i), "listed twice")?; } @@ -419,7 +428,10 @@ fn learning_spec(l: &Json, vars: &[Var], inputs: &[Input]) -> R { let traits = ids("traits", vars.len(), &|x| vars.iter().any(|v| v.id == x && !v.mood), "not a trait of this persona (moods do not learn)")?; let pos = |k: &str, hi: f64| -> R { let p = at("learning", k); let x = num(get(kv, k), &p, Some(0.0), Some(hi), false)?; need(x > 0.0, &p, "must be > 0")?; Ok(x) }; let (rate, total_cap) = (pos("rate", 50.0)?, pos("total_cap", 50.0)?); let step_cap = pos("step_cap", total_cap)?; - Ok(Learning { from, traits, rate, step_cap, total_cap }) + let credit = match get(kv, "credit") { None | Some(Json::Null) => None, Some(c) => { let ck = keys(c, "learning.credit", &["max_open", "half_life_events", "comment"], &[])?; + Some(Credit { max_open: num_or(ck, "max_open", 8.0, "learning.credit", Some(1.0), Some(64.0), true)? as usize, + half_life: num_or(ck, "half_life_events", 32.0, "learning.credit", Some(1.0), Some(10000.0), false)? }) } }; + Ok(Learning { from, traits, rate, step_cap, total_cap, credit }) } /// `reward_from` (docs/persona.md §2.10): the sources a reward-bearing input may come from -> per reward-bearing input (`bearing`: /// the learning block's flags, then `goals..win` per goal of a drives block) its allowed source kinds (None = any). A list of @@ -470,10 +482,12 @@ pub fn check_provenance(p: &Persona, raw: &Json) -> R<()> { if let Some(rw) = &p.reward { provenance(rw, raw)?; } // readings (§2.11, S2): each one's source, its own or the event's, of a kind its sense reads from if let Some(sn) = &p.senses { src_form(raw)?; sense_step(sn, &SState::zero(&p.name, sn, p.seed), raw, get(raw, "src"), true)?; } + // a cancel (§2.8, B-R5) comes from env or a person + if p.credit().is_some() && get(raw, "cancel").is_some() { src_form(raw)?; cancel_src(get(raw, "src"))?; } Ok(()) } -/// A persona whose events need a source: rewards (`reward_from`) or readings (a senses block) -pub fn has_reward_sources(p: &Persona) -> bool { p.reward.is_some() || p.senses.is_some() } +/// A persona whose events need a source: rewards (`reward_from`), readings (a senses block) or cancels (a credit block) +pub fn has_reward_sources(p: &Persona) -> bool { p.reward.is_some() || p.senses.is_some() || p.credit().is_some() } fn check_cond(k: &str, c: &Json, path: &str, inputs: &[Input], history: &[Hist]) -> R<()> { let range = |c: &Json| -> R<()> { if let Json::Num(_) = c { return Ok(()); } let kv = c.as_obj().filter(|kv| !kv.is_empty() && kv.iter().all(|(k, _)| k == "at_least" || k == "at_most")).ok_or_else(|| perr(path, "a number (at least) or {at_least, at_most}"))?; @@ -800,14 +814,131 @@ fn prep(p: &Persona, st: &State, raw: &[(String, Json)], src: Option<&Json>, che let ns = drive_step(d, ds, &x)?; let host = host_inputs(d, &ns, &drive_ctx(d, &ns), &x)?; s2.drives = Some(ns); Ok((s2, host)) } -/// An event's `src`, read (not compiled) with `reward_from` or a senses block: checked (`check`), taken out of the inputs and -/// returned; without either it stays an undeclared input +/// An event's `src`, read (not compiled) with `reward_from`, a senses block or a credit block: checked (`check`), taken out of the +/// inputs and returned; without any of them it stays an undeclared input fn take_src(p: &Persona, raw: Vec<(String, Json)>, check: bool) -> R<(Option, Vec<(String, Json)>)> { - if p.reward.is_none() && p.senses.is_none() { return Ok((None, raw)); } + if p.reward.is_none() && p.senses.is_none() && p.credit().is_none() { return Ok((None, raw)); } if check { match &p.reward { Some(rw) => provenance(rw, &raw)?, None => src_form(&raw)? } } let src = get(&raw, "src").cloned(); Ok((src, raw.into_iter().filter(|(k, _)| k != "src").collect())) } + +// ------------------------------------------------------------------------------------- action-addressed feedback (§2.8) +/// The event keys of a credit block, read (not compiled): `await` (the host will report this decision's outcome), `for` (the +/// decision a reward or correction pays: a turn, or {turn, stance} with the paid stance's digest) and `cancel` (the open decisions +/// no outcome will come for); `given` = the keys as given, echoed in the stance's inputs +#[derive(Default)] +struct Pay { wait: bool, pays: Option<(u64, Option)>, cancel: Option>, given: Vec<(String, Json)> } +const PAY_KEYS: [&str; 3] = ["await", "for", "cancel"]; +/// "sha256:" and 64 lower-case hex digits +fn is_digest(s: &str) -> bool { s.len() == 71 && s.starts_with("sha256:") && s[7..].bytes().all(|c| c.is_ascii_digit() || (b'a'..=b'f').contains(&c)) } +/// A stance's digest (§2.8): sha256 of the stance document's canonical JSON without `credit`, `state_digest` and `timing`. The +/// state remembers it (an open decision's, the previous stance's) without hashing itself, and `for: {turn, stance}` binds it. +pub fn stance_digest(doc: &Json) -> String { + match doc { Json::Obj(v) => sha(&Json::Obj(v.iter().filter(|(k, _)| !["credit", "state_digest", "timing"].contains(&k.as_str())).cloned().collect())), _ => sha(doc) } +} +/// With a credit block: `await`, `for` and `cancel` taken out of the inputs and read (B-R5: a malformed value refuses the event); +/// without one they stay undeclared inputs (listed in `ignored`) +fn take_pay(p: &Persona, raw: Vec<(String, Json)>) -> R<(Option, Vec<(String, Json)>)> { + let Some(c) = p.credit() else { return Ok((None, raw)) }; + let whole = |x: &Json| x.as_f64().filter(|v| *v >= 0.0 && v.fract() == 0.0 && *v <= 9_007_199_254_740_992.0).map(|v| v as u64); + let list = format!("a list of at most {} turns (max_open), each a whole number >= 0", c.max_open); + let mut k = Pay::default(); + for (key, x) in raw.iter().filter(|(key, _)| PAY_KEYS.contains(&key.as_str())) { + match key.as_str() { + "await" => k.wait = match x { Json::Bool(b) => *b, _ => return Err(perr("inputs.await", "true | false (true: the host will report this decision's outcome)")) }, + "for" => k.pays = Some(match x { + Json::Obj(_) => { let o = keys(x, "inputs.for", &["turn", "stance"], &["turn", "stance"])?; + let n = whole(get(o, "turn").unwrap()).ok_or_else(|| perr("inputs.for.turn", "a turn: a whole number >= 0"))?; + let s = get(o, "stance").and_then(Json::as_str).filter(|s| is_digest(s)).ok_or_else(|| perr("inputs.for.stance", "the paid stance's digest (sha256:<64 hex>: its credit.stance)"))?; + (n, Some(s.to_string())) } + _ => (whole(x).ok_or_else(|| perr("inputs.for", "the decision this feedback pays: a turn (a whole number >= 0) or {turn, stance}"))?, None) }), + _ => { let a = x.as_arr().filter(|a| a.len() <= c.max_open).ok_or_else(|| perr("inputs.cancel", list.clone()))?; + k.cancel = Some(a.iter().enumerate().map(|(i, n)| whole(n).ok_or_else(|| perr(&ix("inputs.cancel", i), "a turn: a whole number >= 0"))).collect::>>()?); } } + k.given.push((key.clone(), x.clone())); } + Ok((Some(k), raw.into_iter().filter(|(key, _)| !PAY_KEYS.contains(&key.as_str())).collect())) +} +/// B-R5: a cancel says no outcome will come, so it comes from env or a person: never from the individual, the clock or nowhere +fn cancel_src(src: Option<&Json>) -> R<()> { + match src.and_then(Json::as_str).and_then(src_kind) { Some("env" | "human") => Ok(()), + _ => Err(perr("inputs.src", "a cancel needs a source: env[:id] or human[:id] (never the individual itself or the clock)")) } +} +/// What the credit step settled before compile, for the stance's `credit` object: the payment (turn, eligibility, sign, absorbed, +/// the paid stance's digest) and the decisions closed (by a control line, expired, cancelled, paid), in that order +struct Settled { paid: Option<(u64, f64, f64, bool, String)>, closed: Vec<(u64, &'static str)> } +/// The credit step (§2.8, RFC 0001 B.2), after the drive step and before compile; t = this turn. Open decisions with t − n − 1 >= +/// 4 x half_life_events expire, the cancels close theirs (B-R4 against the open set after expiry), then feedback (a learning flag +/// on, or with drives κ x surprise != 0) pays one decision: the one `for` names (an open one, or the previous stance t − 1), else +/// t − 1 when no other decision is open (B-R1, B-R2, B-R3; B-R6 for a digest-bound `for`). The paid credit (the open decision's, +/// or the state's for t − 1) and its eligibility e = 0.5^((t − n − 1) / half_life_events), 6 decimals, go to compile's learner. +/// Anything refused is refused whole, before any change. -> (the state compile reads, what was settled) +fn credit_step(p: &Persona, st: &State, host: &[(String, Json)], k: &Pay, src: Option<&Json>, check: bool) -> R<(State, Settled)> { + let (c, l) = (p.credit().unwrap(), p.learning.as_ref().unwrap()); let t = st.turn; + if k.cancel.is_some() && check { cancel_src(src)?; } + // feedback, read as compile reads it (the inputs are checked first) + let (vals, _, _, _) = resolve_inputs(p, st, host)?; + let on = |id: &String| matches!(get(&vals, id), Some(Json::Bool(true))); + let flags = l.from.iter().enumerate().fold(0.0, |s, (i, id)| if on(id) { s + if i == 0 { 1.0 } else { -1.0 } } else { s }); + let ks = match (&p.drives, &st.drives) { (Some(d), Some(ds)) => Some(drive_ctx(d, ds).learn_sign), _ => None }; + let feedback = l.from.iter().any(on) || ks.is_some_and(|x| x != 0.0); + let sign = match ks { Some(x) => (flags + x).clamp(-1.0, 1.0), None => flags }; + // B-R3: `for` names the decision a reward or a correction pays + if k.pays.is_some() && !feedback { return Err(perr("inputs.for", "this event carries no feedback: `for` names the decision a reward or a correction pays")); } + let prev = t.checked_sub(1); + let paid = if feedback { k.pays.as_ref().map(|x| x.0).or(prev) } else { None }; + let turns = |o: &[Open]| if o.is_empty() { "none".to_string() } else { o.iter().map(|x| x.turn.to_string()).collect::>().join(", ") }; + // a control line's closures are reported now; then expiry, then the cancels (B-R4) against the open set after it + let mut ns = st.clone(); let mut closed: Vec<(u64, &'static str)> = ns.control_closed.drain(..).map(|n| (n, "control")).collect(); + let (keep, gone): (Vec, Vec) = ns.open.drain(..).partition(|o| (t.saturating_sub(o.turn + 1) as f64) < 4.0 * c.half_life); + closed.extend(gone.iter().map(|o| (o.turn, "expired"))); ns.open = keep; + let cancel = k.cancel.as_deref().unwrap_or(&[]); + for (i, n) in cancel.iter().enumerate() { let path = ix("inputs.cancel", i); + need(!cancel[..i].contains(n), &path, "listed twice")?; + need(paid != Some(*n), &path, &format!("turn {n} is the decision this event's feedback pays"))?; + need(ns.open.iter().any(|o| o.turn == *n), &path, &format!("turn {n} is not open (open: {})", turns(&ns.open)))?; } + for n in cancel { ns.open.retain(|o| o.turn != *n); closed.push((*n, "cancelled")); } + let Some(n) = paid else { return Ok((ns, Settled { paid: None, closed })) }; + // B-R1: without `for`, feedback pays the previous stance only while no other decision is open + if k.pays.is_none() { let others: Vec = ns.open.iter().filter(|o| Some(o.turn) != prev).cloned().collect(); + need(others.is_empty(), "inputs.for", &format!("feedback without `for` while other decisions are open ({}): name the decision it pays", turns(&others)))?; } + // B-R2: an open decision, or the previous stance + let (credit, digest) = match ns.open.iter().position(|o| o.turn == n) { + Some(i) => { let o = ns.open.remove(i); closed.push((n, "paid")); (o.credit, o.stance) } + None if Some(n) == prev => (st.credit.clone(), st.prev_stance.clone().unwrap_or_default()), + None => return Err(perr("inputs.for", format!("turn {n} is neither open nor the previous stance ({}): paid, cancelled, expired, evicted, never opened or still to come (open: {})", + prev.map_or("none".to_string(), |x| x.to_string()), turns(&ns.open)))) }; + // B-R6: a digest-bound `for` pays the stance it names + if let Some(s) = k.pays.as_ref().and_then(|x| x.1.as_ref()) { need(*s == digest, "inputs.for.stance", &format!("turn {n}'s stance is {digest}, not {s}"))?; } + let e = if Some(n) == prev { 1.0 } else { r6(0.5f64.powf((t - n - 1) as f64 / c.half_life)) }; + let absorbed = credit.iter().all(|(_, v)| v.iter().all(|x| *x == 0.0)); + ns.credit = credit; ns.elig = e; + Ok((ns, Settled { paid: Some((n, e, sign, absorbed, digest)), closed })) +} +/// After the turn (§2.8): the keys echoed in the stance's inputs, its `credit` object (paid, closed, open, this stance's digest), +/// an awaited decision opened (beyond max_open the oldest is evicted), the state remembering this stance's digest +fn settle(p: &Persona, j: &mut Json, mut ns: State, k: &Pay, s: Settled) -> State { + let c = p.credit().unwrap(); let t = ns.turn - 1; + let Json::Obj(v) = j else { return ns }; + if let Some((_, Json::Obj(ins))) = v.iter_mut().find(|(key, _)| key == "inputs") { ins.extend(k.given.iter().cloned()); } + let digest = stance_digest(&Json::Obj(v.clone())); let mut closed = s.closed; + if k.wait { ns.open.push(Open { turn: t, credit: ns.credit.clone(), stance: digest.clone() }); + while ns.open.len() > c.max_open { closed.push((ns.open.remove(0).turn, "evicted")); } } + ns.prev_stance = Some(digest.clone()); ns.elig = 1.0; ns.seal(p); + let n = |x: u64| Json::Num(x as f64); + let paid = s.paid.map_or(Json::Null, |(turn, e, sign, absorbed, stance)| Json::Obj(vec![("turn".into(), n(turn)), ("e".into(), Json::Num(e)), ("sign".into(), Json::Num(sign)), + ("absorbed".into(), Json::Bool(absorbed)), ("stance".into(), Json::Str(stance))])); + v.push(("credit".into(), Json::Obj(vec![("paid".into(), paid), + ("closed".into(), Json::Arr(closed.iter().map(|(x, a)| Json::Obj(vec![("turn".into(), n(*x)), ("as".into(), Json::Str(a.to_string()))])).collect())), + ("open".into(), Json::Arr(ns.open.iter().map(|o| n(o.turn)).collect())), ("stance".into(), Json::Str(digest))]))); + if let Some((_, d)) = v.iter_mut().find(|(key, _)| key == "state_digest") { *d = Json::Str(ns.digest.clone()); } + ns +} +/// The open decisions of a state with a credit block (§2.8): (turn, the eligibility a payment at the next turn would get); none +/// without one +pub fn open_decisions(p: &Persona, st: &State) -> Option> { + let c = p.credit()?; + Some(st.open.iter().map(|o| (o.turn, if o.turn + 1 == st.turn { 1.0 } else { r6(0.5f64.powf(st.turn.saturating_sub(o.turn + 1) as f64 / c.half_life)) })).collect()) +} /// The stance document of a drives turn: `pursue` leaves `stance` for its own object (goal, p, odds, released, say, the floor lift), /// `drives` = the values this turn used, `inputs` = the host's (the goals as given, the synthetic inputs left out) fn stance_drives(j: &mut Json, d: &Drives, ds: &DState, lift: &[(String, f64)], given: &[(String, Json)]) { @@ -1225,7 +1356,11 @@ fn values_of(p: &Persona) -> Vec { #[derive(Clone)] pub struct State { pub seed: u64, pub turn: u64, persona: [String; 3], genes: Json, mood: Vec<(String, Vec)>, history: Vec<(String, Vec)>, prev: HashMap, agenda: Option>, rest: Option>, learned: Table, credit: Table, drives: Option, senses: Option, - learned_from: Option>, pub digest: String } + learned_from: Option>, open: Vec, prev_stance: Option, control_closed: Vec, elig: f64, pub digest: String } +/// A decision awaiting its outcome (§2.8, `open_credit`): its turn, its credit (onehot(level) − odds per learned trait it released) +/// and its stance's digest +#[derive(Clone)] +struct Open { turn: u64, credit: Table, stance: String } /// `learned_from` (§2.11): per learned trait the feedback turns that moved it, (rewards, corrections), with a learning block and /// `line.why_past` on (None otherwise) fn learned_from0(p: &Persona) -> Option> { @@ -1235,14 +1370,15 @@ fn table(t: &Table) -> Json { Json::Obj(t.iter().map(|(k, v)| (k.clone(), Json:: /// A zero table over the learned traits (none without a learning block) fn zeros(p: &Persona) -> Table { p.learning.as_ref().map_or(vec![], |l| l.traits.iter().map(|t| (t.clone(), vec![0.0; p.var(t).unwrap().levels.len()])).collect()) } /// The learner (docs/persona.md §2.8). `sign` is this turn's feedback (+1 reward, -1 correction, 0 none: nothing moves); `credit` -/// is the previous stance's onehot(level) - odds per learned trait. The step sign · rate · credit is clipped to ±step_cap per -/// level and recentred to sum 0 (it moves weight between levels; zero credit moves nothing), added, and every delta is clipped to -/// ±total_cap. It returns nothing but the delta table, which compile adds to trait unaries: habits and allowed levels are not -/// reachable from here, so learning can never remove a rule. -fn learn(l: &Learning, credit: &Table, sign: f64, delta: &Table) -> Table { +/// is the paid stance's onehot(level) - odds per learned trait (the previous stance's without a credit block). The step sign · +/// rate · credit is clipped to ±step_cap per level, scaled by the payment's eligibility `e` (1 for the previous stance, so the +/// step is 0.8's) and recentred to sum 0 (it moves weight between levels; zero credit moves nothing), added, and every delta is +/// clipped to ±total_cap. It returns nothing but the delta table, which compile adds to trait unaries: habits and allowed levels +/// are not reachable from here, so learning can never remove a rule. +fn learn(l: &Learning, credit: &Table, sign: f64, e: f64, delta: &Table) -> Table { if sign == 0.0 { return delta.clone(); } delta.iter().zip(credit).map(|((t, d), (_, g))| { - let step: Vec = g.iter().map(|x| (sign * l.rate * x).clamp(-l.step_cap, l.step_cap)).collect(); + let step: Vec = g.iter().map(|x| e * (sign * l.rate * x).clamp(-l.step_cap, l.step_cap)).collect(); let mean = step.iter().fold(0.0, |a, b| a + b) / step.len() as f64; (t.clone(), d.iter().zip(&step).map(|(a, x)| r6((a + (x - mean)).clamp(-l.total_cap, l.total_cap))).collect()) }).collect() } @@ -1271,15 +1407,23 @@ impl State { if let (Some(sn), Some(ss)) = (&p.senses, &self.senses) { v.push(("senses".into(), ss.to_json(sn))); } if let Some(lf) = &self.learned_from { v.push(("learned_from".into(), Json::Obj(lf.iter().map(|(t, r, c)| (t.clone(), Json::Obj(vec![("rewards".into(), Json::Num(*r as f64)), ("corrections".into(), Json::Num(*c as f64))]))).collect()))); } + // a credit block (§2.8): the decisions awaiting an outcome, the previous stance's digest, the decisions a control line closed + if p.credit().is_some() { + v.push(("open_credit".into(), Json::Arr(self.open.iter().map(|o| Json::Obj(vec![("turn".into(), Json::Num(o.turn as f64)), ("credit".into(), table(&o.credit)), + ("stance".into(), Json::Str(o.stance.clone()))])).collect()))); + v.push(("prev_stance".into(), self.prev_stance.as_ref().map_or(Json::Null, |s| Json::Str(s.clone())))); + v.push(("control_closed".into(), Json::Arr(self.control_closed.iter().map(|t| Json::Num(*t as f64)).collect()))); } Json::Obj(v) } pub fn to_json(&self, p: &Persona) -> Json { let mut b = self.body(p); if let Json::Obj(v) = &mut b { v.push(("digest".into(), Json::Str(self.digest.clone()))); } b } fn seal(&mut self, p: &Persona) { self.digest = sha(&self.body(p)); } - /// This state with every credit 0 (a control line's, §5.7: feedback after it credits no stance before it); the same state - /// when there is no credit to clear (no learning block, or a stance that released no learned trait) + /// This state with every credit 0 and (a credit block, §2.8) every open decision closed: a control line's (§5.7), feedback + /// after it credits no stance before it; the next stance lists the closed decisions (as `control`). The same state when there + /// is nothing to clear (no learning block, or a stance that released no learned trait, and no decision open) pub fn zero_credit(&self, p: &Persona) -> State { - if self.credit.iter().all(|(_, c)| c.iter().all(|x| *x == 0.0)) { return self.clone(); } - let mut s = self.clone(); for (_, c) in s.credit.iter_mut() { c.iter_mut().for_each(|x| *x = 0.0); } s.seal(p); s + if self.credit.iter().all(|(_, c)| c.iter().all(|x| *x == 0.0)) && self.open.is_empty() { return self.clone(); } + let mut s = self.clone(); for (_, c) in s.credit.iter_mut() { c.iter_mut().for_each(|x| *x = 0.0); } + let closed: Vec = s.open.drain(..).map(|o| o.turn).collect(); s.control_closed.extend(closed); s.seal(p); s } /// A state document -> State, for this persona: the format, the persona digest, the state's own digest and the genes are /// checked (in that order), then every field's type (a well-formed state never fails those). @@ -1294,16 +1438,19 @@ impl State { need(p.senses.is_none() || get(kv, "senses").is_some(), "state.senses", "required with a senses block")?; let keeps_from = learned_from0(p).is_some(); need(!keeps_from || get(kv, "learned_from").is_some(), "state.learned_from", "required with a learning block and line.why_past")?; - const SK: [&str; 15] = ["probbit_persona_state", "persona", "seed", "turn", "genes", "mood", "history", "prev", "rest", "digest", "learned", "credit", "drives", "senses", "learned_from"]; + const SK: [&str; 18] = ["probbit_persona_state", "persona", "seed", "turn", "genes", "mood", "history", "prev", "rest", "digest", "learned", "credit", "drives", "senses", "learned_from", + "open_credit", "prev_stance", "control_closed"]; let mut sk: Vec<&str> = SK[..10].to_vec(); if p.learning.is_some() { sk.extend(&SK[10..12]); } if p.drives.is_some() { sk.push(SK[12]); } if p.senses.is_some() { sk.push(SK[13]); } if keeps_from { sk.push(SK[14]); } + if p.credit().is_some() { sk.extend(&SK[15..18]); for k in &SK[15..18] { need(get(kv, k).is_some(), &at("state", k), "required with a credit block")?; } } keys(j, "state", &sk, &["persona", "seed", "turn", "genes", "mood", "history", "prev", "digest"]) .map_err(|e| if e.msg.starts_with("unknown field") && (e.path == "state.learned" || e.path == "state.credit") { perr(&e.path, "this persona has no learning block") } else if e.msg.starts_with("unknown field") && e.path == "state.drives" { perr(&e.path, "this persona has no drives block") } else if e.msg.starts_with("unknown field") && e.path == "state.senses" { perr(&e.path, "this persona has no senses block") } + else if e.msg.starts_with("unknown field") && ["state.open_credit", "state.prev_stance", "state.control_closed"].contains(&e.path.as_str()) { perr(&e.path, "this persona has no credit block (learning.credit)") } else if e.msg.starts_with("unknown field") && e.path == "state.learned_from" { perr(&e.path, "this persona keeps no learned_from (a learning block with line.why_past)") } else { e })?; let whole = |k: &str| num(get(kv, k), &at("state", k), Some(0.0), Some(9_007_199_254_740_992.0), true).map(|x| x as u64); let (seed, turn) = (whole("seed")?, whole("turn")?); @@ -1343,7 +1490,27 @@ impl State { Some(z.iter().map(|(t, _, _)| { let tp = at("state.learned_from", t); let e = keys(get(o, t).ok_or_else(|| perr(&tp, "required"))?, &tp, &["rewards", "corrections"], &["rewards", "corrections"])?; let w = |k: &str| num(get(e, k), &at(&tp, k), Some(0.0), Some(9_007_199_254_740_992.0), true).map(|x| x as u64); Ok((t.clone(), w("rewards")?, w("corrections")?)) }).collect::>>()?) } }; - Ok(State { seed, turn, persona, genes: g.clone(), mood, history, prev, agenda, rest, learned, credit, drives, senses, learned_from, digest: get(kv, "digest").and_then(Json::as_str).unwrap_or("").to_string() }) + // a credit block (§2.8): at most max_open open decisions, turns increasing and before this state's turn, credits within ±1, a + // stance digest each; the previous stance's digest (null before the first turn); the decisions a control line closed + let (mut open, mut prev_stance, mut control_closed) = (vec![], None, vec![]); + if let (Some(c), Some(l)) = (p.credit(), &p.learning) { + let turn_at = |x: &Json, path: &str, after: Option| -> R { let n = num(Some(x), path, Some(0.0), Some(9_007_199_254_740_992.0), true)? as u64; + need(n < turn, path, "a turn before this state's turn")?; need(after.map_or(true, |a| n > a), path, "turns increasing")?; Ok(n) }; + let oa = get(kv, "open_credit").and_then(Json::as_arr).filter(|a| a.len() <= c.max_open).ok_or_else(|| perr("state.open_credit", format!("a list of at most {} open decisions (max_open)", c.max_open)))?; + for (i, o) in oa.iter().enumerate() { let op = ix("state.open_credit", i); let ok = keys(o, &op, &["turn", "credit", "stance"], &["turn", "credit", "stance"])?; + let n = turn_at(get(ok, "turn").unwrap(), &at(&op, "turn"), open.last().map(|x: &Open| x.turn))?; + let cp = at(&op, "credit"); let co = get(ok, "credit").and_then(Json::as_obj).filter(|o| o.len() == l.traits.len()).ok_or_else(|| perr(&cp, "one entry per learned trait"))?; + let credit = l.traits.iter().map(|t| { let lv = p.var(t).unwrap().levels.len(); + let a = get(co, t).and_then(Json::as_arr).filter(|a| a.len() == lv && a.iter().all(|x| x.as_f64().is_some_and(|x| x.abs() <= 1.0 + 5e-7))).ok_or_else(|| perr(&at(&cp, t), "one number per level, each within ±1"))?; + Ok((t.clone(), a.iter().map(|x| x.as_f64().unwrap()).collect())) }).collect::>()?; + let stance = get(ok, "stance").and_then(Json::as_str).filter(|s| is_digest(s)).ok_or_else(|| perr(&at(&op, "stance"), "a stance digest (sha256:<64 hex>)"))?.to_string(); + open.push(Open { turn: n, credit, stance }); } + prev_stance = match get(kv, "prev_stance").unwrap() { Json::Null if turn == 0 => None, Json::Str(s) if turn > 0 && is_digest(s) => Some(s.clone()), + _ => return Err(perr("state.prev_stance", "the previous stance's digest (sha256:<64 hex>); null before the first turn")) }; + let ca = get(kv, "control_closed").and_then(Json::as_arr).filter(|a| a.len() <= c.max_open).ok_or_else(|| perr("state.control_closed", format!("a list of at most {} turns", c.max_open)))?; + for (i, x) in ca.iter().enumerate() { let n = turn_at(x, &ix("state.control_closed", i), control_closed.last().copied())?; control_closed.push(n); } } + Ok(State { seed, turn, persona, genes: g.clone(), mood, history, prev, agenda, rest, learned, credit, drives, senses, learned_from, open, prev_stance, control_closed, elig: 1.0, + digest: get(kv, "digest").and_then(Json::as_str).unwrap_or("").to_string() }) } } @@ -1421,7 +1588,7 @@ fn compile(p: &Persona, st: &State, raw: &[(String, Json)], o: &Opts) -> R<(Json let new_learned = match &p.learning { None => vec![], Some(l) => { let sign = l.from.iter().enumerate().fold(0.0, |s, (i, id)| if matches!(get(&vals, id), Some(Json::Bool(true))) { s + if i == 0 { 1.0 } else { -1.0 } } else { s }); let sign = match &dctx { Some(c) => (sign + c.learn_sign).clamp(-1.0, 1.0), None => sign }; learn_sign = sign; - learn(l, &st.credit, sign, &st.learned) } }; + learn(l, &st.credit, sign, st.elig, &st.learned) } }; for (i, v) in p.vars.iter().enumerate() { contrib[i].push(("prior".into(), v.base.clone())); if let Some(g) = st.shift(&v.id) { contrib[i].push(("genes".into(), centered(v.levels.len()).iter().map(|c| g * c).collect())); } if let Some((_, d)) = new_learned.iter().find(|(t, d)| *t == v.id && d.iter().any(|x| *x != 0.0)) { contrib[i].push(("learned".into(), d.clone())); } } @@ -1729,9 +1896,14 @@ fn turn_src(p: &Persona, st: &State, raw: &Json, no_inertia: bool, eng: Engine, // reward provenance (§2.10), first: with `reward_from` (or a senses block, §2.11), `src` is read here (not compiled, so not // `ignored`) and comes back in the stance's inputs; without either `src` is an undeclared input as before let (src, raw) = take_src(p, raw, check)?; + // with a credit block (§2.8) `await`, `for` and `cancel` are read here too (not compiled, so not `ignored`) and come back in + // the stance's inputs + let (pay, raw) = take_pay(p, raw)?; // a senses block steps the normals and a drives block the drives before the turn, which runs on the stepped state with the - // lowering's inputs - let given = raw; let (st2, raw) = prep(p, st, &given, src.as_ref(), check)?; let st = &st2; + // lowering's inputs; then the credit step settles what this turn's feedback pays + let given = raw; let (st2, raw) = prep(p, st, &given, src.as_ref(), check)?; + let (st2, settled) = match &pay { Some(k) => { let (s, d) = credit_step(p, &st2, &raw, k, src.as_ref(), check)?; (s, Some(d)) } None => (st2, None) }; + let st = &st2; let t0 = Instant::now(); let mut calls = 0; let o = Opts { no_inertia, ..Default::default() }; let (mut prog, mut meta) = compile(p, st, &raw, &o)?; let mut ptext = digest_of(&text(&prog)); @@ -1773,6 +1945,7 @@ fn turn_src(p: &Persona, st: &State, raw: &Json, no_inertia: bool, eng: Engine, if let (Some(sn), Some(ss)) = (&p.senses, &st.senses) { stance_senses(&mut j, sn, ss, &given); } if let (Some(d), Some(ds)) = (&p.drives, &st.drives) { stance_drives(&mut j, d, ds, &out.lift, &given); } if let (Some(s), Json::Obj(v)) = (src, &mut j) { if let Some((_, Json::Obj(ins))) = v.iter_mut().find(|(k, _)| k == "inputs") { ins.push(("src".into(), s)); } } + if let (Some(k), Some(d)) = (&pay, settled) { ns = settle(p, &mut j, ns, k, d); } Ok((j, ns)) } @@ -1789,7 +1962,7 @@ pub fn init(p: &Persona, seed: Option, rest: bool, eng: Engine) -> State { history: { let mut h: Vec<(String, Vec)> = vec![]; for x in &p.history { if !h.iter().any(|(k, _)| *k == x.of) { h.push((x.of.clone(), vec![])); } } h }, prev: p.vars.iter().map(|v| (v.id.clone(), v.fallback.clone())).collect(), agenda: (!p.steps.is_empty()).then(|| p.steps.clone()), rest: None, learned: zeros(p), credit: zeros(p), drives: p.drives.as_ref().map(|d| DState::zero(p, d, seed)), senses: p.senses.as_ref().map(|sn| SState::zero(&p.name, sn, seed)), - learned_from: learned_from0(p), digest: String::new() }; + learned_from: learned_from0(p), open: vec![], prev_stance: None, control_closed: vec![], elig: 1.0, digest: String::new() }; if rest { if let Ok((prog, _)) = compile(p, &st, &[], &Opts { twin: Some(false), ..Default::default() }) { let doc = eng(&prog, &flags(p, &st)); if let Some(plan) = doc.get("plan").and_then(Json::as_obj) { @@ -1846,8 +2019,10 @@ pub fn replay(p: &Persona, seed: Option, turns: &[Json], no_inertia: bool, /// `compile`: the turn's program (insertion order; its sha256 is the stance's `engine.program`) pub fn program(p: &Persona, st: &State, raw: &Json) -> R { let raw: Vec<(String, Json)> = match raw { Json::Null => vec![], Json::Obj(v) => v.clone(), _ => return Err(perr("inputs", "must be a JSON object")) }; - let (src, raw) = if p.senses.is_some() { take_src(p, raw, true)? } else { (None, raw) }; + let (src, raw) = if p.senses.is_some() || p.credit().is_some() { take_src(p, raw, true)? } else { (None, raw) }; + let (pay, raw) = take_pay(p, raw)?; let (st, raw) = prep(p, st, &raw, src.as_ref(), true)?; + let st = match &pay { Some(k) => credit_step(p, &st, &raw, k, src.as_ref(), true)?.0, None => st }; Ok(text(&compile(p, &st, &raw, &Opts::default())?.0)) } @@ -2017,9 +2192,13 @@ pub fn describe(p: &Persona) -> Json { ("inputs".into(), Json::Obj(p.inputs.iter().filter(|x| !lowered(p, &x.id)).map(|x| (x.id.clone(), Json::Obj(match x.kind { Kind::Level => vec![("kind".into(), s("level")), ("levels".into(), jstrs(&x.levels))], Kind::Flag => vec![("kind".into(), s("flag"))], Kind::Number => vec![("kind".into(), s("number"))] }))).collect())), ("habits".into(), Json::Arr(p.habits.iter().map(|h| s(&h.id)).collect())), ("agenda".into(), jstrs(&p.steps))]); - // the learning block (§2.8), when there is one: what moves the learned deltas, which traits, and the caps - if let (Json::Obj(v), Some(l)) = (&mut d, &p.learning) { v.push(("learning".into(), Json::Obj(vec![("from".into(), jstrs(&l.from)), ("traits".into(), jstrs(&l.traits)), - ("rate".into(), Json::Num(l.rate)), ("step_cap".into(), Json::Num(l.step_cap)), ("total_cap".into(), Json::Num(l.total_cap))]))); } + // the learning block (§2.8), when there is one: what moves the learned deltas, which traits, and the caps; the credit block's + // settings when declared + if let (Json::Obj(v), Some(l)) = (&mut d, &p.learning) { let mut lv = vec![("from".into(), jstrs(&l.from)), ("traits".into(), jstrs(&l.traits)), + ("rate".into(), Json::Num(l.rate)), ("step_cap".into(), Json::Num(l.step_cap)), ("total_cap".into(), Json::Num(l.total_cap))]; + if let Some(c) = &l.credit { lv.push(("credit".into(), Json::Obj(vec![("max_open".into(), Json::Num(c.max_open as f64)), ("half_life_events".into(), Json::Num(c.half_life)), + ("expires_after".into(), Json::Num(r6(4.0 * c.half_life)))]))); } + v.push(("learning".into(), Json::Obj(lv))); } // the drives block (§2.9), when there is one: the goals (pursue's levels) in order, their phrases, floors and starve_after if let (Json::Obj(v), Some(dr)) = (&mut d, &p.drives) { let per = |f: &dyn Fn(&Goal) -> Option| Json::Obj(dr.goals.iter().filter_map(|g| f(g).map(|x| (g.id.clone(), x))).collect()); v.push(("drives".into(), Json::Obj(vec![("goals".into(), Json::Arr(dr.goals.iter().map(|g| s(&g.id)).collect())), ("say".into(), per(&|g| Some(s(&g.say)))), @@ -2060,8 +2239,10 @@ pub fn check(p: &Persona, eng: Engine) -> R { /// where it differs, the program's size and digest, the line and the why pub fn explain(p: &Persona, st: &State, raw: &Json, eng: Engine) -> R { let rawv: Vec<(String, Json)> = match raw { Json::Null => vec![], Json::Obj(v) => v.clone(), _ => return Err(perr("inputs", "must be a JSON object")) }; - let (src, rawv) = if p.senses.is_some() { take_src(p, rawv, true)? } else { (None, rawv) }; + let (src, rawv) = if p.senses.is_some() || p.credit().is_some() { take_src(p, rawv, true)? } else { (None, rawv) }; + let (pay, rawv) = take_pay(p, rawv)?; let (st2, host) = prep(p, st, &rawv, src.as_ref(), true)?; + let st2 = match &pay { Some(k) => credit_step(p, &st2, &host, k, src.as_ref(), true)?.0, None => st2 }; let (prog, meta) = compile(p, &st2, &host, &Opts::default())?; let doc = eng(&prog, &flags(p, st)); let (out, _) = turn(p, st, raw, false, eng, false)?; let plan: HashMap = doc.get("plan").and_then(Json::as_obj).map_or_else(HashMap::new, |o| o.iter().map(|(k, v)| (k.clone(), back(p, k, v.as_str().unwrap_or("")))).collect()); let g = |k: &str| out.get(k).cloned().unwrap_or(Json::Null); let s = |j: &Json| j.as_str().map_or_else(|| canon(j), str::to_string); @@ -2630,7 +2811,7 @@ mod tests { fn the_learning_block_and_state_fields_are_strict() { let bad = |l: &str| err(persona(&format!(r#","learning":{{{l}}}"#))); let base = r#""from":["praise","criticism"],"traits":["verbosity"],"rate":0.5,"step_cap":0.2,"total_cap":0.6"#; - assert_eq!(bad(&format!(r#"{base},"spread":1"#)), "learning.spread: unknown field (allowed: comment, from, rate, step_cap, total_cap, traits)"); + assert_eq!(bad(&format!(r#"{base},"spread":1"#)), "learning.spread: unknown field (allowed: comment, credit, from, rate, step_cap, total_cap, traits)"); assert_eq!(bad(r#""from":["praise"],"traits":["verbosity"],"rate":0.5,"step_cap":0.2"#), "learning.total_cap: required"); assert_eq!(bad(&base.replace(r#"["praise","criticism"]"#, r#"["praise","valence"]"#)), "learning.from[1]: not a flag input of this persona"); assert_eq!(bad(&base.replace(r#"["verbosity"]"#, r#"["valence"]"#)), "learning.traits[0]: not a trait of this persona (moods do not learn)"); From eaae16d2eda49a251dff8f480c4a0174dc119a18 Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 08:18:45 -0700 Subject: [PATCH 03/15] live: control lines close open decisions, verify summary open, verify --actions; mcp refuses cancel; the one stderr line for credit keys without the block; p0 check accepts it (WIP) --- bench/individuality/p0.py | 46 ++++++++++++++++++++++++-------------- probbit-cli/src/live.rs | 44 ++++++++++++++++++++++++++++++++++++ probbit-cli/src/main.rs | 31 +++++++++++++++++++------ probbit-cli/src/mcp.rs | 18 ++++++++++----- probbit-cli/src/persona.rs | 11 +++++++++ 5 files changed, 121 insertions(+), 29 deletions(-) diff --git a/bench/individuality/p0.py b/bench/individuality/p0.py index dd8510d..85e08d4 100644 --- a/bench/individuality/p0.py +++ b/bench/individuality/p0.py @@ -2,8 +2,8 @@ python3 p0.py record # with a released binary: writes fixtures/p0/EXPECTED, the strands and fixtures/MANIFEST python3 p0.py check # with the binary under test: every output equals its recorded sha256 (exit 1 if not); a - # `live` stderr may also carry the one senses warning line (SENSES_WARNING) where its script - # sends `senses`, and is reported apart + # `live` stderr may also carry the senses and credit warning lines (WARNINGS) where its script + # sends those keys, and is reported apart The corpus: every persona of fixtures/gen.py's P0 list x seeds 0-2 x its committed random scripts, through `persona replay` and `live --clock fixed` (stances, error objects, final state, strand), plus `init`, `check`, `describe`, `compile`, `lint @@ -51,26 +51,38 @@ def masked_err(err): return re.sub(r"strand head sha256:[0-9a-f]{64}", "strand head *", err).encode("utf-8") -# The one line 0.9.0 adds to a corpus output: `live` says once per run, on stderr, that a persona without a senses block -# got a `senses` key (an undeclared input, listed in `ignored` as before). Only the scripts that carry `senses` (k=1) get -# it, at the earliest such event; it is not a document: stdout, states and strands stay byte-identical. +# The lines 0.9.0 adds to a corpus output: `live` says once per run, on stderr, that a persona without a senses block got +# a `senses` key, and once that a persona without a credit block got `await`, `for` or `cancel` (undeclared inputs, listed +# in `ignored` as before). Only the scripts that carry those keys (k=1) get them, each at its earliest such event; they are +# not documents: stdout, states and strands stay byte-identical. SENSES_WARNING = ("probbit: live: events[%d]: this persona has no senses block: `senses` is an undeclared input " "(listed in ignored), no reading is judged\n") +CREDIT_WARNING = ("probbit: live: events[%d]: this persona has no credit block: `await`, `for` and `cancel` are undeclared " + "inputs (listed in ignored), feedback pays the previous stance\n") +WARNINGS = [(SENSES_WARNING, ("senses",)), (CREDIT_WARNING, ("await", "for", "cancel"))] -def first_senses_event(key, k): +def first_event_with(key, k, names): events = common.read_jsonl(os.path.join(P0, "scripts", "%s-%d.jsonl" % (key, k))) - return next((i for i, e in enumerate(events) if "senses" in e), None) + return next((i for i, e in enumerate(events) if any(n in e for n in names)), None) -def without_senses_warning(name, data): - """For a `live` stderr whose script carries `senses`: the bytes without the warning line, else None.""" +def without_warnings(name, data): + """For a `live` stderr whose script carries `senses` or the credit keys: the bytes without each such warning line (each + present exactly once), else None.""" m = re.match(r"live/([^/]+)/s\d+/(\d+)/stderr$", name) - i = m and first_senses_event(m.group(1), int(m.group(2))) - if i is None: + if not m: return None - line = (SENSES_WARNING % i).encode("utf-8") - return data.replace(line, b"", 1) if data.count(line) == 1 else None + rest, removed = data, 0 + for text, names in WARNINGS: + i = first_event_with(m.group(1), int(m.group(2)), names) + if i is None: + continue + line = (text % i).encode("utf-8") + if rest.count(line) != 1: + return None + rest, removed = rest.replace(line, b"", 1), removed + 1 + return rest if removed else None def rel(path): @@ -197,8 +209,8 @@ def keep(key, data, st): def check(verbose=False): - """Returns (outputs checked, differing names, stderr outputs equal but for the senses warning, strands verified, - strand failures, seconds).""" + """Returns (outputs checked, differing names, stderr outputs equal but for the warning lines, strands verified, strand + failures, seconds).""" t0 = time.time() expected = {} with open(os.path.join(P0, "EXPECTED"), encoding="utf-8") as f: @@ -217,7 +229,7 @@ def check(verbose=False): e = expected.get(name) got = (common.sha256_bytes(data), len(data), code) if e != got: - rest = without_senses_warning(name, data) + rest = without_warnings(name, data) if rest is not None and e == (common.sha256_bytes(rest), len(rest), code): warned.append(name) continue @@ -250,7 +262,7 @@ def check(verbose=False): elif len(sys.argv) > 1 and sys.argv[1] == "check": n, diffs, warned, nv, vfail, secs = check(verbose=True) print(json.dumps({"outputs": n, "differ": len(diffs), "identical": n - len(diffs) - len(warned), - "stderr_senses_warning_only": len(warned), "strands_verified": nv, "verify_failed": vfail, + "stderr_warnings_only": len(warned), "strands_verified": nv, "verify_failed": vfail, "seconds": round(secs, 1)})) sys.exit(1 if diffs or vfail else 0) else: diff --git a/probbit-cli/src/live.rs b/probbit-cli/src/live.rs index 911c765..1be7399 100644 --- a/probbit-cli/src/live.rs +++ b/probbit-cli/src/live.rs @@ -236,6 +236,8 @@ impl Replay { let nm = persona::normals(&live.p, &live.st); if !nm.is_empty() { v.push(("normals".into(), Json::Obj(nm.iter().enumerate().map(|(k, (id, m, n, _))| (id.clone(), Json::Obj(vec![("mean".into(), Json::Num(*m)), ("n".into(), Json::Num(*n as f64)), ("max_move_50".into(), Json::Num(self.norms.max_move.get(k).copied().unwrap_or(0.0)))]))).collect()))); } + // a credit block (§2.8): the decisions still awaiting an outcome + if let Some(o) = persona::open_decisions(&live.p, &live.st) { v.push(("open".into(), Json::Arr(o.iter().map(|(t, _)| Json::Num(*t as f64)).collect()))); } Json::Obj(v) } } @@ -265,6 +267,48 @@ pub fn verify_from_checkpoint(text: &str, eng: Engine) -> Result Result<(Json, Vec<(u64, Json)>, Persona), (usize, String)> { + let lines = lines(text); + let mut r = Replay::open(lines.first().copied().unwrap_or(""))?; let mut kept = vec![]; + for l in lines.iter().skip(1) { if let Some(doc) = r.step(l, eng)? { + if let Some(t) = doc.get("turn").and_then(Json::as_f64).map(|x| x as u64).filter(|t| keep.contains(t)) { kept.push((t, doc)); } } } + Ok((r.summary(), kept, r.live.p.clone())) +} +/// One line of a host's action log (`live verify --actions FILE`, §5.7): the decision's turn and, per trait the host acted on, +/// the level it acted on +pub struct Action { pub line: usize, pub turn: u64, pub levels: Vec<(String, String)> } +/// A host's action log: one JSON object per line, {"turn": T, "action": {trait: level, ...}} (blank lines skipped) +pub fn read_actions(text: &str) -> Result, InErr> { + let mut out = vec![]; + for (i, l) in text.split('\n').map(bare).enumerate() { if l.trim().is_empty() { continue; } let path = format!("actions.line{}", i + 1); + let bad = |m: &str| perr(&path, m.to_string()); + let j = json::parse(l).map_err(|e| perr(&path, format!("not JSON: {}", e.msg)))?; + let kv = j.as_obj().filter(|kv| kv.len() == 2 && kv.iter().all(|(k, _)| k == "turn" || k == "action")).ok_or_else(|| bad("an object {\"turn\": T, \"action\": {trait: level}}"))?; + let turn = kv.iter().find(|(k, _)| k == "turn").and_then(|(_, x)| x.as_f64()).filter(|x| *x >= 0.0 && x.fract() == 0.0 && *x <= 9_007_199_254_740_992.0) + .ok_or_else(|| bad("turn: a whole number >= 0 (the stance's turn)"))? as u64; + let act = kv.iter().find(|(k, _)| k == "action").and_then(|(_, x)| x.as_obj()).filter(|a| !a.is_empty()).ok_or_else(|| bad("action: an object trait -> level"))?; + let levels = act.iter().map(|(t, x)| x.as_str().map(|l| (t.clone(), l.to_string())).ok_or_else(|| bad("action: each level a string"))).collect::, InErr>>()?; + out.push(Action { line: i + 1, turn, levels }); } + Ok(out) +} +/// The earliest turn (then the earliest line) whose host action differs from the level its stance released -> (actions +/// checked, the difference: {turn, line, trait, action, released (null: not released or no such turn), why}); an action on a +/// trait the persona does not have is an input error +pub fn first_difference(p: &Persona, actions: &[Action], stances: &[(u64, Json)]) -> Result<(usize, Option), InErr> { + let mut order: Vec<&Action> = actions.iter().collect(); order.sort_by_key(|a| (a.turn, a.line)); + let s = |x: &str| Json::Str(x.to_string()); let mut checked = 0; + for a in order { checked += 1; let doc = stances.iter().find(|(t, _)| *t == a.turn).map(|x| &x.1); + for (t, level) in &a.levels { + let e = match doc { Some(d) => persona::doc_entry(p, d, t), None => None }; + if doc.is_some() && e.is_none() { return Err(perr(&format!("actions.line{}.action.{t}", a.line), "not a trait of the persona")); } + let released = e.as_ref().filter(|e| e.get("released") == Some(&Json::Bool(true))).and_then(|e| e.get("level")).and_then(Json::as_str).map(str::to_string); + let why = match (doc, &released) { (None, _) => "the strand has no stance with this turn", (_, None) => "the stance did not release this trait", + (_, Some(r)) if r != level => "the host acted on another level", _ => continue }; + return Ok((checked, Some(Json::Obj(vec![("turn".into(), Json::Num(a.turn as f64)), ("line".into(), Json::Num(a.line as f64)), ("trait".into(), s(t)), ("action".into(), s(level)), + ("released".into(), released.map_or(Json::Null, |r| s(&r))), ("why".into(), s(why))])))); } } + Ok((checked, None)) +} /// `verify` as one document: the summary, or {ok: false, line, diverges} pub fn verify_doc(text: &str, eng: Engine) -> Json { verify(text, eng).unwrap_or_else(|(line, why)| Json::Obj(vec![("ok".into(), Json::Bool(false)), ("line".into(), Json::Num(line as f64)), ("diverges".into(), Json::Str(why))])) diff --git a/probbit-cli/src/main.rs b/probbit-cli/src/main.rs index 1ff9407..51dd6ca 100644 --- a/probbit-cli/src/main.rs +++ b/probbit-cli/src/main.rs @@ -247,7 +247,7 @@ const F_P_SEEDS: Flag = Flag { name: "--seeds", arg: "LIST", help: "the individu const F_P_THREADS: Flag = Flag { name: "--threads", arg: "N", help: "search threads, 1 to 1024 (default: the logical CPUs)" }; const F_P_JSON: Flag = Flag { name: "--json", arg: "", help: "the JSON document instead of the readable report" }; const EXIT_PERSONA: &str = "0 done (every turn status, refusals and fallbacks included, is an answer; fuzz: no counterexample found; prove: every rule held or proved), 1 lint found an unresolved contradiction or (with rules) a counterexample, fuzz found a counterexample or prove left a rule unknown, 2 bad persona / state / inputs / script / rule (one {\"error\"} object on stdout, code \"persona\", when stdout is not a terminal or with --json) or bad flag (stderr), 3 lint (with rules): a rule the bound leaves unknown and the search cannot break (\"unproven\", not broken)."; -const EXIT_LIVE: &str = "0 done (live: every event answered; verify: every line replays; control: the line appended), 1 verify: a line differs (its number and what), 2 a bad persona, state, event (one {\"error\"} object on stdout per bad event when stdout is not a terminal or with --json; the run goes on), control line or flag, 4 refused: the strand's writer lock is held by another writer, or the individual is paused or retired (one {\"error\"} object per refused event, as for 2; nothing is written)."; +const EXIT_LIVE: &str = "0 done (live: every event answered; verify: every line replays; control: the line appended), 1 verify: a line differs (its number and what) or, with --actions, a host action differs from its turn's released level, 2 a bad persona, state, event (one {\"error\"} object on stdout per bad event when stdout is not a terminal or with --json; the run goes on), control line or flag, 4 refused: the strand's writer lock is held by another writer, or the individual is paused or retired (one {\"error\"} object per refused event, as for 2; nothing is written)."; pub(crate) static COMMANDS: &[Command] = &[ Command { name: "persona", aliases: &[], group: "persona", summary: "the individuality layer: persona + state + inputs -> one stance", usage: &["persona SUB PERSONA [flags] (SUB: init turn replay explain diff lint fuzz prove check compile describe)"], @@ -297,7 +297,7 @@ pub(crate) static COMMANDS: &[Command] = &[ Command { name: "live", aliases: &[], group: "live", summary: "a resident individual: JSONL events in, one stance per event out", usage: &["live PERSONA [--seed N | --state FILE] [--strand FILE] [--events FILE [--watch]] [--clock real|fixed] [--checkpoint-every K]", "live PERSONA --demo week [--seed N] [--strand FILE] [--plain]", - "live verify STRAND [--from-checkpoint]", + "live verify STRAND [--from-checkpoint] [--actions FILE]", "live control STRAND pause|resume|retire --by WHO --reason TEXT [--at TIME]"], about: "A resident individual (docs/persona.md §5.7): JSONL events (one object of inputs per line) from --events FILE or stdin, one stance per event on stdout (canonical JSON). The clock stamps each event's elapsed_hours (quantised to 1e-6 h), so moods decay by their half-lives between events; feedback moves the learned deltas of a persona with a learning block (§2.8).\n--strand FILE logs the life: a header (persona document, initial state, engine version), then per event the inputs as used, the stance and state digests and the sha256 of the line before. `probbit live verify STRAND` replays it.", before: &[], @@ -313,8 +313,9 @@ pub(crate) static COMMANDS: &[Command] = &[ Flag { name: "--checkpoint-every", arg: "K", help: "with --strand: a checkpoint line (the whole state) after every K-th event (default 1000; 0: none); `verify --from-checkpoint` and `monitor` start at the last one" }, ]], subs: &[ - Sub { name: "verify", args: "STRAND [--from-checkpoint]", help: "replay a strand: the earliest line that differs; from the header (every checkpoint checked), or from the last checkpoint", - flags: &[Flag { name: "--from-checkpoint", arg: "", help: "start at the last checkpoint instead of the header" }] }, + Sub { name: "verify", args: "STRAND [--from-checkpoint] [--actions FILE]", help: "replay a strand: the earliest line that differs; from the header (every checkpoint checked), or from the last checkpoint; with --actions, also the earliest turn whose host action differs from the level its stance released", + flags: &[Flag { name: "--from-checkpoint", arg: "", help: "start at the last checkpoint instead of the header" }, + Flag { name: "--actions", arg: "FILE", help: "the host's action log, one {\"turn\": T, \"action\": {trait: level}} per line: compared with each turn's released levels (summary `actions`: checked, differs); exit 1 when one differs" }] }, Sub { name: "control", args: "STRAND pause|resume|retire --by WHO --reason TEXT [--at TIME]", help: "pause, resume or retire an individual; appends a control line under the lock: while paused or retired every event is refused (exit 4); no credit crosses a control line; retire is final; `verify` replays them and reports the status", flags: &[Flag { name: "--by", arg: "WHO", help: "who decided it: human:ID or env:ID (required)" }, @@ -771,7 +772,7 @@ fn fuzz_cmd(args: &[String], path: &str, p: &persona::Persona, eng: fuzz::SyncEn if res.iter().any(|per| per.iter().any(Option::is_some)) { std::process::exit(1) } } /// `probbit live PERSONA [--seed N | --state FILE] [--strand FILE] [--events FILE [--watch]] [--clock real|fixed] [--checkpoint-every K]`; -/// `probbit live PERSONA --demo week`; `probbit live verify STRAND [--from-checkpoint]`; `probbit live control STRAND pause|resume|retire --by WHO --reason TEXT` +/// `probbit live PERSONA --demo week`; `probbit live verify STRAND [--from-checkpoint] [--actions FILE]`; `probbit live control STRAND pause|resume|retire --by WHO --reason TEXT` fn live_cmd(args: &[String]) { let engine = persona_engine(); let eng: persona::Engine = &engine; let opt = |f: &str| -> Option { args.iter().position(|x| x == f).and_then(|k| args.get(k + 1)).cloned() }; @@ -782,6 +783,19 @@ fn live_cmd(args: &[String]) { let mut a = vec!["live verify".to_string()]; a.extend(args.iter().skip(3).cloned()); let (v, w) = sub_flags("live", "verify").unwrap(); check_flags(&a, &v, &w); let Some(path) = args.get(2).filter(|a| !a.starts_with("--")) else { fail("live verify: the strand file: probbit live verify STRAND") }; let text = std::fs::read_to_string(path).unwrap_or_else(|e| fail(&format!("live verify: cannot read {path}: {e}"))); + // --actions (docs/persona.md §5.7): the host's action log against the released levels, replayed from the header + if let Some(af) = opt("--actions") { + if args.iter().any(|a| a == "--from-checkpoint") { fail("live verify: --actions replays from the header: drop --from-checkpoint") } + let at = std::fs::read_to_string(&af).unwrap_or_else(|e| fail(&format!("live verify: cannot read {af}: {e}"))); + let acts = live::read_actions(&at).unwrap_or_else(|e| bad_input("live verify: ", e)); + let turns: Vec = acts.iter().map(|a| a.turn).collect(); + match live::verify_keep(&text, eng, &turns) { + Ok((mut doc, kept, p)) => { let (checked, d) = live::first_difference(&p, &acts, &kept).unwrap_or_else(|e| bad_input("live verify: ", e)); let differs = d.is_some(); + if let Json::Obj(v) = &mut doc { v.push(("actions".into(), obj(vec![("checked", num(checked as f64)), ("differs", d.unwrap_or(Json::Null))]))); } + emit(&persona::canon(&doc)); if differs { std::process::exit(1) } } + Err((line, why)) => { emit(&persona::canon(&obj(vec![("ok", Json::Bool(false)), ("line", num(line as f64)), ("diverges", jstr(&why))]))); std::process::exit(1) } } + return; + } let res = if args.iter().any(|a| a == "--from-checkpoint") { live::verify_from_checkpoint(&text, eng) } else { live::verify(&text, eng) }; match res { Ok(doc) => emit(&persona::canon(&doc)), @@ -831,12 +845,15 @@ fn live_cmd(args: &[String]) { if !lock.as_ref().is_some_and(live::Lock::held) { refuse("live: ", json::InErr { code: "locked", path: "strand".into(), msg: format!("the writer lock {f}.lock is no longer this run's (removed or taken over): stopped before writing") }) } live::append(f, ls).unwrap_or_else(|e| fail(&format!("live: {}", e.msg))) }; if let Some(h) = &header { log(&[h]); } - let (mut bad, mut refused, mut warned) = (0, 0, false); + let (mut bad, mut refused, mut warned, mut warned_credit) = (0, 0, false, false); let mut one = |lv: &mut live::Live, i: usize, t: &str| { let res = json::parse(t).map_err(|e| persona::perr("event", format!("not JSON: {}", e.msg))).and_then(|ev| { // readings sent to a persona without a senses block are an undeclared input (listed in `ignored`): say so once if !warned && !lv.p.has_senses() && ev.get("senses").is_some() { warned = true; err_line(&format!("probbit: live: events[{i}]: this persona has no senses block: `senses` is an undeclared input (listed in ignored), no reading is judged")); } + // so are `await`, `for` and `cancel` without a credit block (docs/persona.md §2.8): say so once + if !warned_credit && !lv.p.has_credit() && ["await", "for", "cancel"].iter().any(|k| ev.get(k).is_some()) { warned_credit = true; + err_line(&format!("probbit: live: events[{i}]: this persona has no credit block: `await`, `for` and `cancel` are undeclared inputs (listed in ignored), feedback pays the previous stance")); } lv.event(&ev, eng) }); match res { Ok((stance, line)) => { let cp = (strand.is_some() && every > 0 && lv.n % every == 0).then(|| lv.checkpoint(&stance)); @@ -1115,7 +1132,7 @@ mod table_tests { let (v, w) = sub_flags("persona", "fuzz").unwrap(); assert!(v.contains(&"--fixture-src") && w.contains(&"--json") && w.contains(&"--pretty")); let (v, w) = flags_of("monitor"); assert!(v.contains(&"--port") && w.contains(&"--demo"), "--demo takes an optional value: parsed as a switch"); assert!(sub_flags("persona", "lnt").is_none()); - assert_eq!(sub_flags("live", "verify").unwrap(), (vec![], vec!["--from-checkpoint"]), "live's own flags are not verify's"); + assert_eq!(sub_flags("live", "verify").unwrap(), (vec!["--actions"], vec!["--from-checkpoint"]), "live's own flags are not verify's"); for c in COMMANDS { let (v, w) = flags_of(c.name); assert_eq!(v.len() + w.len(), c.flags().count(), "{}", c.name); } } #[test] diff --git a/probbit-cli/src/mcp.rs b/probbit-cli/src/mcp.rs index a85be05..93f067d 100644 --- a/probbit-cli/src/mcp.rs +++ b/probbit-cli/src/mcp.rs @@ -151,8 +151,9 @@ fn call(name: &str, args: Option<&Json>) -> Result<(String, Option, bool), fn persona_tool(name: &str, args: &[(String, Json)]) -> (String, Option, bool) { let t0 = std::time::Instant::now(); let eng = crate::persona_engine(); - // readings never come through the agent's channel (docs/persona.md §2.11, S7) - let r = if name == "probbit_persona_turn" { crate::persona::mcp_refuses_readings(args, "inputs") } else { Ok(()) }.and_then(|_| crate::persona::tool(name, args, &eng, true)); + // readings (docs/persona.md §2.11, S7) and cancels (§2.8) never come through the agent's channel + let r = if name == "probbit_persona_turn" { crate::persona::mcp_refuses_readings(args, "inputs").and_then(|_| crate::persona::mcp_refuses_cancel(args, "inputs")) } else { Ok(()) } + .and_then(|_| crate::persona::tool(name, args, &eng, true)); let (doc, is_error) = match r { Ok(d) => (d, false), Err(e) => (e.to_json(), true) }; log(&format!("tools/call {name} -> {}, {:.1} ms", if is_error { "error" } else { "ok" }, t0.elapsed().as_secs_f64() * 1e3)); (crate::persona::canon(&doc), Some(doc), is_error) @@ -171,7 +172,8 @@ fn fuzz_tool(args: &[(String, Json)]) -> (String, Option, bool) { fn live_tool(name: &str, args: &[(String, Json)]) -> (String, Option, bool) { let t0 = std::time::Instant::now(); let eng = crate::persona_engine(); - let r = if name == "probbit_live_event" { crate::persona::mcp_refuses_readings(args, "event") } else { Ok(()) }.and_then(|_| crate::live::tool(name, args, &eng)); + let r = if name == "probbit_live_event" { crate::persona::mcp_refuses_readings(args, "event").and_then(|_| crate::persona::mcp_refuses_cancel(args, "event")) } else { Ok(()) } + .and_then(|_| crate::live::tool(name, args, &eng)); let (doc, is_error) = match r { Ok(d) => (d, false), Err(e) => (e.to_json(), true) }; log(&format!("tools/call {name} -> {}, {:.1} ms", if is_error { "error" } else { "ok" }, t0.elapsed().as_secs_f64() * 1e3)); (crate::persona::canon(&doc), Some(doc), is_error) @@ -225,7 +227,7 @@ fn tools() -> Json { tool("probbit_persona_turn", "This turn's stance from a persona", "probbit persona turn: a persona (inline document or a file path), the individual's state and this turn's inputs (the persona's evidence: sentiment, error, loss, praise, criticism, stakes, time_pressure, claim_done, elapsed_hours, and the persona's own; `goals` for a persona with a drives block) -> {stance, state}. The stance has a level for every trait with exact odds, the mood, the habits in force and the ones that changed the stance (habits are hard rules: 0 violations by construction), status ok | partial | refused | fallback with an escalate reason, a one-line why, and `line`: a short stance line to put into the model's prompt (after any cached prefix). Pass the returned state back on the next turn. The persona never writes the reply; it decides how the reply is written.", p(&format!(r#"{{"type": "object", "additionalProperties": false, "required": ["state"], "properties": {{{PERSONA_ARG}, "state": {{"type": "object", "description": "the state returned by probbit_persona_init or by the previous probbit_persona_turn"}}, - "inputs": {{"type": "object", "description": "this turn's evidence, keyed by input id; flags true/false, level inputs a level name, numbers 0..max; inputs the persona does not declare are listed in stance.ignored", "properties": {{{GOALS_ARG}, {SENSES_ARG}}}, "additionalProperties": {{"type": ["boolean", "number", "string"]}}}}, + "inputs": {{"type": "object", "description": "this turn's evidence, keyed by input id; flags true/false, level inputs a level name, numbers 0..max; inputs the persona does not declare are listed in stance.ignored", "properties": {{{GOALS_ARG}, {SENSES_ARG}, {CREDIT_ARG}}}, "additionalProperties": {{"type": ["boolean", "number", "string"]}}}}, "flags": {{"type": "object", "additionalProperties": false, "properties": {{"timing": {{"type": "boolean", "description": "add a non-canonical timing object to the stance"}}, "no_inertia": {{"type": "boolean", "description": "ignore mood inertia for this turn (diagnostics)"}}}}}}}}}}"#))), tool("probbit_persona_fuzz", "Test a persona's character", "probbit persona fuzz: a persona (inline document or a file path) and a character property in habit syntax (never: {when, then}; or props: a list of them) -> for each individual (seeds, default 0-99) the shortest event script whose stance breaks it, shrunk, with the replay command; `found` says whether any did. It tests the stance a host gets, not the words a model writes; none found is evidence, not a proof. The document of probbit persona fuzz --json.", p(&format!(r#"{{"type": "object", "additionalProperties": false, "properties": {{{PERSONA_ARG}, @@ -240,7 +242,7 @@ fn tools() -> Json { p(&format!(r#"{{"type": "object", "additionalProperties": false, "properties": {{{PERSONA_ARG}, "state": {{"type": "object", "description": "the state returned by the previous event (or by probbit_persona_init); give this or seed"}}, "seed": {{"type": "integer", "minimum": 0, "description": "a new individual (default: the persona's identity.seed)"}}, - "event": {{"type": "object", "description": "the event's inputs keyed by input id, plus elapsed_hours (hours since the previous event, >= 0; default 0)", "properties": {{{GOALS_ARG}, {SENSES_ARG}}}, "additionalProperties": {{"type": ["boolean", "number", "string"]}}}}, + "event": {{"type": "object", "description": "the event's inputs keyed by input id, plus elapsed_hours (hours since the previous event, >= 0; default 0)", "properties": {{{GOALS_ARG}, {SENSES_ARG}, {CREDIT_ARG}}}, "additionalProperties": {{"type": ["boolean", "number", "string"]}}}}, "strand_path": {{"type": "string", "description": "a strand file on the server's disk to append the event's line to (created with its header if missing)"}}}}}}"#))), tool("probbit_live_verify", "Replay a strand", "probbit live verify: a strand (its text, or a file path on the server's disk) -> {ok: true, events, persona, seed, engine, final_state, last_line} when every line replays byte for byte from the header alone, else {ok: false, line, diverges} with the earliest line that differs and what (a changed input, a removed or reordered line, a changed header). A divergence is an answer, not a tool error.", p(r#"{"type": "object", "additionalProperties": false, "properties": {"strand": {"type": "string", "description": "the strand's text (header line, then one line per event)"}, "strand_path": {"type": "string", "description": "a strand file on the server's disk"}}}"#)), @@ -258,6 +260,12 @@ const GOALS_ARG: &str = r#""goals": {"type": "object", "description": "a persona /// `senses` in a turn's inputs or a live event: refused here for a persona with a senses block (readings come from the host's /// instruments, docs/persona.md 2.11, S7); a persona without one lists it in stance.ignored const SENSES_ARG: &str = r#""senses": {"type": "object", "description": "readings: refused through MCP for a persona with a senses block (the host sends them with probbit live or persona turn); a persona without one lists senses in stance.ignored"}"#; +/// `await`, `for` and `cancel` in a turn's inputs or a live event: a persona with a credit block reads them (docs/persona.md 2.8); +/// `cancel` is refused here for such a persona (the host or a person says no outcome will come, never the agent); a persona +/// without the block lists them in stance.ignored +const CREDIT_ARG: &str = r#""await": {"type": "boolean", "description": "a persona with a credit block: the host will report this decision's outcome"}, + "for": {"oneOf": [{"type": "integer", "minimum": 0}, {"type": "object", "additionalProperties": false, "required": ["turn", "stance"], "properties": {"turn": {"type": "integer", "minimum": 0}, "stance": {"type": "string", "description": "the paid stance's digest (its credit.stance)"}}}], "description": "a persona with a credit block: the turn of the decision this reward or correction pays"}, + "cancel": {"type": "array", "items": {"type": "integer", "minimum": 0}, "description": "refused through MCP for a persona with a credit block (the host sends it with probbit live or persona turn)"}"#; fn get_mut<'a>(j: &'a mut Json, k: &str) -> Option<&'a mut Json> { match j { Json::Obj(v) => v.iter_mut().find(|(x, _)| x == k).map(|(_, x)| x), _ => None } } /// `probbit_evaluate`'s input schema: the System One request (TypeSafe OpenAPI 0.2.0 and the Workers AI clef schema: `model`, /// `state`, `questions`, `images`) plus the `probbit` block, whose `rules` are the probbit-ir schema's own rule definitions. diff --git a/probbit-cli/src/persona.rs b/probbit-cli/src/persona.rs index 97fb4c6..34203b0 100644 --- a/probbit-cli/src/persona.rs +++ b/probbit-cli/src/persona.rs @@ -2010,6 +2010,17 @@ pub fn mcp_refuses_readings(args: &[(String, Json)], key: &str) -> R<()> { return Err(perr(&format!("arguments.{key}.senses"), "readings come from the host's instruments, never through the agent's channel: MCP refuses an event that carries readings (the host sends them with probbit live or persona turn)")); } Ok(()) } +/// §2.8: a cancel says no outcome will come for a decision, so an agent could cancel to dodge a correction: through the MCP tools +/// (the agent's own channel) an event that carries `cancel` is refused for a persona with a credit block; a persona without one +/// lists it in stance.ignored +pub fn mcp_refuses_cancel(args: &[(String, Json)], key: &str) -> R<()> { + let get = |k: &str| args.iter().find(|(x, _)| x == k).map(|(_, v)| v).filter(|v| !v.is_null()); + if get(key).and_then(|e| e.get("cancel")).is_none() { return Ok(()); } + let p = match (get("persona"), get("persona_path")) { (Some(d), None) => build(d).ok(), (None, Some(Json::Str(f))) => load(f).ok().map(|x| x.0), _ => None }; + if p.is_some_and(|p| p.credit().is_some()) { + return Err(perr(&format!("arguments.{key}.cancel"), "a cancel comes from the host or a person, never through the agent's channel: MCP refuses an event that carries cancel (the host sends it with probbit live or persona turn)")); } + Ok(()) +} /// `init` at `seed`, then every turn of the script -> (the stance documents, the final state) pub fn replay(p: &Persona, seed: Option, turns: &[Json], no_inertia: bool, eng: Engine, timing: bool) -> R<(Vec, State)> { let mut st = init(p, seed, true, eng); let mut out = vec![]; From b32a0137972d42448a51a88d466f38b2e5dcc8cf Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 08:20:20 -0700 Subject: [PATCH 04/15] bench/individuality: MANIFEST p0.py line and the README log for the credit-keys stderr line --- bench/individuality/README.md | 6 ++++++ bench/individuality/fixtures/MANIFEST | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/bench/individuality/README.md b/bench/individuality/README.md index 4da2b23..985e981 100644 --- a/bench/individuality/README.md +++ b/bench/individuality/README.md @@ -173,3 +173,9 @@ d 0 differing bytes over 240 strands, e 0 violations and 0 breaks over 9,442 sta binary (sha256 in MANIFEST) using relative paths: one line changed (`fuzz/adaptive-fixture`, now 43,646 bytes); every other output, the scripts and the strands are unchanged. MANIFEST's EXPECTED and p0.py lines were updated with the change. +- `p0.py` (wave 2): `check` also accepts the one stderr line `live` writes when a script sends `await`, `for` or + `cancel` to a persona without a credit block (RFC 0001 B.4: undeclared inputs, listed in `ignored`, and `live` says + so), on the same terms as the senses line: only where the script carries those keys, once, at its earliest such event, + each mandated line present exactly once. The outputs equal but for these lines are reported apart as + `stderr_warnings_only` (the key was `stderr_senses_warning_only`). EXPECTED, the scripts and the strands are + unchanged; MANIFEST's p0.py line was updated. diff --git a/bench/individuality/fixtures/MANIFEST b/bench/individuality/fixtures/MANIFEST index cdc799c..e68b4c7 100644 --- a/bench/individuality/fixtures/MANIFEST +++ b/bench/individuality/fixtures/MANIFEST @@ -53,7 +53,7 @@ a88d3b20b41e9843f2b9ac9b117d5b462ec6b1095c762da531cb98481ff48432 43389 p0/strand 615978432a80e6b8be7fdf6e2382438516dc67acae56c562221c89654cae479e 6815 p0/strands/tutor-s0-0.appended cf9073507dad98bedc4f09ca2e49f34862919240c64c548b7a1dcf58fda4804b 1160 p0/strands/tutor-s0-0.state.json 4db5f3d83a0e6df0ea632c35957cdb0970665422af9054fa50e5468e13a888ab 55008 p0/strands/tutor-s0-0.strand -e2ffc0667ba2b5ccb6061c9bee43b4474a6568924404a14fe39f94c8e1018272 12841 ../p0.py +344a54d4cb6bc9318caf82af6eeb776d774ef7ff1a4548bf9fb67a6061bf00e4 13470 ../p0.py # # Metrics a, b, d and e: frozen 2026-10-14 before their first run (personas, generator, streams, bars). # Re-generate the streams: python3 lives.py (gives these bytes). From c24e1ede4b3280b77f7c05437d62162343ed656e Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 08:24:11 -0700 Subject: [PATCH 05/15] fuzz: payments resolved against each state (late, reordered, previous, closed, unknown, mismatch; cancels), refused ones change nothing, exported scripts concrete; monitor: open decisions with eligibility, the payment and closures (WIP) --- probbit-cli/src/fuzz.rs | 35 +++++++++++++++++++++++++++-------- probbit-cli/src/monitor.html | 3 +++ probbit-cli/src/monitor.rs | 19 ++++++++++++++++++- probbit-cli/src/persona.rs | 28 ++++++++++++++++++++++++++++ 4 files changed, 76 insertions(+), 9 deletions(-) diff --git a/probbit-cli/src/fuzz.rs b/probbit-cli/src/fuzz.rs index 69cdc2e..81384b2 100644 --- a/probbit-cli/src/fuzz.rs +++ b/probbit-cli/src/fuzz.rs @@ -29,22 +29,36 @@ pub fn grid(p: &Persona, props: &[Prop], given: &[f64]) -> Vec { /// One individual's shortest counterexample to one property, shrunk: the script, the breaking turn's stance document, what broke pub struct Found { pub script: Vec, pub doc: Json, pub broken: Vec } -fn step(p: &Persona, st: &State, e: &Event, eng: persona::Engine, turns: &AtomicUsize) -> (Json, State) { +/// One turn of the search: (the stance, the new state, the event as it ran). A credit block's payments (§2.8) are resolved +/// against the state first; the credit step may refuse the event (B-R1 to B-R6, at inputs.for / inputs.cancel): None, and it +/// changes nothing +fn step(p: &Persona, st: &State, e: &Event, eng: persona::Engine, turns: &AtomicUsize) -> Option<(Json, State, Event)> { turns.fetch_add(1, Ordering::Relaxed); - persona::turn_any_source(p, st, &persona::event_json(e), false, eng, false).expect("the fuzzer's inputs are valid") + let ev = persona::resolve_payments(p, st, e); + match persona::turn_any_source(p, st, &persona::event_json(&ev), false, eng, false) { + Ok((doc, ns)) => Some((doc, ns, ev)), + Err(x) if p.has_credit() && ["inputs.for", "inputs.cancel"].iter().any(|k| x.path.starts_with(k)) => None, + Err(x) => panic!("the fuzzer's inputs are valid: {}: {}", x.path, x.msg) } } /// The earliest turn of `script` (run from `st0`) whose stance breaks the property fn breaking_turn(p: &Persona, pr: &Prop, st0: &State, script: &[Event], eng: persona::Engine, turns: &AtomicUsize) -> Option<(usize, Json, Vec)> { let mut st = st0.clone(); - for (k, e) in script.iter().enumerate() { let (doc, ns) = step(p, &st, e, eng, turns); + for (k, e) in script.iter().enumerate() { let Some((doc, ns, _)) = step(p, &st, e, eng, turns) else { continue }; if let Some(b) = persona::breaks(p, pr, &st, &doc) { return Some((k, doc, b)); } st = ns; } None } +/// A script as it ran: payments resolved, refused events left out (they change nothing), so it replays as is +fn concrete(p: &Persona, st0: &State, script: &[Event], eng: persona::Engine, turns: &AtomicUsize) -> Vec { + let (mut st, mut out) = (st0.clone(), vec![]); + for e in script { if let Some((_, ns, ev)) = step(p, &st, e, eng, turns) { out.push(ev); st = ns; } } + out +} /// A random event: each input takes one of its non-default values with a fixed chance (flag 1/4, level 1/2, number 2/5, idle /// hours 3/10, a goal signal 3/20), else stays at its default (left out of the event) fn random_event(r: &mut Philox4x32, alpha: &[(String, &'static str, Vec)]) -> Event { let mut e = vec![]; - for (id, kind, vals) in alpha { let chance = match *kind { "flag" => 0.25, "level" => 0.5, "number" => 0.4, "goal" => 0.15, "sense" => 0.4, _ => 0.3 }; + for (id, kind, vals) in alpha { let chance = match *kind { "flag" => 0.25, "level" => 0.5, "number" => 0.4, "goal" => 0.15, "sense" => 0.4, + "pay" => match id.as_str() { "await" => 0.5, "for" => 0.3, _ => 0.1 }, _ => 0.3 }; if r.f64() < chance { e.push((id.clone(), vals[r.below(vals.len())].clone())); } } e } @@ -55,6 +69,10 @@ fn moves(p: &Persona, pr: &Prop, s: &Search) -> Vec { let mut out: Vec = vec![vec![]]; out.extend(atoms.iter().cloned()); for b in persona::forcing(p, pr, &s.grid) { if !out.contains(&b) { out.push(b.clone()); } for a in &atoms { if b.iter().any(|(k, _)| *k == a[0].0) { continue; } let mut e = b.clone(); e.extend(a.iter().cloned()); if !out.contains(&e) { out.push(e); } } } + // a credit block (§2.8): each payment kind alone and with each learning flag (so `for` has feedback to carry) + let flags: Vec = atoms.iter().filter(|a| persona::learning_flag(p, &a[0].0)).cloned().collect(); + for (id, vals) in persona::payment_alphabet(p) { for v in vals { let e = vec![(id.clone(), v)]; + for f in &flags { let mut fe = f.clone(); fe.extend(e.iter().cloned()); out.push(fe); } out.push(e); } } out } /// Breadth by depth, `s.beam` states kept per depth (distinct states, the most pressure first): the earliest script whose last @@ -64,7 +82,7 @@ fn beam(p: &Persona, pr: &Prop, st0: &State, limit: usize, s: &Search, eng: pers for _ in 0..limit { let mut next: Vec<(f64, Vec, State)> = vec![]; for (script, st) in &kept { for e in &mv { - let (doc, ns) = step(p, st, e, eng, turns); let mut sc = script.clone(); sc.push(e.clone()); + let Some((doc, ns, _)) = step(p, st, e, eng, turns) else { continue }; let mut sc = script.clone(); sc.push(e.clone()); if persona::breaks(p, pr, st, &doc).is_some() { return Some(sc); } next.push((persona::pressure(p, pr, st, &doc), sc, ns)); } } next.sort_by(|a, b| b.0.partial_cmp(&a.0).unwrap_or(std::cmp::Ordering::Equal)); // stable: ties keep the move order @@ -87,19 +105,20 @@ fn shrink(p: &Persona, pr: &Prop, st0: &State, script: Vec, eng: persona: if !changed { break; } } let (k, doc, broken) = breaking_turn(p, pr, st0, &cur, eng, turns).expect("a shrunk counterexample still breaks the property"); - cur.truncate(k + 1); Found { script: cur, doc, broken } + cur.truncate(k + 1); Found { script: concrete(p, st0, &cur, eng, turns), doc, broken } } /// One individual: random scripts (shared by the properties), then per property the beam up to one event shorter than the /// shortest found, then shrinking fn individual(p: &Persona, props: &[Prop], seed: u64, s: &Search, eng: persona::Engine, turns: &AtomicUsize) -> Vec> { - let st0 = persona::init(p, Some(seed), true, eng); let alpha = persona::alphabet(p, &s.grid, &s.hours); + let st0 = persona::init(p, Some(seed), true, eng); + let mut alpha = persona::alphabet(p, &s.grid, &s.hours); alpha.extend(persona::payment_alphabet(p).into_iter().map(|(id, v)| (id, "pay", v))); let mut best: Vec>> = vec![None; props.len()]; let mut r = Philox4x32::new(s.fuzz_seed, seed); let search = |script: &[Event], best: &mut Vec>>| { let mut st = st0.clone(); for (k, e) in script.iter().enumerate() { if best.iter().all(|b| b.as_ref().is_some_and(|b| b.len() <= k + 1)) { break; } - let (doc, ns) = step(p, &st, e, eng, turns); + let Some((doc, ns, _)) = step(p, &st, e, eng, turns) else { continue }; for (i, pr) in props.iter().enumerate() { if best[i].as_ref().map_or(true, |b| b.len() > k + 1) && persona::breaks(p, pr, &st, &doc).is_some() { best[i] = Some(script[..=k].to_vec()); } } st = ns; } }; for _ in 0..s.scripts { diff --git a/probbit-cli/src/monitor.html b/probbit-cli/src/monitor.html index 29eb648..59c1ccb 100644 --- a/probbit-cli/src/monitor.html +++ b/probbit-cli/src/monitor.html @@ -176,6 +176,9 @@ const bar=Array.from({length:12},(_,i)=>i===c?'●':i===t?'┃':'─').join(''),norm=x.kind==='flag'?'rate '+f2(mean):(x.scale==='log1p'?f2(Math.expm1(mean)):f2(mean))+' '+x.unit; fact(inputs,'Sense · '+(x.say||x.id),bar+' '+(r?'read '+JSON.stringify(r.raw)+' · z '+(r.z<0?'−':'+')+Math.abs(r.z).toFixed(1):'not read')+' · normal '+norm+' over '+(num(n)?n:0)+' readings'); if(num(nm.moved)&&nm.moved>x.drift_cap/2)fact(inputs,'⚠ Normal moved',(x.say||x.id)+': '+nm.moved+' within 50 events (over drift_cap / 2 = '+(x.drift_cap/2)+')');} + const cr=obj(d.credit);if(f.open)fact(inputs,'Open decisions',f.open.length?f.open.map(o=>o.turn+' (e '+f2(o.e)+')').join(' · '):'None'); + if(cr&&cr.paid)fact(inputs,'Paid',`turn ${cr.paid.turn} · e ${f2(cr.paid.e)} · sign ${cr.paid.sign}`+(cr.paid.absorbed?' · absorbed':'')); + if(cr&&cr.closed?.length)fact(inputs,'Closed',cr.closed.map(x=>x.turn+' '+x.as).join(' · ')); const habits=$('habit-list');habits.replaceChildren();const hb=d.habits||{},active=hb.active||[],bound=hb.bound||[]; for(const name of active)mk('span','chip'+(bound.includes(name)?' on':''),habits,name+(bound.includes(name)?' · bound':'')); if(!active.length)mk('span','chip',habits,'No rules in force');mk('span','chip',habits,'Violations: '+(num(hb.violations)?hb.violations:'unreported')); diff --git a/probbit-cli/src/monitor.rs b/probbit-cli/src/monitor.rs index 1c34877..ff8fbf9 100644 --- a/probbit-cli/src/monitor.rs +++ b/probbit-cli/src/monitor.rs @@ -5,7 +5,8 @@ //! with a sparkline of the last 50 events, the inputs (the event's inputs and the history features), the senses when the //! persona declares them (§2.11: per sense its normal as a tick over the range, the reading, z and n, and an alert when a //! normal moved over drift_cap / 2 within 50 events), the habits in force and the ones that bound, the learned deltas, the -//! drives when the documents carry them (feature-detected), and the stance line. +//! decisions awaiting an outcome with their eligibility (§2.8, with a credit block), the drives when the documents carry them +//! (feature-detected), and the stance line. //! `--serve` draws the same in a browser: one page embedded in the binary, fed by server-sent events from a server on //! 127.0.0.1. It changes no file (the demo's week goes through a temporary one, removed at once) and sends nothing anywhere. use crate::json::{self, Json}; @@ -310,6 +311,18 @@ fn frame(w: Option<&Watch>, bad_head: Option<&(usize, String)>, path: &str, note out.push(format!("{}{t:>().join(" ") }; + let mut row = format!("{}{} {ol}", lab("CREDIT"), s.paint(GREY, "open")); + if let Some(pd) = c.get("paid").filter(|x| !x.is_null()) { let g = |k: &str| pd.get(k).and_then(Json::as_f64).unwrap_or(0.0); + row += &format!(" {dot} {}", s.bold(CYAN, &format!("paid {} e {:.2} sign {}{}", whole(g("turn")), g("e"), whole(g("sign")), if pd.get("absorbed") == Some(&Json::Bool(true)) { " absorbed" } else { "" }))); } + let closed: Vec = c.get("closed").and_then(Json::as_arr).map_or(vec![], |a| a.iter().map(|x| format!("{} {}", x.get("turn").and_then(Json::as_f64).map_or(String::new(), whole), x.get("as").and_then(Json::as_str).unwrap_or(""))).collect()); + if !closed.is_empty() { row += &format!(" {dot} {} {}", s.paint(GREY, "closed"), closed.join(", ")); } + out.push(row); + } // 6. the drives, when the document carries them (feature-detected: documents without them draw no row) out.extend(drives(doc, m, s, idw, &lab)); // 7. the line, and why @@ -407,6 +420,10 @@ fn frame_json(w: Option<&Watch>, bad_head: Option<&(usize, String)>, note: Optio kv.push(("normals", Json::Arr(persona::normals(&w.rep.live.p, &w.rep.live.st).iter().enumerate().map(|(k, (id, mean, n, _))| json::obj(vec![("id", json::str(id)), ("mean", json::num(*mean)), ("n", json::num(*n as f64)), ("moved", json::num(moved.get(k).copied().unwrap_or(0.0)))])).collect()))); } + // the open decisions now (§2.8), only with a credit block: each turn and the eligibility a payment at the next event would get + if let Some(o) = w.and_then(|w| persona::open_decisions(&w.rep.live.p, &w.rep.live.st)) { + kv.push(("open", Json::Arr(o.iter().map(|(t, e)| json::obj(vec![("turn", json::num(*t as f64)), ("e", json::num(*e))])).collect()))); + } json::obj(kv) } diff --git a/probbit-cli/src/persona.rs b/probbit-cli/src/persona.rs index 34203b0..4f44ae8 100644 --- a/probbit-cli/src/persona.rs +++ b/probbit-cli/src/persona.rs @@ -933,6 +933,34 @@ fn settle(p: &Persona, j: &mut Json, mut ns: State, k: &Pay, s: Settled) -> Stat if let Some((_, d)) = v.iter_mut().find(|(key, _)| key == "state_digest") { *d = Json::Str(ns.digest.clone()); } ns } +/// The fuzzer's payments (§2.8, a credit block only): `await`, then `for` and `cancel` as kinds that `resolve_payments` turns +/// into turns against the state an event runs on. -> (key, kinds) +pub fn payment_alphabet(p: &Persona) -> Vec<(String, Vec)> { + if p.credit().is_none() { return vec![]; } + let k = |v: &[&str]| v.iter().map(|x| Json::Str(x.to_string())).collect::>(); + vec![("await".into(), vec![Json::Bool(true)]), ("for".into(), k(&["late", "reordered", "previous", "closed", "unknown", "mismatch"])), ("cancel".into(), k(&["oldest", "unknown"]))] +} +/// A fuzz event's payment kinds resolved against the state it runs on: `for` names the oldest open decision (late), the newest +/// (reordered), the previous stance, a past turn no longer open (a duplicate, or a payment after a cancel or expiry), a turn to +/// come (unknown), or the oldest open decision bound to another stance's digest (mismatch); `cancel` the oldest open decision +/// or a turn to come. A kind with nothing to name is left out; every other input is as given. +pub fn resolve_payments(p: &Persona, st: &State, e: &[(String, Json)]) -> Vec<(String, Json)> { + if p.credit().is_none() { return e.to_vec(); } + let (t, open) = (st.turn, &st.open); let n = |x: u64| Json::Num(x as f64); + e.iter().filter_map(|(k, x)| { let kind = x.as_str().unwrap_or(""); + let v = match (k.as_str(), kind) { + ("for", "late") => open.first().map(|o| n(o.turn)), + ("for", "reordered") => open.last().filter(|_| open.len() > 1).map(|o| n(o.turn)), + ("for", "previous") => t.checked_sub(1).map(n), + ("for", "closed") => (0..t.saturating_sub(1)).rev().find(|x| !open.iter().any(|o| o.turn == *x)).map(n), + ("for", "unknown") | ("cancel", "unknown") => Some(if k == "for" { n(t + 3) } else { Json::Arr(vec![n(t + 5)]) }), + ("for", "mismatch") => open.first().map(|o| Json::Obj(vec![("turn".into(), n(o.turn)), ("stance".into(), Json::Str(format!("sha256:{}", "0".repeat(64))))])), + ("cancel", "oldest") => open.first().map(|o| Json::Arr(vec![n(o.turn)])), + _ => Some(x.clone()) }; + v.map(|v| (k.clone(), v)) }).collect() +} +/// Is `id` a learning block's reward or correction flag (§2.8)? +pub fn learning_flag(p: &Persona, id: &str) -> bool { p.learning.as_ref().is_some_and(|l| l.from.iter().any(|f| f == id)) } /// The open decisions of a state with a credit block (§2.8): (turn, the eligibility a payment at the next turn would get); none /// without one pub fn open_decisions(p: &Persona, st: &State) -> Option> { From 349d8c455d2e121dabdb8ac32eac17a666debb3c Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 08:26:42 -0700 Subject: [PATCH 06/15] examples/agent-harness: the addressed-outcome variant (addressed.json, late.py, its test) and its cross-OS golden --- examples/agent-harness/addressed.json | 78 +++++++++++++++++++ examples/agent-harness/golden/describe.json | 1 + examples/agent-harness/golden/events.json | 75 ++++++++++++++++++ .../agent-harness/golden/final-state.json | 1 + .../agent-harness/golden/program-turn0.json | 1 + examples/agent-harness/golden/state0.json | 1 + examples/agent-harness/golden/turns.jsonl | 16 ++++ examples/agent-harness/late.py | 70 +++++++++++++++++ examples/agent-harness/test_harness.py | 13 ++++ probbit-cli/tests/persona.rs | 27 +++++++ 10 files changed, 283 insertions(+) create mode 100644 examples/agent-harness/addressed.json create mode 100644 examples/agent-harness/golden/describe.json create mode 100644 examples/agent-harness/golden/events.json create mode 100644 examples/agent-harness/golden/final-state.json create mode 100644 examples/agent-harness/golden/program-turn0.json create mode 100644 examples/agent-harness/golden/state0.json create mode 100644 examples/agent-harness/golden/turns.jsonl create mode 100644 examples/agent-harness/late.py diff --git a/examples/agent-harness/addressed.json b/examples/agent-harness/addressed.json new file mode 100644 index 0000000..340ef4d --- /dev/null +++ b/examples/agent-harness/addressed.json @@ -0,0 +1,78 @@ +{ + "probbit_persona": 1, + "identity": { + "name": "Retry policy addressed", + "version": "1", + "seed": 0 + }, + "traits": [ + { + "id": "action", + "levels": [ + "retry", + "ask" + ], + "logw": [ + 0.5, + 0 + ], + "say": [ + "retry the local probe", + "escalate to the operator" + ] + } + ], + "inputs": [ + { + "id": "error", + "kind": "flag" + }, + { + "id": "praise", + "kind": "flag" + } + ], + "history": [ + { + "id": "error_streak", + "of": "error", + "kind": "streak", + "cap": 3, + "effects": { + "action": 0.2 + } + } + ], + "learning": { + "from": [ + "praise" + ], + "traits": [ + "action" + ], + "rate": 0.3, + "step_cap": 0.05, + "total_cap": 0.4, + "credit": { + "max_open": 8, + "half_life_events": 32 + } + }, + "reward_from": [ + "env" + ], + "habits": [ + { + "id": "escalate_after_two_errors", + "when": { + "error_streak": 2 + }, + "then": { + "action": [ + "ask" + ] + }, + "say": "two failures: stop and escalate" + } + ] +} diff --git a/examples/agent-harness/golden/describe.json b/examples/agent-harness/golden/describe.json new file mode 100644 index 0000000..6057c93 --- /dev/null +++ b/examples/agent-harness/golden/describe.json @@ -0,0 +1 @@ +{"agenda":[],"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","habits":["escalate_after_two_errors"],"inputs":{"error":{"kind":"flag"},"praise":{"kind":"flag"}},"learning":{"credit":{"expires_after":128,"half_life_events":32,"max_open":8},"from":["praise"],"rate":0.3,"step_cap":0.05,"total_cap":0.4,"traits":["action"]},"moods":{},"name":"Retry policy addressed","reward_from":{"praise":["env"]},"seed":0,"traits":{"action":{"levels":["retry","ask"],"say":["retry the local probe","escalate to the operator"]}},"version":"1"} diff --git a/examples/agent-harness/golden/events.json b/examples/agent-harness/golden/events.json new file mode 100644 index 0000000..163c513 --- /dev/null +++ b/examples/agent-harness/golden/events.json @@ -0,0 +1,75 @@ +[ + { + "await": true + }, + { + "await": true, + "error": true, + "src": "env:probe" + }, + { + "praise": true, + "for": 0, + "src": "env:probe" + }, + { + "await": true, + "elapsed_hours": 0.5 + }, + { + "cancel": [ + 1 + ], + "src": "env:executor" + }, + { + "praise": true, + "for": 3, + "src": "env:probe" + }, + { + "await": true + }, + { + "praise": true, + "src": "env:probe" + }, + { + "await": true, + "error": true, + "src": "env:probe" + }, + { + "await": true, + "error": true, + "src": "env:probe" + }, + { + "praise": true, + "for": { + "turn": 9, + "stance": "sha256:34fd9fe56a28a65a4503f64ed192b0bfa873b453efb5df2eaae9ddd43f20f426" + }, + "src": "env:probe" + }, + { + "praise": true, + "for": 8, + "src": "env:probe" + }, + { + "await": true, + "elapsed_hours": 1 + }, + { + "await": true + }, + { + "elapsed_hours": 2 + }, + { + "praise": true, + "for": 12, + "src": "env:probe" + } +] diff --git a/examples/agent-harness/golden/final-state.json b/examples/agent-harness/golden/final-state.json new file mode 100644 index 0000000..74833d1 --- /dev/null +++ b/examples/agent-harness/golden/final-state.json @@ -0,0 +1 @@ +{"control_closed":[],"credit":{"action":[0.271458,-0.271458]},"digest":"sha256:8ed82fa4b0d0b817e3ebf10ea153828d7e02f3c136fa3549a2c8ad6f60eba8a7","genes":{"react":{},"shift":{}},"history":{"error":[false,false,false,false,false]},"learned":{"action":[0.243618,-0.243618]},"mood":{},"open_credit":[{"credit":{"action":[0.290805,-0.290805]},"stance":"sha256:49b6b3b9ea9f1d215ae1f706f3110a174866a2a18ee0b331a43bdb35da1dba88","turn":13}],"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"prev":{"action":"retry"},"prev_stance":"sha256:98f83103c496df6f46f7765ea03ace796cf3c749717cdbe8697ce733c3d6a2a2","probbit_persona_state":1,"rest":{"action":"retry"},"seed":0,"turn":16} diff --git a/examples/agent-harness/golden/program-turn0.json b/examples/agent-harness/golden/program-turn0.json new file mode 100644 index 0000000..e597478 --- /dev/null +++ b/examples/agent-harness/golden/program-turn0.json @@ -0,0 +1 @@ +{"probbit_ir":1,"comment":"probbit persona Retry policy addressed 1 seed 0 turn 0; active habits: none","values":["l0","l1"],"vars":[{"id":"action","allowed":["l0","l1"],"h":{"l0":0.5}},{"id":"free.action","allowed":["l0","l1"],"h":{"l0":0.5}}]} diff --git a/examples/agent-harness/golden/state0.json b/examples/agent-harness/golden/state0.json new file mode 100644 index 0000000..333f4fb --- /dev/null +++ b/examples/agent-harness/golden/state0.json @@ -0,0 +1 @@ +{"control_closed":[],"credit":{"action":[0,0]},"digest":"sha256:f1828b098ae085902f1838b9512336eb1764cdd37b00c8dd22d44c810c06a7d2","genes":{"react":{},"shift":{}},"history":{"error":[]},"learned":{"action":[0,0]},"mood":{},"open_credit":[],"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"prev":{"action":"retry"},"prev_stance":null,"probbit_persona_state":1,"rest":{"action":"retry"},"seed":0,"turn":0} diff --git a/examples/agent-harness/golden/turns.jsonl b/examples/agent-harness/golden/turns.jsonl new file mode 100644 index 0000000..1c37eaf --- /dev/null +++ b/examples/agent-harness/golden/turns.jsonl @@ -0,0 +1,16 @@ +{"credit":{"closed":[],"open":[0],"paid":null,"stance":"sha256:675d9fd073e975fcc2a18dc6939779300b47e49ef063b8ee66d58beb454fbd17"},"engine":{"program":"sha256:8540849eb8c3b8fcb21756342c9ff686896f22346dcb7d8a9934bdc3876fbfa0","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"await":true,"error":false,"error_streak":0,"praise":false},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.377541,"retry":0.622459},"p":0.622459,"released":true}},"state_digest":"sha256:8e423f666eb871833adb3bd89d3f51e25629d080a6be6f3d4fd5c896890a7cb1","status":"ok","turn":0,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[],"open":[0,1],"paid":null,"stance":"sha256:a75a78f1f94bb8979f60aac26cec0abc8061a5f7ec15232f075e8ab55d861ab2"},"engine":{"program":"sha256:fa27a46e6e8cd02b7eda8ce40239de1d9dacf5d342916b290853de637913e70a","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"await":true,"error":true,"error_streak":1,"praise":false,"src":"env:probe"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.475021,"retry":0.524979},"p":0.524979,"released":true}},"state_digest":"sha256:4627bb95416a894ff6114a70cc9a34898c3d822649ac99d4b749f32e52d55bc9","status":"ok","turn":1,"unsure":[],"why":"error streak 1 -> action up"} +{"credit":{"closed":[{"as":"paid","turn":0}],"open":[1],"paid":{"absorbed":false,"e":0.978572,"sign":1,"stance":"sha256:675d9fd073e975fcc2a18dc6939779300b47e49ef063b8ee66d58beb454fbd17","turn":0},"stance":"sha256:cc52ea56e1ca7ff7cf7e05d32826e1e20f003a65c248cb673b7d5154037d4df6"},"engine":{"program":"sha256:53f1746bc193fe5dc33c7c3fc36b1d7f00e678e5cb576a32a790248b62d6aed2","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"error":false,"error_streak":0,"for":0,"praise":true,"src":"env:probe"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.354834,"retry":0.645166},"p":0.645166,"released":true}},"state_digest":"sha256:f59932e285e6f7db161a257b60d396c9913901f1ea14da949f6f37257027c3e1","status":"ok","turn":2,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[],"open":[1,3],"paid":null,"stance":"sha256:bf6e8356c13751a7806add1bf8b9df751f812c2a528d71091b4a0b2adae669a1"},"engine":{"program":"sha256:01bca33cd40e85529a7a7efe45f649132f2789c04ffcf0c9b28ca34d1842ad93","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"await":true,"error":false,"error_streak":0,"praise":false},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.354834,"retry":0.645166},"p":0.645166,"released":true}},"state_digest":"sha256:2822cc6662dad309b3b1ad7ce6f45bf0b27045c157be8b70b83a2767b627f5b6","status":"ok","turn":3,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[{"as":"cancelled","turn":1}],"open":[3],"paid":null,"stance":"sha256:f1bbc0937ac73f0db04d938c0ba87e274aedffde4aeeb68b476366a0127fe30a"},"engine":{"program":"sha256:a3d89e780cc58cfe58c13026df656035fef636bb9cf767498890262e81aed5f3","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"cancel":[1],"error":false,"error_streak":0,"praise":false,"src":"env:executor"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.354834,"retry":0.645166},"p":0.645166,"released":true}},"state_digest":"sha256:14b20cbd53cc31c85f8b15cdfaa514100bfff7a98380490c9a1ab12213f0e577","status":"ok","turn":4,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[{"as":"paid","turn":3}],"open":[],"paid":{"absorbed":false,"e":0.978572,"sign":1,"stance":"sha256:bf6e8356c13751a7806add1bf8b9df751f812c2a528d71091b4a0b2adae669a1","turn":3},"stance":"sha256:0f5c1f7ba208bcfc9c75f606bcd2d123314fff4ccd0eed90403539d674d5f95d"},"engine":{"program":"sha256:9fe20224fc4b29ba68427f1c689f571aad32abf14e5fe2bda89cbb9ce324e574","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"error":false,"error_streak":0,"for":3,"praise":true,"src":"env:probe"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.332763,"retry":0.667237},"p":0.667237,"released":true}},"state_digest":"sha256:5f7cd18ed37c62ae56647cae2c176d2fcd1cafb39227d528b6481af9fa42e9ed","status":"ok","turn":5,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[],"open":[6],"paid":null,"stance":"sha256:d4830b7e3fd70227a4ce9d75b2842b3903294d2166b289998532f1361f9404fb"},"engine":{"program":"sha256:70a5fd4247a784162c2c8fbc8d130332a4a3242a3ba98504bcc7e3135bde8d18","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"await":true,"error":false,"error_streak":0,"praise":false},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.332763,"retry":0.667237},"p":0.667237,"released":true}},"state_digest":"sha256:3c878e9856775abcf7bf04f063fdd6be46f004539aeb5c32f78b872ce0eb6fc6","status":"ok","turn":6,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[{"as":"paid","turn":6}],"open":[],"paid":{"absorbed":false,"e":1,"sign":1,"stance":"sha256:d4830b7e3fd70227a4ce9d75b2842b3903294d2166b289998532f1361f9404fb","turn":6},"stance":"sha256:114328fdd177417644f5f2773cc698189a8df31670f24cce369187a8410ea4e6"},"engine":{"program":"sha256:5c5175d06d06f8061a72ba30436618320949cb77f8a3cffe184a5f25beeaa0f0","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"error":false,"error_streak":0,"praise":true,"src":"env:probe"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.310943,"retry":0.689057},"p":0.689057,"released":true}},"state_digest":"sha256:dc055f2b4465c0f245fbaa766f3f4f5b754ebc13c917015ed0808c813672bb37","status":"ok","turn":7,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[],"open":[8],"paid":null,"stance":"sha256:9a7a52057c4a3d4154da66ff36fd1f83eefa36ad9222b971541de6acddad8a22"},"engine":{"program":"sha256:4e32ab06530c48f3f0af10cb9e33a5e13dfe1c641532a96fa8a2cc3375f83211","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"await":true,"error":true,"error_streak":1,"praise":false,"src":"env:probe"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.402342,"retry":0.597658},"p":0.597658,"released":true}},"state_digest":"sha256:f497c2920a4d80e7e3393560d3bda7480392789e629a2299d0f1f82082575802","status":"ok","turn":8,"unsure":[],"why":"error streak 1 -> action up"} +{"credit":{"closed":[],"open":[8,9],"paid":null,"stance":"sha256:34fd9fe56a28a65a4503f64ed192b0bfa873b453efb5df2eaae9ddd43f20f426"},"engine":{"program":"sha256:b041ceee8310415b66f4bf3988bcef588ca798f032493687583968a61c7e09c5","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":["escalate_after_two_errors"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"await":true,"error":true,"error_streak":2,"praise":false,"src":"env:probe"},"line":"Stance: two failures: stop and escalate; escalate to the operator.","line_tokens":17,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"ask","odds":{"ask":1,"retry":0},"p":1,"released":true}},"state_digest":"sha256:b66b04b318f9888796a4c6ebc2344d2fad90bbb7b3791db60e1c532d7cf8548c","status":"ok","turn":9,"unsure":[],"why":"error streak 2 -> action up"} +{"credit":{"closed":[{"as":"paid","turn":9}],"open":[8],"paid":{"absorbed":true,"e":1,"sign":1,"stance":"sha256:34fd9fe56a28a65a4503f64ed192b0bfa873b453efb5df2eaae9ddd43f20f426","turn":9},"stance":"sha256:5f35f40b63ecbcbbb964a24b84d6e9067b64f4ea05d0664f592f9f7ce70fc173"},"engine":{"program":"sha256:ff6ac83eb3d05d9c30e4822d81277dc24c44176479100db5ee1adf5d6ce9a2a6","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"error":false,"error_streak":0,"for":{"stance":"sha256:34fd9fe56a28a65a4503f64ed192b0bfa873b453efb5df2eaae9ddd43f20f426","turn":9},"praise":true,"src":"env:probe"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.310943,"retry":0.689057},"p":0.689057,"released":true}},"state_digest":"sha256:797d9deb4dba34b05eec6ca324be9ba45f894ec8e2b0903431aefdd5ab708730","status":"ok","turn":10,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[{"as":"paid","turn":8}],"open":[],"paid":{"absorbed":false,"e":0.957603,"sign":1,"stance":"sha256:9a7a52057c4a3d4154da66ff36fd1f83eefa36ad9222b971541de6acddad8a22","turn":8},"stance":"sha256:9266080ee58f5d778ef0a9d4d8a69eba77d0580abe2f26126cc6a920fa622979"},"engine":{"program":"sha256:a52518d31bd20664ca728b0cd508bcae5a5cc07f32f7782b85500f4832e71ca9","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"error":false,"error_streak":0,"for":8,"praise":true,"src":"env:probe"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.290805,"retry":0.709195},"p":0.709195,"released":true}},"state_digest":"sha256:032198263a3f8b8445f90f0ef993b667eb8258d9b768ce1edf46dcc6a833f02b","status":"ok","turn":11,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[],"open":[12],"paid":null,"stance":"sha256:45756a9afdc894c252a3ac0046840bf5b834d4993959bc662fd9966588fb98bc"},"engine":{"program":"sha256:556a28d3c08c503572c828eeba6232253fbbc2392e6c693082d65fa6465be713","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"await":true,"error":false,"error_streak":0,"praise":false},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.290805,"retry":0.709195},"p":0.709195,"released":true}},"state_digest":"sha256:5a6718b426f5a3509eac49b391af2fbeecb6946b9d64dcd862786dc13b5cae88","status":"ok","turn":12,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[],"open":[12,13],"paid":null,"stance":"sha256:49b6b3b9ea9f1d215ae1f706f3110a174866a2a18ee0b331a43bdb35da1dba88"},"engine":{"program":"sha256:ade53eb7b998a927e385bc02253ae082b91a5d45dd977a6c8e1a370ed5250e3f","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"await":true,"error":false,"error_streak":0,"praise":false},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.290805,"retry":0.709195},"p":0.709195,"released":true}},"state_digest":"sha256:63f52715c8d94174ce050293f9dab2941a695dc5ddd39477118d59496894898a","status":"ok","turn":13,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[],"open":[12,13],"paid":null,"stance":"sha256:f96613db77b69b6d904bfd78d17ed8293816c7cfa2f84f376946c3a1969641a2"},"engine":{"program":"sha256:5481b8513472b7089fde8efc906b8826824375b5d76ffc8c878cfd61f807c149","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"error":false,"error_streak":0,"praise":false},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.290805,"retry":0.709195},"p":0.709195,"released":true}},"state_digest":"sha256:b34c2ab1c947ea4157dcd28a50fc7af10abe4f4f089716315f00dcc72e22c330","status":"ok","turn":14,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[{"as":"paid","turn":12}],"open":[13],"paid":{"absorbed":false,"e":0.957603,"sign":1,"stance":"sha256:45756a9afdc894c252a3ac0046840bf5b834d4993959bc662fd9966588fb98bc","turn":12},"stance":"sha256:98f83103c496df6f46f7765ea03ace796cf3c749717cdbe8697ce733c3d6a2a2"},"engine":{"program":"sha256:9c68dda9f7df6b8ce8231e69499e7db1bc2e93ab690e7e71f4be25ba3ba55c08","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"error":false,"error_streak":0,"for":12,"praise":true,"src":"env:probe"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.271458,"retry":0.728542},"p":0.728542,"released":true}},"state_digest":"sha256:8ed82fa4b0d0b817e3ebf10ea153828d7e02f3c136fa3549a2c8ad6f60eba8a7","status":"ok","turn":15,"unsure":[],"why":"baseline (no live evidence)"} diff --git a/examples/agent-harness/late.py b/examples/agent-harness/late.py new file mode 100644 index 0000000..dba2445 --- /dev/null +++ b/examples/agent-harness/late.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +"""Late, reordered outcomes credit the decision they were about. Local and dependency-free: no model or network calls.""" +import argparse +import json +from pathlib import Path +import random +import subprocess +import sys +import tempfile + +HERE = Path(__file__).resolve().parent +sys.path.insert(0, str(HERE.parent.parent / "python")) +import probbit +from run import gate + + +def late_outcomes(directory, binary=None, decisions=4, seed=7): + """`addressed.json` awaits the outcome of each decision the host acts on. The outcomes come back late and in another order, + each naming its decision (`for: {turn, stance}`), so each one credits the stance it was about; a duplicate is refused and + changes nothing; `live verify --actions` compares the host's action log with the released levels.""" + binary = probbit.find_binary(binary) + policy = HERE / "addressed.json" + document = json.loads(policy.read_text(encoding="utf-8")) + strand = directory / "late.strand" + result, awaited, actions = None, [], [] + for _ in range(decisions): + # The host acts on this decision now and will report its outcome later: the stance's turn and digest name it. + event = {"await": True} + result = probbit.live_event(document, None if result is None else result["state"], event, + seed=0 if result is None else None, strand=strand, binary=binary) + stance = result["stance"] + decision, _ = gate(stance, "local_probe", 0) + actions.append({"turn": stance["turn"], "action": {"action": "retry" if decision == "dispatch" else "ask"}}) + awaited.append({"turn": stance["turn"], "stance": stance["credit"]["stance"]}) + # Explicitly synthetic confirmations, not production outcomes: late and shuffled, each addressed to its decision. + order = list(awaited) + random.Random(seed).shuffle(order) + paid = [] + for target in order: + result = probbit.live_event(document, result["state"], {"praise": True, "for": target, "src": "env:synthetic"}, + strand=strand, binary=binary) + record = result["stance"]["credit"]["paid"] + paid.append({"turn": record["turn"], "e": record["e"], "stance_matches": record["stance"] == target["stance"]}) + before = strand.read_bytes() + try: + probbit.live_event(document, result["state"], {"praise": True, "for": order[0], "src": "env:synthetic"}, + strand=strand, binary=binary) + duplicate = "accepted" + except probbit.ProbbitInputError as error: + duplicate = error.path + log = directory / "host-actions.jsonl" + log.write_text("".join(json.dumps(a) + "\n" for a in actions), encoding="utf-8") + verify = subprocess.run([binary, "live", "verify", str(strand), "--actions", str(log)], capture_output=True, + encoding="utf-8", timeout=30) + summary = json.loads(verify.stdout) + return {"decisions": len(awaited), "paid": paid, "open_after": result["stance"]["credit"]["open"], + "duplicate_refused_at": duplicate, "strand_unchanged_by_refusal": strand.read_bytes() == before, + "verify_exit": verify.returncode, "actions": summary.get("actions"), "verify_ok": summary.get("ok")} + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--binary", help="probbit executable (otherwise PROBBIT_BIN/PATH/build fallback)") + args = parser.parse_args() + with tempfile.TemporaryDirectory(prefix="probbit-late-outcomes-") as directory: + print(json.dumps(late_outcomes(Path(directory), args.binary), indent=2)) + + +if __name__ == "__main__": + main() diff --git a/examples/agent-harness/test_harness.py b/examples/agent-harness/test_harness.py index 136239e..caa0f13 100644 --- a/examples/agent-harness/test_harness.py +++ b/examples/agent-harness/test_harness.py @@ -3,6 +3,7 @@ from pathlib import Path import tempfile import unittest +from late import late_outcomes from run import demonstrate, gate @@ -33,6 +34,18 @@ def test_host_rejects_unreleased_refused_or_unknown_tool_actions(self): self.assertEqual(gate(stance, "shell", 0)[0], "escalate") self.assertEqual(gate(stance, "local_probe", 3)[0], "escalate") + def test_late_outcomes_credit_their_own_decisions(self): + with tempfile.TemporaryDirectory() as directory: + report = late_outcomes(Path(directory)) + self.assertEqual(sorted(p["turn"] for p in report["paid"]), [0, 1, 2, 3]) + self.assertNotEqual([p["turn"] for p in report["paid"]], [0, 1, 2, 3], "the outcomes came back reordered") + self.assertTrue(all(p["stance_matches"] and 0 < p["e"] <= 1 for p in report["paid"])) + self.assertTrue(any(p["e"] < 1 for p in report["paid"]), "a late outcome moves less than a fresh one") + self.assertEqual(report["open_after"], []) + self.assertTrue(report["duplicate_refused_at"].endswith("inputs.for")) + self.assertTrue(report["strand_unchanged_by_refusal"]) + self.assertEqual((report["verify_exit"], report["verify_ok"], report["actions"]), (0, True, {"checked": 4, "differs": None})) + if __name__ == "__main__": unittest.main() diff --git a/probbit-cli/tests/persona.rs b/probbit-cli/tests/persona.rs index 0020a88..82c3062 100644 --- a/probbit-cli/tests/persona.rs +++ b/probbit-cli/tests/persona.rs @@ -145,6 +145,33 @@ fn stdout_matches_the_sensed_golden() { let _ = std::fs::remove_file(&st); } +/// The addressed-outcome golden (examples/agent-harness/addressed.json, docs/persona.md §2.8): 16 events with decisions awaiting +/// their outcome, late payments (`for`, one bound to its stance's digest), a cancel, an unaddressed payment of the previous stance +/// and a payment of a habit-forced stance (absorbed): `init`, `compile` of turn 0, every turn, the final state, `replay` and +/// `describe`. CI runs it on Linux, macOS and Windows: the same bytes on each. +#[test] +fn stdout_matches_the_addressed_golden() { + let ah = |f: &str| format!("{}/../examples/agent-harness/{f}", env!("CARGO_MANIFEST_DIR")); let p = ah("addressed.json"); + let g = |f: &str| read(&ah(&format!("golden/{f}"))); + let script = parse(&g("events.json")); let turns = script.as_arr().unwrap(); assert_eq!(turns.len(), 16); + let (c, s0, e) = probbit(&["persona", "init", &p], ""); assert_eq!(c, 0, "{e}"); assert_eq!(s0, g("state0.json"), "state0"); + let st = tmp("addressed-state.json"); std::fs::write(&st, &s0).unwrap(); + let (c, prog, e) = probbit(&["persona", "compile", &p, "--state", &st, "--inputs", &jw(&turns[0])], ""); assert_eq!(c, 0, "{e}"); + assert_eq!(prog, g("program-turn0.json"), "program of turn 0"); + let gold = g("turns.jsonl"); let lines: Vec<&str> = gold.lines().collect(); assert_eq!(lines.len(), 16); + for (i, t) in turns.iter().enumerate() { + let (c, out, e) = probbit(&["persona", "turn", &p, "--state", &st, "--inputs", &jw(t)], ""); assert_eq!(c, 0, "{e}"); + assert_eq!(out.trim_end(), lines[i], "addressed turn {i}"); } + assert_eq!(read(&st), g("final-state.json"), "final state"); + let (c, rep, e) = probbit(&["persona", "replay", &p, "--script", &ah("golden/events.json")], ""); assert_eq!(c, 0, "{e}"); assert_eq!(rep, gold, "replay"); + let (c, d, e) = probbit(&["persona", "describe", &p], ""); assert_eq!(c, 0, "{e}"); assert_eq!(d, g("describe.json"), "describe"); + // a late payment carries its eligibility; the digest-bound one pays the habit-forced stance, which moves nothing + assert!(lines[2].contains(r#""paid":{"absorbed":false,"e":0.978572,"sign":1,"stance":"#), "{}", lines[2]); + assert!(lines[10].contains(r#""paid":{"absorbed":true,"e":1,"sign":1,"stance":"#), "{}", lines[10]); + assert!(lines[4].contains(r#""closed":[{"as":"cancelled","turn":1}]"#), "{}", lines[4]); + let _ = std::fs::remove_file(&st); +} + /// `probbit persona --help` documents every subcommand and the exit codes; bad flags and subcommands exit 2. #[test] fn persona_help_and_flags() { From ce57dac5c7f5a65c4aec95070e68f45fcf065c17 Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 09:13:54 -0700 Subject: [PATCH 07/15] fuzz: re-running a shrunk counterexample with its payments resolved is not a searched turn, and a persona without a credit block keeps its script as found --- probbit-cli/src/fuzz.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/probbit-cli/src/fuzz.rs b/probbit-cli/src/fuzz.rs index 81384b2..54eab3c 100644 --- a/probbit-cli/src/fuzz.rs +++ b/probbit-cli/src/fuzz.rs @@ -47,10 +47,12 @@ fn breaking_turn(p: &Persona, pr: &Prop, st0: &State, script: &[Event], eng: per if let Some(b) = persona::breaks(p, pr, &st, &doc) { return Some((k, doc, b)); } st = ns; } None } -/// A script as it ran: payments resolved, refused events left out (they change nothing), so it replays as is -fn concrete(p: &Persona, st0: &State, script: &[Event], eng: persona::Engine, turns: &AtomicUsize) -> Vec { - let (mut st, mut out) = (st0.clone(), vec![]); - for e in script { if let Some((_, ns, ev)) = step(p, &st, e, eng, turns) { out.push(ev); st = ns; } } +/// A script as it ran: payments resolved, refused events left out (they change nothing), so it replays as is. Without a credit +/// block the script is already concrete; the re-run is not a searched turn either way. +fn concrete(p: &Persona, st0: &State, script: &[Event], eng: persona::Engine) -> Vec { + if !p.has_credit() { return script.to_vec(); } + let (mut st, mut out, rerun) = (st0.clone(), vec![], AtomicUsize::new(0)); + for e in script { if let Some((_, ns, ev)) = step(p, &st, e, eng, &rerun) { out.push(ev); st = ns; } } out } /// A random event: each input takes one of its non-default values with a fixed chance (flag 1/4, level 1/2, number 2/5, idle @@ -105,7 +107,7 @@ fn shrink(p: &Persona, pr: &Prop, st0: &State, script: Vec, eng: persona: if !changed { break; } } let (k, doc, broken) = breaking_turn(p, pr, st0, &cur, eng, turns).expect("a shrunk counterexample still breaks the property"); - cur.truncate(k + 1); Found { script: concrete(p, st0, &cur, eng, turns), doc, broken } + cur.truncate(k + 1); Found { script: concrete(p, st0, &cur, eng), doc, broken } } /// One individual: random scripts (shared by the properties), then per property the beam up to one event shorter than the /// shortest found, then shrinking From b06ed9803cf02076c92ccb6eb208a55da7af6b42 Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 09:28:37 -0700 Subject: [PATCH 08/15] persona, live: tests for action-addressed feedback: eligibility at ages 0/3/10/32/127, expiry at 128, eviction, every refusal row B-R1..B-R6 (and byte for byte in live), absorbed, the strict credit state, e = 1 equals 0.8 on every shipped learning persona, control lines, P3c 40 x 300 with a model of the bookkeeping, probbit check on a credit persona --- probbit-cli/src/persona.rs | 118 +++++++++++++++++++++++++++++ probbit-cli/tests/live.rs | 147 ++++++++++++++++++++++++++++++++++++- 2 files changed, 264 insertions(+), 1 deletion(-) diff --git a/probbit-cli/src/persona.rs b/probbit-cli/src/persona.rs index 4f44ae8..0738677 100644 --- a/probbit-cli/src/persona.rs +++ b/probbit-cli/src/persona.rs @@ -3338,4 +3338,122 @@ mod tests { let q = build(&json::parse(&BOX.replace("2.5", "6.5")).unwrap()).unwrap(); assert_eq!(prove_seed(&q, &props(&q, &rule, "--never", "never").unwrap()[0], 0, &run).ok(), Some((1, 2))); } + + // ------------------------------------------------------------- action-addressed feedback (§2.8, RFC 0001 B.2 and B.3) + const CREDIT: &str = r#","learning":{"from":["praise","criticism"],"traits":["verbosity","humour"],"rate":0.5,"step_cap":0.2,"total_cap":0.6,"credit":{"max_open":3,"half_life_events":32}}"#; + /// One turn on the event `ev`: (stance, new state), or the refusal as "path: message" + fn tn(p: &Persona, st: &State, ev: &str) -> Result<(Json, State), String> { turn(p, st, &json::parse(ev).unwrap(), false, &run, false).map_err(|e| format!("{}: {}", e.path, e.msg)) } + fn opened(st: &State) -> Vec { st.open.iter().map(|o| o.turn).collect() } + + /// The RFC arithmetic: a payment `age` events late (age = t − n − 1) gets e = 0.5^(age / 32), 6 decimals (1, 0.937084, 0.805245, + /// 0.5 and 0.063869 at ages 0, 3, 10, 32 and 127) and moves the 0.8 step scaled by e; at age 128 the decision has expired + /// (closed as expired before anything is paid) and paying it is refused (B-R2) + #[test] + fn eligibility_halves_per_half_life_and_a_decision_expires_after_four() { + let p = persona(CREDIT).unwrap(); let l = p.learning.clone().unwrap(); + for (age, e) in [(0u64, 1.0), (3, 0.937084), (10, 0.805245), (32, 0.5), (127, 0.063869)] { + let mut st = tn(&p, &init(&p, Some(1), true, &run), r#"{"await":true}"#).unwrap().1; let c0 = st.open[0].credit.clone(); + assert!(c0.iter().any(|(_, v)| v.iter().any(|x| *x != 0.0)), "the awaited stance carries credit"); + for _ in 0..age { st = tn(&p, &st, "{}").unwrap().1; } + let (doc, ns) = tn(&p, &st, r#"{"praise":true,"for":0}"#).unwrap(); + assert_eq!(g(&doc, &["credit", "paid", "e"]).as_f64(), Some(e), "age {age}"); + assert_eq!(canon(&table(&ns.learned)), canon(&table(&learn(&l, &c0, 1.0, e, &st.learned))), "age {age}: the step scaled by e"); + assert_eq!((canon(g(&doc, &["credit", "closed"])), ns.open.len()), (r#"[{"as":"paid","turn":0}]"#.to_string(), 0), "age {age}"); + } + let mut st = tn(&p, &init(&p, Some(1), true, &run), r#"{"await":true}"#).unwrap().1; + for _ in 0..128 { st = tn(&p, &st, "{}").unwrap().1; } + assert_eq!(opened(&st), [0], "open until an event 128 late"); + let (doc, ns) = tn(&p, &st, "{}").unwrap(); assert_eq!(canon(g(&doc, &["credit", "closed"])), r#"[{"as":"expired","turn":0}]"#); assert!(ns.open.is_empty()); + let e = tn(&p, &st, r#"{"praise":true,"for":0}"#).err().unwrap(); assert!(e.starts_with("inputs.for: turn 0 is neither open nor the previous stance (128)"), "{e}"); + } + + /// At most max_open decisions wait (a fourth `await` evicts the oldest, which can no longer be paid), and every refusal row + /// B-R1 to B-R6 refuses its event whole at its path; a payment of a habit-forced stance moves nothing and says `absorbed` + #[test] + fn eviction_every_refusal_row_and_absorbed() { + let p = persona(CREDIT).unwrap(); let mut st = init(&p, Some(2), true, &run); let mut docs = vec![]; + for _ in 0..4 { let (d, s) = tn(&p, &st, r#"{"await":true}"#).unwrap(); docs.push(d); st = s; } + assert_eq!((canon(g(&docs[3], &["credit", "closed"])), canon(g(&docs[3], &["credit", "open"]))), (r#"[{"as":"evicted","turn":0}]"#.to_string(), "[1,2,3]".to_string())); + let st = tn(&p, &st, "{}").unwrap().1; // turn 5: open 1, 2, 3; the previous stance is 4 + let s5 = tn(&p, &st, r#"{"praise":true,"for":1}"#).unwrap().1; let s6 = tn(&p, &s5, r#"{"cancel":[2],"src":"env:executor"}"#).unwrap().1; // turn 7: open 3 + let z = "0".repeat(64); let d3 = g(&docs[3], &["credit", "stance"]).as_str().unwrap().to_string(); + let rows: Vec<(&State, String, &str)> = vec![ + (&st, r#"{"praise":true}"#.into(), "inputs.for: feedback without `for` while other decisions are open (1, 2, 3)"), // B-R1 + (&st, r#"{"praise":true,"for":0}"#.into(), "inputs.for: turn 0 is neither open nor the previous stance (4)"), // B-R2 evicted + (&st, r#"{"praise":true,"for":9}"#.into(), "inputs.for: turn 9 is neither open"), // B-R2 future + (&s6, r#"{"praise":true,"for":1}"#.into(), "inputs.for: turn 1 is neither open"), // B-R2 paid + (&s6, r#"{"praise":true,"for":2}"#.into(), "inputs.for: turn 2 is neither open"), // B-R2 cancelled + (&s6, r#"{"praise":true,"for":4}"#.into(), "inputs.for: turn 4 is neither open"), // B-R2 never opened + (&st, r#"{"for":1}"#.into(), "inputs.for: this event carries no feedback"), // B-R3 + (&st, r#"{"cancel":[0],"src":"env"}"#.into(), "inputs.cancel[0]: turn 0 is not open (open: 1, 2, 3)"), // B-R4 not open + (&st, r#"{"cancel":[1,1],"src":"env"}"#.into(), "inputs.cancel[1]: listed twice"), // B-R4 twice + (&st, r#"{"praise":true,"for":1,"cancel":[1],"src":"env"}"#.into(), "inputs.cancel[0]: turn 1 is the decision this event's feedback pays"), // B-R4 paid now + (&st, r#"{"await":"yes"}"#.into(), "inputs.await: "), (&st, r#"{"await":1}"#.into(), "inputs.await: "), // B-R5 + (&st, r#"{"praise":true,"for":1.5}"#.into(), "inputs.for: "), (&st, r#"{"praise":true,"for":-1}"#.into(), "inputs.for: "), + (&st, r#"{"praise":true,"for":"1"}"#.into(), "inputs.for: "), (&st, r#"{"praise":true,"for":{"turn":1}}"#.into(), "inputs.for"), + (&st, r#"{"praise":true,"for":{"turn":1,"stance":"1"}}"#.into(), "inputs.for.stance: "), + (&st, r#"{"cancel":1,"src":"env"}"#.into(), "inputs.cancel: "), (&st, r#"{"cancel":[1,2,3,4],"src":"env"}"#.into(), "inputs.cancel: "), + (&st, r#"{"cancel":[0.5],"src":"env"}"#.into(), "inputs.cancel[0]: "), (&st, r#"{"cancel":[1]}"#.into(), "inputs.src: a cancel needs a source"), + (&st, r#"{"cancel":[1],"src":"self"}"#.into(), "inputs.src: a cancel needs a source"), (&st, r#"{"cancel":[1],"src":"clock"}"#.into(), "inputs.src: a cancel needs a source"), + (&s6, format!(r#"{{"praise":true,"for":{{"turn":3,"stance":"sha256:{z}"}}}}"#), "inputs.for.stance: turn 3's stance is sha256:"), // B-R6 + ]; + for (s, ev, want) in &rows { let e = tn(&p, s, ev).map(|_| "accepted".to_string()).unwrap_or_else(|e| e); assert!(e.starts_with(want), "{ev}: {e}"); } + // the digest-bound payment of the stance it names is accepted and echoes it + let (doc, ns) = tn(&p, &s6, &format!(r#"{{"praise":true,"for":{{"turn":3,"stance":"{d3}"}}}}"#)).unwrap(); + assert_eq!((g(&doc, &["credit", "paid", "stance"]).as_str(), g(&doc, &["credit", "paid", "turn"]).as_f64(), opened(&ns)), (Some(d3.as_str()), Some(3.0), vec![])); + // a habit-forced stance carries no credit: paying it moves nothing (absorbed), and learned_from does not count it + let q = persona(&CREDIT.replace(r#""traits":["verbosity","humour"]"#, r#""traits":["humour"]"#)).unwrap(); + let s1 = tn(&q, &init(&q, Some(3), true, &run), r#"{"loss":true,"await":true}"#).unwrap().1; let s2 = tn(&q, &s1, "{}").unwrap().1; + let (doc, s3) = tn(&q, &s2, r#"{"praise":true,"for":0}"#).unwrap(); + assert_eq!((g(&doc, &["credit", "paid", "absorbed"]), &s3.learned), (&Json::Bool(true), &s2.learned)); + } + + /// The credit state is read strictly: at most max_open open decisions, turns increasing and before the state's turn, credits + /// within ±1, stance digests; prev_stance a digest after the first turn; without the block the fields are refused + #[test] + fn the_credit_state_is_strict() { + let p = persona(CREDIT).unwrap(); let mut st = init(&p, Some(4), true, &run); + for ev in [r#"{"await":true}"#, r#"{"await":true}"#, "{}"] { st = tn(&p, &st, ev).unwrap().1; } + assert_eq!((opened(&st), State::read(&p, &st.to_json(&p)).is_ok()), (vec![0, 1], true)); + let bad = |f: &dyn Fn(&mut State)| { let mut s = st.clone(); f(&mut s); s.seal(&p); err(State::read(&p, &s.to_json(&p))) }; + let cases: Vec<(String, &str)> = vec![(bad(&|s| s.open[0].credit[0].1[0] = 1.5), "state.open_credit[0].credit"), (bad(&|s| s.open[1].turn = 0), "state.open_credit[1].turn"), + (bad(&|s| s.open[1].turn = 3), "state.open_credit[1].turn"), (bad(&|s| s.open[0].stance = "sha256:1".into()), "state.open_credit[0].stance"), + (bad(&|s| { let o = s.open[1].clone(); for k in 0..2 { s.open.push(Open { turn: o.turn + 1 + k, ..o.clone() }); } s.turn += 2; }), "state.open_credit"), + (bad(&|s| s.prev_stance = None), "state.prev_stance"), (bad(&|s| s.control_closed = vec![2, 1]), "state.control_closed[1]")]; + for (e, want) in &cases { assert!(e.starts_with(want), "{want}: {e}"); } + // the same fields for a persona without the block are refused by name + let o = persona(LEARN).unwrap(); let Json::Obj(v) = st.to_json(&p) else { unreachable!() }; + let mut v: Vec<(String, Json)> = v.into_iter().filter(|(k, _)| k != "digest").map(|(k, x)| if k == "persona" { (k, json::parse(&canon(&x).replace(&p.digest, &o.digest)).unwrap()) } else { (k, x) }).collect(); + let d = sha(&Json::Obj(v.clone())); v.push(("digest".into(), Json::Str(d))); + let e = err(State::read(&o, &Json::Obj(v))); assert!(e.contains("this persona has no credit block (learning.credit)"), "{e}"); + } + + /// e = 1 is 0.8 (RFC 0001 B.2, B.4): on every shipped learning persona, a copy with a credit block whose feedback names the + /// previous stance (`for: t − 1`), and the same copy unaddressed, learn exactly what the persona without the block learns: the + /// same Δ and learned_from after every turn + #[test] + fn paying_the_previous_stance_by_name_learns_as_0_8() { + let ex = |f: &str| format!("{}/../examples/{f}", env!("CARGO_MANIFEST_DIR")); + let with = |doc: &Json, c: Option| { let Json::Obj(v) = doc else { unreachable!() }; + build(&Json::Obj(v.iter().map(|(k, x)| (k.clone(), if k != "learning" { x.clone() } else { + let mut l: Vec<(String, Json)> = x.as_obj().unwrap().iter().filter(|(k, _)| k != "credit").cloned().collect(); + if let Some(c) = &c { l.push(("credit".into(), c.clone())); } Json::Obj(l) })).collect())).unwrap() }; + let go = |p: &Persona, st: &State, e: &[(String, Json)]| turn_any_source(p, st, &event_json(e), false, &run, false).unwrap().1; + for (i, f) in ["agent-harness/adaptive.json", "agent-harness/guarded.json", "agent-harness/addressed.json", "persona/sensed.yaml", "persona/dispatch-policy.yaml"].iter().enumerate() { + let doc = load(&ex(f)).unwrap().1; let (old, new) = (with(&doc, None), with(&doc, Some(json::parse(r#"{"max_open":8,"half_life_events":32}"#).unwrap()))); + assert!(old.credit().is_none() && new.credit().is_some(), "{f}"); + let alpha = alphabet(&old, &[0.5, 1.0], &[0.5, 6.0]); let mut r = Philox4x32::new(77, i as u64); let seed = Some(i as u64); + let (mut so, mut sa, mut sb) = (init(&old, seed, true, &run), init(&new, seed, true, &run), init(&new, seed, true, &run)); let mut moved = 0; + for t in 0..160u64 { + let mut e: Vec<(String, Json)> = vec![]; + for (id, kind, vals) in &alpha { if r.f64() < if learning_flag(&old, id) { 0.5 } else if *kind == "flag" { 0.3 } else { 0.2 } { e.push((id.clone(), vals[r.below(vals.len())].clone())); } } + let mut named = e.clone(); + if t > 0 && e.iter().any(|(k, x)| learning_flag(&old, k) && *x == Json::Bool(true)) { named.push(("for".into(), Json::Num((t - 1) as f64))); } + let (no, na, nb) = (go(&old, &so, &e), go(&new, &sa, &named), go(&new, &sb, &e)); + for s in [&na, &nb] { assert_eq!((canon(&table(&s.learned)), &s.learned_from), (canon(&table(&no.learned)), &no.learned_from), "{f} turn {t}"); } + if no.learned != so.learned { moved += 1; } + (so, sa, sb) = (no, na, nb); } + assert!(moved >= 5, "{f}: feedback moved the deltas on {moved} turns"); // a one-sided learner reaches total_cap in 8 steps + } + } } diff --git a/probbit-cli/tests/live.rs b/probbit-cli/tests/live.rs index ff3be99..ac5ea6f 100644 --- a/probbit-cli/tests/live.rs +++ b/probbit-cli/tests/live.rs @@ -1,6 +1,8 @@ //! `probbit live` with senses (docs/persona.md §2.11, §5.7): readings logged in the strand as used, `live verify` recomputing the //! normals (summary `normals` with `max_move_50`), a life split across runs equal to one run, the one stderr line for readings -//! sent to a persona without the block, the refusal property P3s, and `probbit check` on a sensed persona. +//! sent to a persona without the block, the refusal property P3s, and `probbit check` on a sensed persona. With action-addressed +//! feedback (§2.8): the refusal property P3c with random payments, every refusal row byte for byte, control lines closing open +//! decisions, and `probbit check` on a credit persona. use std::io::Write; use std::process::{Command, Stdio}; #[allow(dead_code)] @@ -154,6 +156,149 @@ fn p3s_a_refused_event_changes_nothing() { eprintln!("p3s: {refused} refused, {accepted} accepted"); assert!(refused >= 1000 && accepted >= 4000, "a mix of both: {refused} refused, {accepted} accepted"); } +const ADDRESSED: &str = "examples/agent-harness/addressed.json"; +fn lines_of(v: &[&str]) -> Vec { v.iter().map(|x| x.to_string()).collect() } + +/// P3c's generator for the addressed policy (a credit block, max_open 8, half_life_events 32, `reward_from: [env]`): a model of +/// the bookkeeping (RFC 0001 B.2: the next turn, the open decisions after expiry, eviction beyond max_open, which turns were +/// awaited) picks mostly valid payments (late, reordered, the previous stance by name, unaddressed when unambiguous, cancels) +/// and some that a row refuses (B-R1 ambiguous, B-R2 paid/cancelled/evicted/never opened/to come, B-R3, B-R4, B-R5, B-R6), +/// and predicts whether the engine accepts each event +struct Book { t: u64, open: Vec, awaited: Vec } +impl Book { + fn event(&mut self, r: &mut Mix) -> (String, bool) { + let t = self.t; let prev = t.checked_sub(1); let live: Vec = self.open.iter().copied().filter(|n| t - n - 1 < 128).collect(); + let gone: Vec = self.awaited.iter().copied().filter(|n| !live.contains(n) && Some(*n) != prev).collect(); + let never: Vec = (0..t).filter(|n| !self.awaited.contains(n) && Some(*n) != prev).collect(); + let pick = |r: &mut Mix, v: &[u64]| v[r.below(v.len())]; + let ambiguous = live.iter().any(|n| Some(*n) != prev); + let (mut kv, mut ok, mut pays, mut cancels): (Vec, bool, Option, Option) = (vec![], true, None, None); + match r.below(100) { + 0..=39 => {} // a decision (when awaited) or an idle event + 40..=74 => { kv.push(r#""praise":true,"src":"env:probe""#.into()); + match r.below(20) { + 0..=8 if !live.is_empty() => { let n = pick(r, &live); kv.push(format!(r#""for":{n}"#)); pays = Some(n); } // late or reordered + 9 | 10 if prev.is_some() => { kv.push(format!(r#""for":{}"#, t - 1)); pays = prev; } // the previous stance by name + 13 | 14 if !gone.is_empty() => { kv.push(format!(r#""for":{}"#, pick(r, &gone))); ok = false; } // paid, cancelled, evicted, expired + 15 if !never.is_empty() => { kv.push(format!(r#""for":{}"#, pick(r, &never))); ok = false; } // never opened + 16 => { kv.push(format!(r#""for":{}"#, t + 2)); ok = false; } // still to come + 17 if !live.is_empty() => { kv.push(format!(r#""for":{{"turn":{},"stance":"sha256:{}"}}"#, pick(r, &live), "0".repeat(64))); ok = false; } // B-R6 + 18 => { kv.push(r#""for":1.5"#.into()); ok = false; } // B-R5 + _ => { if ambiguous { ok = false; } else { pays = prev; } } } } // unaddressed: B-R1 when ambiguous + 75..=86 => { kv.push(r#""src":"env:executor""#.into()); + match r.below(10) { 0..=6 if !live.is_empty() => { let n = pick(r, &live); kv.push(format!(r#""cancel":[{n}]"#)); cancels = Some(n); } + 7 if !live.is_empty() => { let n = pick(r, &live); kv.push(format!(r#""cancel":[{n},{n}]"#)); ok = false; } // B-R4 twice + _ => { kv.push(format!(r#""cancel":[{}]"#, if gone.is_empty() { t + 5 } else { pick(r, &gone) })); ok = false; } } } // B-R4 not open + _ => { ok = false; kv.push(match r.below(5) { 0 => r#""await":"yes""#.to_string(), 1 => r#""praise":true,"src":"self""#.into(), 2 => r#""praise":true"#.into(), + 3 => format!(r#""cancel":[{}],"src":"self""#, t.saturating_sub(1)), _ => format!(r#""for":{}"#, t.saturating_sub(1)) }); } } // B-R5, provenance, B-R3 + let wait = r.below(10) < 4 && !kv.iter().any(|k| k.contains("await")); if wait { kv.push(r#""await":true"#.into()); } + if r.below(5) == 0 { kv.push(r#""error":true"#.into()); } + if r.below(4) == 0 { kv.push(format!(r#""elapsed_hours":{}"#, r.below(4) as f64 * 0.5)); } + if ok { self.open = live.into_iter().filter(|n| Some(*n) != pays && Some(*n) != cancels).collect(); + if wait { self.open.push(t); self.awaited.push(t); while self.open.len() > 8 { self.open.remove(0); } } self.t += 1; } + (format!("{{{}}}", kv.join(",")), ok) + } +} + +/// P3c: a refused event changes nothing, with payments. 40 individuals x 300 random events with random `await`, `for` and +/// `cancel` (late, reordered, duplicated, cancelled, unknown, mismatched, malformed): the run with the refused events equals the +/// run without them, byte for byte (every stance, the strand with a checkpoint after each event, the final state) +#[test] +fn p3c_a_refused_payment_changes_nothing() { + let (mut refused, mut accepted, mut paid, mut late) = (0usize, 0usize, 0usize, 0usize); + for seed in 0..40u64 { + let (mut r, mut book) = (Mix(0xC4ED_17C0 + seed), Book { t: 0, open: vec![], awaited: vec![] }); + let (evs, model): (Vec, Vec) = (0..300).map(|_| book.event(&mut r)).unzip(); + let all = events_file("p3c-all.jsonl", &evs); + let st = init(ADDRESSED, seed, "p3c-state.json"); let strand = tmp("p3c.strand"); clean(&[&strand]); + let (c, out, _) = live(ADDRESSED, &st, &all, &strand, "1"); + let docs: Vec<&str> = out.lines().collect(); assert_eq!(docs.len(), 300, "seed {seed}: one line per event"); + let ok: Vec = (0..300).filter(|&i| !docs[i].starts_with(r#"{"error""#)).collect(); + for i in 0..300 { assert_eq!(ok.contains(&i), model[i], "seed {seed} event {i}: the model of B.2-B.3 and the engine disagree on {}: {}", evs[i], docs[i]); } + assert_eq!(c, if ok.len() < 300 { 2 } else { 0 }, "seed {seed}"); + refused += 300 - ok.len(); accepted += ok.len(); + for &i in &ok { let p = s(&parse(docs[i]), &["credit", "paid"]).clone(); if p != Json::Null { paid += 1; if s(&p, &["e"]).as_f64() != Some(1.0) { late += 1; } } } + let kept = events_file("p3c-kept.jsonl", &ok.iter().map(|&i| evs[i].clone()).collect::>()); + let st2 = init(ADDRESSED, seed, "p3c-state2.json"); let strand2 = tmp("p3c2.strand"); clean(&[&strand2]); + let (c, out2, e) = live(ADDRESSED, &st2, &kept, &strand2, "1"); assert_eq!(c, 0, "seed {seed}: {e}"); + assert_eq!(out2, ok.iter().map(|&i| format!("{}\n", docs[i])).collect::(), "seed {seed}: the stances"); + assert_eq!(read(&strand2), read(&strand), "seed {seed}: the strand"); assert_eq!(read(&st2), read(&st), "seed {seed}: the state"); + let (c, v, e) = probbit(&["live", "verify", &strand]); assert_eq!((c, s(&parse(&v), &["ok"])), (0, &Json::Bool(true)), "seed {seed}: {e}"); + clean(&[&st, &strand, &st2, &strand2, &all, &kept]); + } + eprintln!("p3c: {refused} refused, {accepted} accepted, {paid} paid ({late} late)"); + assert!(refused >= 1000 && accepted >= 4000 && late >= 200, "a mix: {refused} refused, {accepted} accepted, {paid} paid, {late} late"); +} + +/// Each refusal row (B-R1 to B-R6) refuses its event whole: one {"error"} at its path, exit 2, and the run equals the run without +/// the event, byte for byte (stances, strand, state) +#[test] +fn every_refusal_row_changes_nothing() { + // turn 0 and 1 await, 2 pays 0, 3 awaits and 4 cancels it, 5 awaits: then turn 6 has 1 and 5 open, 5 the previous stance + let base = lines_of(&[r#"{"await":true}"#, r#"{"await":true,"error":true,"src":"env:probe"}"#, r#"{"praise":true,"for":0,"src":"env:probe"}"#, r#"{"await":true}"#, + r#"{"cancel":[3],"src":"env:executor"}"#, r#"{"await":true}"#]); + let tail = lines_of(&[r#"{"praise":true,"for":5,"src":"env:probe"}"#, r#"{"cancel":[1],"src":"env:executor"}"#, r#"{"praise":true,"src":"env:probe"}"#]); + let z = "0".repeat(64); + let rows: Vec<(&str, String, &str)> = vec![("B-R1", r#"{"praise":true,"src":"env:probe"}"#.into(), "inputs.for"), ("B-R2 paid", r#"{"praise":true,"for":0,"src":"env:probe"}"#.into(), "inputs.for"), + ("B-R2 cancelled", r#"{"praise":true,"for":3,"src":"env:probe"}"#.into(), "inputs.for"), ("B-R2 never opened", r#"{"praise":true,"for":2,"src":"env:probe"}"#.into(), "inputs.for"), + ("B-R2 to come", r#"{"praise":true,"for":9,"src":"env:probe"}"#.into(), "inputs.for"), ("B-R3", r#"{"for":1}"#.into(), "inputs.for"), + ("B-R4 not open", r#"{"cancel":[3],"src":"env:executor"}"#.into(), "inputs.cancel[0]"), ("B-R4 twice", r#"{"cancel":[1,1],"src":"env:executor"}"#.into(), "inputs.cancel[1]"), + ("B-R4 paid now", r#"{"praise":true,"for":1,"cancel":[1],"src":"env:probe"}"#.into(), "inputs.cancel[0]"), ("B-R5 await", r#"{"await":1}"#.into(), "inputs.await"), + ("B-R5 for", r#"{"praise":true,"for":-1,"src":"env:probe"}"#.into(), "inputs.for"), ("B-R5 cancel", r#"{"cancel":3,"src":"env:executor"}"#.into(), "inputs.cancel"), + ("B-R5 cancel src", r#"{"cancel":[1],"src":"self"}"#.into(), "inputs.src"), + ("B-R6", format!(r#"{{"praise":true,"for":{{"turn":1,"stance":"sha256:{z}"}},"src":"env:probe"}}"#), "inputs.for.stance")]; + let without: Vec = base.iter().chain(&tail).cloned().collect(); let ev0 = events_file("rows-without.jsonl", &without); + let st0 = init(ADDRESSED, 3, "rows-state0.json"); let strand0 = tmp("rows0.strand"); clean(&[&strand0]); + let (c, out0, e) = live(ADDRESSED, &st0, &ev0, &strand0, "1"); assert_eq!(c, 0, "{e}"); + for (row, ev, path) in &rows { + let with: Vec = base.iter().cloned().chain([ev.clone()]).chain(tail.iter().cloned()).collect(); let ev1 = events_file("rows-with.jsonl", &with); + let st = init(ADDRESSED, 3, "rows-state.json"); let strand = tmp("rows.strand"); clean(&[&strand]); + let (c, out, e) = live(ADDRESSED, &st, &ev1, &strand, "1"); assert_eq!(c, 2, "{row}: {e}"); + let lines: Vec<&str> = out.lines().collect(); let err = parse(lines[6]); + assert!(err.get("error").is_some() && jw(&err).contains(&format!("\"events[6].{path}\"")), "{row}: {}", lines[6]); + assert_eq!(lines.iter().enumerate().filter(|(i, _)| *i != 6).map(|(_, l)| format!("{l}\n")).collect::(), out0, "{row}: the stances"); + assert_eq!((read(&strand), read(&st)), (read(&strand0), read(&st0)), "{row}: the strand and the state"); + clean(&[&st, &strand, &ev1]); + } + clean(&[&st0, &strand0, &ev0]); +} + +/// A control line closes every open decision (closed as control): `live verify` lists them in `open` before it and none after, +/// the next stance lists them as closed, a payment naming one is refused (B-R2), and the strand replays +#[test] +fn control_lines_close_open_decisions() { + let st = init(ADDRESSED, 0, "ctl-state.json"); let strand = tmp("ctl.strand"); clean(&[&strand]); + let ev = events_file("ctl1.jsonl", &lines_of(&[r#"{"await":true}"#, r#"{"await":true}"#, "{}"])); + let (c, _, e) = live(ADDRESSED, &st, &ev, &strand, "1"); assert_eq!(c, 0, "{e}"); + let open = |f: &str| { let (c, v, e) = probbit(&["live", "verify", f]); assert_eq!(c, 0, "{e}"); let v = parse(&v); assert_eq!(s(&v, &["ok"]), &Json::Bool(true)); jw(s(&v, &["open"])) }; + assert_eq!(open(&strand), "[0,1]"); + for what in ["pause", "resume"] { let (c, _, e) = probbit(&["live", "control", &strand, what, "--by", "human:ops", "--reason", "maintenance", "--at", "2026-10-14T09:00:00Z"]); assert_eq!(c, 0, "{e}"); } + assert_eq!(open(&strand), "[]"); + let ev2 = events_file("ctl2.jsonl", &lines_of(&[r#"{"praise":true,"for":1,"src":"env:probe"}"#, r#"{"await":true}"#, r#"{"praise":true,"src":"env:probe"}"#])); + let (c, out, e) = live(ADDRESSED, &st, &ev2, &strand, "1"); assert_eq!(c, 2, "{e}"); + let docs: Vec = out.lines().map(parse).collect(); assert_eq!(docs.len(), 3); + assert!(docs[0].get("error").is_some() && jw(&docs[0]).contains("inputs.for"), "{}", jw(&docs[0])); + assert_eq!((jw(s(&docs[1], &["credit", "closed"])), jw(s(&docs[1], &["credit", "open"]))), (r#"[{"as":"control","turn":0},{"as":"control","turn":1}]"#.into(), "[3]".into())); + assert_eq!((s(&docs[2], &["credit", "paid", "turn"]).as_f64(), s(&docs[2], &["credit", "paid", "e"]).as_f64()), (Some(3.0), Some(1.0)), "the previous stance, paid unaddressed"); + assert_eq!(open(&strand), "[]"); + clean(&[&st, &strand, &ev, &ev2]); +} + +/// `probbit check` on a persona with a credit block: the retry rule held by its habit, and a strand with late, cancelled and +/// digest-bound payments replays +#[test] +fn probbit_check_holds_a_credit_persona() { + let props = tmp("retry-props.json"); std::fs::write(&props, r#"{"props":[{"id":"ask_after_two_errors","when":{"error_streak":2},"then":{"action":["ask"]}}]}"#).unwrap(); + let golden = parse(&read(concat!(env!("CARGO_MANIFEST_DIR"), "/../examples/agent-harness/golden/events.json"))); + let ev = events_file("check-credit.jsonl", &golden.as_arr().unwrap().iter().map(jw).collect::>()); + let st = init(ADDRESSED, 0, "check-credit-state.json"); let strand = tmp("check-credit.strand"); clean(&[&strand]); + let (c, _, e) = live(ADDRESSED, &st, &ev, &strand, "4"); assert_eq!(c, 0, "{e}"); + let (c, out, e) = probbit(&["check", ADDRESSED, "--props", &props, "--seeds", "0-9", "--strand", &strand]); assert_eq!(c, 0, "{out}\n{e}"); + assert!(out.lines().any(|l| l.starts_with("rule ") && l.contains("ask_after_two_errors") && l.contains("held")), "{out}"); + assert!(out.ends_with("check: held 1 · broken 0 · unproven 0 · strands 1/1\n"), "{out}"); + clean(&[&st, &strand, &ev, &props]); +} + /// `probbit check` reuses the lint pipeline: on the sensed persona both habit rules are held by construction, and a sensed /// strand replays #[test] From cbe7cb2699198df0d35067763b185c532a9097a3 Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 09:31:37 -0700 Subject: [PATCH 09/15] =?UTF-8?q?docs:=20action-addressed=20feedback=20(pe?= =?UTF-8?q?rsona.md=20=C2=A72.8=20credit,=20=C2=A74=20stance=20credit,=20?= =?UTF-8?q?=C2=A75.1=20state,=20=C2=A75.6=20payments=20in=20fuzz,=20=C2=A7?= =?UTF-8?q?5.7=20control=20lines=20and=20credit=20in=20live,=20=C2=A75.8?= =?UTF-8?q?=20monitor,=20=C2=A77),=20CHEATSHEET,=20CHANGELOG,=20the=20RFC?= =?UTF-8?q?=20copy=20(question=202=20decided,=20B-R6),=20man=20page=20for?= =?UTF-8?q?=20live=20verify=20--actions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 13 ++++ docs/CHEATSHEET.md | 17 ++++- docs/persona.md | 99 +++++++++++++++++++++++++++-- docs/probbit.1 | 13 ++-- docs/rfcs/0001-senses-and-reward.md | 25 +++++--- 5 files changed, 147 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7aecd35..175e847 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,10 +15,23 @@ All notable changes to this project are documented here. The format follows per sense and an alert when a normal moved over `drift_cap / 2` within 50 events. `examples/persona/sensed.yaml` (with its golden and rules) and `bench/individuality/` (benchmark metrics a, b, d and e; the P0 corpus) are new. Design notes: `docs/rfcs/0001-senses-and-reward.md`. +- **Action-addressed feedback** (docs/persona.md §2.8): an optional `learning.credit` block. An event can mark its decision + as awaiting an outcome (`await`), a reward can name the decision it pays for (`for: `), and decisions can be + cancelled (`cancel`). Credit goes to the paid decision's own odds, scaled by an eligibility that halves per + `half_life_events` of delay; at most `max_open` decisions wait; ambiguous, duplicate, cancelled and unknown payments are + refused whole. Without `for`, feedback pays the previous stance as before. +- `for: {turn, stance}` binds the paid stance's digest (a mismatch is refused); every stance with a credit block carries + `credit` (the payment, the decisions closed, the ones still open, its own digest). A control line closes the open + decisions. `live verify` adds `open` to its summary, and `live verify --actions FILE` compares a host's action log with + the released levels; `monitor` draws the open decisions with their eligibility; `fuzz` adds late, reordered, duplicated, + cancelled and unknown payments; the MCP turn tools refuse `cancel`. `examples/agent-harness/addressed.json` (with + `late.py` and its golden) and benchmark metric c are new. ### Changed - `live` says once on stderr when a persona without a senses block receives a `senses` key (still an undeclared input, listed in `ignored`). The monitor's panel of the event's inputs is labelled INPUTS (it was SENSES). +- `live` says once on stderr when a persona without a credit block receives `await`, `for` or `cancel` (still undeclared + inputs, listed in `ignored`; feedback pays the previous stance). ## 0.8.3 - unreleased diff --git a/docs/CHEATSHEET.md b/docs/CHEATSHEET.md index d45a681..ea8f79a 100644 --- a/docs/CHEATSHEET.md +++ b/docs/CHEATSHEET.md @@ -42,6 +42,9 @@ The exact tiers run before the sampler: `drives`: per goal the wanting, afterglow, expectation, last prediction error, deadline and turns since it was pursued. - `senses` (a persona with a `senses:` block, docs/persona.md §2.11): per sense read this turn its `raw` reading, `src`, `z` and `zd`, and the `mean` and `n` of the normal it was judged against; `noticed`: the sense `why` names. +- `credit` (a persona with a `learning.credit` block, docs/persona.md §2.8): `paid` (`turn`, `e`, `sign`, `absorbed`, + `stance`) or null, `closed` (`turn`, `as`: control, expired, cancelled, paid, evicted), `open` (turns), `stance` (this + stance's digest). ## Senses (0.9.0, docs/persona.md §2.11) - Event: `{"senses": {"tool_fail": true, "tool_latency": {"v": 2.4, "src": "env:runner"}}, "src": "env:host"}`: a bare @@ -54,6 +57,18 @@ The exact tiers run before the sampler: - `live verify` summary: `normals` per sense (`mean`, `n`, `max_move_50`); `monitor`: a row per sense and an alert when a normal moved over `drift_cap / 2` within 50 events. +## Action-addressed feedback (0.9.0, docs/persona.md §2.8) +- Block: `learning: {..., credit: {max_open: 8, half_life_events: 32}}`. +- Events: `{"await": true}` (the host will report this decision's outcome); `{"praise": true, "for": 3, "src": "env:ci"}` or + `"for": {"turn": 3, "stance": "sha256:..."}` (pays decision 3; the digest binds it); `{"cancel": [4], "src": "env:executor"}`. +- Eligibility e = 0.5^((t − n − 1) / half_life_events), 6 decimals: 1, 0.937084, 0.805245, 0.5 at 0, 3, 10, 32 events late; + a decision expires 128 events after it was made; beyond `max_open` the oldest is evicted. e scales the capped 0.8 step. +- Refused whole: ambiguous unaddressed feedback (B-R1), a decision not open (B-R2: paid, cancelled, expired, evicted, never + opened, to come), `for` without feedback (B-R3), a bad cancel (B-R4), malformed keys or a cancel from `self` (B-R5), a + digest that is not the turn's stance (B-R6). A control line closes every open decision; MCP refuses `cancel`. +- `live verify` summary: `open`; `live verify STRAND --actions FILE`: lines `{"turn": T, "action": {trait: level}}`, the + earliest one that differs from the released level (exit 1). + ## Exit codes - `decide`, `run`, `evaluate`: 0 answer (exact | diagnostics_passed | partial), 1 infeasible (a proof), 2 bad input (one `{"error"}` object on stdout, see Errors) or bad flag (stderr), 3 refused / declined / non-finite result. @@ -96,7 +111,7 @@ One channel, the same for every command (0.8.2): |---|---| | `live PERSONA [--seed N \| --state FILE] [--strand FILE] [--events FILE]` | JSONL events in, one stance per event out | | `live PERSONA --demo week [--seed N] [--plain]` | a scripted week: learning to a cap, a night, rules that hold | -| `live verify STRAND` | replay a strand; the earliest line that differs | +| `live verify STRAND [--actions FILE]` | replay a strand; the earliest line that differs (and host action, with `--actions`) | | `monitor STRAND [--follow] [--once] [--plain] [--serve] [--open] [--port N]` | the strand replayed as live bars in the terminal, or the Activity Monitor page on 127.0.0.1 (channel table, event-history traces, inspector) | | `monitor --demo [week\|drives] [--open]` | synthetic data: the tutor's week, paced, in under a minute; `drives`: a short goal-signal scenario | diff --git a/docs/persona.md b/docs/persona.md index 57e1bef..9fa7333 100644 --- a/docs/persona.md +++ b/docs/persona.md @@ -270,6 +270,60 @@ step 2), so the feedback turn's own stance already uses it. What learning can an - A persona without the block has no `learned` or `credit` field, and every document it produces is the same, byte for byte, as before the block existed. +**Action-addressed feedback (`learning.credit`, optional).** Without it, feedback pays the previous stance. With it, the host +can name the decision an outcome is about, so a late or out-of-order outcome credits the stance the host acted on: + +```yaml +learning: + # ... the fields above, unchanged + credit: + max_open: 8 # decisions awaiting an outcome at once (1-64; default 8) + half_life_events: 32 # eligibility halves per 32 events of delay (1-10000; default 32) +``` + +Three event keys are read (not compiled, so not in `ignored`) and come back in the stance's `inputs` as given: + +- `await: true`: the host will act on this turn's stance and report its outcome. The decision stays open with its credit and + its stance's digest (`credit.stance` in the stance document). +- `for: T` or `for: {turn: T, stance: "sha256:..."}`: this feedback pays the decision of turn T. The second form binds the paid + stance's digest, so a restored state can never pay another decision under the same turn number (B-R6); with `for: T` the + paid digest comes back in `credit.paid.stance` for the host to compare. +- `cancel: [T, ...]`: no outcome will come for these open decisions. A cancel needs `src` env or human (never the individual). + +The credit step runs after the drive step and before compile, at turn t. Feedback is a learning flag on (or, with drives, a +non-zero surprise term), with the sign above: + + expire each open n with t - n - 1 >= 4 x half_life_events (closed as expired) + close each n in cancel (closed as cancelled) + if feedback: + paid = for if given, else t - 1 + c = the open decision's credit, or the state's credit when paid = t - 1 is not open + e = 0.5^((t - paid - 1) / half_life_events), 6 decimals (1 for t - 1) + step(l) = e x clip(sign x rate x c(l), -step_cap, +step_cap), recentred and added as above + close paid (closed as paid) + -- compile and solve -- + if await: open[t] = {credit, stance digest}; beyond max_open the oldest is closed (closed as evicted) + +Eligibility scales the capped step, so a stale outcome always moves less than a fresh one: 3 events late it keeps 0.937084 of +the step, 10 late 0.805245, 32 late 0.5, 127 late 0.063869; 128 events after it was made a decision expires. At e = 1 the step +is the one above exactly: feedback that names the previous stance, or names nothing while no other decision is open, learns +what a persona without the block learns, Δ for Δ. Paying a stance a habit forced moves nothing and is marked `absorbed`. A +control line closes every open decision (section 5.7). An event is **refused whole** (one `{"error"}` at its path, no turn, no +state change; `persona turn` exits 2, `live` at the end of the run) when: + +| row | refused | path | +|---|---|---| +| B-R1 | feedback without `for` while a decision other than t − 1 is open (ambiguous) | `inputs.for` | +| B-R2 | `for` naming a decision neither open nor t − 1: paid, cancelled, expired, evicted, never opened or still to come | `inputs.for` | +| B-R3 | `for` on an event without feedback | `inputs.for` | +| B-R4 | `cancel` naming a decision not open, the same turn twice, or the decision this event's feedback pays | `inputs.cancel[i]` | +| B-R5 | `for` not a whole number or `{turn, stance}`; `cancel` not a list of at most `max_open` whole numbers; `await` not true or false; a cancel without an env or human `src` | `inputs.for`, `inputs.cancel`, `inputs.await`, `inputs.src` | +| B-R6 | `for: {turn, stance}` whose digest is not that turn's stance | `inputs.for.stance` | + +Reward provenance (section 2.10) is checked first. A stance's digest is the sha256 of its canonical JSON without `credit`, +`state_digest` and `timing`. Without the block, `await`, `for` and `cancel` are undeclared inputs (listed in `ignored`; `live` +says so once on stderr) and every document is as before. + ### 2.9 Drives (optional) ```yaml @@ -590,6 +644,10 @@ child process). `probbit persona compile` prints it; `probbit run` with those fl - With a senses block (section 2.11): `"senses": {"tool_fail": {"raw": true, "src": "env:runner", "z": 3.878359, "zd": 3.378359, "mean": 0.05, "n": 0}}` per sense read this turn (the `mean` and `n` it was judged against) and `"noticed": "tool_fail"` (the normal clause's sense, or null); `inputs` echoes `senses` as given. +- With a credit block (section 2.8): `"credit": {"paid": {"turn": 3, "e": 0.937084, "sign": 1, "absorbed": false, "stance": + "sha256:..."}, "closed": [{"turn": 3, "as": "paid"}], "open": [5, 6], "stance": "sha256:..."}`: the payment this turn made + (null when none), the decisions it closed (by a control line, expired, cancelled, paid, evicted, in that order), the turns + still open, and this stance's own digest (what `for: {turn, stance}` names); `inputs` echoes `await`, `for` and `cancel`. - `held`: the unsure traits held at their `hold` level; such a trait also carries `odds_unheld`, its odds before the hold. - With a drives block (section 2.9), `pursue` leaves `stance` for its own object and the turn's drive values follow it: `"pursue": {"goal": "fun", "p": 0.44, "odds": {"chores": 0.10, "craft": 0.26, "fun": 0.44, "safety": 0.20}, "released": true, @@ -619,6 +677,8 @@ child process). `probbit persona compile` prints it; `probbit run` with those fl "senses": {"genes": {"gain": {"tool_fail": 1.19}, "threshold": {"tool_fail": -0.17}, "habituation": {"tool_fail": 1.46}}, "norm": {"tool_fail": {"mean": 0.3, "var": 0.2, "n": 10}}}, # with a senses block (section 2.11): per sense "learned_from": {"caution": {"rewards": 3, "corrections": 2}}, # with learning and line.why_past: feedback turns by sign + "open_credit": [{"turn": 5, "credit": {"verbosity": [0.1, -0.4, 0.3]}, "stance": "sha256:..."}], # with a credit block + "prev_stance": "sha256:...", "control_closed": [], # (section 2.8): open decisions, digests, control closures "digest": "sha256:..."} ``` @@ -629,7 +689,11 @@ match the seed, a drive value outside its box (wanting, afterglow and expectatio deadlines 0 to 1e6 hours or null, `since` a whole number >= 0) or a goal set that differs from the persona's, and (with a senses block, rule S4) a mean outside prior ± drift_cap, a variance outside [0, var_cap], a count that is not a whole number up to 1e6, a sense set that differs from the persona's or sense genes that do not match the seed, even with a recomputed digest. -Each normal starts at its prior with n = 0; a persona without the block refuses a state with a `senses` field. +Each normal starts at its prior with n = 0; a persona without the block refuses a state with a `senses` field. With a credit +block (section 2.8) the state keeps `open_credit` (the decisions awaiting an outcome: at most `max_open`, turns increasing and +before the state's turn, credits within ±1, a stance digest each), `prev_stance` (the previous stance's digest, null before the +first turn) and `control_closed` (decisions a control line closed, listed by the next stance); a persona without the block +refuses a state with any of them. ### 5.2 Canonical JSON and the number rule @@ -779,6 +843,13 @@ With a senses block the labels cover readings too (a bare reading takes the even numbers on `--grid` × the range, one reading repeated 1, 5 and 20 times, and the range ends alternating. `prove` reads each `sense__up/down` input as a box [0, zcap] × gain and each sense condition both ways, so a habit on `sense..raw` holds by construction for a rule with the same condition. A rule reads the sense conditions the persona's habits use. + +**Payments in fuzz** (section 2.8, with a credit block). `fuzz` adds `await` to its events and payments resolved against the +state each event runs on: `for` the oldest open decision (late), the newest (reordered), the previous stance, a past turn no +longer open (a duplicate, or a payment after a cancel or an expiry), a turn still to come (unknown), or an open decision bound +to another stance's digest; `cancel` the oldest open decision or a turn still to come. A refused payment changes nothing, so +the search goes on from the same state, and a reported counterexample's script holds only the events that ran, with every +payment as a concrete turn, so it replays as printed. A persona without the block is searched exactly as before. The Python `persona_fuzz` and MCP fuzz tool accept `fixture_src` too. See the [host regression example](../examples/agent-harness/README.md). Synthetic observations are not production evidence. @@ -896,7 +967,9 @@ characters. Pause moves an active individual to paused, resume a paused one back retire. While paused or retired every event is refused: one `{"error"}` object with code `paused` or `retired` per event, nothing written, exit 4 at the end of the run. **No credit crosses a control line**: the credit of the stance before it is cleared (section 2.8), so feedback after a resume credits no stance from before the pause, and learning cannot tie a reward to -an interruption. Nothing else moves: moods, drives, learned weights, history and the turn count are the individual's as before, +an interruption. With a credit block (section 2.8) a control line also closes every open decision: the next stance lists them +as closed `control`, and a payment that names one is refused (B-R2), so no outcome is paid across an interruption either. +Nothing else moves: moods, drives, learned weights, history and the turn count are the individual's as before, and the clock goes on (with `--clock fixed` the host's hours of the next event include the pause). The individual has no input that names a control line or unsets one: an event's `control` key is an undeclared input like any other, and the stance never mentions the status. Control lines are not an MCP tool: keep `live control` out of the agent's own reach. @@ -922,6 +995,16 @@ its source, and `verify` recomputes the normals from the logged readings: its su "max_move_50"}}`, the normal now and the largest move of its mean within 50 events (the monitor alerts above drift_cap / 2). A persona without the block lists `senses` in `ignored`, as before, and `live` says so once on stderr, at the earliest event that carries it: `probbit: live: events[i]: this persona has no senses block: ...`. The documents and the strand are unchanged. + +**Credit in live** (section 2.8). Events carry `await`, `for` and `cancel` as `persona turn` does, and the strand logs them as +given; `verify` recomputes the open decisions with everything else and adds `"open": [turns]` (the decisions still awaiting +an outcome) to its summary. `live verify STRAND --actions FILE` also reads the host's action log, one `{"turn": T, "action": +{"": ""}}` per line, and compares each action with the level its turn's stance released: the summary adds +`"actions": {"checked": N, "differs": null}`, or the earliest turn (then line) where the host acted otherwise, as +`{"turn", "line", "trait", "action", "released", "why"}` (another level, a trait the stance did not release, or no such turn), +and exits 1. A trait the persona does not have is an input error (exit 2); `--actions` replays from the header, so it does not +combine with `--from-checkpoint`. A persona without a credit block lists `await`, `for` and `cancel` in `ignored`, as before, +and `live` says so once on stderr: `probbit: live: events[i]: this persona has no credit block: ...`. `monitor` starts at the last checkpoint and draws its event at once. A strand that ends in a checkpoint line is continued from the state it carries. Before continuation or a control append, the stored chain and lifecycle are checked from the header: a checkpoint cannot hide a retired status, an invalid transition or a broken preceding hash link. This structural scan @@ -961,7 +1044,9 @@ turn used them (flags lit, numbers as bars, levels by name, the clock) and the h with a senses block (section 2.11): one row per sense, its normal as a tick over the range, this event's reading, z and n (a sense not read keeps its normal), and an alert when a normal moved over drift_cap / 2 within 50 events. The habits in force, the ones that bound in colour, and the violations counter (0 by construction, section 2.5). The learned deltas per -level as centred bars within ±total_cap (with a learning block, section 2.8). The drives, when a document carries `pursue` or +level as centred bars within ±total_cap (with a learning block, section 2.8), and with a credit block a CREDIT row: the open +decisions with the eligibility a payment at the next event would get, this event's payment (turn, e, sign, absorbed) and the +decisions it closed. The drives, when a document carries `pursue` or `drives`: documents without them draw no row, so a strand of a later engine lights them up. The stance line, and why. **Checkpoints and control lines.** A strand with checkpoint lines (section 5.7) is replayed from its last checkpoint, not from @@ -1085,11 +1170,11 @@ store the new state. On `refused` or `fallback`, use the line as given (habits o | `probbit persona lint PERSONA [--props FILE \| --never RULE] [--seeds 0-99] [--threads N]` | contradicting habits and planned levels that are not their trait's most likely one (section 5.5); with rules, prove them and fuzz the unknown ones (section 5.6); with a drives block, `floors`: the habits that can exclude a floor goal and the floors whose lift can reach 50; exit 1 if a contradiction is unresolved or a rule breaks, 3 if a rule is unproven (unknown, no counterexample found) | | `probbit persona fuzz PERSONA (--never RULE \| --props FILE) [--seeds 0-99] [--fuzz-seed N] [--scripts N] [--depth N] [--beam N] [--grid LIST] [--hours LIST] [--threads N] [--json]` | search event scripts for each individual's shortest counterexample to a character property, shrunk and replayable (section 5.6); exit 1 if one is found | | `probbit persona prove PERSONA (--never RULE \| --props FILE) [--seeds 0-99] [--threads N] [--json]` | per rule: held by construction, proved for every event sequence, or unknown with the cell that failed (section 5.6); exit 1 if one is unknown | -| `probbit persona check PERSONA` / `describe PERSONA` | valid, its digest and sizes / its traits, moods, inputs, habits and agenda (and senses: unit, range, scale, sources, prior, caps, spreads, reserved ids) | +| `probbit persona check PERSONA` / `describe PERSONA` | valid, its digest and sizes / its traits, moods, inputs, habits and agenda (and senses: unit, range, scale, sources, prior, caps, spreads, reserved ids; the learning block with its credit block) | | `probbit persona compile PERSONA --state STATE [--inputs ...]` | the turn's probbit-ir program; its sha256 is the stance's `engine.program` | | `probbit live PERSONA [--seed N \| --state FILE] [--strand FILE] [--events FILE [--watch]] [--clock real\|fixed]` | a resident individual: JSONL events in, one stance per event out, `elapsed_hours` stamped by the clock, the life logged to a strand (section 5.7); `--state` is rewritten after every event | | `probbit live PERSONA --demo week [--seed N] [--strand FILE] [--plain]` | one individual's scripted week on the fixed clock: learning to its cap, a quiet night, habits that hold (section 5.7) | -| `probbit live verify STRAND` | replay a strand from its header alone: ok, or the earliest line that differs (exit 1) | +| `probbit live verify STRAND [--from-checkpoint] [--actions FILE]` | replay a strand from its header alone: ok, or the earliest line that differs (exit 1); with `--actions`, also the earliest turn whose host action differs from the level its stance released (section 5.7) | | `probbit monitor STRAND [--follow] [--once] [--plain] [--fps N] [--serve] [--open] [--port N]`, `probbit monitor --demo [...]` | watch an individual's inner state: the strand replayed as live bars in the terminal, or as a page on 127.0.0.1 (section 5.8) | A script is a JSON list of per-turn input objects (or `{"turns": [...]}`; a turn may be `{"inputs": {...}, ...}`). Exit codes @@ -1109,7 +1194,9 @@ never change a document. The persona's own `engine.chains` is used whatever `PRO `probbit_live_verify {strand | strand_path}` -> `live verify`'s document (section 5.7; a divergence is an answer). For a persona with a senses block, `probbit_persona_turn` and `probbit_live_event` refuse an event that carries readings (rule S7, section 2.11: readings come from the host's instruments, never through the agent's channel); a persona without - the block lists `senses` in `ignored`, as before. + the block lists `senses` in `ignored`, as before. For a persona with a credit block they refuse an event that carries + `cancel` (section 2.8: a cancel comes from the executor or a person, never through the agent's channel, so the agent cannot + cancel a decision to dodge its correction); `await` and `for` pass. A persona with a drives block takes `goals` in `inputs` / `event` (section 2.9); the schemas declare it. Stateless; the documents are the CLI's. A refusal, a fallback, a counterexample or a divergent strand is an answer; a bad persona, state, input, event or rule is a tool error carrying the error object. diff --git a/docs/probbit.1 b/docs/probbit.1 index 27a72b2..504e99a 100644 --- a/docs/probbit.1 +++ b/docs/probbit.1 @@ -9,7 +9,7 @@ probbit \- a virtual probabilistic (p\-bit) processor: joint decisions under har [\-\-events FILE [\-\-watch]] [\-\-clock real|fixed] [\-\-checkpoint\-every K] \fBprobbit\fR live PERSONA \-\-demo week [\-\-seed N] [\-\-strand FILE] [\-\-plain] -\fBprobbit\fR live verify STRAND [\-\-from\-checkpoint] +\fBprobbit\fR live verify STRAND [\-\-from\-checkpoint] [\-\-actions FILE] \fBprobbit\fR live control STRAND pause|resume|retire \-\-by WHO \-\-reason TEXT [\-\-at TIME] \fBprobbit\fR check PERSONA [\-\-props FILE] [\-\-strand FILE]... [\-\-seeds LIST] @@ -257,7 +257,7 @@ a resident individual: JSONL events in, one stance per event out [\-\-events FILE [\-\-watch]] [\-\-clock real|fixed] [\-\-checkpoint\-every K] \fBprobbit\fR live PERSONA \-\-demo week [\-\-seed N] [\-\-strand FILE] [\-\-plain] -\fBprobbit\fR live verify STRAND [\-\-from\-checkpoint] +\fBprobbit\fR live verify STRAND [\-\-from\-checkpoint] [\-\-actions FILE] \fBprobbit\fR live control STRAND pause|resume|retire \-\-by WHO \-\-reason TEXT [\-\-at TIME] .fi @@ -300,12 +300,15 @@ with \-\-strand: a checkpoint line (the whole state) after every K\-th event (de Subcommands: .RS 4 .TP -\fBverify\fR STRAND [\-\-from\-checkpoint] -replay a strand: the earliest line that differs; from the header (every checkpoint checked), or from the last checkpoint +\fBverify\fR STRAND [\-\-from\-checkpoint] [\-\-actions FILE] +replay a strand: the earliest line that differs; from the header (every checkpoint checked), or from the last checkpoint; with \-\-actions, also the earliest turn whose host action differs from the level its stance released .RS 4 .TP \fB\-\-from\-checkpoint\fR start at the last checkpoint instead of the header +.TP +\fB\-\-actions\fR \fIFILE\fR +the host's action log, one {"turn": T, "action": {trait: level}} per line: compared with each turn's released levels (summary `actions`: checked, differs); exit 1 when one differs .RE .TP \fBcontrol\fR STRAND pause|resume|retire \-\-by WHO \-\-reason TEXT [\-\-at TIME] @@ -325,7 +328,7 @@ when (default: now, UTC) .PP \fIthe safety kit\fR: (docs/persona.md \[u00A7]5.7) one writer per strand: `\-\-strand` takes STRAND.lock (a second writer exits 4 and changes nothing; a lock whose process is gone is taken over). With `reward_from` in the persona (\[u00A7]2.10), a reward from `src: self`, without a src or from an undeclared one is refused like a bad event. .PP -\fIexit\fR: 0 done (live: every event answered; verify: every line replays; control: the line appended), 1 verify: a line differs (its number and what), 2 a bad persona, state, event (one {"error"} object on stdout per bad event when stdout is not a terminal or with \-\-json; the run goes on), control line or flag, 4 refused: the strand's writer lock is held by another writer, or the individual is paused or retired (one {"error"} object per refused event, as for 2; nothing is written). +\fIexit\fR: 0 done (live: every event answered; verify: every line replays; control: the line appended), 1 verify: a line differs (its number and what) or, with \-\-actions, a host action differs from its turn's released level, 2 a bad persona, state, event (one {"error"} object on stdout per bad event when stdout is not a terminal or with \-\-json; the run goes on), control line or flag, 4 refused: the strand's writer lock is held by another writer, or the individual is paused or retired (one {"error"} object per refused event, as for 2; nothing is written). .PP Examples: .RS 4 diff --git a/docs/rfcs/0001-senses-and-reward.md b/docs/rfcs/0001-senses-and-reward.md index 64ec68e..483361e 100644 --- a/docs/rfcs/0001-senses-and-reward.md +++ b/docs/rfcs/0001-senses-and-reward.md @@ -164,8 +164,10 @@ keeps 0.94 of its step, 10 events late 0.81. A decision expires after 4 half-liv most 1/16 of `step_cap`. Event keys: `await: true` (the host will act on this turn's stance and report its outcome); `for: n` (this feedback pays the -decision whose stance has `turn` n); `cancel: [n, …]` (no outcome will come; needs an env or human `src`). They are read, not -compiled, and echoed in `inputs`. +decision whose stance has `turn` n) or `for: {turn: n, stance: "sha256:…"}` (the same, bound to that stance's digest, see +question 2); `cancel: [n, …]` (no outcome will come; needs an env or human `src`). They are read, not compiled, and echoed in +`inputs`. A stance's digest is the sha256 of its canonical JSON without `credit`, `state_digest` and `timing` (so the state +can remember it without hashing itself); each stance carries its own as `credit.stance`. ### B.2 The credit step @@ -192,8 +194,9 @@ if await: open[t] = {credit, stance digest}; beyond max_open close the oldest ( Eligibility scales the capped step, so a stale reward always moves less than a fresh one, and at e = 1 the step is 0.8's exactly. Paying a stance a habit forced moves nothing and is marked `absorbed`. A control line closes every open decision (closed: control): in 0.8 no credit crosses one. State: `open_credit: [{turn, credit, stance}]` (turns increasing, at most -`max_open`, credits within ±1). Stance: `credit: {paid: {turn, e, sign, absorbed, stance} | null, closed: [{turn, as}], -open: [turns]}`. +`max_open`, credits within ±1), `prev_stance` (the previous stance's digest) and `control_closed` (the decisions a control line +closed, listed by the next stance). Stance: `credit: {paid: {turn, e, sign, absorbed, stance} | null, closed: [{turn, as}], +open: [turns], stance}`. ### B.3 Refusals @@ -202,9 +205,12 @@ Refused whole (one `{"error"}` at its path, no turn, no state change; exit 2 for - **B-R1** feedback without `for` while a decision other than t − 1 is open; - **B-R2** `for` naming a decision neither open nor t − 1 (paid, cancelled, expired, evicted, never opened, future); - **B-R3** `for` on an event without feedback; -- **B-R4** `cancel` naming a decision not open, twice, or the one `for` pays; -- **B-R5** malformed: `for` not a whole number, `cancel` not a list of at most `max_open` whole numbers, `await` not - true/false, a `cancel` without an env or human `src`. +- **B-R4** `cancel` naming a decision not open, twice, or the one this event's feedback pays (named by `for`, or t − 1 + when unaddressed); +- **B-R5** malformed: `for` not a whole number or `{turn, stance}` (a whole number and a sha256 digest), `cancel` not a list + of at most `max_open` whole numbers, `await` not true/false, a `cancel` without an env or human `src`; +- **B-R6** `for: {turn: n, stance: d}` where d is not the digest of decision n's stance (the open decision's, or the previous + stance's for t − 1): a restored or forked state cannot pay another decision under the same turn number. `reward_from` checks run before these, unchanged. @@ -280,7 +286,7 @@ with `live control retire`). A 0.8 binary refuses the new blocks as unknown fiel | Outcomes never settled | `max_open`, expiry, `open` in every stance | | A duplicated or replayed payment | the decision is closed: B-R2 | | The agent cancels to dodge a correction | `cancel` needs env or human; MCP refuses it | -| A restored state repeats turn numbers | `paid.stance` names the paid stance's digest for the host to compare | +| A restored state repeats turn numbers | `for: {turn, stance}` binds the paid stance's digest (B-R6); with a bare `for` the paid digest comes back in `paid.stance` for the host to compare | ## Alternatives considered @@ -296,6 +302,9 @@ with `live control retire`). A 0.8 binary refuses the new blocks as unknown fiel 1. Should open decisions survive pause and resume? Closing them matches 0.8, but outcomes landing during a pause are lost. 2. Should `for` carry the stance digest (`for: {turn, stance}`) so a restored state cannot pay a different decision? + **Decided for 0.9.0: yes.** `for: {turn, stance}` binds the digest from the start, and a digest that is not the named + turn's stance is refused (B-R6). A bare `for: n` stays accepted (the turn is unambiguous within the open set), and the + paid stance's digest is echoed in the stance's `credit.paid.stance`. 3. Should eligibility decay by events, by clock hours, or not at all until expiry? 4. Should `human` readings teach a normal, or only move the stance? 5. Should 0.9.0 ship `persona migrate OLD NEW --state S` to carry moods, history and learned weights into a persona that only From 694a8367d129e1835e1532fb6fcf5d6153022e17 Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 09:39:22 -0700 Subject: [PATCH 10/15] bench/individuality: metric c frozen before its first run (dispatch.yaml with a credit block and its no-block twin, the seeded draws and their generator, bars-c.json; the plain-inputs control persona for metric a); credit.py and run.py run it --- bench/individuality/README.md | 24 +- bench/individuality/credit.py | 294 +++++++++++++++++ bench/individuality/fixtures/MANIFEST | 18 ++ bench/individuality/fixtures/bars-c.json | 6 + .../fixtures/credit/draws-0.jsonl | 300 ++++++++++++++++++ .../fixtures/credit/draws-1.jsonl | 300 ++++++++++++++++++ .../fixtures/credit/draws-2.jsonl | 300 ++++++++++++++++++ .../fixtures/credit/draws-3.jsonl | 300 ++++++++++++++++++ .../fixtures/credit/draws-4.jsonl | 300 ++++++++++++++++++ .../fixtures/credit/draws-5.jsonl | 300 ++++++++++++++++++ .../fixtures/credit/draws-6.jsonl | 300 ++++++++++++++++++ .../fixtures/credit/draws-7.jsonl | 300 ++++++++++++++++++ .../fixtures/credit/draws-8.jsonl | 300 ++++++++++++++++++ .../fixtures/credit/draws-9.jsonl | 300 ++++++++++++++++++ bench/individuality/fixtures/credit_draws.py | 39 +++ .../fixtures/dispatch-noblock.yaml | 67 ++++ bench/individuality/fixtures/dispatch.yaml | 70 ++++ .../individuality/fixtures/sensed-plain.yaml | 129 ++++++++ bench/individuality/run.py | 16 +- 19 files changed, 3656 insertions(+), 7 deletions(-) create mode 100644 bench/individuality/credit.py create mode 100644 bench/individuality/fixtures/bars-c.json create mode 100644 bench/individuality/fixtures/credit/draws-0.jsonl create mode 100644 bench/individuality/fixtures/credit/draws-1.jsonl create mode 100644 bench/individuality/fixtures/credit/draws-2.jsonl create mode 100644 bench/individuality/fixtures/credit/draws-3.jsonl create mode 100644 bench/individuality/fixtures/credit/draws-4.jsonl create mode 100644 bench/individuality/fixtures/credit/draws-5.jsonl create mode 100644 bench/individuality/fixtures/credit/draws-6.jsonl create mode 100644 bench/individuality/fixtures/credit/draws-7.jsonl create mode 100644 bench/individuality/fixtures/credit/draws-8.jsonl create mode 100644 bench/individuality/fixtures/credit/draws-9.jsonl create mode 100644 bench/individuality/fixtures/credit_draws.py create mode 100644 bench/individuality/fixtures/dispatch-noblock.yaml create mode 100644 bench/individuality/fixtures/dispatch.yaml create mode 100644 bench/individuality/fixtures/sensed-plain.yaml diff --git a/bench/individuality/README.md b/bench/individuality/README.md index 985e981..a61a36d 100644 --- a/bench/individuality/README.md +++ b/bench/individuality/README.md @@ -98,7 +98,7 @@ Measures whether the same reading lands differently after a learned normal, and b4 ≥ 95 %; b5 ≥ 95 %. - **Script.** `habituation.py`. -## Metric c: credit accuracy (with RFC Design B; skipped in this release) +## Metric c: credit accuracy (with RFC Design B) Measures whether a late, reordered or cancelled outcome credits the decision it was for: an act-or-ask policy, 10 individuals × 300 events, outcomes delivered on time and up to 6 events late (10 % cancelled, 5 % sent twice, 2 % paying a turn never @@ -106,6 +106,24 @@ opened), against an independent Python learner. Bars: c1 ≥ 99 % of the applied events with the oracle's Δ, c3 ≥ 99 % of open outcomes accepted, c4 = 100 % of duplicates, late payments and unknown turns refused, each refused run byte-identical to the run without the refused events. +- **Fixture.** `fixtures/dispatch.yaml` is the shipped dispatch policy (`examples/persona/dispatch-policy.yaml`) with a credit + block (`max_open` 8, `half_life_events` 32); `fixtures/dispatch-noblock.yaml` is the same without it, for variants (iii) + and (iv). `fixtures/credit_draws.py` draws, per individual from `random.Random(1000 + seed)`, each decision's blast radius + (0.05 to 0.65: no habit binds), its outcome draw, its delay, and whether it is cancelled, sent twice or joined by a payment + of a turn never opened; the draws are committed as `fixtures/credit/draws-.jsonl`. +- **Host.** `credit.py` drives one `probbit live --checkpoint-every 1` per run event by event: it reads each stance's action, + decides the outcome (good when the draw is below 0.8 after `act`, 0.4 after `ask`) and queues it. One message rides on + an event; a second one due on the same event moves to the next (the older decision first). A second copy of an outcome + is due one event after the first; for a cancelled decision the second copy is an outcome sent after the cancel. A payment + of a turn never opened names turn k + 1000. A refused event is followed by the same decision without its message, so + each run makes 300 decisions. Five runs per individual: stream 1, and on stream 2 (i) addressed, (ii) unaddressed, (iii) + 0.8 semantics (cancels not sent), (iv) the 0.8 workaround. +- **Statistics.** The oracle replays RFC section B.2 from the stance documents and the events, over all five runs: c1 weighs + each accepted payment by the oracle's applied step (and requires the engine's `paid` turn and `e` to match), c2 compares Δ + after every accepted event, c3 counts the outcomes of runs stream 1 and (i) whose decision was open on arrival, c4 the + duplicates, outcomes after a cancel and unknown turns of (i) and the ambiguous unaddressed feedback of (ii), and every run + is re-run without its refused events. + ## Metric d: replay Measures whether an individual is reproducible from its log. @@ -179,3 +197,7 @@ d 0 differing bytes over 240 strands, e 0 violations and 0 breaks over 9,442 sta each mandated line present exactly once. The outputs equal but for these lines are reported apart as `stderr_warnings_only` (the key was `stderr_senses_warning_only`). EXPECTED, the scripts and the strands are unchanged; MANIFEST's p0.py line was updated. +- Metric c (wave 2): its fixtures, the draws generator, the draws and its bars (`fixtures/bars-c.json`, the bars of the + metric c section above) were added to MANIFEST in their own section before their first run; `run.py` runs metric c. + `fixtures/sensed-plain.yaml` (metric a's reported control: the senses replaced by plain 0.8 number inputs) was frozen in + the same section. No earlier fixture, stream or bar changed. diff --git a/bench/individuality/credit.py b/bench/individuality/credit.py new file mode 100644 index 0000000..e319124 --- /dev/null +++ b/bench/individuality/credit.py @@ -0,0 +1,294 @@ +"""Metric c: credit accuracy (Python 3.9, standard library only). + +Individuals 0-9 run fixtures/dispatch.yaml for 300 decisions each: every event is a decision on `action` (act or ask) with a +`blast` reading as a plain input. A host drives one `probbit live` per run event by event: it reads each stance's action, +draws its outcome from the frozen draws (fixtures/credit/, good with probability 0.8 after act, 0.4 after ask) and sends it +back later. Five runs per individual: stream 1 (each outcome on the next event, with `for`) and, on stream 2 (delays 0-6 +events, 10 % of decisions cancelled instead, 5 % of outcomes sent twice, 2 % of events paying a turn never opened; one message +per event, a second one due on the same event moves to the next), (i) addressed (`for`), (ii) unaddressed, (iii) 0.8 +semantics (fixtures/dispatch-noblock.yaml, outcomes unaddressed on arrival, cancels not sent) and (iv) the 0.8 workaround (an +outcome is kept only when the previous stance took the paid decision's level). A refused event is followed by the same +decision without its message, so every run makes 300 decisions. An independent learner replays RFC 0001 section B.2 from the +stance documents (levels, odds) and the events, and is compared with the state the strand checkpoints after every event. +""" +import json +import os +import shutil +import subprocess +import tempfile +from concurrent.futures import ThreadPoolExecutor + +import common + +BLOCK = os.path.join(common.FIXTURES, "dispatch.yaml") +NOBLOCK = os.path.join(common.FIXTURES, "dispatch-noblock.yaml") +SEEDS = list(range(10)) +DECISIONS = 300 +RUNS = ["stream1", "addressed", "unaddressed", "v08", "workaround"] +P_GOOD = {"act": 0.8, "ask": 0.4} +LEVELS = ["act", "ask"] +RATE, STEP_CAP, TOTAL_CAP, HALF_LIFE, MAX_OPEN = 0.3, 0.05, 0.4, 32, 8 +TOL = 1e-6 + 1e-12 +WORKERS = 4 + + +def r6(x): + """6 decimals as the engine rounds (the exact binary value, printed to 6 places)""" + v = float("%.6f" % x) + return 0.0 if v == 0 else v + + +def clip(x, lo, hi): + return max(lo, min(hi, x)) + + +def draws(seed): + return common.read_jsonl(os.path.join(common.FIXTURES, "credit", "draws-%d.jsonl" % seed)) + + +class Host: + """One `probbit live` process driven event by event: the host sees each stance before it sends the next event.""" + + def __init__(self, persona, seed, strand, errf): + self.err = open(errf, "w") + self.p = subprocess.Popen([common.binary(), "live", persona, "--seed", str(seed), "--clock", "fixed", "--strand", strand, + "--checkpoint-every", "1"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=self.err, + cwd=common.REPO, universal_newlines=True, bufsize=1) + self.events, self.lines = [], [] + + def send(self, ev): + self.p.stdin.write(common.canon(ev) + "\n") + self.p.stdin.flush() + line = self.p.stdout.readline() + if not line: + raise common.SetupError("live ended before its events") + self.events.append(ev) + self.lines.append(line) + return json.loads(line) + + def close(self): + self.p.stdin.close() + self.p.stdout.read() + code = self.p.wait() + self.err.close() + return code + + +def compose(run, base, m, k, level): + """The event that carries message m at step k in this run, and whether the host sent the message or dropped it""" + ev = dict(base) + if m["kind"] == "cancel": + if run in ("v08", "workaround"): + return ev, "dropped" # 0.8 has no cancel + ev["cancel"] = [m["n"]] + ev["src"] = "env:executor" + return ev, "sent" + if run == "workaround" and (k == 0 or m["n"] not in level or level[k - 1] != level[m["n"]]): + return ev, "dropped" # kept only when the previous stance took the paid decision's level + ev["praise" if m["good"] else "criticism"] = True + ev["src"] = "env:outcome" + if run in ("stream1", "addressed"): + ev["for"] = m["n"] + return ev, "sent" + + +def one_run(tmp, seed, run): + """One host-driven run: the events and stance lines, the messages with their fate, the strand, the levels per decision""" + persona = NOBLOCK if run in ("v08", "workaround") else BLOCK + name = "s%d-%s" % (seed, run) + strand = os.path.join(tmp, name + ".strand") + h = Host(persona, seed, strand, os.path.join(tmp, name + ".err")) + dr, late = draws(seed), run != "stream1" + queue, level, msgs = {}, {}, [] + try: + for k in range(DECISIONS): + d = dr[k] + due = sorted(queue.pop(k, []), key=lambda m: (m["n"], m["order"])) + if late and d["unknown"]: + due.append({"kind": "unknown", "n": k + 1000, "order": 2, "good": d["unknown_good"]}) + if len(due) > 1: + queue.setdefault(k + 1, []).extend(due[1:]) # the later ones move to the next event + base = {"blast": d["blast"], "src": "env:host"} + if persona == BLOCK: + base["await"] = True + ev, m = base, (due[0] if due else None) + if m is not None: + ev, m["fate"] = compose(run, base, m, k, level) + m["step"] = k + msgs.append(m) + doc = h.send(ev) + if m is not None: + m["refused"] = "error" in doc + if "error" in doc: + doc = h.send(base) # the decision without its message + if "error" in doc: + raise common.SetupError("s%d %s step %d: the decision itself was refused: %s" % (seed, run, k, json.dumps(doc))) + if doc.get("turn") != k: + raise common.SetupError("s%d %s: turn %s at step %d" % (seed, run, doc.get("turn"), k)) + level[k] = doc["stance"]["action"]["level"] + good = d["u_out"] < P_GOOD[level[k]] + if not late: + queue.setdefault(k + 1, []).append({"kind": "outcome", "n": k, "order": 0, "good": good}) + elif d["cancel"]: + queue.setdefault(k + 1 + d["delay"], []).append({"kind": "cancel", "n": k, "order": 0, "good": good}) + if d["dup"]: + queue.setdefault(k + 2 + d["delay"], []).append({"kind": "stray", "n": k, "order": 1, "good": good}) + else: + queue.setdefault(k + 1 + d["delay"], []).append({"kind": "outcome", "n": k, "order": 0, "good": good}) + if d["dup"]: + queue.setdefault(k + 2 + d["delay"], []).append({"kind": "dup", "n": k, "order": 1, "good": good}) + finally: + code = h.close() + if code not in (0, 2): + raise common.SetupError("s%d %s: live exit %d" % (seed, run, code)) + return {"seed": seed, "run": run, "persona": persona, "block": persona == BLOCK, "strand": strand, "events": h.events, + "lines": h.lines, "msgs": msgs, "level": level, "unsettled": sum(len(v) for v in queue.values())} + + +def oracle(r): + """RFC 0001 B.2 in Python, over every event in order (a refused one changes nothing): per event the open decisions on + arrival (after expiry) and, when accepted, the payment, its eligibility, Δ after it and the step it applied""" + delta, credit, opened, out, t = [0.0, 0.0], {}, [], [], 0 + for ev, line in zip(r["events"], r["lines"]): + doc = json.loads(line) + live = [n for n in opened if t - n - 1 < 4 * HALF_LIFE] if r["block"] else [] + row = {"t": t, "accepted": "error" not in doc, "open": live} + out.append(row) + if not row["accepted"]: + continue + before, opened = list(delta), [n for n in live if n not in ev.get("cancel", [])] + sign = (1 if ev.get("praise") else 0) - (1 if ev.get("criticism") else 0) + paid = e = None + if sign != 0 and t > 0: + paid = ev.get("for", t - 1) if r["block"] else t - 1 + e = 1.0 if paid == t - 1 else r6(0.5 ** ((t - paid - 1) / HALF_LIFE)) + step = [e * clip(sign * RATE * x, -STEP_CAP, STEP_CAP) for x in credit[paid]] + mean = (step[0] + step[1]) / 2 + delta = [r6(clip(dv + (x - mean), -TOTAL_CAP, TOTAL_CAP)) for dv, x in zip(delta, step)] + opened = [n for n in opened if n != paid] + a = doc["stance"]["action"] + credit[t] = [r6((1.0 if lv == a["level"] else 0.0) - a["odds"][lv]) for lv in LEVELS] if a.get("released") else [0.0, 0.0] + if r["block"] and ev.get("await"): + opened.append(t) + opened = opened[-MAX_OPEN:] + row.update({"paid": paid, "e": e, "delta": delta, "step": [x - y for x, y in zip(delta, before)], "after": list(opened)}) + t += 1 + return out + + +def checkpoints(strand): + """The state after every event line (a checkpoint after each)""" + with open(strand, encoding="utf-8") as f: + return [j["state"] for j in (json.loads(x) for x in f if x.strip()) if "checkpoint" in j] + + +def rerun_identical(tmp, r): + """The same run with its refused events deleted: the same stance lines and the same strand, byte for byte""" + kept = [ev for ev, line in zip(r["events"], r["lines"]) if not line.startswith('{"error"')] + evf, strand2 = os.path.join(tmp, "s%d-%s.kept.jsonl" % (r["seed"], r["run"])), os.path.join(tmp, "s%d-%s.kept.strand" % (r["seed"], r["run"])) + common.write_jsonl(evf, kept) + code, out, err = common.run(["live", r["persona"], "--seed", str(r["seed"]), "--clock", "fixed", "--events", evf, "--strand", strand2, + "--checkpoint-every", "1"]) + lines = "".join(x for x in r["lines"] if not x.startswith('{"error"')) + with open(r["strand"], "rb") as a, open(strand2, "rb") as b: + return code == 0 and out.decode("utf-8") == lines and a.read() == b.read() + + +def evaluate(tmp, r): + """Per run: the oracle against the engine (c1, c2), the open outcomes paid (c3), the refusals and the re-run (c4)""" + o, states = oracle(r), checkpoints(r["strand"]) + acc = [x for x in o if x["accepted"]] + if len(states) != len(acc): + raise common.SetupError("s%d %s: %d checkpoints for %d accepted events" % (r["seed"], r["run"], len(states), len(acc))) + docs = [json.loads(x) for x in r["lines"] if not x.startswith('{"error"')] + s = {"events": len(acc), "delta_equal": 0, "step_total": 0.0, "step_equal": 0.0, "payments": 0, "open_mismatch": 0} + prev = [0.0, 0.0] + for row, st, doc in zip(acc, states, docs): + eng = st["learned"]["action"] + s["delta_equal"] += all(abs(x - y) <= TOL for x, y in zip(eng, row["delta"])) + if r["block"]: + s["open_mismatch"] += sorted(x["turn"] for x in st["open_credit"]) != sorted(row["after"]) + if row["paid"] is not None: + w = sum(abs(x) for x in row["step"]) + same = all(abs((x - y) - z) <= TOL for x, y, z in zip(eng, prev, row["step"])) + if r["block"]: + p = doc["credit"]["paid"] or {} + same = same and p.get("turn") == row["paid"] and p.get("e") == row["e"] + s["payments"] += 1 + s["step_total"] += w + s["step_equal"] += w if same else 0.0 + prev = eng + # the open decisions on arrival of each message: the oracle's row of the first event sent at its step (the one carrying it) + at, step = {}, 0 + for row in o: + at.setdefault(step, row) + step += row["accepted"] + for m in r["msgs"]: + m["open_on_arrival"] = m["n"] in at[m["step"]]["open"] + m["ambiguous"] = any(n != at[m["step"]]["t"] - 1 for n in at[m["step"]]["open"]) + s["identical"] = rerun_identical(tmp, r) + s["refused_events"] = sum(1 for x in r["lines"] if x.startswith('{"error"')) + return s + + +def metric(bars_c, tmp=None): + own = tmp is None + tmp = tmp or tempfile.mkdtemp(prefix="pbit-credit-") + try: + with ThreadPoolExecutor(WORKERS) as ex: + runs = list(ex.map(lambda sr: one_run(tmp, sr[0], sr[1]), [(s, r) for s in SEEDS for r in RUNS])) + stats = list(ex.map(lambda r: evaluate(tmp, r), runs)) + finally: + if own: + shutil.rmtree(tmp, ignore_errors=True) + tot = lambda k: sum(x[k] for x in stats) # noqa: E731 + by = lambda run: [r for r in runs if r["run"] == run] # noqa: E731 + msgs = lambda run, *kinds: [m for r in by(run) for m in r["msgs"] if m["kind"] in kinds and m["fate"] == "sent"] # noqa: E731 + c1 = tot("step_equal") / tot("step_total") if tot("step_total") else 1.0 + c2 = tot("delta_equal") / tot("events") + on_arrival = [m for run in ("stream1", "addressed") for m in msgs(run, "outcome") if m["open_on_arrival"]] + c3 = sum(not m["refused"] for m in on_arrival) / len(on_arrival) + bad = msgs("addressed", "dup", "stray", "unknown") + [m for m in msgs("unaddressed", "outcome", "dup", "stray", "unknown") if m["ambiguous"]] + c4 = sum(m["refused"] for m in bad) / len(bad) + pairs = sum(x["identical"] for x in stats) + # reported + v08 = [(r, m) for r in by("v08") for m in r["msgs"] if m["kind"] == "outcome" and m["fate"] == "sent"] + wrong = sum(r["level"][m["step"] - 1] != r["level"][m["n"]] for r, m in v08 if m["step"] > 0) + wk = [m for r in by("workaround") for m in r["msgs"] if m["kind"] == "outcome"] + act_rate = {run: common.r6(sum(r["level"][k] == "act" for r in by(run) for k in range(DECISIONS - 100, DECISIONS)) / (100 * len(SEEDS))) + for run in ("stream1", "addressed", "v08", "workaround")} + closed = {"evicted": 0, "expired": 0} + for r in runs: + if r["block"]: + for line in r["lines"]: + for c in (json.loads(line).get("credit") or {}).get("closed", []): + if c["as"] in closed: + closed[c["as"]] += 1 + decisions = len(SEEDS) * DECISIONS + kinds = {k: len(msgs("addressed", k)) for k in ("outcome", "cancel", "dup", "stray", "unknown")} + res = { + "scope": "fixtures/dispatch.yaml (dispatch-noblock.yaml for iii and iv), individuals 0-9, 300 decisions each, 5 runs; " + "stream 2: outcomes 0-6 events late, 10 % cancelled, 5 % sent twice, 2 % of events paying a turn never opened", + "c1": common.r6(c1), "c2": common.r6(c2), "c3": common.r6(c3), "c4": common.r6(c4), + "c1_payments": tot("payments"), "c2_events": tot("events"), "c3_outcomes_open_on_arrival": len(on_arrival), + "c4_refusable": len(bad), "c4_pairs_identical": "%d/%d" % (pairs, len(stats)), + "open_set_mismatches": tot("open_mismatch"), "refused_events": tot("refused_events"), + "addressed_messages": kinds, + "reported": { + "v08_outcomes_credited_at_another_level": common.r6(wrong / len(v08)) if v08 else None, + "v08_duplicates_strays_unknowns_accepted": len(msgs("v08", "dup", "stray", "unknown")), + "workaround_outcomes_kept": common.r6(sum(m["fate"] == "sent" for m in wk) / len(wk)) if wk else None, + "act_rate_last_100": act_rate, + "evicted_share": common.r6(closed["evicted"] / (3 * decisions)), "expired_share": common.r6(closed["expired"] / (3 * decisions)), + "addressed_outcomes_not_open_on_arrival": sum(not m["open_on_arrival"] for m in msgs("addressed", "outcome")), + "unsettled_at_end_addressed": sum(r["unsettled"] for r in by("addressed")), + }, + } + res["pass"] = {"c1": c1 >= bars_c["c1"]["share_min"], "c2": c2 >= bars_c["c2"]["share_min"], "c3": c3 >= bars_c["c3"]["share_min"], + "c4": c4 >= bars_c["c4"]["share_min"] and (pairs == len(stats) or not bars_c["c4"]["pairs_identical"])} + return res + + +if __name__ == "__main__": + with open(os.path.join(common.FIXTURES, "bars-c.json"), encoding="utf-8") as f: + print(json.dumps(metric(json.load(f)), indent=1, sort_keys=True)) diff --git a/bench/individuality/fixtures/MANIFEST b/bench/individuality/fixtures/MANIFEST index e68b4c7..e1d89c4 100644 --- a/bench/individuality/fixtures/MANIFEST +++ b/bench/individuality/fixtures/MANIFEST @@ -68,3 +68,21 @@ a61143fbc343b16ab4fc3a588417c726d3f02747b10f4a0fc3badd141eae1a63 7823 lives/room 4776a2f10511d3366070c3de96b6544ef188404d08855523dcde178684276b41 2787 lives/surprise-quiet.jsonl b27c8ecd32390c74442b6a6269b78df150dbef8f20e37101943f33e189ef1894 2775 lives/surprise-rate.jsonl 63e68a2e9d3ae7b084fc0d627a3a39387550639071f063f5b96e9927eeb4c478 910 lives/tail.jsonl +# +# Metric c, and metric a's re-measure control: frozen 2026-10-14 before their first run (personas, the draws generator, the +# draws, the bars). Re-generate the draws: python3 credit_draws.py (gives these bytes). +4ff28296970b96f4692bfee0ad5d47d156129894394a95c1bdf6080bee75d4cd 2188 dispatch.yaml +8ed7ba7c53ad5fcce38d59e89e39c2e174b84f88741acf62867267d43f53a4c1 2047 dispatch-noblock.yaml +a870ced67bb749e7f9a9ab89f200d050c46fb138fe767bb06df2c62a395e217a 1710 credit_draws.py +54dd7acc30e5a5f7c7b8bc097dd84b7b35940269642465e86a7d8dfcc89ab22b 33847 credit/draws-0.jsonl +73367908c1263e159a3bf69479859717f9ab29cbbaa33f0de016b4b954438fdf 33831 credit/draws-1.jsonl +6dd03598ed4e78477143b2efcb0d1ca935b0042eba838594c4ef001b926aa7c1 33828 credit/draws-2.jsonl +26e2f74b5dfe91a83b9ca5cdc0f2f466f9cfa604dedb4ee3a0e60047d8292047 33808 credit/draws-3.jsonl +bdf289dd7ac017bca7ca24e9a61aa03b9ec18aefc9c17ff31af2c0c2cdb827c6 33813 credit/draws-4.jsonl +9e5163de163f8288d9e960c422873ebe337870acd300b90b1059ed35ca98a36a 33845 credit/draws-5.jsonl +6612ff8b06fee52bf4e1a9498a5d9a5fdac4ff8efb02ec578289d68b4547b5d3 33844 credit/draws-6.jsonl +34991b43085bfc89285f55b3e92449be242bd6bf9de0ee3716286a169186af3e 33806 credit/draws-7.jsonl +4b010ef3db7076da72d610694b3ab43aff78ce3b52b1b8757896981d8869064a 33838 credit/draws-8.jsonl +69de4cbc7f383cee6cb03db47c735f8af2ab567a76562622e284b013cbd200ad 33799 credit/draws-9.jsonl +8dba56c14fcdde61398f52eedfb692b9bd1a07fc4ef0170fa44c6569172f0dab 138 bars-c.json +3033259caa5e227a14180124d88fe602715613a16316f3ab82a4c25bfaae1d0e 3992 sensed-plain.yaml diff --git a/bench/individuality/fixtures/bars-c.json b/bench/individuality/fixtures/bars-c.json new file mode 100644 index 0000000..ed9123f --- /dev/null +++ b/bench/individuality/fixtures/bars-c.json @@ -0,0 +1,6 @@ +{ + "c1": {"share_min": 0.99}, + "c2": {"share_min": 1.0}, + "c3": {"share_min": 0.99}, + "c4": {"share_min": 1.0, "pairs_identical": true} +} diff --git a/bench/individuality/fixtures/credit/draws-0.jsonl b/bench/individuality/fixtures/credit/draws-0.jsonl new file mode 100644 index 0000000..25934ec --- /dev/null +++ b/bench/individuality/fixtures/credit/draws-0.jsonl @@ -0,0 +1,300 @@ +{"blast":0.52,"cancel":false,"delay":0,"dup":false,"k":0,"u_out":0.669826,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":1,"dup":false,"k":1,"u_out":0.22182,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":0,"dup":false,"k":2,"u_out":0.458064,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":true,"delay":1,"dup":false,"k":3,"u_out":0.691531,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":1,"dup":false,"k":4,"u_out":0.983088,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":false,"delay":5,"dup":false,"k":5,"u_out":0.814172,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":2,"dup":false,"k":6,"u_out":0.292038,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":3,"dup":false,"k":7,"u_out":0.119701,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":1,"dup":false,"k":8,"u_out":0.011944,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":1,"dup":false,"k":9,"u_out":0.859377,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":2,"dup":false,"k":10,"u_out":0.3474,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":1,"dup":false,"k":11,"u_out":0.07373,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":4,"dup":false,"k":12,"u_out":0.323683,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":4,"dup":false,"k":13,"u_out":0.375556,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":2,"dup":false,"k":14,"u_out":0.201046,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":0,"dup":false,"k":15,"u_out":0.557115,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":true,"delay":1,"dup":false,"k":16,"u_out":0.591078,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":6,"dup":false,"k":17,"u_out":0.019853,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":6,"dup":false,"k":18,"u_out":0.784105,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":3,"dup":false,"k":19,"u_out":0.992715,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":2,"dup":false,"k":20,"u_out":0.700327,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":6,"dup":false,"k":21,"u_out":0.214123,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":0,"dup":false,"k":22,"u_out":0.605024,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":5,"dup":false,"k":23,"u_out":0.72516,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":3,"dup":false,"k":24,"u_out":0.254571,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":5,"dup":false,"k":25,"u_out":0.290251,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":3,"dup":false,"k":26,"u_out":0.922404,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":true,"delay":6,"dup":false,"k":27,"u_out":0.805131,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":4,"dup":false,"k":28,"u_out":0.689869,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":6,"dup":false,"k":29,"u_out":0.424606,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":3,"dup":false,"k":30,"u_out":0.539918,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":3,"dup":false,"k":31,"u_out":0.741161,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":4,"dup":false,"k":32,"u_out":0.06371,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":6,"dup":false,"k":33,"u_out":0.029917,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":5,"dup":false,"k":34,"u_out":0.934856,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":35,"u_out":0.125765,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":2,"dup":false,"k":36,"u_out":0.221054,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":1,"dup":false,"k":37,"u_out":0.907541,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":true,"delay":0,"dup":false,"k":38,"u_out":0.682624,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":5,"dup":false,"k":39,"u_out":0.84637,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":5,"dup":false,"k":40,"u_out":0.131055,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":true,"delay":1,"dup":false,"k":41,"u_out":0.372348,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":6,"dup":false,"k":42,"u_out":0.455571,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":0,"dup":false,"k":43,"u_out":0.134852,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":44,"u_out":0.358244,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":true,"delay":4,"dup":false,"k":45,"u_out":0.168734,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":6,"dup":false,"k":46,"u_out":0.99494,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":6,"dup":false,"k":47,"u_out":0.358128,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":2,"dup":false,"k":48,"u_out":0.789003,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":4,"dup":false,"k":49,"u_out":0.194642,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":6,"dup":false,"k":50,"u_out":0.902449,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":true,"delay":5,"dup":false,"k":51,"u_out":0.610117,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":3,"dup":false,"k":52,"u_out":0.495507,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":4,"dup":false,"k":53,"u_out":0.815594,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":6,"dup":false,"k":54,"u_out":0.114216,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":0,"dup":true,"k":55,"u_out":0.62465,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":0,"dup":false,"k":56,"u_out":0.984966,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":57,"u_out":0.425219,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":0,"dup":false,"k":58,"u_out":0.463796,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":1,"dup":false,"k":59,"u_out":0.186831,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":5,"dup":false,"k":60,"u_out":0.168246,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":1,"dup":false,"k":61,"u_out":0.272755,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":5,"dup":false,"k":62,"u_out":0.505397,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":3,"dup":false,"k":63,"u_out":0.010989,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":6,"dup":false,"k":64,"u_out":0.462425,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":4,"dup":false,"k":65,"u_out":0.946341,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":0,"dup":false,"k":66,"u_out":0.124434,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":1,"dup":false,"k":67,"u_out":0.285906,"unknown":true,"unknown_good":false} +{"blast":0.6,"cancel":true,"delay":2,"dup":false,"k":68,"u_out":0.339219,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":6,"dup":false,"k":69,"u_out":0.263226,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":2,"dup":false,"k":70,"u_out":0.953117,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":4,"dup":true,"k":71,"u_out":0.39953,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":3,"dup":false,"k":72,"u_out":0.682157,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":4,"dup":false,"k":73,"u_out":0.222809,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":true,"delay":6,"dup":false,"k":74,"u_out":0.442124,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":4,"dup":false,"k":75,"u_out":0.231735,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":4,"dup":false,"k":76,"u_out":0.529838,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":2,"dup":false,"k":77,"u_out":0.957139,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":1,"dup":false,"k":78,"u_out":0.882711,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":2,"dup":false,"k":79,"u_out":0.512634,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":2,"dup":false,"k":80,"u_out":0.727982,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":2,"dup":false,"k":81,"u_out":0.934703,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":2,"dup":false,"k":82,"u_out":0.184085,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":0,"dup":false,"k":83,"u_out":0.284,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":1,"dup":false,"k":84,"u_out":0.971319,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":3,"dup":false,"k":85,"u_out":0.447021,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":2,"dup":false,"k":86,"u_out":0.818976,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":5,"dup":false,"k":87,"u_out":0.495469,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":5,"dup":false,"k":88,"u_out":0.871067,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":1,"dup":false,"k":89,"u_out":0.528524,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":4,"dup":false,"k":90,"u_out":0.72406,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":0,"dup":false,"k":91,"u_out":0.649974,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":6,"dup":false,"k":92,"u_out":0.018572,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":4,"dup":false,"k":93,"u_out":0.472967,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":6,"dup":false,"k":94,"u_out":0.995126,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":95,"u_out":0.115641,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":6,"dup":false,"k":96,"u_out":0.1125,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":3,"dup":false,"k":97,"u_out":0.272987,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":1,"dup":false,"k":98,"u_out":0.015013,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":false,"delay":3,"dup":false,"k":99,"u_out":0.58955,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":0,"dup":false,"k":100,"u_out":0.161107,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":6,"dup":false,"k":101,"u_out":0.573963,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":3,"dup":false,"k":102,"u_out":0.137545,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":103,"u_out":0.53997,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":6,"dup":false,"k":104,"u_out":0.555162,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":105,"u_out":0.824692,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":3,"dup":false,"k":106,"u_out":0.466578,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":107,"u_out":0.401082,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":0,"dup":false,"k":108,"u_out":0.869604,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":6,"dup":false,"k":109,"u_out":0.261421,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":3,"dup":false,"k":110,"u_out":0.41614,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":1,"dup":false,"k":111,"u_out":0.59267,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":4,"dup":false,"k":112,"u_out":0.087643,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":2,"dup":false,"k":113,"u_out":0.798286,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":3,"dup":false,"k":114,"u_out":0.725695,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":5,"dup":false,"k":115,"u_out":0.669945,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":0,"dup":false,"k":116,"u_out":0.311553,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":1,"dup":false,"k":117,"u_out":0.376577,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":5,"dup":false,"k":118,"u_out":0.320836,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":1,"dup":true,"k":119,"u_out":0.664602,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":3,"dup":false,"k":120,"u_out":0.45537,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":6,"dup":false,"k":121,"u_out":0.403142,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":5,"dup":false,"k":122,"u_out":0.644092,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":5,"dup":false,"k":123,"u_out":0.731501,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":4,"dup":false,"k":124,"u_out":0.260472,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":3,"dup":false,"k":125,"u_out":0.580573,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":0,"dup":false,"k":126,"u_out":0.412812,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":true,"delay":5,"dup":false,"k":127,"u_out":0.125659,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":true,"delay":0,"dup":false,"k":128,"u_out":0.366425,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":2,"dup":false,"k":129,"u_out":0.06775,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":0,"dup":false,"k":130,"u_out":0.965127,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":131,"u_out":0.870109,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":2,"dup":false,"k":132,"u_out":0.430471,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":2,"dup":false,"k":133,"u_out":0.446819,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":true,"delay":6,"dup":false,"k":134,"u_out":0.766591,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":2,"dup":false,"k":135,"u_out":0.454248,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":136,"u_out":0.084407,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":4,"dup":false,"k":137,"u_out":0.611034,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":3,"dup":false,"k":138,"u_out":0.182923,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":6,"dup":false,"k":139,"u_out":0.005204,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":0,"dup":false,"k":140,"u_out":0.505787,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":4,"dup":false,"k":141,"u_out":0.251161,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":0,"dup":true,"k":142,"u_out":0.789048,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":0,"dup":false,"k":143,"u_out":0.907424,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":6,"dup":false,"k":144,"u_out":0.533748,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":6,"dup":false,"k":145,"u_out":0.788805,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":5,"dup":false,"k":146,"u_out":0.984778,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":0,"dup":false,"k":147,"u_out":0.21815,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":1,"dup":false,"k":148,"u_out":0.068996,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":0,"dup":false,"k":149,"u_out":0.464932,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":3,"dup":false,"k":150,"u_out":0.938255,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":2,"dup":true,"k":151,"u_out":0.435022,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":3,"dup":false,"k":152,"u_out":0.761261,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":3,"dup":false,"k":153,"u_out":0.048991,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":6,"dup":true,"k":154,"u_out":0.562629,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":3,"dup":false,"k":155,"u_out":0.415156,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":1,"dup":false,"k":156,"u_out":0.517704,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":2,"dup":false,"k":157,"u_out":0.07008,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":0,"dup":false,"k":158,"u_out":0.58764,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":5,"dup":true,"k":159,"u_out":0.54869,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":2,"dup":false,"k":160,"u_out":0.349604,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":6,"dup":false,"k":161,"u_out":0.756625,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":2,"dup":false,"k":162,"u_out":0.546444,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":4,"dup":false,"k":163,"u_out":0.792076,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":4,"dup":false,"k":164,"u_out":0.529684,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":4,"dup":false,"k":165,"u_out":0.622743,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":6,"dup":false,"k":166,"u_out":0.645175,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":3,"dup":false,"k":167,"u_out":0.092445,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":3,"dup":false,"k":168,"u_out":0.88812,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":true,"delay":0,"dup":false,"k":169,"u_out":0.562383,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":170,"u_out":0.501222,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":4,"dup":false,"k":171,"u_out":0.577507,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":0,"dup":true,"k":172,"u_out":0.859675,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":1,"dup":false,"k":173,"u_out":0.237995,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":3,"dup":false,"k":174,"u_out":0.794109,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":1,"dup":false,"k":175,"u_out":0.835936,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":true,"delay":0,"dup":false,"k":176,"u_out":0.828097,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":177,"u_out":0.826235,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":6,"dup":false,"k":178,"u_out":0.550189,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":0,"dup":false,"k":179,"u_out":0.890203,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":3,"dup":false,"k":180,"u_out":0.097337,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":2,"dup":false,"k":181,"u_out":0.104843,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":5,"dup":false,"k":182,"u_out":0.663891,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":4,"dup":false,"k":183,"u_out":0.105212,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":true,"delay":5,"dup":false,"k":184,"u_out":0.689615,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":6,"dup":false,"k":185,"u_out":0.241297,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":true,"delay":5,"dup":false,"k":186,"u_out":0.835479,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":5,"dup":false,"k":187,"u_out":0.304516,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":1,"dup":false,"k":188,"u_out":0.760857,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":3,"dup":false,"k":189,"u_out":0.580505,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":1,"dup":false,"k":190,"u_out":0.359699,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":2,"dup":false,"k":191,"u_out":0.830631,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":2,"dup":false,"k":192,"u_out":0.980872,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":2,"dup":false,"k":193,"u_out":0.83448,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":6,"dup":false,"k":194,"u_out":0.07528,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":1,"dup":false,"k":195,"u_out":0.773334,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":1,"dup":false,"k":196,"u_out":0.950157,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":5,"dup":false,"k":197,"u_out":0.042727,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":4,"dup":false,"k":198,"u_out":0.452372,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":4,"dup":false,"k":199,"u_out":0.2756,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":6,"dup":false,"k":200,"u_out":0.451149,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":3,"dup":false,"k":201,"u_out":0.112404,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":2,"dup":false,"k":202,"u_out":0.53729,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":0,"dup":false,"k":203,"u_out":0.827641,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":false,"delay":0,"dup":false,"k":204,"u_out":0.383101,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":0,"dup":false,"k":205,"u_out":0.008193,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":3,"dup":false,"k":206,"u_out":0.904151,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":1,"dup":false,"k":207,"u_out":0.211625,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":2,"dup":false,"k":208,"u_out":0.99691,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":3,"dup":false,"k":209,"u_out":0.05421,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":true,"delay":0,"dup":false,"k":210,"u_out":0.220037,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":1,"dup":false,"k":211,"u_out":0.037843,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":212,"u_out":0.427069,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":4,"dup":false,"k":213,"u_out":0.187286,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":true,"delay":5,"dup":false,"k":214,"u_out":0.857639,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":4,"dup":false,"k":215,"u_out":0.905915,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":6,"dup":false,"k":216,"u_out":0.602975,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":6,"dup":false,"k":217,"u_out":0.55527,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":1,"dup":false,"k":218,"u_out":0.523707,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":1,"dup":false,"k":219,"u_out":0.224392,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":2,"dup":false,"k":220,"u_out":0.073253,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":0,"dup":false,"k":221,"u_out":0.731149,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":5,"dup":false,"k":222,"u_out":0.868582,"unknown":false,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":3,"dup":false,"k":223,"u_out":0.736586,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":2,"dup":false,"k":224,"u_out":0.279945,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":4,"dup":false,"k":225,"u_out":0.416285,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":3,"dup":false,"k":226,"u_out":0.790451,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":0,"dup":false,"k":227,"u_out":0.073718,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":6,"dup":false,"k":228,"u_out":0.638545,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":1,"dup":false,"k":229,"u_out":0.979678,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":5,"dup":false,"k":230,"u_out":0.289371,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":2,"dup":false,"k":231,"u_out":0.092924,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":0,"dup":false,"k":232,"u_out":0.808467,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":2,"dup":false,"k":233,"u_out":0.779526,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":3,"dup":false,"k":234,"u_out":0.879923,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":true,"delay":2,"dup":false,"k":235,"u_out":0.138854,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":1,"dup":false,"k":236,"u_out":0.843851,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":237,"u_out":0.80904,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":5,"dup":false,"k":238,"u_out":0.445089,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":2,"dup":false,"k":239,"u_out":0.295927,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":3,"dup":false,"k":240,"u_out":0.379104,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":true,"delay":5,"dup":false,"k":241,"u_out":0.239865,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":4,"dup":false,"k":242,"u_out":0.129021,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":2,"dup":false,"k":243,"u_out":0.378932,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":3,"dup":true,"k":244,"u_out":0.215234,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":true,"delay":5,"dup":false,"k":245,"u_out":0.214343,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":1,"dup":false,"k":246,"u_out":0.778176,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":5,"dup":false,"k":247,"u_out":0.125137,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":5,"dup":false,"k":248,"u_out":0.385384,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":2,"dup":false,"k":249,"u_out":0.820336,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":6,"dup":false,"k":250,"u_out":0.104167,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":3,"dup":false,"k":251,"u_out":0.99652,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":0,"dup":false,"k":252,"u_out":0.858317,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":253,"u_out":0.365652,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":true,"delay":0,"dup":false,"k":254,"u_out":0.821707,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":1,"dup":false,"k":255,"u_out":0.74333,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":false,"delay":6,"dup":true,"k":256,"u_out":0.051307,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":4,"dup":false,"k":257,"u_out":0.496678,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":3,"dup":false,"k":258,"u_out":0.273438,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":true,"delay":5,"dup":false,"k":259,"u_out":0.540344,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":0,"dup":false,"k":260,"u_out":0.134356,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":4,"dup":false,"k":261,"u_out":0.278754,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":4,"dup":false,"k":262,"u_out":0.538804,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":3,"dup":false,"k":263,"u_out":0.395665,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":6,"dup":false,"k":264,"u_out":0.230741,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":4,"dup":false,"k":265,"u_out":0.133821,"unknown":false,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":0,"dup":false,"k":266,"u_out":0.146018,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":3,"dup":false,"k":267,"u_out":0.794066,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":0,"dup":false,"k":268,"u_out":0.670464,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":3,"dup":false,"k":269,"u_out":0.211839,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":4,"dup":false,"k":270,"u_out":0.881243,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":5,"dup":false,"k":271,"u_out":0.12433,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":2,"dup":false,"k":272,"u_out":0.944204,"unknown":true,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":2,"dup":false,"k":273,"u_out":0.071984,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":3,"dup":false,"k":274,"u_out":0.579089,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":3,"dup":false,"k":275,"u_out":0.731169,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":0,"dup":false,"k":276,"u_out":0.34726,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":true,"delay":3,"dup":false,"k":277,"u_out":0.199752,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":3,"dup":true,"k":278,"u_out":0.993569,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":3,"dup":false,"k":279,"u_out":0.763899,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":true,"delay":0,"dup":false,"k":280,"u_out":0.322375,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":6,"dup":false,"k":281,"u_out":0.998209,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":4,"dup":false,"k":282,"u_out":0.914069,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":0,"dup":false,"k":283,"u_out":0.613329,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":1,"dup":false,"k":284,"u_out":0.764067,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":1,"dup":false,"k":285,"u_out":0.779018,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":3,"dup":false,"k":286,"u_out":0.90979,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":1,"dup":false,"k":287,"u_out":0.741052,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":4,"dup":false,"k":288,"u_out":0.530185,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":6,"dup":false,"k":289,"u_out":0.315675,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":2,"dup":false,"k":290,"u_out":0.227129,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":4,"dup":false,"k":291,"u_out":0.498402,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":true,"delay":4,"dup":false,"k":292,"u_out":0.352026,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":1,"dup":false,"k":293,"u_out":0.362221,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":0,"dup":false,"k":294,"u_out":0.652348,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":true,"delay":4,"dup":false,"k":295,"u_out":0.702073,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":4,"dup":false,"k":296,"u_out":0.357141,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":297,"u_out":0.850138,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":5,"dup":false,"k":298,"u_out":0.168079,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":299,"u_out":0.744744,"unknown":false,"unknown_good":true} diff --git a/bench/individuality/fixtures/credit/draws-1.jsonl b/bench/individuality/fixtures/credit/draws-1.jsonl new file mode 100644 index 0000000..6c8b5f1 --- /dev/null +++ b/bench/individuality/fixtures/credit/draws-1.jsonl @@ -0,0 +1,300 @@ +{"blast":0.53,"cancel":false,"delay":6,"dup":false,"k":0,"u_out":0.058626,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":4,"dup":false,"k":1,"u_out":0.72198,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":5,"dup":false,"k":2,"u_out":0.737088,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":5,"dup":false,"k":3,"u_out":0.909125,"unknown":true,"unknown_good":false} +{"blast":0.43,"cancel":true,"delay":1,"dup":false,"k":4,"u_out":0.406635,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":0,"dup":false,"k":5,"u_out":0.792044,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":4,"dup":false,"k":6,"u_out":0.005662,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":1,"dup":false,"k":7,"u_out":0.44365,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":4,"dup":true,"k":8,"u_out":0.688065,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":5,"dup":false,"k":9,"u_out":0.021379,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":6,"dup":false,"k":10,"u_out":0.901001,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":1,"dup":false,"k":11,"u_out":0.116012,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":0,"dup":false,"k":12,"u_out":0.313867,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":4,"dup":false,"k":13,"u_out":0.50243,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":1,"dup":false,"k":14,"u_out":0.073156,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":0,"dup":false,"k":15,"u_out":0.114486,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":3,"dup":false,"k":16,"u_out":0.512587,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":true,"delay":4,"dup":false,"k":17,"u_out":0.781874,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":5,"dup":false,"k":18,"u_out":0.749175,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":true,"delay":5,"dup":false,"k":19,"u_out":0.448042,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":0,"dup":false,"k":20,"u_out":0.721461,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":1,"dup":false,"k":21,"u_out":0.689229,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":4,"dup":false,"k":22,"u_out":0.958709,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":2,"dup":false,"k":23,"u_out":0.27964,"unknown":true,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":2,"dup":false,"k":24,"u_out":0.544339,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":3,"dup":false,"k":25,"u_out":0.730661,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":3,"dup":false,"k":26,"u_out":0.724891,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":1,"dup":false,"k":27,"u_out":0.422568,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":4,"dup":false,"k":28,"u_out":0.866875,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":0,"dup":false,"k":29,"u_out":0.616362,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":true,"delay":6,"dup":false,"k":30,"u_out":0.20311,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":3,"dup":false,"k":31,"u_out":0.821211,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":4,"dup":false,"k":32,"u_out":0.675033,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":1,"dup":false,"k":33,"u_out":0.628814,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":2,"dup":false,"k":34,"u_out":0.737508,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":true,"delay":4,"dup":false,"k":35,"u_out":0.682195,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":4,"dup":false,"k":36,"u_out":0.618552,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":1,"dup":false,"k":37,"u_out":0.90441,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":0,"dup":false,"k":38,"u_out":0.444864,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":4,"dup":false,"k":39,"u_out":0.393089,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":0,"dup":false,"k":40,"u_out":0.918343,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":0,"dup":false,"k":41,"u_out":0.700565,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":1,"dup":false,"k":42,"u_out":0.124071,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":3,"dup":false,"k":43,"u_out":0.443399,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":3,"dup":false,"k":44,"u_out":0.780593,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":4,"dup":false,"k":45,"u_out":0.5426,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":5,"dup":false,"k":46,"u_out":0.03789,"unknown":false,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":1,"dup":false,"k":47,"u_out":0.562166,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":4,"dup":false,"k":48,"u_out":0.35687,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":true,"delay":1,"dup":false,"k":49,"u_out":0.875742,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":0,"dup":false,"k":50,"u_out":0.258444,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":3,"dup":false,"k":51,"u_out":0.441069,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":2,"dup":false,"k":52,"u_out":0.245095,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":0,"dup":false,"k":53,"u_out":0.209392,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":0,"dup":false,"k":54,"u_out":0.129243,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":6,"dup":false,"k":55,"u_out":0.519378,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":6,"dup":false,"k":56,"u_out":0.378453,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":6,"dup":false,"k":57,"u_out":0.105586,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":5,"dup":false,"k":58,"u_out":0.180157,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":1,"dup":false,"k":59,"u_out":0.087254,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":0,"dup":false,"k":60,"u_out":0.783317,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":61,"u_out":0.892389,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":0,"dup":false,"k":62,"u_out":0.359256,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":6,"dup":false,"k":63,"u_out":0.342772,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":4,"dup":false,"k":64,"u_out":0.528781,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":4,"dup":false,"k":65,"u_out":0.284106,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":5,"dup":false,"k":66,"u_out":0.762287,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":6,"dup":false,"k":67,"u_out":0.50345,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":1,"dup":false,"k":68,"u_out":0.235002,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":2,"dup":false,"k":69,"u_out":0.60582,"unknown":true,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":5,"dup":false,"k":70,"u_out":0.346347,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":2,"dup":false,"k":71,"u_out":0.733381,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":72,"u_out":0.861227,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":5,"dup":false,"k":73,"u_out":0.738165,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":5,"dup":false,"k":74,"u_out":0.199704,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":6,"dup":false,"k":75,"u_out":0.414731,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":76,"u_out":0.568918,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":0,"dup":false,"k":77,"u_out":0.239211,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":5,"dup":false,"k":78,"u_out":0.537499,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":4,"dup":false,"k":79,"u_out":0.045891,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":6,"dup":false,"k":80,"u_out":0.002338,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":2,"dup":false,"k":81,"u_out":0.197489,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":5,"dup":false,"k":82,"u_out":0.397706,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":6,"dup":false,"k":83,"u_out":0.69764,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":5,"dup":false,"k":84,"u_out":0.047775,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":1,"dup":false,"k":85,"u_out":0.831201,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":0,"dup":false,"k":86,"u_out":0.514488,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":2,"dup":false,"k":87,"u_out":0.439632,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":3,"dup":false,"k":88,"u_out":0.594701,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":1,"dup":false,"k":89,"u_out":0.585274,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":4,"dup":false,"k":90,"u_out":0.180053,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":true,"delay":0,"dup":false,"k":91,"u_out":0.033026,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":0,"dup":false,"k":92,"u_out":0.456887,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":6,"dup":false,"k":93,"u_out":0.684694,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":0,"dup":false,"k":94,"u_out":0.833515,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":4,"dup":false,"k":95,"u_out":0.685997,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":6,"dup":true,"k":96,"u_out":0.418708,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":4,"dup":false,"k":97,"u_out":0.966773,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":3,"dup":false,"k":98,"u_out":0.690746,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":1,"dup":false,"k":99,"u_out":0.963849,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":3,"dup":false,"k":100,"u_out":0.618411,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":4,"dup":false,"k":101,"u_out":0.247944,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":2,"dup":false,"k":102,"u_out":0.522201,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":5,"dup":false,"k":103,"u_out":0.674308,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":6,"dup":false,"k":104,"u_out":0.533439,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":1,"dup":false,"k":105,"u_out":0.301317,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":3,"dup":false,"k":106,"u_out":0.906139,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":0,"dup":false,"k":107,"u_out":0.762547,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":5,"dup":false,"k":108,"u_out":0.211481,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":2,"dup":false,"k":109,"u_out":0.2516,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":2,"dup":false,"k":110,"u_out":0.858314,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":0,"dup":false,"k":111,"u_out":0.446137,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":0,"dup":false,"k":112,"u_out":0.956423,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":4,"dup":false,"k":113,"u_out":0.733478,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":2,"dup":false,"k":114,"u_out":0.14566,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":0,"dup":false,"k":115,"u_out":0.055903,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":1,"dup":false,"k":116,"u_out":0.674738,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":1,"dup":false,"k":117,"u_out":0.371144,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":4,"dup":false,"k":118,"u_out":0.438257,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":true,"delay":5,"dup":false,"k":119,"u_out":0.042178,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":5,"dup":false,"k":120,"u_out":0.851707,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":2,"dup":false,"k":121,"u_out":0.657138,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":true,"delay":1,"dup":false,"k":122,"u_out":0.903579,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":0,"dup":false,"k":123,"u_out":0.627777,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":5,"dup":false,"k":124,"u_out":0.902964,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":125,"u_out":0.393491,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":2,"dup":false,"k":126,"u_out":0.103229,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":true,"delay":4,"dup":false,"k":127,"u_out":0.815837,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":4,"dup":false,"k":128,"u_out":0.479806,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":1,"dup":true,"k":129,"u_out":0.429922,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":true,"delay":5,"dup":true,"k":130,"u_out":0.881317,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":1,"dup":false,"k":131,"u_out":0.587901,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":5,"dup":false,"k":132,"u_out":0.725945,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":2,"dup":false,"k":133,"u_out":0.157926,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":3,"dup":true,"k":134,"u_out":0.340632,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":135,"u_out":0.758356,"unknown":true,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":6,"dup":false,"k":136,"u_out":0.704654,"unknown":true,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":4,"dup":false,"k":137,"u_out":0.08867,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":1,"dup":false,"k":138,"u_out":0.169775,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":true,"delay":0,"dup":false,"k":139,"u_out":0.706462,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":5,"dup":false,"k":140,"u_out":0.694735,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":3,"dup":false,"k":141,"u_out":0.182073,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":4,"dup":false,"k":142,"u_out":0.539501,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":143,"u_out":0.634227,"unknown":false,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":1,"dup":false,"k":144,"u_out":0.451387,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":4,"dup":false,"k":145,"u_out":0.297037,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":2,"dup":false,"k":146,"u_out":0.196589,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":147,"u_out":0.167009,"unknown":true,"unknown_good":false} +{"blast":0.23,"cancel":true,"delay":0,"dup":false,"k":148,"u_out":0.45637,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":0,"dup":false,"k":149,"u_out":0.825921,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":2,"dup":false,"k":150,"u_out":0.1584,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":true,"delay":1,"dup":false,"k":151,"u_out":0.820568,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":0,"dup":false,"k":152,"u_out":0.402339,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":4,"dup":false,"k":153,"u_out":0.344014,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":5,"dup":false,"k":154,"u_out":0.4576,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":1,"dup":false,"k":155,"u_out":0.188661,"unknown":true,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":0,"dup":false,"k":156,"u_out":0.765682,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":0,"dup":false,"k":157,"u_out":0.75104,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":6,"dup":false,"k":158,"u_out":0.049852,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":5,"dup":false,"k":159,"u_out":0.271714,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":2,"dup":false,"k":160,"u_out":0.496218,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":6,"dup":false,"k":161,"u_out":0.004357,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":3,"dup":true,"k":162,"u_out":0.068711,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":2,"dup":false,"k":163,"u_out":0.606976,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":164,"u_out":0.317344,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":2,"dup":false,"k":165,"u_out":0.984965,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":3,"dup":false,"k":166,"u_out":0.324495,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":2,"dup":false,"k":167,"u_out":0.822031,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":4,"dup":true,"k":168,"u_out":0.084233,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":5,"dup":false,"k":169,"u_out":0.980718,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":3,"dup":true,"k":170,"u_out":0.864691,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":171,"u_out":0.832918,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":true,"delay":3,"dup":false,"k":172,"u_out":0.028334,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":173,"u_out":0.629973,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":3,"dup":false,"k":174,"u_out":0.205479,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":true,"delay":1,"dup":false,"k":175,"u_out":0.529057,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":true,"delay":3,"dup":false,"k":176,"u_out":0.628057,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":177,"u_out":0.058023,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":6,"dup":false,"k":178,"u_out":0.904477,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":0,"dup":false,"k":179,"u_out":0.356391,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":5,"dup":false,"k":180,"u_out":0.532921,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":5,"dup":false,"k":181,"u_out":0.355935,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":5,"dup":false,"k":182,"u_out":0.204769,"unknown":false,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":0,"dup":false,"k":183,"u_out":0.437053,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":184,"u_out":0.437777,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":6,"dup":false,"k":185,"u_out":0.836985,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":5,"dup":false,"k":186,"u_out":0.562701,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":5,"dup":false,"k":187,"u_out":0.83727,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":5,"dup":false,"k":188,"u_out":0.244248,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":1,"dup":false,"k":189,"u_out":0.381834,"unknown":true,"unknown_good":false} +{"blast":0.19,"cancel":true,"delay":3,"dup":false,"k":190,"u_out":0.871008,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":6,"dup":false,"k":191,"u_out":0.382974,"unknown":true,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":0,"dup":false,"k":192,"u_out":0.762028,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":3,"dup":false,"k":193,"u_out":0.096947,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":2,"dup":false,"k":194,"u_out":0.700968,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":5,"dup":false,"k":195,"u_out":0.845347,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":4,"dup":false,"k":196,"u_out":0.753387,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":2,"dup":false,"k":197,"u_out":0.810317,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":4,"dup":false,"k":198,"u_out":0.905727,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":6,"dup":false,"k":199,"u_out":0.550866,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":2,"dup":false,"k":200,"u_out":0.061369,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":2,"dup":false,"k":201,"u_out":0.787826,"unknown":false,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":2,"dup":false,"k":202,"u_out":0.239269,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":3,"dup":false,"k":203,"u_out":0.799072,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":6,"dup":false,"k":204,"u_out":0.080126,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":4,"dup":false,"k":205,"u_out":0.132147,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":5,"dup":false,"k":206,"u_out":0.148099,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":6,"dup":false,"k":207,"u_out":0.015978,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":0,"dup":false,"k":208,"u_out":0.70195,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":1,"dup":false,"k":209,"u_out":0.695847,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":1,"dup":false,"k":210,"u_out":0.683022,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":2,"dup":false,"k":211,"u_out":0.274174,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":3,"dup":false,"k":212,"u_out":0.577093,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":2,"dup":false,"k":213,"u_out":0.470404,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":2,"dup":false,"k":214,"u_out":0.895223,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":3,"dup":false,"k":215,"u_out":0.992278,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":3,"dup":false,"k":216,"u_out":0.886191,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":true,"delay":4,"dup":false,"k":217,"u_out":0.27789,"unknown":true,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":5,"dup":false,"k":218,"u_out":0.506489,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":4,"dup":false,"k":219,"u_out":0.820065,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":5,"dup":false,"k":220,"u_out":0.834307,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":5,"dup":false,"k":221,"u_out":0.101096,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":6,"dup":false,"k":222,"u_out":0.103472,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":5,"dup":false,"k":223,"u_out":0.406842,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":6,"dup":false,"k":224,"u_out":0.446055,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":6,"dup":false,"k":225,"u_out":0.751637,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":1,"dup":false,"k":226,"u_out":0.952249,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":3,"dup":false,"k":227,"u_out":0.359391,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":3,"dup":false,"k":228,"u_out":0.786428,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":229,"u_out":0.76221,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":false,"delay":6,"dup":false,"k":230,"u_out":0.139124,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":5,"dup":false,"k":231,"u_out":0.922587,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":2,"dup":false,"k":232,"u_out":0.759238,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":4,"dup":false,"k":233,"u_out":0.537767,"unknown":true,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":1,"dup":true,"k":234,"u_out":0.146375,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":5,"dup":false,"k":235,"u_out":0.062757,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":4,"dup":false,"k":236,"u_out":0.723789,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":6,"dup":false,"k":237,"u_out":0.641698,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":0,"dup":false,"k":238,"u_out":0.784985,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":true,"delay":3,"dup":false,"k":239,"u_out":0.656199,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":4,"dup":false,"k":240,"u_out":0.528351,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":1,"dup":false,"k":241,"u_out":0.617821,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":1,"dup":false,"k":242,"u_out":0.669925,"unknown":true,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":1,"dup":false,"k":243,"u_out":0.554601,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":1,"dup":false,"k":244,"u_out":0.87104,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":0,"dup":false,"k":245,"u_out":0.788628,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":0,"dup":false,"k":246,"u_out":0.215305,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":6,"dup":false,"k":247,"u_out":0.415698,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":2,"dup":false,"k":248,"u_out":0.820467,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":5,"dup":true,"k":249,"u_out":0.383975,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":2,"dup":false,"k":250,"u_out":0.721949,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":3,"dup":true,"k":251,"u_out":0.337923,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":6,"dup":false,"k":252,"u_out":0.596807,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":true,"delay":3,"dup":false,"k":253,"u_out":0.199639,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":0,"dup":false,"k":254,"u_out":0.552028,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":true,"delay":2,"dup":false,"k":255,"u_out":0.90479,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":1,"dup":false,"k":256,"u_out":0.414987,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":2,"dup":false,"k":257,"u_out":0.354905,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":0,"dup":false,"k":258,"u_out":0.073129,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":3,"dup":false,"k":259,"u_out":0.797323,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":0,"dup":false,"k":260,"u_out":0.488511,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":3,"dup":false,"k":261,"u_out":0.357575,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":true,"delay":2,"dup":false,"k":262,"u_out":0.901643,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":3,"dup":false,"k":263,"u_out":0.83095,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":true,"delay":6,"dup":false,"k":264,"u_out":0.820651,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":4,"dup":false,"k":265,"u_out":0.228957,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":1,"dup":false,"k":266,"u_out":0.84041,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":5,"dup":true,"k":267,"u_out":0.202694,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":6,"dup":false,"k":268,"u_out":0.277773,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":2,"dup":false,"k":269,"u_out":0.003229,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":true,"delay":1,"dup":false,"k":270,"u_out":0.867305,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":6,"dup":false,"k":271,"u_out":0.245321,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":3,"dup":false,"k":272,"u_out":0.237302,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":1,"dup":false,"k":273,"u_out":0.738421,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":6,"dup":false,"k":274,"u_out":0.383681,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":6,"dup":false,"k":275,"u_out":0.954617,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":true,"delay":4,"dup":false,"k":276,"u_out":0.619478,"unknown":true,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":277,"u_out":0.290223,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":false,"delay":5,"dup":false,"k":278,"u_out":0.088396,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":3,"dup":false,"k":279,"u_out":0.157271,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":4,"dup":false,"k":280,"u_out":0.313623,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":4,"dup":false,"k":281,"u_out":0.176059,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":1,"dup":false,"k":282,"u_out":0.061978,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":3,"dup":false,"k":283,"u_out":0.325568,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":3,"dup":false,"k":284,"u_out":0.302315,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":true,"delay":0,"dup":false,"k":285,"u_out":0.547443,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":0,"dup":false,"k":286,"u_out":0.255363,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":1,"dup":false,"k":287,"u_out":0.776586,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":true,"delay":4,"dup":false,"k":288,"u_out":0.265955,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":2,"dup":false,"k":289,"u_out":0.777636,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":true,"delay":4,"dup":false,"k":290,"u_out":0.997147,"unknown":true,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":0,"dup":false,"k":291,"u_out":0.959153,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":2,"dup":false,"k":292,"u_out":0.240348,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":3,"dup":false,"k":293,"u_out":0.78641,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":true,"delay":2,"dup":false,"k":294,"u_out":0.404297,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":5,"dup":false,"k":295,"u_out":0.246258,"unknown":true,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":5,"dup":false,"k":296,"u_out":0.196262,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":6,"dup":false,"k":297,"u_out":0.638475,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":5,"dup":false,"k":298,"u_out":0.870667,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":3,"dup":false,"k":299,"u_out":0.177495,"unknown":false,"unknown_good":false} diff --git a/bench/individuality/fixtures/credit/draws-2.jsonl b/bench/individuality/fixtures/credit/draws-2.jsonl new file mode 100644 index 0000000..de4ac08 --- /dev/null +++ b/bench/individuality/fixtures/credit/draws-2.jsonl @@ -0,0 +1,300 @@ +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":0,"u_out":0.42125,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":true,"delay":4,"dup":false,"k":1,"u_out":0.995844,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":6,"dup":false,"k":2,"u_out":0.676404,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":6,"dup":false,"k":3,"u_out":0.079963,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":true,"delay":6,"dup":false,"k":4,"u_out":0.289363,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":1,"dup":false,"k":5,"u_out":0.808677,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":0,"dup":false,"k":6,"u_out":0.179197,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":0,"dup":false,"k":7,"u_out":0.838121,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":true,"delay":1,"dup":false,"k":8,"u_out":0.083014,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":1,"dup":false,"k":9,"u_out":0.472251,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":0,"dup":false,"k":10,"u_out":0.149975,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":5,"dup":true,"k":11,"u_out":0.710053,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":5,"dup":false,"k":12,"u_out":0.132346,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":4,"dup":false,"k":13,"u_out":0.031295,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":5,"dup":false,"k":14,"u_out":0.640054,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":3,"dup":false,"k":15,"u_out":0.922994,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":2,"dup":false,"k":16,"u_out":0.814523,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":0,"dup":false,"k":17,"u_out":0.226294,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":2,"dup":false,"k":18,"u_out":0.101614,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":5,"dup":false,"k":19,"u_out":0.435576,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":2,"dup":false,"k":20,"u_out":0.737509,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":3,"dup":false,"k":21,"u_out":0.433812,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":22,"u_out":0.103147,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":6,"dup":false,"k":23,"u_out":0.789564,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":2,"dup":false,"k":24,"u_out":0.319698,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":3,"dup":true,"k":25,"u_out":0.591268,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":true,"delay":6,"dup":false,"k":26,"u_out":0.365322,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":3,"dup":false,"k":27,"u_out":0.529748,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":1,"dup":false,"k":28,"u_out":0.953765,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":4,"dup":false,"k":29,"u_out":0.237336,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":0,"dup":false,"k":30,"u_out":0.180241,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":4,"dup":false,"k":31,"u_out":0.183002,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":0,"dup":true,"k":32,"u_out":0.028811,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":1,"dup":false,"k":33,"u_out":0.035472,"unknown":true,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":2,"dup":false,"k":34,"u_out":0.145027,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":1,"dup":true,"k":35,"u_out":0.870518,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":3,"dup":false,"k":36,"u_out":0.7215,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":6,"dup":false,"k":37,"u_out":0.610905,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":4,"dup":true,"k":38,"u_out":0.894843,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":2,"dup":false,"k":39,"u_out":0.110486,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":1,"dup":false,"k":40,"u_out":0.77177,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":3,"dup":false,"k":41,"u_out":0.186997,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":2,"dup":false,"k":42,"u_out":0.945944,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":0,"dup":false,"k":43,"u_out":0.968134,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":2,"dup":false,"k":44,"u_out":0.472607,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":true,"delay":0,"dup":false,"k":45,"u_out":0.341088,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":2,"dup":false,"k":46,"u_out":0.658286,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":3,"dup":false,"k":47,"u_out":0.205593,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":3,"dup":false,"k":48,"u_out":0.884079,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":3,"dup":false,"k":49,"u_out":0.281024,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":5,"dup":false,"k":50,"u_out":0.86226,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":5,"dup":false,"k":51,"u_out":0.926961,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":false,"delay":6,"dup":false,"k":52,"u_out":0.733243,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":4,"dup":false,"k":53,"u_out":0.602315,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":1,"dup":false,"k":54,"u_out":0.836866,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":55,"u_out":0.501466,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":5,"dup":false,"k":56,"u_out":0.979194,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":2,"dup":false,"k":57,"u_out":0.768906,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":2,"dup":false,"k":58,"u_out":0.630137,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":3,"dup":false,"k":59,"u_out":0.283378,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":1,"dup":false,"k":60,"u_out":0.387774,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":2,"dup":false,"k":61,"u_out":0.316947,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":1,"dup":false,"k":62,"u_out":0.106305,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":6,"dup":false,"k":63,"u_out":0.25455,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":1,"dup":true,"k":64,"u_out":0.469171,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":6,"dup":false,"k":65,"u_out":0.023702,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":2,"dup":false,"k":66,"u_out":0.839026,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":6,"dup":false,"k":67,"u_out":0.587451,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":5,"dup":false,"k":68,"u_out":0.681719,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":1,"dup":false,"k":69,"u_out":0.281885,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":1,"dup":false,"k":70,"u_out":0.080259,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":6,"dup":false,"k":71,"u_out":0.309949,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":1,"dup":false,"k":72,"u_out":0.709694,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":5,"dup":false,"k":73,"u_out":0.347438,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":4,"dup":false,"k":74,"u_out":0.67769,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":6,"dup":false,"k":75,"u_out":0.147083,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":3,"dup":false,"k":76,"u_out":0.734766,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":1,"dup":false,"k":77,"u_out":0.435956,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":5,"dup":false,"k":78,"u_out":0.932829,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":true,"delay":2,"dup":false,"k":79,"u_out":0.505681,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":3,"dup":false,"k":80,"u_out":0.898737,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":3,"dup":false,"k":81,"u_out":0.771575,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":3,"dup":false,"k":82,"u_out":0.897817,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":0,"dup":false,"k":83,"u_out":0.826782,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":3,"dup":false,"k":84,"u_out":0.277187,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":1,"dup":false,"k":85,"u_out":0.775939,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":2,"dup":false,"k":86,"u_out":0.416615,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":87,"u_out":0.081354,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":88,"u_out":0.593543,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":0,"dup":false,"k":89,"u_out":0.583237,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":1,"dup":true,"k":90,"u_out":0.762198,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":6,"dup":false,"k":91,"u_out":0.704939,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":6,"dup":false,"k":92,"u_out":0.796177,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":2,"dup":false,"k":93,"u_out":0.529313,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":true,"delay":5,"dup":false,"k":94,"u_out":0.133288,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":true,"delay":0,"dup":false,"k":95,"u_out":0.265342,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":3,"dup":false,"k":96,"u_out":0.890069,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":5,"dup":false,"k":97,"u_out":0.772972,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":4,"dup":false,"k":98,"u_out":0.897122,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":6,"dup":false,"k":99,"u_out":0.217298,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":3,"dup":true,"k":100,"u_out":0.710415,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":2,"dup":false,"k":101,"u_out":0.113266,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":3,"dup":false,"k":102,"u_out":0.767549,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":3,"dup":true,"k":103,"u_out":0.274716,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":3,"dup":false,"k":104,"u_out":0.718181,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":1,"dup":false,"k":105,"u_out":0.703698,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":4,"dup":false,"k":106,"u_out":0.03363,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":1,"dup":false,"k":107,"u_out":0.869205,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":1,"dup":false,"k":108,"u_out":0.124857,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":6,"dup":false,"k":109,"u_out":0.129449,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":5,"dup":false,"k":110,"u_out":0.210914,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":111,"u_out":0.614734,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":1,"dup":false,"k":112,"u_out":0.243964,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":0,"dup":false,"k":113,"u_out":0.458887,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":6,"dup":true,"k":114,"u_out":0.185627,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":true,"delay":6,"dup":false,"k":115,"u_out":0.443734,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":0,"dup":false,"k":116,"u_out":0.540679,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":2,"dup":false,"k":117,"u_out":0.327363,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":2,"dup":false,"k":118,"u_out":0.893568,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":5,"dup":false,"k":119,"u_out":0.98764,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":3,"dup":false,"k":120,"u_out":0.375463,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":121,"u_out":0.237241,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":5,"dup":false,"k":122,"u_out":0.810707,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":5,"dup":false,"k":123,"u_out":0.906743,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":6,"dup":false,"k":124,"u_out":0.318685,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":1,"dup":false,"k":125,"u_out":0.915339,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":126,"u_out":0.669426,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":true,"delay":1,"dup":false,"k":127,"u_out":0.976854,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":6,"dup":false,"k":128,"u_out":0.813634,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":2,"dup":false,"k":129,"u_out":0.066002,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":3,"dup":false,"k":130,"u_out":0.159756,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":2,"dup":false,"k":131,"u_out":0.504792,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":0,"dup":false,"k":132,"u_out":0.281226,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":3,"dup":false,"k":133,"u_out":0.235574,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":2,"dup":false,"k":134,"u_out":0.778278,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":true,"delay":5,"dup":false,"k":135,"u_out":0.04254,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":4,"dup":false,"k":136,"u_out":0.785372,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":1,"dup":false,"k":137,"u_out":0.346562,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":4,"dup":false,"k":138,"u_out":0.205985,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":6,"dup":false,"k":139,"u_out":0.82968,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":1,"dup":false,"k":140,"u_out":0.587229,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":4,"dup":true,"k":141,"u_out":0.961572,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":5,"dup":false,"k":142,"u_out":0.739026,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":true,"delay":4,"dup":false,"k":143,"u_out":0.912198,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":144,"u_out":0.760831,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":5,"dup":false,"k":145,"u_out":0.557187,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":5,"dup":false,"k":146,"u_out":0.209977,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":1,"dup":false,"k":147,"u_out":0.21657,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":3,"dup":false,"k":148,"u_out":0.301729,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":2,"dup":false,"k":149,"u_out":0.8265,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":3,"dup":false,"k":150,"u_out":0.423667,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":3,"dup":false,"k":151,"u_out":0.78718,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":0,"dup":true,"k":152,"u_out":0.471326,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":2,"dup":false,"k":153,"u_out":0.147784,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":4,"dup":false,"k":154,"u_out":0.173168,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":6,"dup":false,"k":155,"u_out":0.858779,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":5,"dup":false,"k":156,"u_out":0.733692,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":2,"dup":false,"k":157,"u_out":0.694863,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":2,"dup":false,"k":158,"u_out":0.683075,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":1,"dup":false,"k":159,"u_out":0.624037,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":3,"dup":false,"k":160,"u_out":0.840943,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":0,"dup":false,"k":161,"u_out":0.567783,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":3,"dup":false,"k":162,"u_out":0.777438,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":true,"delay":1,"dup":false,"k":163,"u_out":0.270187,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":4,"dup":false,"k":164,"u_out":0.944304,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":3,"dup":true,"k":165,"u_out":0.01795,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":1,"dup":false,"k":166,"u_out":0.361809,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":3,"dup":false,"k":167,"u_out":0.895316,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":1,"dup":false,"k":168,"u_out":0.538743,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":5,"dup":true,"k":169,"u_out":0.678089,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":6,"dup":false,"k":170,"u_out":0.455114,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":4,"dup":false,"k":171,"u_out":0.765572,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":0,"dup":false,"k":172,"u_out":0.004175,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":3,"dup":false,"k":173,"u_out":0.84536,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":1,"dup":false,"k":174,"u_out":0.078946,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":true,"delay":6,"dup":false,"k":175,"u_out":0.532887,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":6,"dup":false,"k":176,"u_out":0.666433,"unknown":true,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":4,"dup":false,"k":177,"u_out":0.840337,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":3,"dup":false,"k":178,"u_out":0.56559,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":true,"delay":0,"dup":false,"k":179,"u_out":0.867135,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":true,"delay":6,"dup":false,"k":180,"u_out":0.042774,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":1,"dup":false,"k":181,"u_out":0.676719,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":6,"dup":false,"k":182,"u_out":0.578927,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":1,"dup":false,"k":183,"u_out":0.332864,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":3,"dup":false,"k":184,"u_out":0.387204,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":1,"dup":false,"k":185,"u_out":0.846196,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":6,"dup":false,"k":186,"u_out":0.230458,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":2,"dup":false,"k":187,"u_out":0.537837,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":1,"dup":false,"k":188,"u_out":0.096006,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":4,"dup":false,"k":189,"u_out":0.238595,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":6,"dup":false,"k":190,"u_out":0.84283,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":0,"dup":false,"k":191,"u_out":0.784037,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":2,"dup":false,"k":192,"u_out":0.079411,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":0,"dup":true,"k":193,"u_out":0.510542,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":2,"dup":false,"k":194,"u_out":0.452304,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":true,"delay":3,"dup":false,"k":195,"u_out":0.96257,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":5,"dup":false,"k":196,"u_out":0.482849,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":3,"dup":false,"k":197,"u_out":0.176258,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":true,"delay":4,"dup":false,"k":198,"u_out":0.342648,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":0,"dup":false,"k":199,"u_out":0.098607,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":3,"dup":false,"k":200,"u_out":0.606987,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":201,"u_out":0.925153,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":2,"dup":false,"k":202,"u_out":0.917175,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":3,"dup":false,"k":203,"u_out":0.867186,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":6,"dup":false,"k":204,"u_out":0.255682,"unknown":true,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":3,"dup":false,"k":205,"u_out":0.809279,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":206,"u_out":0.728613,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":5,"dup":false,"k":207,"u_out":0.580553,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":true,"delay":2,"dup":false,"k":208,"u_out":0.737751,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":2,"dup":false,"k":209,"u_out":0.779065,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":0,"dup":false,"k":210,"u_out":0.336148,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":0,"dup":false,"k":211,"u_out":0.557675,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":0,"dup":false,"k":212,"u_out":0.088334,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":5,"dup":false,"k":213,"u_out":0.460382,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":1,"dup":false,"k":214,"u_out":0.755476,"unknown":true,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":6,"dup":false,"k":215,"u_out":0.440531,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":3,"dup":false,"k":216,"u_out":0.377238,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":5,"dup":false,"k":217,"u_out":0.681003,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":218,"u_out":0.843386,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":0,"dup":false,"k":219,"u_out":0.860661,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":1,"dup":false,"k":220,"u_out":0.059958,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":4,"dup":false,"k":221,"u_out":0.388107,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":1,"dup":false,"k":222,"u_out":0.386507,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":5,"dup":false,"k":223,"u_out":0.65137,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":4,"dup":false,"k":224,"u_out":0.299414,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":3,"dup":false,"k":225,"u_out":0.461039,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":5,"dup":false,"k":226,"u_out":0.68357,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":4,"dup":false,"k":227,"u_out":0.713123,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":6,"dup":false,"k":228,"u_out":0.616984,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":6,"dup":false,"k":229,"u_out":0.246349,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":1,"dup":false,"k":230,"u_out":0.636681,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":0,"dup":false,"k":231,"u_out":0.39491,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":0,"dup":true,"k":232,"u_out":0.796391,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":6,"dup":false,"k":233,"u_out":0.890978,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":5,"dup":false,"k":234,"u_out":0.2314,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":4,"dup":false,"k":235,"u_out":0.136414,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":1,"dup":false,"k":236,"u_out":0.611637,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":4,"dup":false,"k":237,"u_out":0.423281,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":238,"u_out":0.56463,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":1,"dup":false,"k":239,"u_out":0.849439,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":0,"dup":false,"k":240,"u_out":0.21632,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":3,"dup":false,"k":241,"u_out":0.583713,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":true,"delay":1,"dup":false,"k":242,"u_out":0.223873,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":243,"u_out":0.003664,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":5,"dup":false,"k":244,"u_out":0.631637,"unknown":true,"unknown_good":true} +{"blast":0.47,"cancel":true,"delay":2,"dup":false,"k":245,"u_out":0.42975,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":2,"dup":false,"k":246,"u_out":0.859542,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":0,"dup":false,"k":247,"u_out":0.692486,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":1,"dup":false,"k":248,"u_out":0.909281,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":1,"dup":false,"k":249,"u_out":0.721482,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":true,"delay":6,"dup":false,"k":250,"u_out":0.780117,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":2,"dup":false,"k":251,"u_out":0.294124,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":6,"dup":false,"k":252,"u_out":0.240087,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":4,"dup":false,"k":253,"u_out":0.703319,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":2,"dup":false,"k":254,"u_out":0.681438,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":4,"dup":false,"k":255,"u_out":0.5681,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":6,"dup":false,"k":256,"u_out":0.154931,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":257,"u_out":0.097912,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":3,"dup":false,"k":258,"u_out":0.345745,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":3,"dup":false,"k":259,"u_out":0.512453,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":6,"dup":false,"k":260,"u_out":0.221602,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":2,"dup":true,"k":261,"u_out":0.083083,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":3,"dup":false,"k":262,"u_out":0.111741,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":2,"dup":false,"k":263,"u_out":0.178214,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":1,"dup":false,"k":264,"u_out":0.058887,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":true,"delay":1,"dup":false,"k":265,"u_out":0.2191,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":5,"dup":false,"k":266,"u_out":0.239739,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":true,"delay":3,"dup":false,"k":267,"u_out":0.2076,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":0,"dup":false,"k":268,"u_out":0.832816,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":1,"dup":false,"k":269,"u_out":0.850514,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":5,"dup":false,"k":270,"u_out":0.680119,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":5,"dup":false,"k":271,"u_out":0.440487,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":4,"dup":false,"k":272,"u_out":0.807522,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":3,"dup":false,"k":273,"u_out":0.31935,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":0,"dup":false,"k":274,"u_out":0.36621,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":true,"delay":4,"dup":false,"k":275,"u_out":0.192937,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":1,"dup":false,"k":276,"u_out":0.03477,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":2,"dup":false,"k":277,"u_out":0.810233,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":2,"dup":false,"k":278,"u_out":0.031148,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":4,"dup":false,"k":279,"u_out":0.780029,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":6,"dup":false,"k":280,"u_out":0.661133,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":0,"dup":false,"k":281,"u_out":0.22809,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":0,"dup":false,"k":282,"u_out":0.126447,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":3,"dup":false,"k":283,"u_out":0.424968,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":3,"dup":false,"k":284,"u_out":0.392686,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":2,"dup":false,"k":285,"u_out":0.026572,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":true,"delay":1,"dup":false,"k":286,"u_out":0.356846,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":4,"dup":false,"k":287,"u_out":0.281621,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":3,"dup":false,"k":288,"u_out":0.052818,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":6,"dup":true,"k":289,"u_out":0.998458,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":3,"dup":false,"k":290,"u_out":0.039159,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":291,"u_out":0.810436,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":0,"dup":false,"k":292,"u_out":0.12398,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":1,"dup":false,"k":293,"u_out":0.540381,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":5,"dup":false,"k":294,"u_out":0.549618,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":4,"dup":false,"k":295,"u_out":0.55031,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":6,"dup":false,"k":296,"u_out":0.560844,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":5,"dup":false,"k":297,"u_out":0.620992,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":1,"dup":false,"k":298,"u_out":0.773446,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":4,"dup":false,"k":299,"u_out":0.740287,"unknown":false,"unknown_good":false} diff --git a/bench/individuality/fixtures/credit/draws-3.jsonl b/bench/individuality/fixtures/credit/draws-3.jsonl new file mode 100644 index 0000000..2c3a180 --- /dev/null +++ b/bench/individuality/fixtures/credit/draws-3.jsonl @@ -0,0 +1,300 @@ +{"blast":0.35,"cancel":false,"delay":5,"dup":false,"k":0,"u_out":0.35999,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":true,"delay":4,"dup":false,"k":1,"u_out":0.502002,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":0,"dup":false,"k":2,"u_out":0.898616,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":1,"dup":true,"k":3,"u_out":0.552496,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":1,"dup":false,"k":4,"u_out":0.267856,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":6,"dup":false,"k":5,"u_out":0.454211,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":0,"dup":false,"k":6,"u_out":0.250666,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":7,"u_out":0.51091,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":3,"dup":false,"k":8,"u_out":0.239599,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":4,"dup":false,"k":9,"u_out":0.395975,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":5,"dup":false,"k":10,"u_out":0.341755,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":1,"dup":false,"k":11,"u_out":0.596866,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":true,"delay":2,"dup":false,"k":12,"u_out":0.942021,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":0,"dup":false,"k":13,"u_out":0.006604,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":true,"delay":4,"dup":false,"k":14,"u_out":0.167799,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":3,"dup":false,"k":15,"u_out":0.679429,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":4,"dup":false,"k":16,"u_out":0.085782,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":0,"dup":true,"k":17,"u_out":0.230254,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":1,"dup":false,"k":18,"u_out":0.965725,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":6,"dup":false,"k":19,"u_out":0.075671,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":0,"dup":false,"k":20,"u_out":0.422452,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":6,"dup":false,"k":21,"u_out":0.396376,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":true,"delay":6,"dup":false,"k":22,"u_out":0.040208,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":5,"dup":false,"k":23,"u_out":0.242562,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":0,"dup":false,"k":24,"u_out":0.166689,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":4,"dup":false,"k":25,"u_out":0.18573,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":6,"dup":false,"k":26,"u_out":0.471023,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":6,"dup":false,"k":27,"u_out":0.111126,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":3,"dup":false,"k":28,"u_out":0.39084,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":29,"u_out":0.546095,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":4,"dup":false,"k":30,"u_out":0.587292,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":2,"dup":false,"k":31,"u_out":0.190993,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":5,"dup":false,"k":32,"u_out":0.399314,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":1,"dup":false,"k":33,"u_out":0.584451,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":0,"dup":false,"k":34,"u_out":0.545115,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":6,"dup":false,"k":35,"u_out":0.739505,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":6,"dup":false,"k":36,"u_out":0.406283,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":4,"dup":false,"k":37,"u_out":0.285733,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":1,"dup":false,"k":38,"u_out":0.01499,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":2,"dup":false,"k":39,"u_out":0.022704,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":1,"dup":false,"k":40,"u_out":0.3784,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":4,"dup":false,"k":41,"u_out":0.458903,"unknown":true,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":1,"dup":false,"k":42,"u_out":0.852984,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":3,"dup":false,"k":43,"u_out":0.519755,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":2,"dup":false,"k":44,"u_out":0.836826,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":0,"dup":false,"k":45,"u_out":0.585381,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":46,"u_out":0.428358,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":4,"dup":false,"k":47,"u_out":0.039565,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":3,"dup":false,"k":48,"u_out":0.006912,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":0,"dup":false,"k":49,"u_out":0.012974,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":6,"dup":false,"k":50,"u_out":0.088368,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":true,"delay":1,"dup":false,"k":51,"u_out":0.834886,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":0,"dup":false,"k":52,"u_out":0.871139,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":true,"delay":0,"dup":false,"k":53,"u_out":0.186971,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":6,"dup":false,"k":54,"u_out":0.346279,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":2,"dup":false,"k":55,"u_out":0.962138,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":2,"dup":false,"k":56,"u_out":0.754075,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":4,"dup":false,"k":57,"u_out":0.924101,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":3,"dup":false,"k":58,"u_out":0.935479,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":0,"dup":false,"k":59,"u_out":0.649461,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":true,"delay":2,"dup":false,"k":60,"u_out":0.30835,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":0,"dup":false,"k":61,"u_out":0.625207,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":6,"dup":false,"k":62,"u_out":0.331758,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":1,"dup":false,"k":63,"u_out":0.757646,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":0,"dup":false,"k":64,"u_out":0.372414,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":6,"dup":false,"k":65,"u_out":0.318833,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":1,"dup":false,"k":66,"u_out":0.888523,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":2,"dup":false,"k":67,"u_out":0.480144,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":3,"dup":false,"k":68,"u_out":0.519031,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":69,"u_out":0.592266,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":2,"dup":false,"k":70,"u_out":0.176116,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":2,"dup":false,"k":71,"u_out":0.418599,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":1,"dup":false,"k":72,"u_out":0.680886,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":6,"dup":false,"k":73,"u_out":0.821338,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":6,"dup":false,"k":74,"u_out":0.567712,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":5,"dup":false,"k":75,"u_out":0.774683,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":1,"dup":false,"k":76,"u_out":0.61302,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":true,"delay":3,"dup":false,"k":77,"u_out":0.840272,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":true,"delay":3,"dup":false,"k":78,"u_out":0.927917,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":true,"delay":5,"dup":false,"k":79,"u_out":0.3677,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":80,"u_out":0.900318,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":4,"dup":false,"k":81,"u_out":0.669407,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":2,"dup":false,"k":82,"u_out":0.683646,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":3,"dup":false,"k":83,"u_out":0.69078,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":6,"dup":false,"k":84,"u_out":0.759409,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":2,"dup":false,"k":85,"u_out":0.456549,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":4,"dup":false,"k":86,"u_out":0.275552,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":true,"delay":1,"dup":false,"k":87,"u_out":0.11179,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":1,"dup":false,"k":88,"u_out":0.763109,"unknown":true,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":3,"dup":false,"k":89,"u_out":0.909623,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":90,"u_out":0.304496,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":1,"dup":false,"k":91,"u_out":0.147807,"unknown":true,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":0,"dup":false,"k":92,"u_out":0.14818,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":3,"dup":false,"k":93,"u_out":0.118905,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":5,"dup":false,"k":94,"u_out":0.775493,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":4,"dup":false,"k":95,"u_out":0.442071,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":3,"dup":false,"k":96,"u_out":0.218579,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":2,"dup":true,"k":97,"u_out":0.752254,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":3,"dup":false,"k":98,"u_out":0.072604,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":99,"u_out":0.55742,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":5,"dup":false,"k":100,"u_out":0.5099,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":4,"dup":false,"k":101,"u_out":0.736378,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":0,"dup":false,"k":102,"u_out":0.237575,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":3,"dup":false,"k":103,"u_out":0.027769,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":2,"dup":false,"k":104,"u_out":0.565073,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":2,"dup":false,"k":105,"u_out":0.327012,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":6,"dup":false,"k":106,"u_out":0.024594,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":5,"dup":false,"k":107,"u_out":0.060709,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":2,"dup":false,"k":108,"u_out":0.527662,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":2,"dup":false,"k":109,"u_out":0.749794,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":110,"u_out":0.696719,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":1,"dup":false,"k":111,"u_out":0.943918,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":true,"delay":3,"dup":false,"k":112,"u_out":0.629702,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":2,"dup":false,"k":113,"u_out":0.311669,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":3,"dup":false,"k":114,"u_out":0.126798,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":4,"dup":false,"k":115,"u_out":0.786846,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":1,"dup":false,"k":116,"u_out":0.546196,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":6,"dup":false,"k":117,"u_out":0.33665,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":6,"dup":false,"k":118,"u_out":0.519908,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":2,"dup":false,"k":119,"u_out":0.726087,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":0,"dup":false,"k":120,"u_out":0.559866,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":1,"dup":false,"k":121,"u_out":0.776775,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":0,"dup":false,"k":122,"u_out":0.809171,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":0,"dup":false,"k":123,"u_out":0.129251,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":5,"dup":false,"k":124,"u_out":0.84157,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":2,"dup":false,"k":125,"u_out":0.724869,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":6,"dup":false,"k":126,"u_out":0.730204,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":3,"dup":false,"k":127,"u_out":0.904422,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":3,"dup":false,"k":128,"u_out":0.869352,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":0,"dup":false,"k":129,"u_out":0.795659,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":5,"dup":false,"k":130,"u_out":0.287338,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":2,"dup":false,"k":131,"u_out":0.409492,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":5,"dup":false,"k":132,"u_out":0.655861,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":3,"dup":false,"k":133,"u_out":0.729786,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":2,"dup":false,"k":134,"u_out":0.671019,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":2,"dup":false,"k":135,"u_out":0.64159,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":5,"dup":false,"k":136,"u_out":0.251597,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":3,"dup":false,"k":137,"u_out":0.042946,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":3,"dup":false,"k":138,"u_out":0.952845,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":5,"dup":false,"k":139,"u_out":0.520976,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":true,"delay":2,"dup":false,"k":140,"u_out":0.223295,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":2,"dup":false,"k":141,"u_out":0.858151,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":1,"dup":false,"k":142,"u_out":0.28369,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":1,"dup":false,"k":143,"u_out":0.7452,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":3,"dup":false,"k":144,"u_out":0.891111,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":true,"delay":1,"dup":false,"k":145,"u_out":0.373077,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":2,"dup":false,"k":146,"u_out":0.933751,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":5,"dup":false,"k":147,"u_out":0.671725,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":4,"dup":false,"k":148,"u_out":0.795483,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":1,"dup":false,"k":149,"u_out":0.895138,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":0,"dup":false,"k":150,"u_out":0.938489,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":2,"dup":false,"k":151,"u_out":0.681803,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":1,"dup":false,"k":152,"u_out":0.290169,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":0,"dup":false,"k":153,"u_out":0.57279,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":6,"dup":false,"k":154,"u_out":0.010352,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":1,"dup":false,"k":155,"u_out":0.984349,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":156,"u_out":0.564888,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":5,"dup":false,"k":157,"u_out":0.454398,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":4,"dup":false,"k":158,"u_out":0.900073,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":2,"dup":false,"k":159,"u_out":0.669187,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":true,"delay":1,"dup":false,"k":160,"u_out":0.486534,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":4,"dup":false,"k":161,"u_out":0.7573,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":6,"dup":true,"k":162,"u_out":0.608587,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":5,"dup":false,"k":163,"u_out":0.732033,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":4,"dup":false,"k":164,"u_out":0.03799,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":4,"dup":false,"k":165,"u_out":0.125902,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":4,"dup":false,"k":166,"u_out":0.553362,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":6,"dup":false,"k":167,"u_out":0.789686,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":true,"delay":1,"dup":false,"k":168,"u_out":0.50566,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":0,"dup":false,"k":169,"u_out":0.729339,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":4,"dup":true,"k":170,"u_out":0.874704,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":3,"dup":false,"k":171,"u_out":0.229848,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":1,"dup":false,"k":172,"u_out":0.804182,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":true,"delay":1,"dup":false,"k":173,"u_out":0.71393,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":true,"delay":1,"dup":false,"k":174,"u_out":0.581778,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":true,"delay":2,"dup":false,"k":175,"u_out":0.660585,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":0,"dup":false,"k":176,"u_out":0.369103,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":1,"dup":false,"k":177,"u_out":0.152728,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":2,"dup":false,"k":178,"u_out":0.814927,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":true,"delay":5,"dup":false,"k":179,"u_out":0.10232,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":6,"dup":false,"k":180,"u_out":0.190619,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":6,"dup":false,"k":181,"u_out":0.465733,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":2,"dup":true,"k":182,"u_out":0.627761,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":1,"dup":false,"k":183,"u_out":0.833144,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":5,"dup":true,"k":184,"u_out":0.077123,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":0,"dup":false,"k":185,"u_out":0.871809,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":4,"dup":true,"k":186,"u_out":0.029829,"unknown":false,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":2,"dup":false,"k":187,"u_out":0.722784,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":2,"dup":false,"k":188,"u_out":0.717879,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":3,"dup":false,"k":189,"u_out":0.849251,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":0,"dup":false,"k":190,"u_out":0.407532,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":6,"dup":false,"k":191,"u_out":0.701528,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":true,"delay":2,"dup":false,"k":192,"u_out":0.43628,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":true,"delay":5,"dup":false,"k":193,"u_out":0.179317,"unknown":true,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":1,"dup":true,"k":194,"u_out":0.687412,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":2,"dup":true,"k":195,"u_out":0.503448,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":3,"dup":false,"k":196,"u_out":0.227876,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":3,"dup":false,"k":197,"u_out":0.185118,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":4,"dup":false,"k":198,"u_out":0.479929,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":199,"u_out":0.370492,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":0,"dup":false,"k":200,"u_out":0.198112,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":2,"dup":false,"k":201,"u_out":0.727026,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":true,"delay":2,"dup":false,"k":202,"u_out":0.636649,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":true,"delay":3,"dup":false,"k":203,"u_out":0.635134,"unknown":true,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":6,"dup":false,"k":204,"u_out":0.138408,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":205,"u_out":0.840956,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":5,"dup":false,"k":206,"u_out":0.884911,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":true,"delay":6,"dup":false,"k":207,"u_out":0.661317,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":1,"dup":false,"k":208,"u_out":0.060699,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":209,"u_out":0.664714,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":0,"dup":false,"k":210,"u_out":0.982518,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":6,"dup":false,"k":211,"u_out":0.440361,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":4,"dup":false,"k":212,"u_out":0.014886,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":3,"dup":false,"k":213,"u_out":0.381326,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":true,"delay":5,"dup":false,"k":214,"u_out":0.62246,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":1,"dup":false,"k":215,"u_out":0.728109,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":0,"dup":false,"k":216,"u_out":0.122502,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":true,"delay":3,"dup":false,"k":217,"u_out":0.338315,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":4,"dup":false,"k":218,"u_out":0.751529,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":5,"dup":false,"k":219,"u_out":0.97519,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":5,"dup":false,"k":220,"u_out":0.422782,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":4,"dup":false,"k":221,"u_out":0.014364,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":5,"dup":false,"k":222,"u_out":0.543646,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":4,"dup":false,"k":223,"u_out":0.380164,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":5,"dup":false,"k":224,"u_out":0.888969,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":2,"dup":false,"k":225,"u_out":0.509968,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":6,"dup":false,"k":226,"u_out":0.13711,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":2,"dup":false,"k":227,"u_out":0.554592,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":3,"dup":false,"k":228,"u_out":0.595303,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":6,"dup":false,"k":229,"u_out":0.796155,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":230,"u_out":0.455593,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":5,"dup":false,"k":231,"u_out":0.801452,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":3,"dup":false,"k":232,"u_out":0.554197,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":true,"delay":5,"dup":false,"k":233,"u_out":0.254351,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":true,"delay":5,"dup":false,"k":234,"u_out":0.43562,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":6,"dup":false,"k":235,"u_out":0.222563,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":3,"dup":false,"k":236,"u_out":0.587902,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":1,"dup":false,"k":237,"u_out":0.898978,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":true,"delay":4,"dup":true,"k":238,"u_out":0.572665,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":false,"delay":6,"dup":false,"k":239,"u_out":0.254963,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":4,"dup":false,"k":240,"u_out":0.205336,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":4,"dup":false,"k":241,"u_out":0.128054,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":4,"dup":false,"k":242,"u_out":0.60032,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":3,"dup":false,"k":243,"u_out":0.76012,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":5,"dup":false,"k":244,"u_out":0.007,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":245,"u_out":0.310183,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":0,"dup":false,"k":246,"u_out":0.691607,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":4,"dup":false,"k":247,"u_out":0.993483,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":3,"dup":false,"k":248,"u_out":0.150209,"unknown":true,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":4,"dup":true,"k":249,"u_out":0.474234,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":true,"delay":5,"dup":false,"k":250,"u_out":0.324047,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":6,"dup":false,"k":251,"u_out":0.843916,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":true,"delay":4,"dup":false,"k":252,"u_out":0.646493,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":1,"dup":false,"k":253,"u_out":0.746505,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":true,"delay":4,"dup":true,"k":254,"u_out":0.3984,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":6,"dup":false,"k":255,"u_out":0.476447,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":6,"dup":false,"k":256,"u_out":0.381403,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":0,"dup":false,"k":257,"u_out":0.487576,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":6,"dup":false,"k":258,"u_out":0.106785,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":0,"dup":false,"k":259,"u_out":0.066821,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":2,"dup":false,"k":260,"u_out":0.414805,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":0,"dup":false,"k":261,"u_out":0.037042,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":2,"dup":false,"k":262,"u_out":0.62411,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":true,"delay":6,"dup":false,"k":263,"u_out":0.432127,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":2,"dup":true,"k":264,"u_out":0.00496,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":1,"dup":false,"k":265,"u_out":0.718786,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":true,"delay":1,"dup":false,"k":266,"u_out":0.170717,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":2,"dup":false,"k":267,"u_out":0.438865,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":0,"dup":false,"k":268,"u_out":0.270936,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":false,"delay":5,"dup":false,"k":269,"u_out":0.634918,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":0,"dup":false,"k":270,"u_out":0.406956,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":1,"dup":false,"k":271,"u_out":0.43332,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":5,"dup":false,"k":272,"u_out":0.469383,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":1,"dup":false,"k":273,"u_out":0.083759,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":0,"dup":false,"k":274,"u_out":0.69269,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":true,"delay":1,"dup":false,"k":275,"u_out":0.818548,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":1,"dup":false,"k":276,"u_out":0.633071,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":2,"dup":true,"k":277,"u_out":0.22879,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":2,"dup":false,"k":278,"u_out":0.673627,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":2,"dup":false,"k":279,"u_out":0.301887,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":true,"delay":6,"dup":false,"k":280,"u_out":0.023976,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":6,"dup":false,"k":281,"u_out":0.00403,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":2,"dup":false,"k":282,"u_out":0.242505,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":283,"u_out":0.894149,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":2,"dup":false,"k":284,"u_out":0.958061,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":4,"dup":false,"k":285,"u_out":0.045144,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":0,"dup":false,"k":286,"u_out":0.9866,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":true,"delay":6,"dup":false,"k":287,"u_out":0.742633,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":4,"dup":false,"k":288,"u_out":0.698754,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":5,"dup":false,"k":289,"u_out":0.372399,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":0,"dup":false,"k":290,"u_out":0.633808,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":false,"delay":0,"dup":false,"k":291,"u_out":0.104052,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":2,"dup":false,"k":292,"u_out":0.174554,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":1,"dup":false,"k":293,"u_out":0.345906,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":2,"dup":false,"k":294,"u_out":0.564134,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":true,"delay":2,"dup":false,"k":295,"u_out":0.452897,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":5,"dup":false,"k":296,"u_out":0.943982,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":4,"dup":false,"k":297,"u_out":0.719934,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":2,"dup":false,"k":298,"u_out":0.397771,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":1,"dup":false,"k":299,"u_out":0.91522,"unknown":false,"unknown_good":true} diff --git a/bench/individuality/fixtures/credit/draws-4.jsonl b/bench/individuality/fixtures/credit/draws-4.jsonl new file mode 100644 index 0000000..ffbab77 --- /dev/null +++ b/bench/individuality/fixtures/credit/draws-4.jsonl @@ -0,0 +1,300 @@ +{"blast":0.3,"cancel":false,"delay":4,"dup":false,"k":0,"u_out":0.976107,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":2,"dup":false,"k":1,"u_out":0.774941,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":4,"dup":true,"k":2,"u_out":0.369585,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":3,"dup":false,"k":3,"u_out":0.512718,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":true,"delay":4,"dup":false,"k":4,"u_out":0.98371,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":5,"dup":false,"k":5,"u_out":0.444048,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":1,"dup":false,"k":6,"u_out":0.440101,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":6,"dup":false,"k":7,"u_out":0.985794,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":5,"dup":false,"k":8,"u_out":0.389496,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":0,"dup":false,"k":9,"u_out":0.431486,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":2,"dup":false,"k":10,"u_out":0.143365,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":3,"dup":false,"k":11,"u_out":0.701106,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":3,"dup":false,"k":12,"u_out":0.772707,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":6,"dup":false,"k":13,"u_out":0.209387,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":0,"dup":false,"k":14,"u_out":0.604841,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":2,"dup":false,"k":15,"u_out":0.763044,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":4,"dup":false,"k":16,"u_out":0.812376,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":3,"dup":false,"k":17,"u_out":0.241171,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":1,"dup":false,"k":18,"u_out":0.254859,"unknown":true,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":1,"dup":false,"k":19,"u_out":0.834899,"unknown":true,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":0,"dup":false,"k":20,"u_out":0.6686,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":4,"dup":false,"k":21,"u_out":0.071037,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":6,"dup":false,"k":22,"u_out":0.623823,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":0,"dup":false,"k":23,"u_out":0.406385,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":4,"dup":false,"k":24,"u_out":0.88285,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":4,"dup":false,"k":25,"u_out":0.900075,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":2,"dup":false,"k":26,"u_out":0.686581,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":5,"dup":false,"k":27,"u_out":0.73346,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":3,"dup":false,"k":28,"u_out":0.239552,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":true,"delay":1,"dup":false,"k":29,"u_out":0.028389,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":true,"delay":6,"dup":false,"k":30,"u_out":0.551974,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":4,"dup":false,"k":31,"u_out":0.397136,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":true,"delay":0,"dup":true,"k":32,"u_out":0.895011,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":6,"dup":false,"k":33,"u_out":0.608295,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":4,"dup":false,"k":34,"u_out":0.485786,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":0,"dup":false,"k":35,"u_out":0.73365,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":6,"dup":false,"k":36,"u_out":0.080136,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":6,"dup":false,"k":37,"u_out":0.046652,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":0,"dup":false,"k":38,"u_out":0.444727,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":4,"dup":false,"k":39,"u_out":0.818524,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":6,"dup":false,"k":40,"u_out":0.087236,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":true,"delay":2,"dup":false,"k":41,"u_out":0.726069,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":true,"delay":3,"dup":false,"k":42,"u_out":0.897923,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":5,"dup":false,"k":43,"u_out":0.666138,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":1,"dup":false,"k":44,"u_out":0.817613,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":1,"dup":false,"k":45,"u_out":0.967617,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":3,"dup":false,"k":46,"u_out":0.823601,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":0,"dup":false,"k":47,"u_out":0.749118,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":1,"dup":false,"k":48,"u_out":0.010364,"unknown":true,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":0,"dup":false,"k":49,"u_out":0.627656,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":1,"dup":false,"k":50,"u_out":0.512336,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":true,"delay":3,"dup":false,"k":51,"u_out":0.600805,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":1,"dup":false,"k":52,"u_out":0.335354,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":1,"dup":false,"k":53,"u_out":0.086629,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":6,"dup":false,"k":54,"u_out":0.103451,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":true,"delay":0,"dup":false,"k":55,"u_out":0.896111,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":true,"delay":1,"dup":false,"k":56,"u_out":0.898409,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":3,"dup":false,"k":57,"u_out":0.22332,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":0,"dup":false,"k":58,"u_out":0.506139,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":5,"dup":false,"k":59,"u_out":0.885542,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":3,"dup":false,"k":60,"u_out":0.94928,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":3,"dup":false,"k":61,"u_out":0.116313,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":5,"dup":true,"k":62,"u_out":0.061688,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":2,"dup":false,"k":63,"u_out":0.790468,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":5,"dup":false,"k":64,"u_out":0.336085,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":2,"dup":false,"k":65,"u_out":0.649808,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":2,"dup":false,"k":66,"u_out":0.902232,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":2,"dup":false,"k":67,"u_out":0.484954,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":4,"dup":false,"k":68,"u_out":0.864357,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":1,"dup":false,"k":69,"u_out":0.99012,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":5,"dup":false,"k":70,"u_out":0.984875,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":true,"delay":5,"dup":false,"k":71,"u_out":0.420982,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":4,"dup":false,"k":72,"u_out":0.008153,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":1,"dup":false,"k":73,"u_out":0.356882,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":5,"dup":false,"k":74,"u_out":0.901412,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":2,"dup":false,"k":75,"u_out":0.578279,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":76,"u_out":0.0741,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":5,"dup":false,"k":77,"u_out":0.811696,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":0,"dup":false,"k":78,"u_out":0.72444,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":5,"dup":false,"k":79,"u_out":0.710959,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":1,"dup":false,"k":80,"u_out":0.04383,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":1,"dup":false,"k":81,"u_out":0.378425,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":4,"dup":false,"k":82,"u_out":0.229838,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":3,"dup":false,"k":83,"u_out":0.246005,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":6,"dup":false,"k":84,"u_out":0.654192,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":3,"dup":false,"k":85,"u_out":0.374384,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":6,"dup":false,"k":86,"u_out":0.846363,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":true,"delay":0,"dup":false,"k":87,"u_out":0.470817,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":6,"dup":false,"k":88,"u_out":0.125066,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":6,"dup":false,"k":89,"u_out":0.59505,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":4,"dup":false,"k":90,"u_out":0.038541,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":0,"dup":false,"k":91,"u_out":0.931647,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":5,"dup":false,"k":92,"u_out":0.920359,"unknown":true,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":4,"dup":false,"k":93,"u_out":0.109824,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":5,"dup":true,"k":94,"u_out":0.123604,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":4,"dup":false,"k":95,"u_out":0.385476,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":5,"dup":false,"k":96,"u_out":0.021283,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":6,"dup":false,"k":97,"u_out":0.819809,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":4,"dup":false,"k":98,"u_out":0.437287,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":3,"dup":false,"k":99,"u_out":0.823601,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":3,"dup":true,"k":100,"u_out":0.750969,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":3,"dup":true,"k":101,"u_out":0.926266,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":0,"dup":false,"k":102,"u_out":0.015184,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":2,"dup":false,"k":103,"u_out":0.306081,"unknown":true,"unknown_good":false} +{"blast":0.59,"cancel":true,"delay":1,"dup":false,"k":104,"u_out":0.250197,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":0,"dup":false,"k":105,"u_out":0.521025,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":5,"dup":false,"k":106,"u_out":0.741816,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":4,"dup":false,"k":107,"u_out":0.26471,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":true,"delay":4,"dup":false,"k":108,"u_out":0.744163,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":4,"dup":false,"k":109,"u_out":0.646496,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":2,"dup":false,"k":110,"u_out":0.736799,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":2,"dup":false,"k":111,"u_out":0.03285,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":true,"delay":2,"dup":false,"k":112,"u_out":0.532496,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":5,"dup":false,"k":113,"u_out":0.682921,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":3,"dup":false,"k":114,"u_out":0.737724,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":5,"dup":false,"k":115,"u_out":0.791767,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":0,"dup":false,"k":116,"u_out":0.451407,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":5,"dup":false,"k":117,"u_out":0.003651,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":5,"dup":false,"k":118,"u_out":0.339101,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":4,"dup":false,"k":119,"u_out":0.300086,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":0,"dup":false,"k":120,"u_out":0.725616,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":3,"dup":false,"k":121,"u_out":0.821166,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":1,"dup":false,"k":122,"u_out":0.908031,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":3,"dup":false,"k":123,"u_out":0.460916,"unknown":false,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":4,"dup":true,"k":124,"u_out":0.090052,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":true,"delay":5,"dup":false,"k":125,"u_out":0.25964,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":5,"dup":false,"k":126,"u_out":0.447391,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":3,"dup":false,"k":127,"u_out":0.123181,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":3,"dup":false,"k":128,"u_out":0.062099,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":2,"dup":false,"k":129,"u_out":0.275145,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":0,"dup":false,"k":130,"u_out":0.302995,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":1,"dup":false,"k":131,"u_out":0.763329,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":5,"dup":false,"k":132,"u_out":0.63889,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":3,"dup":false,"k":133,"u_out":0.423843,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":0,"dup":false,"k":134,"u_out":0.440155,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":2,"dup":false,"k":135,"u_out":0.641396,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":4,"dup":false,"k":136,"u_out":0.137424,"unknown":true,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":5,"dup":false,"k":137,"u_out":0.850548,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":4,"dup":false,"k":138,"u_out":0.673551,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":2,"dup":false,"k":139,"u_out":0.692439,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":6,"dup":false,"k":140,"u_out":0.38005,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":2,"dup":false,"k":141,"u_out":0.132921,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":142,"u_out":0.830235,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":4,"dup":false,"k":143,"u_out":0.220448,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":2,"dup":false,"k":144,"u_out":0.526722,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":1,"dup":false,"k":145,"u_out":0.919883,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":4,"dup":false,"k":146,"u_out":0.085949,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":6,"dup":false,"k":147,"u_out":0.710191,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":2,"dup":false,"k":148,"u_out":0.035211,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":2,"dup":false,"k":149,"u_out":0.444686,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":3,"dup":false,"k":150,"u_out":0.184973,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":0,"dup":false,"k":151,"u_out":0.70602,"unknown":true,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":0,"dup":false,"k":152,"u_out":0.79664,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":1,"dup":false,"k":153,"u_out":0.612114,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":0,"dup":false,"k":154,"u_out":0.142352,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":0,"dup":false,"k":155,"u_out":0.370129,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":1,"dup":false,"k":156,"u_out":0.919795,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":0,"dup":false,"k":157,"u_out":0.246368,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":3,"dup":false,"k":158,"u_out":0.779789,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":true,"delay":6,"dup":false,"k":159,"u_out":0.684783,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":4,"dup":false,"k":160,"u_out":0.092352,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":true,"delay":6,"dup":false,"k":161,"u_out":0.750369,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":0,"dup":true,"k":162,"u_out":0.061732,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":163,"u_out":0.759085,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":true,"delay":2,"dup":false,"k":164,"u_out":0.863636,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":6,"dup":false,"k":165,"u_out":0.228348,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":1,"dup":false,"k":166,"u_out":0.545434,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":0,"dup":false,"k":167,"u_out":0.250864,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":2,"dup":false,"k":168,"u_out":0.690138,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":0,"dup":false,"k":169,"u_out":0.736179,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":5,"dup":false,"k":170,"u_out":0.405167,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":1,"dup":true,"k":171,"u_out":0.575211,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":1,"dup":false,"k":172,"u_out":0.007942,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":4,"dup":false,"k":173,"u_out":0.199283,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":3,"dup":false,"k":174,"u_out":0.887421,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":5,"dup":false,"k":175,"u_out":0.848332,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":0,"dup":true,"k":176,"u_out":0.01122,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":5,"dup":false,"k":177,"u_out":0.712126,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":6,"dup":false,"k":178,"u_out":0.261171,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":1,"dup":false,"k":179,"u_out":0.586563,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":4,"dup":false,"k":180,"u_out":0.335773,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":2,"dup":false,"k":181,"u_out":0.265831,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":6,"dup":false,"k":182,"u_out":0.344857,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":true,"delay":4,"dup":false,"k":183,"u_out":0.406147,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":1,"dup":true,"k":184,"u_out":0.321757,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":6,"dup":false,"k":185,"u_out":0.042913,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":3,"dup":false,"k":186,"u_out":0.352186,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":6,"dup":false,"k":187,"u_out":0.041667,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":1,"dup":false,"k":188,"u_out":0.524303,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":4,"dup":false,"k":189,"u_out":0.19521,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":5,"dup":false,"k":190,"u_out":0.270668,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":0,"dup":false,"k":191,"u_out":0.511957,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":2,"dup":false,"k":192,"u_out":0.25032,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":1,"dup":false,"k":193,"u_out":0.071085,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":0,"dup":true,"k":194,"u_out":0.67724,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":0,"dup":false,"k":195,"u_out":0.057237,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":1,"dup":false,"k":196,"u_out":0.31759,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":197,"u_out":0.928437,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":6,"dup":false,"k":198,"u_out":0.065094,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":3,"dup":false,"k":199,"u_out":0.445241,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":4,"dup":false,"k":200,"u_out":0.779143,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":4,"dup":false,"k":201,"u_out":0.107357,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":0,"dup":true,"k":202,"u_out":0.438537,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":2,"dup":true,"k":203,"u_out":0.615615,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":0,"dup":false,"k":204,"u_out":0.635303,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":2,"dup":false,"k":205,"u_out":0.563275,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":0,"dup":false,"k":206,"u_out":0.4755,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":2,"dup":true,"k":207,"u_out":0.366366,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":1,"dup":false,"k":208,"u_out":0.656809,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":4,"dup":false,"k":209,"u_out":0.500344,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":1,"dup":false,"k":210,"u_out":0.934336,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":3,"dup":false,"k":211,"u_out":0.767515,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":1,"dup":false,"k":212,"u_out":0.641989,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":4,"dup":false,"k":213,"u_out":0.733427,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":4,"dup":false,"k":214,"u_out":0.11573,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":3,"dup":false,"k":215,"u_out":0.23072,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":true,"delay":1,"dup":false,"k":216,"u_out":0.229071,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":3,"dup":false,"k":217,"u_out":0.381363,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":1,"dup":false,"k":218,"u_out":0.023585,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":1,"dup":false,"k":219,"u_out":0.510238,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":0,"dup":false,"k":220,"u_out":0.451104,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":true,"delay":0,"dup":false,"k":221,"u_out":0.316542,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":5,"dup":false,"k":222,"u_out":0.4237,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":0,"dup":false,"k":223,"u_out":0.339898,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":6,"dup":false,"k":224,"u_out":0.058099,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":6,"dup":false,"k":225,"u_out":0.838456,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":true,"delay":3,"dup":false,"k":226,"u_out":0.084433,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":6,"dup":false,"k":227,"u_out":0.600511,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":5,"dup":false,"k":228,"u_out":0.491291,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":3,"dup":false,"k":229,"u_out":0.434369,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":1,"dup":false,"k":230,"u_out":0.062834,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":5,"dup":false,"k":231,"u_out":0.691952,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":2,"dup":false,"k":232,"u_out":0.961317,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":3,"dup":false,"k":233,"u_out":0.115474,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":4,"dup":false,"k":234,"u_out":0.265764,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":2,"dup":false,"k":235,"u_out":0.502218,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":3,"dup":false,"k":236,"u_out":0.741135,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":5,"dup":false,"k":237,"u_out":0.246289,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":3,"dup":false,"k":238,"u_out":0.599524,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":1,"dup":false,"k":239,"u_out":0.165148,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":4,"dup":false,"k":240,"u_out":0.130796,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":2,"dup":false,"k":241,"u_out":0.850779,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":2,"dup":false,"k":242,"u_out":0.473194,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":6,"dup":false,"k":243,"u_out":0.662899,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":2,"dup":false,"k":244,"u_out":0.273891,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":2,"dup":false,"k":245,"u_out":0.998754,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":5,"dup":false,"k":246,"u_out":0.046649,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":1,"dup":false,"k":247,"u_out":0.409776,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":3,"dup":false,"k":248,"u_out":0.592855,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":3,"dup":false,"k":249,"u_out":0.864794,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":3,"dup":false,"k":250,"u_out":0.643145,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":5,"dup":false,"k":251,"u_out":0.038345,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":true,"delay":4,"dup":false,"k":252,"u_out":0.180368,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":5,"dup":false,"k":253,"u_out":0.656187,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":3,"dup":false,"k":254,"u_out":0.784404,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":2,"dup":false,"k":255,"u_out":0.117024,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":6,"dup":false,"k":256,"u_out":0.85171,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":true,"delay":6,"dup":false,"k":257,"u_out":0.23429,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":2,"dup":false,"k":258,"u_out":0.315291,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":6,"dup":false,"k":259,"u_out":0.841737,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":4,"dup":false,"k":260,"u_out":0.637281,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":5,"dup":false,"k":261,"u_out":0.535863,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":true,"delay":5,"dup":false,"k":262,"u_out":0.600663,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":4,"dup":false,"k":263,"u_out":0.723121,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":true,"delay":4,"dup":false,"k":264,"u_out":0.283292,"unknown":true,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":4,"dup":false,"k":265,"u_out":0.560074,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":3,"dup":false,"k":266,"u_out":0.26612,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":1,"dup":false,"k":267,"u_out":0.899985,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":1,"dup":false,"k":268,"u_out":0.595079,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":true,"delay":2,"dup":false,"k":269,"u_out":0.366143,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":4,"dup":false,"k":270,"u_out":0.915585,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":0,"dup":false,"k":271,"u_out":0.244735,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":5,"dup":false,"k":272,"u_out":0.086613,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":0,"dup":true,"k":273,"u_out":0.723313,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":true,"delay":5,"dup":false,"k":274,"u_out":0.875415,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":1,"dup":false,"k":275,"u_out":0.760854,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":5,"dup":true,"k":276,"u_out":0.142671,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":277,"u_out":0.733289,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":4,"dup":false,"k":278,"u_out":0.05666,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":5,"dup":false,"k":279,"u_out":0.603713,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":1,"dup":false,"k":280,"u_out":0.052702,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":true,"delay":5,"dup":false,"k":281,"u_out":0.232789,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":1,"dup":false,"k":282,"u_out":0.86263,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":2,"dup":false,"k":283,"u_out":0.595951,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":5,"dup":false,"k":284,"u_out":0.982847,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":6,"dup":false,"k":285,"u_out":0.310063,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":6,"dup":false,"k":286,"u_out":0.84518,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":0,"dup":false,"k":287,"u_out":0.294002,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":5,"dup":false,"k":288,"u_out":0.06395,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":true,"delay":0,"dup":false,"k":289,"u_out":0.195714,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":2,"dup":false,"k":290,"u_out":0.347399,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":6,"dup":false,"k":291,"u_out":0.460554,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":2,"dup":true,"k":292,"u_out":0.780217,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":2,"dup":false,"k":293,"u_out":0.20889,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":2,"dup":false,"k":294,"u_out":0.691886,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":4,"dup":false,"k":295,"u_out":0.638778,"unknown":true,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":0,"dup":false,"k":296,"u_out":0.59659,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":3,"dup":false,"k":297,"u_out":0.415815,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":6,"dup":false,"k":298,"u_out":0.582241,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":1,"dup":false,"k":299,"u_out":0.104031,"unknown":false,"unknown_good":true} diff --git a/bench/individuality/fixtures/credit/draws-5.jsonl b/bench/individuality/fixtures/credit/draws-5.jsonl new file mode 100644 index 0000000..073172e --- /dev/null +++ b/bench/individuality/fixtures/credit/draws-5.jsonl @@ -0,0 +1,300 @@ +{"blast":0.34,"cancel":false,"delay":4,"dup":false,"k":0,"u_out":0.902183,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":0,"dup":false,"k":1,"u_out":0.178873,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":0,"dup":false,"k":2,"u_out":0.580258,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":3,"dup":false,"k":3,"u_out":0.648868,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":true,"delay":4,"dup":false,"k":4,"u_out":0.897672,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":3,"dup":false,"k":5,"u_out":0.419183,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":0,"dup":false,"k":6,"u_out":0.828707,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":3,"dup":false,"k":7,"u_out":0.615701,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":0,"dup":false,"k":8,"u_out":0.458345,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":9,"u_out":0.963593,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":0,"dup":false,"k":10,"u_out":0.958573,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":4,"dup":false,"k":11,"u_out":0.946475,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":2,"dup":false,"k":12,"u_out":0.628877,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":true,"delay":2,"dup":true,"k":13,"u_out":0.586215,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":true,"delay":3,"dup":false,"k":14,"u_out":0.980065,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":5,"dup":false,"k":15,"u_out":0.766504,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":6,"dup":false,"k":16,"u_out":0.515608,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":true,"delay":5,"dup":false,"k":17,"u_out":0.155415,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":5,"dup":false,"k":18,"u_out":0.456229,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":3,"dup":false,"k":19,"u_out":0.428556,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":true,"delay":2,"dup":false,"k":20,"u_out":0.821313,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":3,"dup":false,"k":21,"u_out":0.334932,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":2,"dup":false,"k":22,"u_out":0.643247,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":2,"dup":false,"k":23,"u_out":0.580851,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":4,"dup":false,"k":24,"u_out":0.27769,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":1,"dup":false,"k":25,"u_out":0.691612,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":1,"dup":false,"k":26,"u_out":0.664072,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":6,"dup":false,"k":27,"u_out":0.404576,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":2,"dup":false,"k":28,"u_out":0.179614,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":0,"dup":false,"k":29,"u_out":0.745027,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":4,"dup":false,"k":30,"u_out":0.186919,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":6,"dup":false,"k":31,"u_out":0.285731,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":1,"dup":false,"k":32,"u_out":0.120374,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":33,"u_out":0.16709,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":4,"dup":false,"k":34,"u_out":0.052704,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":5,"dup":false,"k":35,"u_out":0.993807,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":6,"dup":false,"k":36,"u_out":0.920313,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":4,"dup":false,"k":37,"u_out":0.871823,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":3,"dup":false,"k":38,"u_out":0.207203,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":2,"dup":false,"k":39,"u_out":0.624194,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":5,"dup":false,"k":40,"u_out":0.66626,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":6,"dup":false,"k":41,"u_out":0.201461,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":6,"dup":false,"k":42,"u_out":0.417229,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":1,"dup":false,"k":43,"u_out":0.909872,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":6,"dup":false,"k":44,"u_out":0.711442,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":1,"dup":false,"k":45,"u_out":0.445283,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":6,"dup":false,"k":46,"u_out":0.61993,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":4,"dup":false,"k":47,"u_out":0.219612,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":2,"dup":false,"k":48,"u_out":0.569176,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":4,"dup":false,"k":49,"u_out":0.49755,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":3,"dup":false,"k":50,"u_out":0.204417,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":true,"delay":2,"dup":false,"k":51,"u_out":0.404143,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":1,"dup":false,"k":52,"u_out":0.230032,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":4,"dup":true,"k":53,"u_out":0.336256,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":true,"delay":0,"dup":false,"k":54,"u_out":0.845011,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":6,"dup":false,"k":55,"u_out":0.18295,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":4,"dup":false,"k":56,"u_out":0.06495,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":4,"dup":false,"k":57,"u_out":0.026915,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":0,"dup":true,"k":58,"u_out":0.594592,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":2,"dup":false,"k":59,"u_out":0.071227,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":5,"dup":false,"k":60,"u_out":0.301839,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":2,"dup":false,"k":61,"u_out":0.856202,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":1,"dup":false,"k":62,"u_out":0.279043,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":4,"dup":false,"k":63,"u_out":0.801219,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":6,"dup":false,"k":64,"u_out":0.670041,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":1,"dup":false,"k":65,"u_out":0.196101,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":4,"dup":false,"k":66,"u_out":0.80446,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":5,"dup":false,"k":67,"u_out":0.206986,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":0,"dup":false,"k":68,"u_out":0.85575,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":3,"dup":false,"k":69,"u_out":0.54164,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":3,"dup":false,"k":70,"u_out":0.311986,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":3,"dup":false,"k":71,"u_out":0.192279,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":6,"dup":false,"k":72,"u_out":0.921461,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":73,"u_out":0.885221,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":true,"delay":3,"dup":false,"k":74,"u_out":0.968103,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":1,"dup":false,"k":75,"u_out":0.994479,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":5,"dup":false,"k":76,"u_out":0.720151,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":4,"dup":false,"k":77,"u_out":0.872509,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":1,"dup":false,"k":78,"u_out":0.846779,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":6,"dup":false,"k":79,"u_out":0.920661,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":2,"dup":false,"k":80,"u_out":0.652357,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":2,"dup":false,"k":81,"u_out":0.156374,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":4,"dup":false,"k":82,"u_out":0.563171,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":5,"dup":false,"k":83,"u_out":0.335777,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":0,"dup":false,"k":84,"u_out":0.398401,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":true,"delay":4,"dup":false,"k":85,"u_out":0.782051,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":6,"dup":false,"k":86,"u_out":0.438339,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":1,"dup":false,"k":87,"u_out":0.962762,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":6,"dup":false,"k":88,"u_out":0.572202,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":1,"dup":false,"k":89,"u_out":0.85102,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":1,"dup":false,"k":90,"u_out":0.025323,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":6,"dup":false,"k":91,"u_out":0.129135,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":true,"delay":3,"dup":false,"k":92,"u_out":0.109765,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":93,"u_out":0.562917,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":0,"dup":false,"k":94,"u_out":0.420055,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":95,"u_out":0.512986,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":3,"dup":false,"k":96,"u_out":0.759625,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":4,"dup":false,"k":97,"u_out":0.765675,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":3,"dup":false,"k":98,"u_out":0.886685,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":0,"dup":false,"k":99,"u_out":0.485037,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":6,"dup":false,"k":100,"u_out":0.944312,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":5,"dup":false,"k":101,"u_out":0.752919,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":6,"dup":false,"k":102,"u_out":0.154322,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":103,"u_out":0.19074,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":2,"dup":false,"k":104,"u_out":0.323465,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":6,"dup":false,"k":105,"u_out":0.80651,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":6,"dup":false,"k":106,"u_out":0.771083,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":3,"dup":false,"k":107,"u_out":0.118637,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":2,"dup":false,"k":108,"u_out":0.840314,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":2,"dup":false,"k":109,"u_out":0.626073,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":110,"u_out":0.269984,"unknown":true,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":4,"dup":false,"k":111,"u_out":0.260594,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":0,"dup":false,"k":112,"u_out":0.251664,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":2,"dup":true,"k":113,"u_out":0.17787,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":0,"dup":false,"k":114,"u_out":0.931441,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":0,"dup":false,"k":115,"u_out":0.493941,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":0,"dup":false,"k":116,"u_out":0.834897,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":1,"dup":false,"k":117,"u_out":0.684879,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":3,"dup":false,"k":118,"u_out":0.758734,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":1,"dup":false,"k":119,"u_out":0.258572,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":2,"dup":false,"k":120,"u_out":0.538036,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":6,"dup":false,"k":121,"u_out":0.508914,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":2,"dup":false,"k":122,"u_out":0.157287,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":1,"dup":false,"k":123,"u_out":0.398054,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":0,"dup":false,"k":124,"u_out":0.285841,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":5,"dup":false,"k":125,"u_out":0.993794,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":true,"delay":5,"dup":false,"k":126,"u_out":0.167376,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":5,"dup":true,"k":127,"u_out":0.523732,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":128,"u_out":0.947858,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":129,"u_out":0.816366,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":0,"dup":false,"k":130,"u_out":0.078154,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":4,"dup":false,"k":131,"u_out":0.667663,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":4,"dup":false,"k":132,"u_out":0.854051,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":5,"dup":false,"k":133,"u_out":0.05392,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":3,"dup":false,"k":134,"u_out":0.584489,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":4,"dup":false,"k":135,"u_out":0.428227,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":3,"dup":false,"k":136,"u_out":0.078091,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":0,"dup":false,"k":137,"u_out":0.322334,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":5,"dup":false,"k":138,"u_out":0.256926,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":1,"dup":false,"k":139,"u_out":0.401013,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":2,"dup":false,"k":140,"u_out":0.382306,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":true,"delay":4,"dup":false,"k":141,"u_out":0.499783,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":5,"dup":false,"k":142,"u_out":0.728992,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":5,"dup":false,"k":143,"u_out":0.018933,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":5,"dup":false,"k":144,"u_out":0.873944,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":3,"dup":false,"k":145,"u_out":0.808093,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":3,"dup":false,"k":146,"u_out":0.985596,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":6,"dup":false,"k":147,"u_out":0.031488,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":2,"dup":false,"k":148,"u_out":0.609397,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":6,"dup":false,"k":149,"u_out":0.610062,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":4,"dup":false,"k":150,"u_out":0.359123,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":2,"dup":false,"k":151,"u_out":0.002124,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":1,"dup":false,"k":152,"u_out":0.704845,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":4,"dup":false,"k":153,"u_out":0.166349,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":4,"dup":false,"k":154,"u_out":0.547681,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":4,"dup":false,"k":155,"u_out":0.165525,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":3,"dup":false,"k":156,"u_out":0.482188,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":6,"dup":false,"k":157,"u_out":0.440718,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":5,"dup":false,"k":158,"u_out":0.047464,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":159,"u_out":0.594187,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":4,"dup":false,"k":160,"u_out":0.043871,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":0,"dup":false,"k":161,"u_out":0.039301,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":0,"dup":false,"k":162,"u_out":0.444892,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":1,"dup":false,"k":163,"u_out":0.384228,"unknown":true,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":1,"dup":false,"k":164,"u_out":0.465304,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":6,"dup":false,"k":165,"u_out":0.548309,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":5,"dup":false,"k":166,"u_out":0.365918,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":2,"dup":false,"k":167,"u_out":0.451712,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":0,"dup":false,"k":168,"u_out":0.564997,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":3,"dup":false,"k":169,"u_out":0.872995,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":6,"dup":false,"k":170,"u_out":0.942952,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":2,"dup":false,"k":171,"u_out":0.841856,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":4,"dup":false,"k":172,"u_out":0.160499,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":true,"delay":1,"dup":false,"k":173,"u_out":0.102189,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":5,"dup":false,"k":174,"u_out":0.393421,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":1,"dup":false,"k":175,"u_out":0.673306,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":6,"dup":false,"k":176,"u_out":0.187492,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":3,"dup":false,"k":177,"u_out":0.79295,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":0,"dup":false,"k":178,"u_out":0.220672,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":6,"dup":false,"k":179,"u_out":0.156088,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":true,"delay":6,"dup":false,"k":180,"u_out":0.737637,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":3,"dup":true,"k":181,"u_out":0.990866,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":4,"dup":false,"k":182,"u_out":0.722675,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":3,"dup":false,"k":183,"u_out":0.410913,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":6,"dup":false,"k":184,"u_out":0.958672,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":6,"dup":false,"k":185,"u_out":0.266229,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":1,"dup":false,"k":186,"u_out":0.381018,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":true,"delay":2,"dup":false,"k":187,"u_out":0.492493,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":1,"dup":false,"k":188,"u_out":0.058051,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":0,"dup":false,"k":189,"u_out":0.490945,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":6,"dup":false,"k":190,"u_out":0.000921,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":6,"dup":true,"k":191,"u_out":0.465342,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":1,"dup":false,"k":192,"u_out":0.814415,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":1,"dup":false,"k":193,"u_out":0.030557,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":1,"dup":false,"k":194,"u_out":0.216185,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":4,"dup":false,"k":195,"u_out":0.987325,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":196,"u_out":0.803997,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":2,"dup":false,"k":197,"u_out":0.787489,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":6,"dup":false,"k":198,"u_out":0.683746,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":0,"dup":false,"k":199,"u_out":0.440992,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":1,"dup":false,"k":200,"u_out":0.289354,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":5,"dup":false,"k":201,"u_out":0.632413,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":3,"dup":true,"k":202,"u_out":0.391215,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":2,"dup":false,"k":203,"u_out":0.703647,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":5,"dup":false,"k":204,"u_out":0.18282,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":6,"dup":false,"k":205,"u_out":0.432833,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":true,"delay":1,"dup":false,"k":206,"u_out":0.496975,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":2,"dup":false,"k":207,"u_out":0.350248,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":true,"delay":6,"dup":false,"k":208,"u_out":0.390491,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":2,"dup":false,"k":209,"u_out":0.223668,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":0,"dup":false,"k":210,"u_out":0.181006,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":2,"dup":false,"k":211,"u_out":0.254044,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":6,"dup":false,"k":212,"u_out":0.570119,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":2,"dup":false,"k":213,"u_out":0.194056,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":4,"dup":false,"k":214,"u_out":0.312898,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":2,"dup":false,"k":215,"u_out":0.948642,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":true,"delay":6,"dup":false,"k":216,"u_out":0.418796,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":true,"delay":1,"dup":false,"k":217,"u_out":0.278847,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":1,"dup":false,"k":218,"u_out":0.15953,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":5,"dup":false,"k":219,"u_out":0.094261,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":220,"u_out":0.7735,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":3,"dup":false,"k":221,"u_out":0.207795,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":0,"dup":false,"k":222,"u_out":0.876699,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":2,"dup":false,"k":223,"u_out":0.938091,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":3,"dup":false,"k":224,"u_out":0.251414,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":3,"dup":false,"k":225,"u_out":0.703159,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":4,"dup":false,"k":226,"u_out":0.023625,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":0,"dup":false,"k":227,"u_out":0.111537,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":4,"dup":false,"k":228,"u_out":0.433366,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":2,"dup":false,"k":229,"u_out":0.284482,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":4,"dup":false,"k":230,"u_out":0.84835,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":231,"u_out":0.364823,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":4,"dup":false,"k":232,"u_out":0.314361,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":1,"dup":false,"k":233,"u_out":0.603986,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":false,"delay":1,"dup":false,"k":234,"u_out":0.721473,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":1,"dup":false,"k":235,"u_out":0.718894,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":6,"dup":false,"k":236,"u_out":0.161738,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":0,"dup":false,"k":237,"u_out":0.84434,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":1,"dup":false,"k":238,"u_out":0.267982,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":5,"dup":false,"k":239,"u_out":0.660136,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":3,"dup":false,"k":240,"u_out":0.817818,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":6,"dup":false,"k":241,"u_out":0.386021,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":1,"dup":false,"k":242,"u_out":0.834705,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":1,"dup":false,"k":243,"u_out":0.292929,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":true,"delay":6,"dup":false,"k":244,"u_out":0.585281,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":5,"dup":false,"k":245,"u_out":0.419532,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":false,"delay":0,"dup":false,"k":246,"u_out":0.129311,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":true,"delay":2,"dup":false,"k":247,"u_out":0.316416,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":true,"delay":5,"dup":true,"k":248,"u_out":0.940407,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":true,"delay":4,"dup":false,"k":249,"u_out":0.670772,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":250,"u_out":0.708198,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":5,"dup":false,"k":251,"u_out":0.589704,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":1,"dup":false,"k":252,"u_out":0.651848,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":6,"dup":false,"k":253,"u_out":0.112864,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":1,"dup":false,"k":254,"u_out":0.500668,"unknown":true,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":3,"dup":false,"k":255,"u_out":0.555619,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":2,"dup":false,"k":256,"u_out":0.723239,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":3,"dup":false,"k":257,"u_out":0.173431,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":1,"dup":false,"k":258,"u_out":0.748086,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":1,"dup":false,"k":259,"u_out":0.780799,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":2,"dup":false,"k":260,"u_out":0.800232,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":5,"dup":true,"k":261,"u_out":0.457439,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":1,"dup":false,"k":262,"u_out":0.945387,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":2,"dup":false,"k":263,"u_out":0.364578,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":0,"dup":false,"k":264,"u_out":0.069285,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":265,"u_out":0.428351,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":3,"dup":false,"k":266,"u_out":0.326458,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":3,"dup":false,"k":267,"u_out":0.703337,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":6,"dup":false,"k":268,"u_out":0.282896,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":true,"delay":5,"dup":false,"k":269,"u_out":0.272335,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":5,"dup":false,"k":270,"u_out":0.588158,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":1,"dup":false,"k":271,"u_out":0.040163,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":6,"dup":false,"k":272,"u_out":0.891307,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":3,"dup":false,"k":273,"u_out":0.795977,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":5,"dup":true,"k":274,"u_out":0.179817,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":1,"dup":false,"k":275,"u_out":0.851208,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":4,"dup":false,"k":276,"u_out":0.770726,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":6,"dup":false,"k":277,"u_out":0.224741,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":4,"dup":false,"k":278,"u_out":0.74095,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":4,"dup":false,"k":279,"u_out":0.286582,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":5,"dup":false,"k":280,"u_out":0.845357,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":6,"dup":false,"k":281,"u_out":0.161758,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":0,"dup":true,"k":282,"u_out":0.79244,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":3,"dup":false,"k":283,"u_out":0.664879,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":true,"delay":4,"dup":false,"k":284,"u_out":0.554628,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":4,"dup":false,"k":285,"u_out":0.048005,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":3,"dup":false,"k":286,"u_out":0.600065,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":3,"dup":false,"k":287,"u_out":0.532716,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":2,"dup":false,"k":288,"u_out":0.208899,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":2,"dup":false,"k":289,"u_out":0.228961,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":4,"dup":false,"k":290,"u_out":0.402818,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":4,"dup":false,"k":291,"u_out":0.130682,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":4,"dup":false,"k":292,"u_out":0.151707,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":0,"dup":false,"k":293,"u_out":0.744257,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":4,"dup":false,"k":294,"u_out":0.736679,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":2,"dup":false,"k":295,"u_out":0.232717,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":2,"dup":false,"k":296,"u_out":0.90957,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":4,"dup":false,"k":297,"u_out":0.318972,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":4,"dup":false,"k":298,"u_out":0.004943,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":2,"dup":false,"k":299,"u_out":0.752916,"unknown":false,"unknown_good":false} diff --git a/bench/individuality/fixtures/credit/draws-6.jsonl b/bench/individuality/fixtures/credit/draws-6.jsonl new file mode 100644 index 0000000..a1941e7 --- /dev/null +++ b/bench/individuality/fixtures/credit/draws-6.jsonl @@ -0,0 +1,300 @@ +{"blast":0.26,"cancel":false,"delay":0,"dup":false,"k":0,"u_out":0.228641,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":2,"dup":false,"k":1,"u_out":0.893859,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":false,"delay":2,"dup":false,"k":2,"u_out":0.049495,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":true,"delay":6,"dup":false,"k":3,"u_out":0.988908,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":3,"dup":false,"k":4,"u_out":0.354833,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":2,"dup":false,"k":5,"u_out":0.692049,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":6,"dup":false,"k":6,"u_out":0.52812,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":0,"dup":false,"k":7,"u_out":0.961407,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":0,"dup":true,"k":8,"u_out":0.241849,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":1,"dup":false,"k":9,"u_out":0.377705,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":10,"u_out":0.606812,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":11,"u_out":0.211988,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":12,"u_out":0.120396,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":6,"dup":false,"k":13,"u_out":0.52378,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":3,"dup":true,"k":14,"u_out":0.080297,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":2,"dup":false,"k":15,"u_out":0.752845,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":5,"dup":false,"k":16,"u_out":0.013704,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":6,"dup":false,"k":17,"u_out":0.13341,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":6,"dup":false,"k":18,"u_out":0.190409,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":3,"dup":false,"k":19,"u_out":0.62516,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":2,"dup":false,"k":20,"u_out":0.32487,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":6,"dup":false,"k":21,"u_out":0.514177,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":true,"delay":4,"dup":false,"k":22,"u_out":0.852844,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":4,"dup":false,"k":23,"u_out":0.38513,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":5,"dup":false,"k":24,"u_out":0.407803,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":0,"dup":false,"k":25,"u_out":0.19807,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":2,"dup":false,"k":26,"u_out":0.202026,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":1,"dup":false,"k":27,"u_out":0.016238,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":true,"delay":5,"dup":false,"k":28,"u_out":0.868453,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":5,"dup":true,"k":29,"u_out":0.699763,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":true,"delay":5,"dup":false,"k":30,"u_out":0.319582,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":true,"delay":0,"dup":false,"k":31,"u_out":0.913286,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":3,"dup":false,"k":32,"u_out":0.164931,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":1,"dup":false,"k":33,"u_out":0.903785,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":true,"delay":6,"dup":false,"k":34,"u_out":0.833851,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":35,"u_out":0.739888,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":1,"dup":false,"k":36,"u_out":0.387978,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":6,"dup":false,"k":37,"u_out":0.835793,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":6,"dup":false,"k":38,"u_out":0.511003,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":4,"dup":false,"k":39,"u_out":0.276294,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":1,"dup":false,"k":40,"u_out":0.139606,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":41,"u_out":0.071075,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":true,"delay":6,"dup":false,"k":42,"u_out":0.15076,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":4,"dup":false,"k":43,"u_out":0.517533,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":5,"dup":false,"k":44,"u_out":0.950573,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":1,"dup":false,"k":45,"u_out":0.081151,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":5,"dup":false,"k":46,"u_out":0.699754,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":2,"dup":false,"k":47,"u_out":0.16873,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":4,"dup":false,"k":48,"u_out":0.817112,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":6,"dup":false,"k":49,"u_out":0.613115,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":4,"dup":false,"k":50,"u_out":0.017704,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":3,"dup":false,"k":51,"u_out":0.049426,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":3,"dup":false,"k":52,"u_out":0.275799,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":3,"dup":false,"k":53,"u_out":0.329384,"unknown":false,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":5,"dup":false,"k":54,"u_out":0.967261,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":5,"dup":false,"k":55,"u_out":0.674368,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":2,"dup":false,"k":56,"u_out":0.446206,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":0,"dup":false,"k":57,"u_out":0.476557,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":4,"dup":false,"k":58,"u_out":0.529533,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":2,"dup":false,"k":59,"u_out":0.883437,"unknown":true,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":5,"dup":false,"k":60,"u_out":0.736817,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":3,"dup":false,"k":61,"u_out":0.683929,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":0,"dup":false,"k":62,"u_out":0.600799,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":2,"dup":false,"k":63,"u_out":0.698585,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":true,"delay":4,"dup":false,"k":64,"u_out":0.551587,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":0,"dup":false,"k":65,"u_out":0.21448,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":4,"dup":false,"k":66,"u_out":0.16592,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":2,"dup":false,"k":67,"u_out":0.098184,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":4,"dup":false,"k":68,"u_out":0.436584,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":3,"dup":false,"k":69,"u_out":0.137347,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":1,"dup":false,"k":70,"u_out":0.133947,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":2,"dup":false,"k":71,"u_out":0.53975,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":2,"dup":false,"k":72,"u_out":0.55216,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":1,"dup":false,"k":73,"u_out":0.044404,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":1,"dup":true,"k":74,"u_out":0.980347,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":6,"dup":false,"k":75,"u_out":0.213045,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":5,"dup":false,"k":76,"u_out":0.367355,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":3,"dup":false,"k":77,"u_out":0.216163,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":3,"dup":false,"k":78,"u_out":0.492171,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":0,"dup":false,"k":79,"u_out":0.779896,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":0,"dup":false,"k":80,"u_out":0.354918,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":true,"delay":1,"dup":false,"k":81,"u_out":0.471068,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":0,"dup":false,"k":82,"u_out":0.425936,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":0,"dup":false,"k":83,"u_out":0.629292,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":5,"dup":false,"k":84,"u_out":0.800921,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":3,"dup":false,"k":85,"u_out":0.510896,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":true,"delay":5,"dup":false,"k":86,"u_out":0.297737,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":3,"dup":false,"k":87,"u_out":0.879911,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":1,"dup":false,"k":88,"u_out":0.066695,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":6,"dup":false,"k":89,"u_out":0.104738,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":1,"dup":false,"k":90,"u_out":0.807671,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":5,"dup":false,"k":91,"u_out":0.252471,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":6,"dup":false,"k":92,"u_out":0.997411,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":6,"dup":false,"k":93,"u_out":0.736873,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":6,"dup":false,"k":94,"u_out":0.229071,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":0,"dup":false,"k":95,"u_out":0.566341,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":6,"dup":false,"k":96,"u_out":0.246736,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":5,"dup":false,"k":97,"u_out":0.749756,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":0,"dup":false,"k":98,"u_out":0.911754,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":0,"dup":false,"k":99,"u_out":0.095565,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":4,"dup":false,"k":100,"u_out":0.794782,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":true,"delay":6,"dup":false,"k":101,"u_out":0.102648,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":3,"dup":false,"k":102,"u_out":0.068237,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":0,"dup":false,"k":103,"u_out":0.493486,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":4,"dup":false,"k":104,"u_out":0.579029,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":1,"dup":false,"k":105,"u_out":0.458813,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":true,"delay":3,"dup":false,"k":106,"u_out":0.383288,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":5,"dup":false,"k":107,"u_out":0.117646,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":5,"dup":false,"k":108,"u_out":0.55004,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":1,"dup":false,"k":109,"u_out":0.710664,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":1,"dup":false,"k":110,"u_out":0.058437,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":3,"dup":false,"k":111,"u_out":0.00397,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":2,"dup":false,"k":112,"u_out":0.206635,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":1,"dup":false,"k":113,"u_out":0.182867,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":2,"dup":false,"k":114,"u_out":0.737723,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":5,"dup":false,"k":115,"u_out":0.352228,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":true,"delay":4,"dup":false,"k":116,"u_out":0.578867,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":1,"dup":false,"k":117,"u_out":0.324604,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":true,"delay":2,"dup":false,"k":118,"u_out":0.022227,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":4,"dup":false,"k":119,"u_out":0.824059,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":1,"dup":false,"k":120,"u_out":0.622685,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":3,"dup":false,"k":121,"u_out":0.961521,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":5,"dup":false,"k":122,"u_out":0.775848,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":1,"dup":false,"k":123,"u_out":0.834489,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":2,"dup":false,"k":124,"u_out":0.072023,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":125,"u_out":0.420305,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":4,"dup":false,"k":126,"u_out":0.86644,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":1,"dup":false,"k":127,"u_out":0.434666,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":128,"u_out":0.045614,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":1,"dup":false,"k":129,"u_out":0.660015,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":0,"dup":false,"k":130,"u_out":0.465191,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":6,"dup":false,"k":131,"u_out":0.682689,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":true,"delay":1,"dup":false,"k":132,"u_out":0.685857,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":5,"dup":false,"k":133,"u_out":0.869875,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":true,"delay":3,"dup":false,"k":134,"u_out":0.971752,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":4,"dup":false,"k":135,"u_out":0.545567,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":1,"dup":false,"k":136,"u_out":0.380909,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":true,"delay":3,"dup":false,"k":137,"u_out":0.835011,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":5,"dup":false,"k":138,"u_out":0.755539,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":1,"dup":false,"k":139,"u_out":0.308451,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":1,"dup":false,"k":140,"u_out":0.386166,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":4,"dup":false,"k":141,"u_out":0.009492,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":3,"dup":false,"k":142,"u_out":0.531966,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":5,"dup":false,"k":143,"u_out":0.939066,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":true,"delay":3,"dup":false,"k":144,"u_out":0.779239,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":6,"dup":false,"k":145,"u_out":0.948031,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":3,"dup":false,"k":146,"u_out":0.698136,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":6,"dup":false,"k":147,"u_out":0.035343,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":5,"dup":true,"k":148,"u_out":0.78266,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":5,"dup":false,"k":149,"u_out":0.439755,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":3,"dup":false,"k":150,"u_out":0.053255,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":0,"dup":false,"k":151,"u_out":0.918417,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":5,"dup":false,"k":152,"u_out":0.213137,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":true,"delay":6,"dup":false,"k":153,"u_out":0.179059,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":true,"delay":0,"dup":false,"k":154,"u_out":0.433018,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":3,"dup":false,"k":155,"u_out":0.723455,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":2,"dup":false,"k":156,"u_out":0.329293,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":2,"dup":true,"k":157,"u_out":0.864245,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":1,"dup":false,"k":158,"u_out":0.217363,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":4,"dup":true,"k":159,"u_out":0.614838,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":6,"dup":false,"k":160,"u_out":0.414855,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":4,"dup":false,"k":161,"u_out":0.819799,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":true,"delay":6,"dup":false,"k":162,"u_out":0.61825,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":163,"u_out":0.223127,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":2,"dup":false,"k":164,"u_out":0.398572,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":true,"delay":1,"dup":false,"k":165,"u_out":0.005407,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":5,"dup":false,"k":166,"u_out":0.152856,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":3,"dup":false,"k":167,"u_out":0.782808,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":1,"dup":false,"k":168,"u_out":0.422349,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":5,"dup":false,"k":169,"u_out":0.867184,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":170,"u_out":0.448094,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":2,"dup":false,"k":171,"u_out":0.754328,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":4,"dup":false,"k":172,"u_out":0.017616,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":6,"dup":false,"k":173,"u_out":0.844124,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":0,"dup":false,"k":174,"u_out":0.645196,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":0,"dup":false,"k":175,"u_out":0.119962,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":6,"dup":false,"k":176,"u_out":0.262071,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":0,"dup":true,"k":177,"u_out":0.25132,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":5,"dup":false,"k":178,"u_out":0.275899,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":true,"delay":6,"dup":false,"k":179,"u_out":0.576995,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":0,"dup":false,"k":180,"u_out":0.518713,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":5,"dup":false,"k":181,"u_out":0.548964,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":5,"dup":false,"k":182,"u_out":0.997042,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":183,"u_out":0.186503,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":0,"dup":true,"k":184,"u_out":0.011475,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":1,"dup":false,"k":185,"u_out":0.433121,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":186,"u_out":0.013968,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":5,"dup":false,"k":187,"u_out":0.754584,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":0,"dup":false,"k":188,"u_out":0.507426,"unknown":true,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":3,"dup":false,"k":189,"u_out":0.681345,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":4,"dup":false,"k":190,"u_out":0.964786,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":2,"dup":false,"k":191,"u_out":0.112357,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":6,"dup":false,"k":192,"u_out":0.718866,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":1,"dup":false,"k":193,"u_out":0.520235,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":1,"dup":false,"k":194,"u_out":0.697766,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":6,"dup":false,"k":195,"u_out":0.338458,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":4,"dup":false,"k":196,"u_out":0.026587,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":1,"dup":false,"k":197,"u_out":0.986606,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":2,"dup":false,"k":198,"u_out":0.268694,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":2,"dup":false,"k":199,"u_out":0.612389,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":4,"dup":false,"k":200,"u_out":0.274189,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":2,"dup":false,"k":201,"u_out":0.393111,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":2,"dup":false,"k":202,"u_out":0.534277,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":0,"dup":false,"k":203,"u_out":0.691684,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":2,"dup":false,"k":204,"u_out":0.615209,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":0,"dup":false,"k":205,"u_out":0.304425,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":true,"delay":1,"dup":false,"k":206,"u_out":0.975791,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":6,"dup":false,"k":207,"u_out":0.775492,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":0,"dup":false,"k":208,"u_out":0.589352,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":true,"delay":5,"dup":false,"k":209,"u_out":0.799479,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":1,"dup":true,"k":210,"u_out":0.503686,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":0,"dup":false,"k":211,"u_out":0.926502,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":2,"dup":false,"k":212,"u_out":0.948325,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":6,"dup":false,"k":213,"u_out":0.488287,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":true,"delay":0,"dup":false,"k":214,"u_out":0.131551,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":4,"dup":false,"k":215,"u_out":0.590524,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":1,"dup":false,"k":216,"u_out":0.506579,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":4,"dup":false,"k":217,"u_out":0.516395,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":5,"dup":false,"k":218,"u_out":0.952343,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":5,"dup":false,"k":219,"u_out":0.59013,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":0,"dup":false,"k":220,"u_out":0.001232,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":4,"dup":false,"k":221,"u_out":0.387109,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":1,"dup":false,"k":222,"u_out":0.528219,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":0,"dup":false,"k":223,"u_out":0.707943,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":1,"dup":false,"k":224,"u_out":0.806507,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":1,"dup":false,"k":225,"u_out":0.076927,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":1,"dup":false,"k":226,"u_out":0.423924,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":1,"dup":false,"k":227,"u_out":0.301195,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":0,"dup":true,"k":228,"u_out":0.278658,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":6,"dup":false,"k":229,"u_out":0.306956,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":5,"dup":false,"k":230,"u_out":0.405232,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":true,"delay":5,"dup":false,"k":231,"u_out":0.063989,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":1,"dup":false,"k":232,"u_out":0.903336,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":4,"dup":false,"k":233,"u_out":0.488997,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":6,"dup":false,"k":234,"u_out":0.912022,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":2,"dup":false,"k":235,"u_out":0.355897,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":0,"dup":false,"k":236,"u_out":0.575924,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":2,"dup":false,"k":237,"u_out":0.203049,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":5,"dup":false,"k":238,"u_out":0.189131,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":239,"u_out":0.772741,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":2,"dup":false,"k":240,"u_out":0.839382,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":true,"delay":3,"dup":false,"k":241,"u_out":0.994705,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":5,"dup":false,"k":242,"u_out":0.016811,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":4,"dup":false,"k":243,"u_out":0.68518,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":2,"dup":false,"k":244,"u_out":0.719965,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":5,"dup":false,"k":245,"u_out":0.58887,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":2,"dup":false,"k":246,"u_out":0.465487,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":true,"delay":3,"dup":false,"k":247,"u_out":0.551404,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":true,"delay":1,"dup":false,"k":248,"u_out":0.71531,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":5,"dup":false,"k":249,"u_out":0.178404,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":true,"delay":4,"dup":false,"k":250,"u_out":0.653636,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":0,"dup":false,"k":251,"u_out":0.958397,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":5,"dup":false,"k":252,"u_out":0.149684,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":3,"dup":false,"k":253,"u_out":0.430697,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":0,"dup":false,"k":254,"u_out":0.231642,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":1,"dup":false,"k":255,"u_out":0.338447,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":true,"delay":4,"dup":false,"k":256,"u_out":0.548459,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":5,"dup":false,"k":257,"u_out":0.743834,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":3,"dup":false,"k":258,"u_out":0.670468,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":4,"dup":false,"k":259,"u_out":0.443099,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":5,"dup":false,"k":260,"u_out":0.07506,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":3,"dup":false,"k":261,"u_out":0.258213,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":2,"dup":false,"k":262,"u_out":0.570526,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":5,"dup":false,"k":263,"u_out":0.335987,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":1,"dup":false,"k":264,"u_out":0.907264,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":4,"dup":false,"k":265,"u_out":0.629561,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":4,"dup":false,"k":266,"u_out":0.39405,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":5,"dup":false,"k":267,"u_out":0.058078,"unknown":true,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":6,"dup":false,"k":268,"u_out":0.221112,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":2,"dup":false,"k":269,"u_out":0.276315,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":1,"dup":false,"k":270,"u_out":0.884694,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":271,"u_out":0.382334,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":0,"dup":false,"k":272,"u_out":0.823188,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":3,"dup":false,"k":273,"u_out":0.751774,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":3,"dup":false,"k":274,"u_out":0.781534,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":5,"dup":false,"k":275,"u_out":0.573963,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":4,"dup":false,"k":276,"u_out":0.427822,"unknown":true,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":4,"dup":false,"k":277,"u_out":0.002629,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":0,"dup":false,"k":278,"u_out":0.609865,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":4,"dup":false,"k":279,"u_out":0.402612,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":5,"dup":false,"k":280,"u_out":0.884701,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":0,"dup":false,"k":281,"u_out":0.25529,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":5,"dup":false,"k":282,"u_out":0.764186,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":3,"dup":false,"k":283,"u_out":0.157987,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":0,"dup":false,"k":284,"u_out":0.921979,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":6,"dup":false,"k":285,"u_out":0.267988,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":5,"dup":false,"k":286,"u_out":0.335729,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":0,"dup":true,"k":287,"u_out":0.955803,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":5,"dup":false,"k":288,"u_out":0.404309,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":3,"dup":false,"k":289,"u_out":0.633241,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":0,"dup":false,"k":290,"u_out":0.85612,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":3,"dup":false,"k":291,"u_out":0.009516,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":6,"dup":false,"k":292,"u_out":0.802695,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":5,"dup":false,"k":293,"u_out":0.882166,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":5,"dup":false,"k":294,"u_out":0.071133,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":5,"dup":false,"k":295,"u_out":0.935369,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":4,"dup":false,"k":296,"u_out":0.226477,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":true,"delay":1,"dup":false,"k":297,"u_out":0.150161,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":1,"dup":false,"k":298,"u_out":0.630868,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":5,"dup":false,"k":299,"u_out":0.872198,"unknown":false,"unknown_good":false} diff --git a/bench/individuality/fixtures/credit/draws-7.jsonl b/bench/individuality/fixtures/credit/draws-7.jsonl new file mode 100644 index 0000000..2a7c447 --- /dev/null +++ b/bench/individuality/fixtures/credit/draws-7.jsonl @@ -0,0 +1,300 @@ +{"blast":0.56,"cancel":false,"delay":4,"dup":false,"k":0,"u_out":0.800484,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":1,"u_out":0.056876,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":1,"dup":false,"k":2,"u_out":0.436283,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":2,"dup":false,"k":3,"u_out":0.058018,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":0,"dup":true,"k":4,"u_out":0.570872,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":3,"dup":true,"k":5,"u_out":0.283772,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":true,"delay":1,"dup":false,"k":6,"u_out":0.184097,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":1,"dup":false,"k":7,"u_out":0.946267,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":2,"dup":false,"k":8,"u_out":0.625097,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":6,"dup":false,"k":9,"u_out":0.866717,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":2,"dup":false,"k":10,"u_out":0.249842,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":4,"dup":false,"k":11,"u_out":0.888336,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":4,"dup":false,"k":12,"u_out":0.019615,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":1,"dup":true,"k":13,"u_out":0.470463,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":5,"dup":false,"k":14,"u_out":0.698539,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":1,"dup":false,"k":15,"u_out":0.425146,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":4,"dup":false,"k":16,"u_out":0.891758,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":4,"dup":false,"k":17,"u_out":0.515359,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":true,"delay":1,"dup":false,"k":18,"u_out":0.341161,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":2,"dup":false,"k":19,"u_out":0.568666,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":2,"dup":false,"k":20,"u_out":0.940816,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":true,"delay":2,"dup":false,"k":21,"u_out":0.740777,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":2,"dup":false,"k":22,"u_out":0.33894,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":true,"delay":4,"dup":false,"k":23,"u_out":0.9126,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":0,"dup":false,"k":24,"u_out":0.798873,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":2,"dup":false,"k":25,"u_out":0.027198,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":2,"dup":false,"k":26,"u_out":0.49686,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":1,"dup":false,"k":27,"u_out":0.424003,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":1,"dup":false,"k":28,"u_out":0.95661,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":3,"dup":false,"k":29,"u_out":0.645468,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":0,"dup":false,"k":30,"u_out":0.827876,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":true,"delay":6,"dup":false,"k":31,"u_out":0.040926,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":true,"delay":0,"dup":false,"k":32,"u_out":0.65557,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":true,"delay":0,"dup":false,"k":33,"u_out":0.620046,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":2,"dup":false,"k":34,"u_out":0.448398,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":4,"dup":false,"k":35,"u_out":0.497189,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":5,"dup":false,"k":36,"u_out":0.861391,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":1,"dup":false,"k":37,"u_out":0.399341,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":6,"dup":false,"k":38,"u_out":0.793495,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":1,"dup":false,"k":39,"u_out":0.398002,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":5,"dup":false,"k":40,"u_out":0.845037,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":2,"dup":false,"k":41,"u_out":0.183514,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":6,"dup":false,"k":42,"u_out":0.16145,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":3,"dup":false,"k":43,"u_out":0.73783,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":6,"dup":false,"k":44,"u_out":0.246026,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":1,"dup":true,"k":45,"u_out":0.935835,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":4,"dup":false,"k":46,"u_out":0.468853,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":0,"dup":false,"k":47,"u_out":0.870993,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":5,"dup":false,"k":48,"u_out":0.92033,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":1,"dup":false,"k":49,"u_out":0.337397,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":6,"dup":false,"k":50,"u_out":0.313561,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":5,"dup":false,"k":51,"u_out":0.184654,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":true,"delay":5,"dup":false,"k":52,"u_out":0.085782,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":2,"dup":false,"k":53,"u_out":0.51705,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":4,"dup":false,"k":54,"u_out":0.991122,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":6,"dup":false,"k":55,"u_out":0.605662,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":true,"delay":6,"dup":false,"k":56,"u_out":0.666873,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":true,"delay":3,"dup":false,"k":57,"u_out":0.510386,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":3,"dup":false,"k":58,"u_out":0.170237,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":2,"dup":false,"k":59,"u_out":0.643729,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":5,"dup":true,"k":60,"u_out":0.981715,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":1,"dup":false,"k":61,"u_out":0.293714,"unknown":true,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":1,"dup":false,"k":62,"u_out":0.076322,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":true,"delay":0,"dup":false,"k":63,"u_out":0.271907,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":64,"u_out":0.430968,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":1,"dup":false,"k":65,"u_out":0.751392,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":6,"dup":false,"k":66,"u_out":0.522302,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":3,"dup":false,"k":67,"u_out":0.609236,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":0,"dup":false,"k":68,"u_out":0.603306,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":6,"dup":false,"k":69,"u_out":0.337833,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":1,"dup":false,"k":70,"u_out":0.064006,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":2,"dup":false,"k":71,"u_out":0.892437,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":6,"dup":false,"k":72,"u_out":0.247504,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":1,"dup":false,"k":73,"u_out":0.769683,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":4,"dup":false,"k":74,"u_out":0.77287,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":1,"dup":false,"k":75,"u_out":0.457688,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":1,"dup":false,"k":76,"u_out":0.986094,"unknown":true,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":0,"dup":false,"k":77,"u_out":0.741832,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":2,"dup":false,"k":78,"u_out":0.358201,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":5,"dup":false,"k":79,"u_out":0.086915,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":2,"dup":false,"k":80,"u_out":0.559622,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":5,"dup":false,"k":81,"u_out":0.86499,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":5,"dup":false,"k":82,"u_out":0.748469,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":6,"dup":false,"k":83,"u_out":0.281765,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":3,"dup":false,"k":84,"u_out":0.950205,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":85,"u_out":0.594555,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":3,"dup":false,"k":86,"u_out":0.504214,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":0,"dup":false,"k":87,"u_out":0.643254,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":6,"dup":false,"k":88,"u_out":0.438921,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":3,"dup":false,"k":89,"u_out":0.145137,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":0,"dup":false,"k":90,"u_out":0.756334,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":1,"dup":false,"k":91,"u_out":0.704662,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":4,"dup":false,"k":92,"u_out":0.833589,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":1,"dup":false,"k":93,"u_out":0.103857,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":true,"delay":3,"dup":false,"k":94,"u_out":0.692874,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":5,"dup":false,"k":95,"u_out":0.674544,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":0,"dup":false,"k":96,"u_out":0.844074,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":3,"dup":false,"k":97,"u_out":0.38553,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":6,"dup":false,"k":98,"u_out":0.339208,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":4,"dup":false,"k":99,"u_out":0.010945,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":4,"dup":false,"k":100,"u_out":0.064901,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":2,"dup":false,"k":101,"u_out":0.64262,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":4,"dup":false,"k":102,"u_out":0.590639,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":0,"dup":false,"k":103,"u_out":0.300865,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":0,"dup":false,"k":104,"u_out":0.013645,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":6,"dup":false,"k":105,"u_out":0.62124,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":4,"dup":false,"k":106,"u_out":0.560509,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":5,"dup":false,"k":107,"u_out":0.550654,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":108,"u_out":0.516069,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":6,"dup":false,"k":109,"u_out":0.297149,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":4,"dup":false,"k":110,"u_out":0.11972,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":true,"delay":5,"dup":false,"k":111,"u_out":0.85595,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":1,"dup":true,"k":112,"u_out":0.825017,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":3,"dup":false,"k":113,"u_out":0.532475,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":1,"dup":false,"k":114,"u_out":0.624889,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":5,"dup":false,"k":115,"u_out":0.546041,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":1,"dup":false,"k":116,"u_out":0.583037,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":4,"dup":false,"k":117,"u_out":0.856481,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":6,"dup":false,"k":118,"u_out":0.378348,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":1,"dup":false,"k":119,"u_out":0.9466,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":0,"dup":false,"k":120,"u_out":0.663018,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":4,"dup":false,"k":121,"u_out":0.864943,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":5,"dup":false,"k":122,"u_out":0.705177,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":1,"dup":false,"k":123,"u_out":0.67188,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":1,"dup":false,"k":124,"u_out":0.999635,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":2,"dup":false,"k":125,"u_out":0.631817,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":5,"dup":false,"k":126,"u_out":0.956259,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":1,"dup":false,"k":127,"u_out":0.720788,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":4,"dup":false,"k":128,"u_out":0.476185,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":5,"dup":false,"k":129,"u_out":0.850456,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":5,"dup":false,"k":130,"u_out":0.372086,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":1,"dup":false,"k":131,"u_out":0.258647,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":0,"dup":false,"k":132,"u_out":0.219909,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":true,"delay":4,"dup":true,"k":133,"u_out":0.556741,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":2,"dup":false,"k":134,"u_out":0.270386,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":4,"dup":false,"k":135,"u_out":0.916451,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":6,"dup":true,"k":136,"u_out":0.772932,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":1,"dup":false,"k":137,"u_out":0.954345,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":6,"dup":false,"k":138,"u_out":0.947333,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":true,"delay":1,"dup":false,"k":139,"u_out":0.179827,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":3,"dup":false,"k":140,"u_out":0.708068,"unknown":true,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":0,"dup":false,"k":141,"u_out":0.743362,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":5,"dup":false,"k":142,"u_out":0.615498,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":true,"delay":0,"dup":false,"k":143,"u_out":0.800892,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":6,"dup":true,"k":144,"u_out":0.190268,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":3,"dup":false,"k":145,"u_out":0.51669,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":true,"delay":1,"dup":false,"k":146,"u_out":0.119332,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":4,"dup":false,"k":147,"u_out":0.159265,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":true,"delay":3,"dup":false,"k":148,"u_out":0.324244,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":0,"dup":false,"k":149,"u_out":0.250102,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":6,"dup":false,"k":150,"u_out":0.823717,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":0,"dup":false,"k":151,"u_out":0.760377,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":5,"dup":false,"k":152,"u_out":0.547788,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":0,"dup":false,"k":153,"u_out":0.227471,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":true,"delay":0,"dup":false,"k":154,"u_out":0.148679,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":3,"dup":false,"k":155,"u_out":0.600563,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":2,"dup":false,"k":156,"u_out":0.059832,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":4,"dup":false,"k":157,"u_out":0.28228,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":1,"dup":false,"k":158,"u_out":0.857378,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":1,"dup":false,"k":159,"u_out":0.920981,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":0,"dup":false,"k":160,"u_out":0.236608,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":2,"dup":false,"k":161,"u_out":0.593767,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":5,"dup":false,"k":162,"u_out":0.254838,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":true,"delay":0,"dup":false,"k":163,"u_out":0.981721,"unknown":true,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":4,"dup":false,"k":164,"u_out":0.403008,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":2,"dup":false,"k":165,"u_out":0.396406,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":true,"delay":2,"dup":false,"k":166,"u_out":0.496683,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":3,"dup":false,"k":167,"u_out":0.953664,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":false,"delay":4,"dup":false,"k":168,"u_out":0.061296,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":169,"u_out":0.943743,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":0,"dup":false,"k":170,"u_out":0.677138,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":6,"dup":false,"k":171,"u_out":0.108322,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":3,"dup":false,"k":172,"u_out":0.538267,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":1,"dup":false,"k":173,"u_out":0.300629,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":5,"dup":false,"k":174,"u_out":0.767609,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":6,"dup":false,"k":175,"u_out":0.722218,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":6,"dup":false,"k":176,"u_out":0.624121,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":2,"dup":false,"k":177,"u_out":0.172713,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":true,"delay":0,"dup":false,"k":178,"u_out":0.388353,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":5,"dup":false,"k":179,"u_out":0.92715,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":0,"dup":false,"k":180,"u_out":0.227988,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":4,"dup":false,"k":181,"u_out":0.095586,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":5,"dup":false,"k":182,"u_out":0.704086,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":2,"dup":false,"k":183,"u_out":0.828039,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":4,"dup":false,"k":184,"u_out":0.711255,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":5,"dup":false,"k":185,"u_out":0.879064,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":true,"delay":6,"dup":false,"k":186,"u_out":0.739719,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":true,"delay":6,"dup":false,"k":187,"u_out":0.045532,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":188,"u_out":0.611208,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":3,"dup":false,"k":189,"u_out":0.382606,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":4,"dup":false,"k":190,"u_out":0.596452,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":true,"delay":0,"dup":false,"k":191,"u_out":0.551968,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":3,"dup":false,"k":192,"u_out":0.086361,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":193,"u_out":0.338594,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":2,"dup":false,"k":194,"u_out":0.937743,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":4,"dup":false,"k":195,"u_out":0.833076,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":2,"dup":false,"k":196,"u_out":0.597915,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":4,"dup":false,"k":197,"u_out":0.654579,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":0,"dup":false,"k":198,"u_out":0.075587,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":5,"dup":false,"k":199,"u_out":0.368363,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":6,"dup":false,"k":200,"u_out":0.09044,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":3,"dup":false,"k":201,"u_out":0.052018,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":4,"dup":false,"k":202,"u_out":0.096798,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":1,"dup":false,"k":203,"u_out":0.30149,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":2,"dup":false,"k":204,"u_out":0.321223,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":5,"dup":false,"k":205,"u_out":0.564663,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":0,"dup":false,"k":206,"u_out":0.108561,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":4,"dup":false,"k":207,"u_out":0.659494,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":4,"dup":false,"k":208,"u_out":0.718968,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":5,"dup":false,"k":209,"u_out":0.031483,"unknown":true,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":2,"dup":false,"k":210,"u_out":0.256429,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":3,"dup":false,"k":211,"u_out":0.48558,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":2,"dup":false,"k":212,"u_out":0.640988,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":true,"delay":3,"dup":false,"k":213,"u_out":0.756045,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":0,"dup":false,"k":214,"u_out":0.804553,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":6,"dup":false,"k":215,"u_out":0.775528,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":1,"dup":false,"k":216,"u_out":0.123534,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":5,"dup":false,"k":217,"u_out":0.012747,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":0,"dup":false,"k":218,"u_out":0.304934,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":3,"dup":true,"k":219,"u_out":0.117017,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":5,"dup":false,"k":220,"u_out":0.642432,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":6,"dup":false,"k":221,"u_out":0.79541,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":3,"dup":false,"k":222,"u_out":0.572017,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":true,"delay":1,"dup":false,"k":223,"u_out":0.24534,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":4,"dup":false,"k":224,"u_out":0.600745,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":3,"dup":false,"k":225,"u_out":0.261366,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":3,"dup":false,"k":226,"u_out":0.763887,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":5,"dup":false,"k":227,"u_out":0.492035,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":1,"dup":false,"k":228,"u_out":0.736016,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":1,"dup":false,"k":229,"u_out":0.115926,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":2,"dup":false,"k":230,"u_out":0.061336,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":1,"dup":false,"k":231,"u_out":0.538843,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":232,"u_out":0.80898,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":3,"dup":false,"k":233,"u_out":0.595911,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":0,"dup":false,"k":234,"u_out":0.892925,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":4,"dup":false,"k":235,"u_out":0.826658,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":2,"dup":false,"k":236,"u_out":0.69765,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":true,"delay":2,"dup":false,"k":237,"u_out":0.770839,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":true,"delay":4,"dup":false,"k":238,"u_out":0.696826,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":0,"dup":false,"k":239,"u_out":0.386068,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":2,"dup":false,"k":240,"u_out":0.131788,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":5,"dup":false,"k":241,"u_out":0.321995,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":242,"u_out":0.516466,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":2,"dup":false,"k":243,"u_out":0.385675,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":4,"dup":false,"k":244,"u_out":0.351619,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":1,"dup":false,"k":245,"u_out":0.059137,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":4,"dup":false,"k":246,"u_out":0.089073,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":4,"dup":false,"k":247,"u_out":0.375735,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":3,"dup":false,"k":248,"u_out":0.213092,"unknown":true,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":0,"dup":false,"k":249,"u_out":0.469501,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":1,"dup":false,"k":250,"u_out":0.376783,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":4,"dup":false,"k":251,"u_out":0.195875,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":5,"dup":false,"k":252,"u_out":0.625818,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":6,"dup":false,"k":253,"u_out":0.469836,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":0,"dup":false,"k":254,"u_out":0.028364,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":0,"dup":false,"k":255,"u_out":0.545091,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":0,"dup":false,"k":256,"u_out":0.478902,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":6,"dup":false,"k":257,"u_out":0.388821,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":3,"dup":false,"k":258,"u_out":0.764252,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":4,"dup":false,"k":259,"u_out":0.295063,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":true,"delay":5,"dup":false,"k":260,"u_out":0.400895,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":1,"dup":false,"k":261,"u_out":0.955106,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":2,"dup":false,"k":262,"u_out":0.67348,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":0,"dup":false,"k":263,"u_out":0.345615,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":3,"dup":false,"k":264,"u_out":0.208293,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":0,"dup":true,"k":265,"u_out":0.063127,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":true,"delay":2,"dup":false,"k":266,"u_out":0.759135,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":6,"dup":false,"k":267,"u_out":0.660421,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":3,"dup":false,"k":268,"u_out":0.748372,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":1,"dup":false,"k":269,"u_out":0.798577,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":2,"dup":false,"k":270,"u_out":0.186966,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":2,"dup":false,"k":271,"u_out":0.620065,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":true,"delay":6,"dup":false,"k":272,"u_out":0.410907,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":2,"dup":false,"k":273,"u_out":0.532208,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":6,"dup":false,"k":274,"u_out":0.805856,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":6,"dup":false,"k":275,"u_out":0.582759,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":0,"dup":false,"k":276,"u_out":0.8756,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":3,"dup":false,"k":277,"u_out":0.502119,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":0,"dup":false,"k":278,"u_out":0.159346,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":3,"dup":false,"k":279,"u_out":0.646343,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":0,"dup":false,"k":280,"u_out":0.971544,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":true,"delay":5,"dup":false,"k":281,"u_out":0.596999,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":4,"dup":false,"k":282,"u_out":0.485373,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":283,"u_out":0.571596,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":4,"dup":false,"k":284,"u_out":0.328363,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":5,"dup":false,"k":285,"u_out":0.715284,"unknown":true,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":4,"dup":false,"k":286,"u_out":0.771588,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":6,"dup":false,"k":287,"u_out":0.800991,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":true,"delay":3,"dup":false,"k":288,"u_out":0.864433,"unknown":true,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":289,"u_out":0.624013,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":0,"dup":false,"k":290,"u_out":0.415738,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":4,"dup":false,"k":291,"u_out":0.467418,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":5,"dup":false,"k":292,"u_out":0.09474,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":4,"dup":false,"k":293,"u_out":0.641565,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":294,"u_out":0.162251,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":4,"dup":false,"k":295,"u_out":0.34489,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":0,"dup":false,"k":296,"u_out":0.187385,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":5,"dup":false,"k":297,"u_out":0.243885,"unknown":false,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":1,"dup":false,"k":298,"u_out":0.994303,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":true,"delay":5,"dup":false,"k":299,"u_out":0.548895,"unknown":false,"unknown_good":false} diff --git a/bench/individuality/fixtures/credit/draws-8.jsonl b/bench/individuality/fixtures/credit/draws-8.jsonl new file mode 100644 index 0000000..54ca83c --- /dev/null +++ b/bench/individuality/fixtures/credit/draws-8.jsonl @@ -0,0 +1,300 @@ +{"blast":0.36,"cancel":true,"delay":2,"dup":false,"k":0,"u_out":0.958399,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":5,"dup":false,"k":1,"u_out":0.141678,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":1,"dup":false,"k":2,"u_out":0.327796,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":0,"dup":false,"k":3,"u_out":0.375337,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":3,"dup":false,"k":4,"u_out":0.829306,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":2,"dup":false,"k":5,"u_out":0.769915,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":4,"dup":false,"k":6,"u_out":0.357577,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":5,"dup":false,"k":7,"u_out":0.451451,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":0,"dup":false,"k":8,"u_out":0.729571,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":5,"dup":false,"k":9,"u_out":0.494702,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":6,"dup":false,"k":10,"u_out":0.167514,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":true,"delay":1,"dup":false,"k":11,"u_out":0.553787,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":4,"dup":false,"k":12,"u_out":0.434939,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":5,"dup":false,"k":13,"u_out":0.342762,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":true,"delay":3,"dup":false,"k":14,"u_out":0.972463,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":5,"dup":false,"k":15,"u_out":0.235987,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":false,"delay":0,"dup":false,"k":16,"u_out":0.334599,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":0,"dup":false,"k":17,"u_out":0.808214,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":2,"dup":false,"k":18,"u_out":0.677929,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":3,"dup":false,"k":19,"u_out":0.273066,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":6,"dup":false,"k":20,"u_out":0.409694,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":0,"dup":false,"k":21,"u_out":0.152139,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":2,"dup":false,"k":22,"u_out":0.713363,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":2,"dup":false,"k":23,"u_out":0.183801,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":0,"dup":false,"k":24,"u_out":0.817414,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":true,"delay":1,"dup":true,"k":25,"u_out":0.017861,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":3,"dup":false,"k":26,"u_out":0.429632,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":4,"dup":false,"k":27,"u_out":0.861632,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":6,"dup":false,"k":28,"u_out":0.197661,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":0,"dup":false,"k":29,"u_out":0.168018,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":4,"dup":false,"k":30,"u_out":0.990332,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":true,"delay":0,"dup":false,"k":31,"u_out":0.558441,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":5,"dup":false,"k":32,"u_out":0.146813,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":1,"dup":false,"k":33,"u_out":0.31859,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":true,"delay":1,"dup":false,"k":34,"u_out":0.994958,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":6,"dup":false,"k":35,"u_out":0.234617,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":2,"dup":false,"k":36,"u_out":0.184822,"unknown":true,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":5,"dup":false,"k":37,"u_out":0.323655,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":false,"delay":5,"dup":false,"k":38,"u_out":0.785225,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":true,"delay":2,"dup":true,"k":39,"u_out":0.923235,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":1,"dup":false,"k":40,"u_out":0.581163,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":3,"dup":false,"k":41,"u_out":0.913931,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":3,"dup":false,"k":42,"u_out":0.760776,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":0,"dup":false,"k":43,"u_out":0.594533,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":5,"dup":false,"k":44,"u_out":0.646694,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":1,"dup":false,"k":45,"u_out":0.847298,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":1,"dup":false,"k":46,"u_out":0.506949,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":0,"dup":false,"k":47,"u_out":0.147003,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":5,"dup":false,"k":48,"u_out":0.778637,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":true,"delay":2,"dup":false,"k":49,"u_out":0.639392,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":2,"dup":false,"k":50,"u_out":0.601348,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":0,"dup":false,"k":51,"u_out":0.903636,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":6,"dup":false,"k":52,"u_out":0.370237,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":3,"dup":false,"k":53,"u_out":0.306722,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":2,"dup":false,"k":54,"u_out":0.460266,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":3,"dup":false,"k":55,"u_out":0.602999,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":0,"dup":false,"k":56,"u_out":0.030987,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":6,"dup":false,"k":57,"u_out":0.17035,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":3,"dup":false,"k":58,"u_out":0.325212,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":3,"dup":false,"k":59,"u_out":0.205843,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":0,"dup":false,"k":60,"u_out":0.281305,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":0,"dup":false,"k":61,"u_out":0.202592,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":2,"dup":false,"k":62,"u_out":0.692125,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":4,"dup":false,"k":63,"u_out":0.398143,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":64,"u_out":0.444963,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":6,"dup":false,"k":65,"u_out":0.299035,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":3,"dup":false,"k":66,"u_out":0.874659,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":true,"delay":4,"dup":false,"k":67,"u_out":0.237706,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":5,"dup":false,"k":68,"u_out":0.735949,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":true,"delay":3,"dup":false,"k":69,"u_out":0.512823,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":6,"dup":false,"k":70,"u_out":0.288176,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":0,"dup":false,"k":71,"u_out":0.357099,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":true,"delay":0,"dup":false,"k":72,"u_out":0.929607,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":2,"dup":false,"k":73,"u_out":0.976808,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":1,"dup":true,"k":74,"u_out":0.844694,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":5,"dup":false,"k":75,"u_out":0.359095,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":0,"dup":false,"k":76,"u_out":0.927086,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":3,"dup":false,"k":77,"u_out":0.627059,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":0,"dup":false,"k":78,"u_out":0.601373,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":true,"delay":0,"dup":false,"k":79,"u_out":0.542401,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":0,"dup":false,"k":80,"u_out":0.704439,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":81,"u_out":0.58329,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":82,"u_out":0.391957,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":2,"dup":false,"k":83,"u_out":0.958643,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":2,"dup":false,"k":84,"u_out":0.443791,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":1,"dup":false,"k":85,"u_out":0.835122,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":0,"dup":false,"k":86,"u_out":0.663941,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":5,"dup":false,"k":87,"u_out":0.365469,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":0,"dup":true,"k":88,"u_out":0.898341,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":3,"dup":true,"k":89,"u_out":0.168862,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":1,"dup":false,"k":90,"u_out":0.340551,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":5,"dup":false,"k":91,"u_out":0.882797,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":0,"dup":false,"k":92,"u_out":0.352935,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":6,"dup":false,"k":93,"u_out":0.835047,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":true,"delay":0,"dup":false,"k":94,"u_out":0.627911,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":1,"dup":true,"k":95,"u_out":0.398275,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":1,"dup":false,"k":96,"u_out":0.937809,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":5,"dup":false,"k":97,"u_out":0.393515,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":4,"dup":false,"k":98,"u_out":0.264341,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":6,"dup":false,"k":99,"u_out":0.258827,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":2,"dup":false,"k":100,"u_out":0.072909,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":1,"dup":false,"k":101,"u_out":0.325585,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":true,"delay":4,"dup":false,"k":102,"u_out":0.376559,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":3,"dup":false,"k":103,"u_out":0.734999,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":0,"dup":false,"k":104,"u_out":0.285323,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":105,"u_out":0.512006,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":4,"dup":false,"k":106,"u_out":0.946121,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":2,"dup":false,"k":107,"u_out":0.342521,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":6,"dup":false,"k":108,"u_out":0.190449,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":3,"dup":true,"k":109,"u_out":0.030286,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":2,"dup":false,"k":110,"u_out":0.224101,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":5,"dup":false,"k":111,"u_out":0.29278,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":1,"dup":false,"k":112,"u_out":0.247772,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":5,"dup":false,"k":113,"u_out":0.018636,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":5,"dup":false,"k":114,"u_out":0.130622,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":6,"dup":false,"k":115,"u_out":0.477329,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":1,"dup":false,"k":116,"u_out":0.590379,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":6,"dup":false,"k":117,"u_out":0.191977,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":3,"dup":false,"k":118,"u_out":0.900785,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":6,"dup":false,"k":119,"u_out":0.961411,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":4,"dup":false,"k":120,"u_out":0.982974,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":2,"dup":false,"k":121,"u_out":0.644354,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":5,"dup":false,"k":122,"u_out":0.478043,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":6,"dup":false,"k":123,"u_out":0.495164,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":6,"dup":false,"k":124,"u_out":0.477582,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":4,"dup":false,"k":125,"u_out":0.98232,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":126,"u_out":0.445434,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":0,"dup":false,"k":127,"u_out":0.586957,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":3,"dup":false,"k":128,"u_out":0.44041,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":129,"u_out":0.027487,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":2,"dup":false,"k":130,"u_out":0.813266,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":1,"dup":false,"k":131,"u_out":0.396849,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":4,"dup":false,"k":132,"u_out":0.972946,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":1,"dup":false,"k":133,"u_out":0.931333,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":2,"dup":false,"k":134,"u_out":0.220344,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":6,"dup":false,"k":135,"u_out":0.020101,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":2,"dup":false,"k":136,"u_out":0.217805,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":1,"dup":false,"k":137,"u_out":0.084837,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":true,"delay":0,"dup":false,"k":138,"u_out":0.337793,"unknown":true,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":3,"dup":false,"k":139,"u_out":0.255211,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":5,"dup":false,"k":140,"u_out":0.370623,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":6,"dup":false,"k":141,"u_out":0.408218,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":1,"dup":false,"k":142,"u_out":0.635049,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":2,"dup":false,"k":143,"u_out":0.648534,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":4,"dup":true,"k":144,"u_out":0.311609,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":0,"dup":false,"k":145,"u_out":0.019684,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":1,"dup":false,"k":146,"u_out":0.848235,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":6,"dup":false,"k":147,"u_out":0.34137,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":4,"dup":false,"k":148,"u_out":0.622205,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":0,"dup":false,"k":149,"u_out":0.896903,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":4,"dup":false,"k":150,"u_out":0.468092,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":5,"dup":false,"k":151,"u_out":0.918121,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":5,"dup":false,"k":152,"u_out":0.940976,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":0,"dup":false,"k":153,"u_out":0.893058,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":0,"dup":false,"k":154,"u_out":0.901023,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":6,"dup":false,"k":155,"u_out":0.060981,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":6,"dup":false,"k":156,"u_out":0.516957,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":6,"dup":false,"k":157,"u_out":0.03494,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":3,"dup":false,"k":158,"u_out":0.49589,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":1,"dup":false,"k":159,"u_out":0.41907,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":false,"delay":0,"dup":false,"k":160,"u_out":0.903984,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":true,"delay":1,"dup":false,"k":161,"u_out":0.915179,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":1,"dup":false,"k":162,"u_out":0.735416,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":5,"dup":false,"k":163,"u_out":0.335493,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":6,"dup":false,"k":164,"u_out":0.578894,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":1,"dup":false,"k":165,"u_out":0.038494,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":0,"dup":false,"k":166,"u_out":0.054194,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":true,"delay":2,"dup":false,"k":167,"u_out":0.233935,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":6,"dup":false,"k":168,"u_out":0.929097,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":2,"dup":false,"k":169,"u_out":0.150853,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":6,"dup":false,"k":170,"u_out":0.354358,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":true,"delay":3,"dup":false,"k":171,"u_out":0.688737,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":2,"dup":false,"k":172,"u_out":0.892421,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":0,"dup":false,"k":173,"u_out":0.261817,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":6,"dup":false,"k":174,"u_out":0.794777,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":4,"dup":false,"k":175,"u_out":0.462428,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":3,"dup":false,"k":176,"u_out":0.325157,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":6,"dup":false,"k":177,"u_out":0.207435,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":2,"dup":false,"k":178,"u_out":0.517092,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":4,"dup":false,"k":179,"u_out":0.252474,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":4,"dup":true,"k":180,"u_out":0.077625,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":2,"dup":false,"k":181,"u_out":0.845509,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":3,"dup":false,"k":182,"u_out":0.053013,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":true,"delay":2,"dup":false,"k":183,"u_out":0.984288,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":5,"dup":false,"k":184,"u_out":0.70038,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":4,"dup":false,"k":185,"u_out":0.856829,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":5,"dup":false,"k":186,"u_out":0.224827,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":6,"dup":false,"k":187,"u_out":0.25405,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":false,"delay":1,"dup":false,"k":188,"u_out":0.253437,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":5,"dup":false,"k":189,"u_out":0.313966,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":6,"dup":false,"k":190,"u_out":0.48975,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":4,"dup":false,"k":191,"u_out":0.994269,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":6,"dup":false,"k":192,"u_out":0.60381,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":1,"dup":false,"k":193,"u_out":0.906521,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":3,"dup":false,"k":194,"u_out":0.004609,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":5,"dup":false,"k":195,"u_out":0.207231,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":1,"dup":false,"k":196,"u_out":0.171097,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":1,"dup":false,"k":197,"u_out":0.932635,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":1,"dup":false,"k":198,"u_out":0.775681,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":4,"dup":false,"k":199,"u_out":0.790325,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":true,"delay":6,"dup":false,"k":200,"u_out":0.843122,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":4,"dup":false,"k":201,"u_out":0.797144,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":3,"dup":false,"k":202,"u_out":0.539152,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":0,"dup":false,"k":203,"u_out":0.231257,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":3,"dup":false,"k":204,"u_out":0.67859,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":5,"dup":false,"k":205,"u_out":0.821181,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":0,"dup":false,"k":206,"u_out":0.310025,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":true,"delay":4,"dup":false,"k":207,"u_out":0.769716,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":5,"dup":false,"k":208,"u_out":0.148809,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":3,"dup":false,"k":209,"u_out":0.619315,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":1,"dup":false,"k":210,"u_out":0.640992,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":1,"dup":true,"k":211,"u_out":0.457515,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":true,"delay":1,"dup":false,"k":212,"u_out":0.550462,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":0,"dup":false,"k":213,"u_out":0.004118,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":3,"dup":false,"k":214,"u_out":0.983651,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":4,"dup":false,"k":215,"u_out":0.190806,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":true,"delay":4,"dup":false,"k":216,"u_out":0.017571,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":true,"delay":5,"dup":false,"k":217,"u_out":0.630466,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":4,"dup":false,"k":218,"u_out":0.423588,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":true,"delay":0,"dup":false,"k":219,"u_out":0.861517,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":6,"dup":false,"k":220,"u_out":0.799625,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":4,"dup":false,"k":221,"u_out":0.002323,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":3,"dup":true,"k":222,"u_out":0.300178,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":1,"dup":true,"k":223,"u_out":0.497018,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":4,"dup":false,"k":224,"u_out":0.75285,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":5,"dup":false,"k":225,"u_out":0.956047,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":3,"dup":false,"k":226,"u_out":0.221029,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":0,"dup":false,"k":227,"u_out":0.055826,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":228,"u_out":0.222082,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":2,"dup":false,"k":229,"u_out":0.560915,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":3,"dup":false,"k":230,"u_out":0.099859,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":1,"dup":false,"k":231,"u_out":0.375177,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":1,"dup":false,"k":232,"u_out":0.909916,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":2,"dup":false,"k":233,"u_out":0.463625,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":2,"dup":false,"k":234,"u_out":0.099321,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":0,"dup":false,"k":235,"u_out":0.367659,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":2,"dup":false,"k":236,"u_out":0.202092,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":0,"dup":false,"k":237,"u_out":0.833843,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":5,"dup":false,"k":238,"u_out":0.746901,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":1,"dup":false,"k":239,"u_out":0.904042,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":5,"dup":true,"k":240,"u_out":0.545029,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":3,"dup":false,"k":241,"u_out":0.019893,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":5,"dup":false,"k":242,"u_out":0.409636,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":2,"dup":false,"k":243,"u_out":0.616747,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":5,"dup":false,"k":244,"u_out":0.663105,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":3,"dup":false,"k":245,"u_out":0.237006,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":1,"dup":false,"k":246,"u_out":0.617346,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":0,"dup":false,"k":247,"u_out":0.239396,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":3,"dup":false,"k":248,"u_out":0.361331,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":3,"dup":false,"k":249,"u_out":0.38674,"unknown":true,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":6,"dup":true,"k":250,"u_out":0.39128,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":2,"dup":false,"k":251,"u_out":0.028124,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":252,"u_out":0.91035,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":5,"dup":false,"k":253,"u_out":0.412466,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":1,"dup":false,"k":254,"u_out":0.82828,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":2,"dup":false,"k":255,"u_out":0.935314,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":3,"dup":false,"k":256,"u_out":0.490687,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":257,"u_out":0.140546,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":2,"dup":false,"k":258,"u_out":0.440084,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":259,"u_out":0.950057,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":3,"dup":false,"k":260,"u_out":0.572719,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":true,"delay":0,"dup":false,"k":261,"u_out":0.327375,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":4,"dup":false,"k":262,"u_out":0.10853,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":5,"dup":false,"k":263,"u_out":0.145252,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":264,"u_out":0.142934,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":3,"dup":false,"k":265,"u_out":0.864281,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":2,"dup":false,"k":266,"u_out":0.889611,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":6,"dup":false,"k":267,"u_out":0.636289,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":2,"dup":false,"k":268,"u_out":0.366068,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":3,"dup":true,"k":269,"u_out":0.338489,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":6,"dup":false,"k":270,"u_out":0.639541,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":6,"dup":false,"k":271,"u_out":0.292685,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":4,"dup":false,"k":272,"u_out":0.170372,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":4,"dup":false,"k":273,"u_out":0.93537,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":3,"dup":false,"k":274,"u_out":0.528118,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":5,"dup":false,"k":275,"u_out":0.252092,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":0,"dup":false,"k":276,"u_out":0.564096,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":1,"dup":true,"k":277,"u_out":0.919896,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":true,"delay":3,"dup":false,"k":278,"u_out":0.009573,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":2,"dup":false,"k":279,"u_out":0.902463,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":0,"dup":false,"k":280,"u_out":0.782953,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":3,"dup":false,"k":281,"u_out":0.54577,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":true,"delay":3,"dup":false,"k":282,"u_out":0.974128,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":6,"dup":false,"k":283,"u_out":0.531352,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":2,"dup":false,"k":284,"u_out":0.317212,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":true,"delay":5,"dup":false,"k":285,"u_out":0.131069,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":4,"dup":false,"k":286,"u_out":0.886393,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":true,"delay":4,"dup":false,"k":287,"u_out":0.489407,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":6,"dup":false,"k":288,"u_out":0.244554,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":true,"delay":0,"dup":false,"k":289,"u_out":0.962649,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":true,"delay":0,"dup":false,"k":290,"u_out":0.432824,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":1,"dup":false,"k":291,"u_out":0.428032,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":6,"dup":false,"k":292,"u_out":0.993575,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":5,"dup":false,"k":293,"u_out":0.180133,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":3,"dup":false,"k":294,"u_out":0.303684,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":5,"dup":false,"k":295,"u_out":0.907257,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":true,"delay":2,"dup":true,"k":296,"u_out":0.609745,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":1,"dup":false,"k":297,"u_out":0.387834,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":true,"delay":5,"dup":false,"k":298,"u_out":0.600369,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":5,"dup":false,"k":299,"u_out":0.801909,"unknown":false,"unknown_good":false} diff --git a/bench/individuality/fixtures/credit/draws-9.jsonl b/bench/individuality/fixtures/credit/draws-9.jsonl new file mode 100644 index 0000000..4322486 --- /dev/null +++ b/bench/individuality/fixtures/credit/draws-9.jsonl @@ -0,0 +1,300 @@ +{"blast":0.16,"cancel":false,"delay":0,"dup":false,"k":0,"u_out":0.487362,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":1,"dup":false,"k":1,"u_out":0.766023,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":true,"delay":5,"dup":false,"k":2,"u_out":0.160801,"unknown":true,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":5,"dup":false,"k":3,"u_out":0.353733,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":3,"dup":false,"k":4,"u_out":0.787349,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":4,"dup":false,"k":5,"u_out":0.033664,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":2,"dup":false,"k":6,"u_out":0.688971,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":1,"dup":false,"k":7,"u_out":0.871677,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":0,"dup":false,"k":8,"u_out":0.851975,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":2,"dup":false,"k":9,"u_out":0.024102,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":3,"dup":false,"k":10,"u_out":0.715309,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":true,"delay":2,"dup":false,"k":11,"u_out":0.265359,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":3,"dup":false,"k":12,"u_out":0.080409,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":5,"dup":false,"k":13,"u_out":0.966081,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":1,"dup":false,"k":14,"u_out":0.660601,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":4,"dup":false,"k":15,"u_out":0.380439,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":true,"delay":1,"dup":false,"k":16,"u_out":0.743289,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":5,"dup":true,"k":17,"u_out":0.843503,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":1,"dup":false,"k":18,"u_out":0.597283,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":5,"dup":false,"k":19,"u_out":0.112983,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":true,"delay":2,"dup":false,"k":20,"u_out":0.510736,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":3,"dup":false,"k":21,"u_out":0.192323,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":0,"dup":false,"k":22,"u_out":0.66041,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":true,"delay":4,"dup":false,"k":23,"u_out":0.217159,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":2,"dup":false,"k":24,"u_out":0.592887,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":0,"dup":false,"k":25,"u_out":0.429628,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":5,"dup":true,"k":26,"u_out":0.005364,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":6,"dup":false,"k":27,"u_out":0.419419,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":2,"dup":false,"k":28,"u_out":0.286576,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":1,"dup":false,"k":29,"u_out":0.618775,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":5,"dup":false,"k":30,"u_out":0.830572,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":false,"delay":1,"dup":false,"k":31,"u_out":0.028295,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":6,"dup":false,"k":32,"u_out":0.432448,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":0,"dup":false,"k":33,"u_out":0.979353,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":true,"delay":3,"dup":false,"k":34,"u_out":0.046605,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":3,"dup":true,"k":35,"u_out":0.237758,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":true,"delay":6,"dup":false,"k":36,"u_out":0.724951,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":5,"dup":false,"k":37,"u_out":0.242224,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":true,"delay":4,"dup":false,"k":38,"u_out":0.5548,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":0,"dup":false,"k":39,"u_out":0.953371,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":5,"dup":false,"k":40,"u_out":0.323337,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":5,"dup":false,"k":41,"u_out":0.949988,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":0,"dup":false,"k":42,"u_out":0.59302,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":4,"dup":false,"k":43,"u_out":0.220414,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":4,"dup":false,"k":44,"u_out":0.946047,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":45,"u_out":0.992627,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":3,"dup":false,"k":46,"u_out":0.446742,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":true,"delay":6,"dup":false,"k":47,"u_out":0.284767,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":1,"dup":false,"k":48,"u_out":0.630733,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":6,"dup":false,"k":49,"u_out":0.443509,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":5,"dup":false,"k":50,"u_out":0.039615,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":6,"dup":false,"k":51,"u_out":0.844875,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":false,"delay":0,"dup":false,"k":52,"u_out":0.402413,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":1,"dup":false,"k":53,"u_out":0.07823,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":4,"dup":false,"k":54,"u_out":0.204849,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":2,"dup":false,"k":55,"u_out":0.019851,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":6,"dup":false,"k":56,"u_out":0.099061,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":true,"delay":4,"dup":false,"k":57,"u_out":0.966791,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":0,"dup":false,"k":58,"u_out":0.543969,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":4,"dup":false,"k":59,"u_out":0.7913,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":4,"dup":false,"k":60,"u_out":0.290818,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":3,"dup":false,"k":61,"u_out":0.332795,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":4,"dup":false,"k":62,"u_out":0.2381,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":true,"delay":6,"dup":false,"k":63,"u_out":0.587583,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":5,"dup":false,"k":64,"u_out":0.912541,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":3,"dup":false,"k":65,"u_out":0.678526,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":1,"dup":false,"k":66,"u_out":0.509267,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":6,"dup":false,"k":67,"u_out":0.398734,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":4,"dup":false,"k":68,"u_out":0.419673,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":69,"u_out":0.504585,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":6,"dup":false,"k":70,"u_out":0.995743,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":0,"dup":false,"k":71,"u_out":0.736887,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":true,"delay":5,"dup":false,"k":72,"u_out":0.263582,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":true,"delay":0,"dup":false,"k":73,"u_out":0.890167,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":0,"dup":false,"k":74,"u_out":0.116327,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":2,"dup":false,"k":75,"u_out":0.577677,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":1,"dup":false,"k":76,"u_out":0.887662,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":true,"delay":6,"dup":false,"k":77,"u_out":0.851216,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":5,"dup":false,"k":78,"u_out":0.351683,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":5,"dup":false,"k":79,"u_out":0.149,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":0,"dup":false,"k":80,"u_out":0.234773,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":5,"dup":false,"k":81,"u_out":0.214377,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":2,"dup":false,"k":82,"u_out":0.894591,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":1,"dup":false,"k":83,"u_out":0.604273,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":2,"dup":false,"k":84,"u_out":0.661301,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":4,"dup":false,"k":85,"u_out":0.293157,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":4,"dup":false,"k":86,"u_out":0.078779,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":4,"dup":false,"k":87,"u_out":0.582198,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":5,"dup":false,"k":88,"u_out":0.020668,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":4,"dup":false,"k":89,"u_out":0.439279,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":true,"delay":6,"dup":false,"k":90,"u_out":0.884552,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":0,"dup":false,"k":91,"u_out":0.338761,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":2,"dup":false,"k":92,"u_out":0.465594,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":6,"dup":false,"k":93,"u_out":0.678317,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":3,"dup":false,"k":94,"u_out":0.009207,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":95,"u_out":0.378926,"unknown":true,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":0,"dup":false,"k":96,"u_out":0.41424,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":5,"dup":false,"k":97,"u_out":0.231223,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":3,"dup":false,"k":98,"u_out":0.240994,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":5,"dup":false,"k":99,"u_out":0.662834,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":0,"dup":false,"k":100,"u_out":0.910726,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":false,"delay":3,"dup":false,"k":101,"u_out":0.389592,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":3,"dup":false,"k":102,"u_out":0.304843,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":true,"delay":0,"dup":false,"k":103,"u_out":0.458967,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":5,"dup":false,"k":104,"u_out":0.59048,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":1,"dup":false,"k":105,"u_out":0.074311,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":2,"dup":false,"k":106,"u_out":0.175365,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":true,"delay":0,"dup":false,"k":107,"u_out":0.572696,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":4,"dup":false,"k":108,"u_out":0.143406,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":4,"dup":false,"k":109,"u_out":0.559843,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":true,"delay":3,"dup":false,"k":110,"u_out":0.326569,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":0,"dup":false,"k":111,"u_out":0.124748,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":0,"dup":false,"k":112,"u_out":0.942556,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":2,"dup":false,"k":113,"u_out":0.212045,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":4,"dup":false,"k":114,"u_out":0.647715,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":true,"delay":6,"dup":false,"k":115,"u_out":0.27453,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":3,"dup":false,"k":116,"u_out":0.11914,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":0,"dup":false,"k":117,"u_out":0.327135,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":6,"dup":false,"k":118,"u_out":0.215695,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":3,"dup":false,"k":119,"u_out":0.948829,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":true,"delay":1,"dup":false,"k":120,"u_out":0.322899,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":3,"dup":false,"k":121,"u_out":0.213868,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":5,"dup":false,"k":122,"u_out":0.743889,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":3,"dup":false,"k":123,"u_out":0.348356,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":2,"dup":false,"k":124,"u_out":0.811556,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":1,"dup":false,"k":125,"u_out":0.696658,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":1,"dup":true,"k":126,"u_out":0.232849,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":0,"dup":false,"k":127,"u_out":0.700666,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":1,"dup":false,"k":128,"u_out":0.456913,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":6,"dup":false,"k":129,"u_out":0.435684,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":0,"dup":false,"k":130,"u_out":0.994542,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":131,"u_out":0.597,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":3,"dup":false,"k":132,"u_out":0.725591,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":0,"dup":false,"k":133,"u_out":0.890952,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":1,"dup":false,"k":134,"u_out":0.124687,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":0,"dup":false,"k":135,"u_out":0.644469,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":true,"delay":3,"dup":false,"k":136,"u_out":0.813234,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":1,"dup":false,"k":137,"u_out":0.209915,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":true,"delay":0,"dup":false,"k":138,"u_out":0.506246,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":5,"dup":true,"k":139,"u_out":0.020426,"unknown":false,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":3,"dup":false,"k":140,"u_out":0.735037,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":4,"dup":true,"k":141,"u_out":0.448102,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":4,"dup":false,"k":142,"u_out":0.417152,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":1,"dup":false,"k":143,"u_out":0.628293,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":6,"dup":false,"k":144,"u_out":0.8387,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":2,"dup":false,"k":145,"u_out":0.41698,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":4,"dup":false,"k":146,"u_out":0.889739,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":0,"dup":false,"k":147,"u_out":0.994453,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":4,"dup":false,"k":148,"u_out":0.281388,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":1,"dup":false,"k":149,"u_out":0.547709,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":6,"dup":false,"k":150,"u_out":0.116724,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":4,"dup":false,"k":151,"u_out":0.337145,"unknown":true,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":4,"dup":false,"k":152,"u_out":0.185932,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":1,"dup":false,"k":153,"u_out":0.331968,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":6,"dup":true,"k":154,"u_out":0.60968,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":5,"dup":false,"k":155,"u_out":0.175818,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":1,"dup":false,"k":156,"u_out":0.92635,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":3,"dup":false,"k":157,"u_out":0.844677,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":0,"dup":true,"k":158,"u_out":0.101023,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":6,"dup":false,"k":159,"u_out":0.739045,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":2,"dup":true,"k":160,"u_out":0.200371,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":1,"dup":false,"k":161,"u_out":0.739635,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":1,"dup":false,"k":162,"u_out":0.373544,"unknown":true,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":0,"dup":false,"k":163,"u_out":0.647564,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":0,"dup":false,"k":164,"u_out":0.119251,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":6,"dup":false,"k":165,"u_out":0.372193,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":4,"dup":false,"k":166,"u_out":0.07552,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":2,"dup":false,"k":167,"u_out":0.212646,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":true,"delay":6,"dup":false,"k":168,"u_out":0.013572,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":1,"dup":false,"k":169,"u_out":0.674535,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":true,"delay":6,"dup":false,"k":170,"u_out":0.657952,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":3,"dup":false,"k":171,"u_out":0.630269,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":0,"dup":false,"k":172,"u_out":0.250345,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":5,"dup":false,"k":173,"u_out":0.462863,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":4,"dup":false,"k":174,"u_out":0.491625,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":0,"dup":false,"k":175,"u_out":0.524306,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":5,"dup":false,"k":176,"u_out":0.584048,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":6,"dup":false,"k":177,"u_out":0.191149,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":6,"dup":false,"k":178,"u_out":0.979456,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":0,"dup":false,"k":179,"u_out":0.518121,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":3,"dup":false,"k":180,"u_out":0.687361,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":181,"u_out":0.695954,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":1,"dup":false,"k":182,"u_out":0.29321,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":6,"dup":false,"k":183,"u_out":0.442202,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":6,"dup":false,"k":184,"u_out":0.785894,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":4,"dup":false,"k":185,"u_out":0.080108,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":5,"dup":false,"k":186,"u_out":0.649758,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":3,"dup":false,"k":187,"u_out":0.74068,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":true,"delay":4,"dup":false,"k":188,"u_out":0.261954,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":4,"dup":false,"k":189,"u_out":0.685253,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":6,"dup":false,"k":190,"u_out":0.806582,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":191,"u_out":0.71688,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":4,"dup":false,"k":192,"u_out":0.067287,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":4,"dup":false,"k":193,"u_out":0.166175,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":3,"dup":false,"k":194,"u_out":0.581588,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":4,"dup":false,"k":195,"u_out":0.807636,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":6,"dup":false,"k":196,"u_out":0.604542,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":4,"dup":false,"k":197,"u_out":0.674861,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":6,"dup":false,"k":198,"u_out":0.37115,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":3,"dup":false,"k":199,"u_out":0.387608,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":2,"dup":true,"k":200,"u_out":0.423416,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":1,"dup":true,"k":201,"u_out":0.400042,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":5,"dup":false,"k":202,"u_out":0.059443,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":6,"dup":true,"k":203,"u_out":0.61575,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":1,"dup":false,"k":204,"u_out":0.211092,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":0,"dup":false,"k":205,"u_out":0.194834,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":3,"dup":false,"k":206,"u_out":0.315301,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":2,"dup":false,"k":207,"u_out":0.721947,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":6,"dup":false,"k":208,"u_out":0.626368,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":4,"dup":false,"k":209,"u_out":0.134371,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":5,"dup":false,"k":210,"u_out":0.49437,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":2,"dup":false,"k":211,"u_out":0.722435,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":true,"delay":5,"dup":false,"k":212,"u_out":0.110164,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":4,"dup":false,"k":213,"u_out":0.570011,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":214,"u_out":0.883401,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":true,"delay":1,"dup":false,"k":215,"u_out":0.79975,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":1,"dup":false,"k":216,"u_out":0.676326,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":3,"dup":false,"k":217,"u_out":0.68706,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":6,"dup":false,"k":218,"u_out":0.271358,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":3,"dup":false,"k":219,"u_out":0.509887,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":true,"delay":6,"dup":false,"k":220,"u_out":0.311492,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":6,"dup":false,"k":221,"u_out":0.618205,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":3,"dup":false,"k":222,"u_out":0.318299,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":2,"dup":false,"k":223,"u_out":0.723002,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":3,"dup":true,"k":224,"u_out":0.66878,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":4,"dup":false,"k":225,"u_out":0.474626,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":4,"dup":false,"k":226,"u_out":0.560821,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":4,"dup":false,"k":227,"u_out":0.638127,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":4,"dup":false,"k":228,"u_out":0.731292,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":6,"dup":false,"k":229,"u_out":0.756685,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":5,"dup":false,"k":230,"u_out":0.409929,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":5,"dup":false,"k":231,"u_out":0.511922,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":6,"dup":false,"k":232,"u_out":0.100686,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":4,"dup":false,"k":233,"u_out":0.229039,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":2,"dup":false,"k":234,"u_out":0.052013,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":6,"dup":false,"k":235,"u_out":0.702649,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":236,"u_out":0.513986,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":6,"dup":false,"k":237,"u_out":0.708914,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":3,"dup":false,"k":238,"u_out":0.772296,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":5,"dup":false,"k":239,"u_out":0.352157,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":1,"dup":false,"k":240,"u_out":0.675209,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":1,"dup":false,"k":241,"u_out":0.68368,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":4,"dup":false,"k":242,"u_out":0.061158,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":6,"dup":false,"k":243,"u_out":0.831999,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":5,"dup":false,"k":244,"u_out":0.5032,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":4,"dup":true,"k":245,"u_out":0.952093,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":true,"delay":6,"dup":false,"k":246,"u_out":0.722674,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":2,"dup":false,"k":247,"u_out":0.604825,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":1,"dup":false,"k":248,"u_out":0.444746,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":6,"dup":false,"k":249,"u_out":0.856588,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":3,"dup":false,"k":250,"u_out":0.760607,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":5,"dup":false,"k":251,"u_out":0.668003,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":0,"dup":false,"k":252,"u_out":0.502532,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":2,"dup":false,"k":253,"u_out":0.386454,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":4,"dup":true,"k":254,"u_out":0.90424,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":5,"dup":false,"k":255,"u_out":0.201861,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":6,"dup":false,"k":256,"u_out":0.010356,"unknown":true,"unknown_good":false} +{"blast":0.63,"cancel":true,"delay":0,"dup":false,"k":257,"u_out":0.393197,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":true,"delay":0,"dup":false,"k":258,"u_out":0.28439,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":5,"dup":false,"k":259,"u_out":0.22993,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":2,"dup":false,"k":260,"u_out":0.157443,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":0,"dup":false,"k":261,"u_out":0.677888,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":262,"u_out":0.66324,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":true,"delay":2,"dup":false,"k":263,"u_out":0.648891,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":0,"dup":false,"k":264,"u_out":0.600739,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":6,"dup":false,"k":265,"u_out":0.76982,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":1,"dup":false,"k":266,"u_out":0.38268,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":5,"dup":false,"k":267,"u_out":0.223215,"unknown":true,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":6,"dup":false,"k":268,"u_out":0.734681,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":1,"dup":false,"k":269,"u_out":0.192753,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":0,"dup":false,"k":270,"u_out":0.288589,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":271,"u_out":0.605375,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":1,"dup":false,"k":272,"u_out":0.770272,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":2,"dup":false,"k":273,"u_out":0.047174,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":4,"dup":false,"k":274,"u_out":0.510225,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":1,"dup":false,"k":275,"u_out":0.03689,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":true,"delay":0,"dup":false,"k":276,"u_out":0.846551,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":6,"dup":false,"k":277,"u_out":0.768953,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":3,"dup":false,"k":278,"u_out":0.396004,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":1,"dup":false,"k":279,"u_out":0.225815,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":true,"delay":2,"dup":false,"k":280,"u_out":0.327131,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":2,"dup":false,"k":281,"u_out":0.50924,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":5,"dup":false,"k":282,"u_out":0.382312,"unknown":true,"unknown_good":false} +{"blast":0.42,"cancel":true,"delay":6,"dup":false,"k":283,"u_out":0.2403,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":3,"dup":false,"k":284,"u_out":0.416453,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":2,"dup":false,"k":285,"u_out":0.431984,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":5,"dup":false,"k":286,"u_out":0.881183,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":4,"dup":false,"k":287,"u_out":0.823458,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":0,"dup":false,"k":288,"u_out":0.951271,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":5,"dup":false,"k":289,"u_out":0.745306,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":290,"u_out":0.058511,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":0,"dup":false,"k":291,"u_out":0.157667,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":0,"dup":false,"k":292,"u_out":0.501101,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":6,"dup":false,"k":293,"u_out":0.520964,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":true,"delay":6,"dup":false,"k":294,"u_out":0.671614,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":1,"dup":false,"k":295,"u_out":0.004205,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":5,"dup":false,"k":296,"u_out":0.131053,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":2,"dup":false,"k":297,"u_out":0.788776,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":6,"dup":false,"k":298,"u_out":0.26862,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":4,"dup":false,"k":299,"u_out":0.733001,"unknown":false,"unknown_good":true} diff --git a/bench/individuality/fixtures/credit_draws.py b/bench/individuality/fixtures/credit_draws.py new file mode 100644 index 0000000..6eb75d5 --- /dev/null +++ b/bench/individuality/fixtures/credit_draws.py @@ -0,0 +1,39 @@ +"""Metric c: the seeded draws of every decision (Python 3.9, standard library only). + + python3 credit_draws.py # writes credit/draws-.jsonl for individuals 0-9 (the bytes MANIFEST records) + +One line per decision k = 0..299, drawn in this order from random.Random(1000 + seed): `blast` (the request's blast radius, +uniform on 0.05..0.65, 2 decimals: no habit binds), `u_out` (the outcome is good when u_out < 0.8 after act, 0.4 after ask), +`delay` (stream 2: the outcome rides on event k + 1 + delay, uniform on 0..6), `cancel` (10 %: the executor cancels the +decision instead), `dup` (5 %: the outcome, or for a cancelled decision a stray outcome after the cancel, is sent a second +time), `unknown` (2 %: this event also pays a turn never opened) and `unknown_good` (that payment's sign). +""" +import json +import os +import random + +HERE = os.path.dirname(os.path.abspath(__file__)) +SEEDS = range(10) +DECISIONS = 300 + + +def draws(seed): + rng = random.Random(1000 + seed) + out = [] + for k in range(DECISIONS): + out.append({"k": k, "blast": round(rng.uniform(0.05, 0.65), 2), "u_out": round(rng.random(), 6), + "delay": rng.randint(0, 6), "cancel": rng.random() < 0.10, "dup": rng.random() < 0.05, + "unknown": rng.random() < 0.02, "unknown_good": rng.random() < 0.5}) + return out + + +def main(): + os.makedirs(os.path.join(HERE, "credit"), exist_ok=True) + for s in SEEDS: + with open(os.path.join(HERE, "credit", "draws-%d.jsonl" % s), "w", encoding="utf-8", newline="\n") as f: + for d in draws(s): + f.write(json.dumps(d, sort_keys=True, separators=(",", ":")) + "\n") + + +if __name__ == "__main__": + main() diff --git a/bench/individuality/fixtures/dispatch-noblock.yaml b/bench/individuality/fixtures/dispatch-noblock.yaml new file mode 100644 index 0000000..d8e7ca1 --- /dev/null +++ b/bench/individuality/fixtures/dispatch-noblock.yaml @@ -0,0 +1,67 @@ +# Metric c fixture, variants (iii) and (iv): dispatch.yaml without its learning.credit block (0.8 semantics: feedback pays +# the previous stance). +probbit_persona: 1 +identity: + name: Dispatch + version: 1.0.0 + seed: 0 + summary: acts on routine work; asks a person before risky work or after repeated failures +traits: + - id: action + levels: [act, ask] + logw: [0.8, 0] + spread: 0.3 + say: [take the action, ask a person first] + - id: caution + levels: [measured, careful] + prior: [0.6, 0.4] + spread: 0.3 + say: ["", verify before acting] +couplings: + - {vars: [caution, action], align: 0.6} +inputs: + - id: blast + kind: number + say: blast radius of the request (0 = none, 1 = everything) + effects: {action: 1.2, caution: 1.0} + - id: error + kind: flag + say: the last action failed + effects: {action: 0.4, caution: 0.6} + - id: praise + kind: flag + say: the outcome was confirmed good + - id: criticism + kind: flag + say: the outcome was judged bad +history: + - id: error_streak + of: error + kind: streak + cap: 3 + effects: {action: 0.3} +habits: + # routine work: no blast radius, no failure, no failure streak. Without this habit, feedback can teach some + # individuals to ask about routine work too (see the README section "Check in CI"). + - id: routine_acts + when: {blast: {at_most: 0}, error: false, error_streak: {at_most: 0}} + then: {action: [act]} + say: routine work, just do it + priority: -1 # never applies together with the two below; if it ever did, it yields to them + - id: risky_asks + when: {blast: 0.7} + then: {action: [ask]} + say: high blast radius, ask first + - id: two_errors_ask + when: {error_streak: 2} + then: {action: [ask]} + say: two failures in a row, ask first +learning: + from: [praise, criticism] + traits: [action] + rate: 0.3 + step_cap: 0.05 + total_cap: 0.4 +reward_from: [human, env] +engine: + on_conflict: yield # lint pairs habits by what they require: these never meet, but a turn where they did would ask diff --git a/bench/individuality/fixtures/dispatch.yaml b/bench/individuality/fixtures/dispatch.yaml new file mode 100644 index 0000000..62fc9ab --- /dev/null +++ b/bench/individuality/fixtures/dispatch.yaml @@ -0,0 +1,70 @@ +# Metric c fixture (credit accuracy): the shipped dispatch policy (examples/persona/dispatch-policy.yaml, 0.8.3) with a +# learning.credit block. Every event is a decision on `action` (act or ask) with a `blast` reading as a plain input. +probbit_persona: 1 +identity: + name: Dispatch + version: 1.0.0 + seed: 0 + summary: acts on routine work; asks a person before risky work or after repeated failures +traits: + - id: action + levels: [act, ask] + logw: [0.8, 0] + spread: 0.3 + say: [take the action, ask a person first] + - id: caution + levels: [measured, careful] + prior: [0.6, 0.4] + spread: 0.3 + say: ["", verify before acting] +couplings: + - {vars: [caution, action], align: 0.6} +inputs: + - id: blast + kind: number + say: blast radius of the request (0 = none, 1 = everything) + effects: {action: 1.2, caution: 1.0} + - id: error + kind: flag + say: the last action failed + effects: {action: 0.4, caution: 0.6} + - id: praise + kind: flag + say: the outcome was confirmed good + - id: criticism + kind: flag + say: the outcome was judged bad +history: + - id: error_streak + of: error + kind: streak + cap: 3 + effects: {action: 0.3} +habits: + # routine work: no blast radius, no failure, no failure streak. Without this habit, feedback can teach some + # individuals to ask about routine work too (see the README section "Check in CI"). + - id: routine_acts + when: {blast: {at_most: 0}, error: false, error_streak: {at_most: 0}} + then: {action: [act]} + say: routine work, just do it + priority: -1 # never applies together with the two below; if it ever did, it yields to them + - id: risky_asks + when: {blast: 0.7} + then: {action: [ask]} + say: high blast radius, ask first + - id: two_errors_ask + when: {error_streak: 2} + then: {action: [ask]} + say: two failures in a row, ask first +learning: + from: [praise, criticism] + traits: [action] + rate: 0.3 + step_cap: 0.05 + total_cap: 0.4 + credit: + max_open: 8 + half_life_events: 32 +reward_from: [human, env] +engine: + on_conflict: yield # lint pairs habits by what they require: these never meet, but a turn where they did would ask diff --git a/bench/individuality/fixtures/sensed-plain.yaml b/bench/individuality/fixtures/sensed-plain.yaml new file mode 100644 index 0000000..282249f --- /dev/null +++ b/bench/individuality/fixtures/sensed-plain.yaml @@ -0,0 +1,129 @@ +# Metric a's reported control (not gated): fixtures/sensed.yaml with its senses block replaced by plain 0.8 number inputs +# (twins_b.py sends each reading's push against the fixed prior) and the habits on the raw readings read plain inputs. +# A fictional persona with senses: an agent that runs tools for a person. probbit persona format 1 (docs/persona.md §2.11). +# Four readings the host measures (tool failures, tool latency, message tempo, silence) are judged against the normal this +# individual learns from its own log, so the same reading moves two lives differently, and `why` names the normal it was +# judged against. The host acts on caution: bold = go ahead, measured = show the plan, then go, careful = show the diff and wait. +probbit_persona: 1 +identity: + name: Vale + version: 1.0.0 + seed: 1 + summary: a tool-running agent that judges its tool failures, latency, message tempo and silence against its own normals + +traits: + - id: caution + levels: [bold, measured, careful] + prior: [0.35, 0.45, 0.2] + spread: 0.4 + say: [go ahead, show the plan then go, show the diff and wait] + - id: initiative + levels: [follow, suggest, lead] + prior: [0.3, 0.45, 0.25] + spread: 0.4 + say: [answer only what was asked, suggest a next step, take the next step] + - id: verbosity + levels: [terse, short, full] + prior: [0.2, 0.35, 0.45] + spread: 0.4 + say: [one line, a short reply, full detail] + - id: warmth + levels: [cool, neutral, warm] + prior: [0.25, 0.45, 0.3] + spread: 0.4 + say: [plain, "", warm] + +moods: + - id: valence + levels: [down, even, up] + prior: [0.25, 0.5, 0.25] + inertia: 0.5 + half_life_hours: 6 + - id: arousal + levels: [calm, steady, keyed] + prior: [0.3, 0.45, 0.25] + inertia: 0.5 + half_life_hours: 6 + +couplings: + - {vars: [valence, warmth], align: 0.6} + - {vars: [arousal, caution], align: 0.5} + +inputs: + - id: praise + kind: flag + effects: {valence: 0.6} + - id: criticism + kind: flag + effects: {valence: -0.6} + + # the readings as plain 0.8 number inputs (metric a's reported control): the host judges each reading against the + # declared prior, which never moves (z, the 0.5 dead zone and the cap of 6 as a sense with zero spreads would), and + # sends the push up and down; tool_fail and tempo also come raw, for the habits + - id: tool_fail + kind: flag + - id: tool_fail_up + kind: number + max: 6 + reactivity_spread: 0.3 + effects: {caution: 0.8, valence: -0.4} + - id: tool_fail_down + kind: number + max: 6 + reactivity_spread: 0.3 + effects: {caution: -0.8, valence: 0.4} + - id: tool_latency_up + kind: number + max: 6 + reactivity_spread: 0.3 + effects: {arousal: 0.5, verbosity: -0.3} + - id: tool_latency_down + kind: number + max: 6 + reactivity_spread: 0.3 + effects: {arousal: -0.5, verbosity: 0.3} + - id: tempo + kind: number + max: 200 + - id: tempo_up + kind: number + max: 6 + reactivity_spread: 0.3 + effects: {verbosity: -0.4, arousal: 0.3} + - id: tempo_down + kind: number + max: 6 + reactivity_spread: 0.3 + effects: {verbosity: 0.4, arousal: -0.3} + - id: silence_up + kind: number + max: 6 + reactivity_spread: 0.3 + effects: {warmth: 0.4, initiative: 0.3} + - id: silence_down + kind: number + max: 6 + reactivity_spread: 0.3 + effects: {warmth: -0.4, initiative: -0.3} +habits: + - id: no_bold_after_failure + when: {tool_fail: true} # the raw reading: holds whatever the history + then: {caution: {not: [bold]}} + say: no bold move after a failure + - id: short_when_busy + when: {tempo: {at_least: 20}} + then: {verbosity: {at_most: short}} + say: keep it short while busy + +learning: + from: [praise, criticism] + traits: [caution] + rate: 0.3 + step_cap: 0.1 + total_cap: 0.4 +reward_from: [human, env] + +engine: + exact_limit: 1000 # solved per component: the same odds, a fraction of the time +line: + order: [caution, verbosity, initiative, warmth] diff --git a/bench/individuality/run.py b/bench/individuality/run.py index a9317df..f2c6f3a 100644 --- a/bench/individuality/run.py +++ b/bench/individuality/run.py @@ -1,10 +1,10 @@ """bench/individuality: run the metrics, check every gated bar (Python 3.9, standard library only). - python3 run.py [--only a,b,d,e] [--out result.json] + python3 run.py [--only a,b,c,d,e] [--out result.json] The binary is PROBBIT_BIN, else `probbit` on PATH. Exit 0: every gated bar of the metrics run passes; 1: one fails (or the -wall time is over its bar); 2: a setup error (no binary, a fixture that differs from fixtures/MANIFEST). Metric c (credit) -and f (lineage) need blocks this release does not have and are skipped with a note. +wall time is over its bar); 2: a setup error (no binary, a fixture that differs from fixtures/MANIFEST). Metric f (lineage) +needs blocks this release does not have and is skipped with a note. """ import json import os @@ -19,8 +19,7 @@ import common # noqa: E402 KNOWN = ["a", "b", "c", "d", "e", "f"] -LATER = {"c": "credit accuracy needs the learning.credit block (not in this release)", - "f": "lineage drift needs signed rewards and a lineage block (not in this release)"} +LATER = {"f": "lineage drift needs signed rewards and a lineage block (not in this release)"} def manifest(): @@ -52,7 +51,7 @@ def main(argv): elif a == "--out" and args: out = args.pop(0) else: - common.fail("usage: python3 run.py [--only a,b,d,e] [--out FILE]") + common.fail("usage: python3 run.py [--only a,b,c,d,e] [--out FILE]") unknown = [m for m in only if m not in KNOWN] if unknown: common.fail("unknown metric(s): " + ", ".join(unknown)) @@ -64,6 +63,9 @@ def main(argv): raise common.SetupError("fixtures differ from fixtures/MANIFEST: " + ", ".join(bad)) with open(os.path.join(common.FIXTURES, "bars.json"), encoding="utf-8") as f: bars = json.load(f) + with open(os.path.join(common.FIXTURES, "bars-c.json"), encoding="utf-8") as f: + bars_c = json.load(f) + import credit import habits import habituation import replay @@ -83,6 +85,8 @@ def main(argv): result["metrics"]["d"] = replay.metric(lv, tmp, bars) if "e" in only: result["metrics"]["e"] = habits.metric(stances, bars) + if "c" in only: + result["metrics"]["c"] = credit.metric(bars_c, tmp) finally: shutil.rmtree(tmp, ignore_errors=True) for m in only: From 9d52f8ee1530a229e9ed6b35f87ae55b8640e06b Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 09:56:54 -0700 Subject: [PATCH 11/15] bench/individuality: credit.py runs its 50 host-driven runs side by side, re-runs only the runs that refused events, and reports evictions, expiries and payment ages per run (logged in the README) --- bench/individuality/README.md | 5 +++++ bench/individuality/credit.py | 26 ++++++++++++++++++-------- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/bench/individuality/README.md b/bench/individuality/README.md index a61a36d..90f0940 100644 --- a/bench/individuality/README.md +++ b/bench/individuality/README.md @@ -201,3 +201,8 @@ d 0 differing bytes over 240 strands, e 0 violations and 0 breaks over 9,442 sta metric c section above) were added to MANIFEST in their own section before their first run; `run.py` runs metric c. `fixtures/sensed-plain.yaml` (metric a's reported control: the senses replaced by plain 0.8 number inputs) was frozen in the same section. No earlier fixture, stream or bar changed. +- `credit.py` after its first run (no fixture, bar or gated computation changed; every gated value was the same in each + run): the 50 runs go side by side (the host waits on each stance, so a run is latency-bound); a run that refused no + event is not re-run (without refused events it is the same run, and metric d replays every strand); the reported + eviction and expiry shares are given per run, with the age of the addressed payments. The first run's numbers stay in + the history: c1, c2, c3 and c4 1.0, 50/50 pairs identical. diff --git a/bench/individuality/credit.py b/bench/individuality/credit.py index e319124..d26274e 100644 --- a/bench/individuality/credit.py +++ b/bench/individuality/credit.py @@ -29,7 +29,7 @@ LEVELS = ["act", "ask"] RATE, STEP_CAP, TOTAL_CAP, HALF_LIFE, MAX_OPEN = 0.3, 0.05, 0.4, 32, 8 TOL = 1e-6 + 1e-12 -WORKERS = 4 +WORKERS = 50 # the host waits on each stance: the runs are latency-bound, so all 50 run side by side def r6(x): @@ -226,8 +226,10 @@ def evaluate(tmp, r): for m in r["msgs"]: m["open_on_arrival"] = m["n"] in at[m["step"]]["open"] m["ambiguous"] = any(n != at[m["step"]]["t"] - 1 for n in at[m["step"]]["open"]) - s["identical"] = rerun_identical(tmp, r) s["refused_events"] = sum(1 for x in r["lines"] if x.startswith('{"error"')) + # without a refused event the run without them is the same run (metric d replays every strand) + s["identical"] = rerun_identical(tmp, r) if s["refused_events"] else True + s["reran"] = bool(s["refused_events"]) return s @@ -257,21 +259,26 @@ def metric(bars_c, tmp=None): wk = [m for r in by("workaround") for m in r["msgs"] if m["kind"] == "outcome"] act_rate = {run: common.r6(sum(r["level"][k] == "act" for r in by(run) for k in range(DECISIONS - 100, DECISIONS)) / (100 * len(SEEDS))) for run in ("stream1", "addressed", "v08", "workaround")} - closed = {"evicted": 0, "expired": 0} + closed = {run: {"evicted": 0, "expired": 0} for run in ("stream1", "addressed", "unaddressed")} + ages = [] for r in runs: if r["block"]: for line in r["lines"]: - for c in (json.loads(line).get("credit") or {}).get("closed", []): - if c["as"] in closed: - closed[c["as"]] += 1 + c = json.loads(line).get("credit") or {} + for x in c.get("closed", []): + if x["as"] in closed[r["run"]]: + closed[r["run"]][x["as"]] += 1 + if r["run"] == "addressed" and c.get("paid"): + ages.append(json.loads(line)["turn"] - c["paid"]["turn"] - 1) decisions = len(SEEDS) * DECISIONS + ages.sort() kinds = {k: len(msgs("addressed", k)) for k in ("outcome", "cancel", "dup", "stray", "unknown")} res = { "scope": "fixtures/dispatch.yaml (dispatch-noblock.yaml for iii and iv), individuals 0-9, 300 decisions each, 5 runs; " "stream 2: outcomes 0-6 events late, 10 % cancelled, 5 % sent twice, 2 % of events paying a turn never opened", "c1": common.r6(c1), "c2": common.r6(c2), "c3": common.r6(c3), "c4": common.r6(c4), "c1_payments": tot("payments"), "c2_events": tot("events"), "c3_outcomes_open_on_arrival": len(on_arrival), - "c4_refusable": len(bad), "c4_pairs_identical": "%d/%d" % (pairs, len(stats)), + "c4_refusable": len(bad), "c4_pairs_identical": "%d/%d" % (pairs, len(stats)), "c4_runs_rerun": tot("reran"), "open_set_mismatches": tot("open_mismatch"), "refused_events": tot("refused_events"), "addressed_messages": kinds, "reported": { @@ -279,7 +286,10 @@ def metric(bars_c, tmp=None): "v08_duplicates_strays_unknowns_accepted": len(msgs("v08", "dup", "stray", "unknown")), "workaround_outcomes_kept": common.r6(sum(m["fate"] == "sent" for m in wk) / len(wk)) if wk else None, "act_rate_last_100": act_rate, - "evicted_share": common.r6(closed["evicted"] / (3 * decisions)), "expired_share": common.r6(closed["expired"] / (3 * decisions)), + "evicted_share": {k: common.r6(v["evicted"] / decisions) for k, v in closed.items()}, + "expired_share": {k: common.r6(v["expired"] / decisions) for k, v in closed.items()}, + "addressed_paid_age": {"max": ages[-1], "p50": ages[len(ages) // 2], "p95": ages[int(len(ages) * 0.95)], + "share_at_most_6": common.r6(sum(a <= 6 for a in ages) / len(ages))} if ages else None, "addressed_outcomes_not_open_on_arrival": sum(not m["open_on_arrival"] for m in msgs("addressed", "outcome")), "unsettled_at_end_addressed": sum(r["unsettled"] for r in by("addressed")), }, From 7798437bc123bc288dd51994b45c7b2c7c621974 Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 10:06:35 -0700 Subject: [PATCH 12/15] =?UTF-8?q?bench/individuality:=20twins=5Faddressed.?= =?UTF-8?q?py=20re-measures=20metric=20a=20with=20Design=20B=20on=20the=20?= =?UTF-8?q?frozen=20fixture=20and=20bars,=20with=20the=20plain-inputs=20co?= =?UTF-8?q?ntrol;=20BENCHMARKS.md=20=C2=A711=20(metric=20c=20and=20the=20r?= =?UTF-8?q?e-measured=20twins)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BENCHMARKS.md | 44 ++++++++ bench/individuality/README.md | 12 +- bench/individuality/twins_addressed.py | 150 +++++++++++++++++++++++++ 3 files changed, 205 insertions(+), 1 deletion(-) create mode 100644 bench/individuality/twins_addressed.py diff --git a/BENCHMARKS.md b/BENCHMARKS.md index bb4642e..c6a67a5 100644 --- a/BENCHMARKS.md +++ b/BENCHMARKS.md @@ -1141,3 +1141,47 @@ re-measured when action-addressed feedback (RFC 0001 Design B, metric c) lands. block (9,600 live turns and as many replayed, `describe`, `lint --seeds 0-99`, `fuzz` and `prove` documents): 0 differ. 629 are byte-identical; 24 are the stderr of `live` runs whose scripts send a `senses` key, identical once the one line naming it is removed. All 8 recorded strands verify, and the tutor's continues with the recorded bytes. + +## §11 Action-addressed feedback: credit accuracy, and the twins re-measured (`python3 bench/individuality/run.py --only c,d,e`, `python3 bench/individuality/twins_addressed.py`, stdlib; development build of 0.9.0) + +Metric c's fixtures, draws and bars were frozen in `bench/individuality/fixtures/MANIFEST` before its first run; three runs +gave the same values. Ten individuals of an act-or-ask policy (`fixtures/dispatch.yaml`: the shipped dispatch policy with a +credit block) make 300 decisions each; a host reads each stance's action, draws its outcome (good with probability 0.8 after +act, 0.4 after ask) and sends it back, on time (stream 1) or 0 to 6 events late with cancels, duplicates and payments of +turns never opened (stream 2). An independent Python learner replays RFC 0001 B.2 from the stance documents and the events. + +| metric | measured | bar | | +|---|---|---|---| +| c1 share of the applied step equal to the learner's (and the same paid turn and eligibility), over 8,393 accepted payments in 50 runs | 100 % | >= 99 % | passes | +| c2 events whose Δ equals the learner's, after every one of 15,000 accepted events | 100 % | 100 % | passes | +| c3 outcomes accepted, of the 3,802 whose decision was open on arrival (streams 1 and 2, addressed) | 100 % | >= 99 % | passes | +| c4 duplicates, outcomes after a cancel and unknown turns (addressed) and ambiguous unaddressed feedback refused; runs equal to the run without their refused events | 100 % of 2,793; 50 of 50 byte-identical | 100 %; all | passes | + +Also measured (not gated): the learner's open decisions equal the engine's `open_credit` after every event. Without the block +(0.8 semantics) 27 % of the outcomes credit a stance that took another level than the decision they were about, and all 138 +duplicates and unknown payments move the weights; the 0.8 workaround (keep an outcome only when the previous stance took the +paid level) keeps 72 % of them. Act rate in the last 100 decisions: 0.655 on time, 0.628 addressed, 0.424 under 0.8 +semantics, 0.657 with the workaround. + +Reading it. Every accepted payment moved exactly the step RFC 0001 B.2 gives for the decision it named, and every duplicate, +cancelled or unknown payment was refused without changing anything. The stream is busier than its design intended: each +decision yields a message and an event carries at most one, so messages queue (254 still undelivered at the end over the +ten individuals) and with every event awaiting, 67 % of the addressed decisions were evicted at `max_open` 8 before their +outcome arrived (1,710 such outcomes refused, B-R2); paid outcomes were 0 to 7 events late. The fixture is not changed after +the fact. + +**The twins re-measured with Design B** (`twins_addressed.py`, the frozen metric a fixture, streams, probes and bars; the +credit block and the addressed feedback added at run time: room A's praise names the decision 2 events earlier, room B's +criticism the one 3 events earlier): + +| run | a1 mean d_life (95 % interval) | a2 tv_life vs min(tv_seed_A, tv_seed_B) | | +|---|---|---|---| +| as frozen (rewards pay the previous stance) | 0.145 (0.096 to 0.199) | 0.1307 vs 0.1329 | fails | +| addressed (Design B) | 0.1725 (0.1175 to 0.235) | 0.1223 vs 0.1366 | fails | +| control: readings as plain 0.8 number inputs against a fixed prior, rewards unaddressed (reported) | 0.155 (0.099 to 0.219) | 0.0295 vs 0.1296 | — | + +Reading it. Addressing the rewards raises the share of probes whose action differs between two lives from 0.145 to 0.1725, +below the 0.30 bar. In both rooms the feedback still moves the learned caution weights away from `careful` (mean Δ careful +−0.32 after room A, −0.11 after room B), so the two lives drift the same way, and on the 10 probes with a tool failure the +habit and the failure's push make both lives careful or measured (23 of 400 actions differ). The control shows what the +normals add: with plain inputs the odds distance between two lives falls from 0.13 to 0.03. diff --git a/bench/individuality/README.md b/bench/individuality/README.md index 90f0940..78568cc 100644 --- a/bench/individuality/README.md +++ b/bench/individuality/README.md @@ -32,7 +32,12 @@ bench/individuality/ lives.py the seeded generator of the streams; its outputs are committed in lives/ and checked against MANIFEST bars.json the gated bars gen.py, p0/ the P0 corpus: personas, scripts, the recorded outputs and strands - twins.py habituation.py replay.py habits.py + dispatch.yaml metric c: the shipped dispatch policy with a credit block; dispatch-noblock.yaml without it + credit_draws.py metric c's seeded draws per decision, committed in credit/ and checked against MANIFEST + bars-c.json metric c's gated bars + sensed-plain.yaml metric a's reported control: the senses as plain 0.8 number inputs + twins.py habituation.py credit.py replay.py habits.py + twins_addressed.py metric a re-measured with Design B (and the control), on the frozen fixture and bars ``` ## Shared fixtures @@ -177,6 +182,11 @@ One run on an Apple M4 (development build, 10.0 s): a1 0.145 (interval 0.096–0 bars; b1 0.304149 with 0 of 4,522 values differing, b2 3.422977, b3 100 %, b4 100 % of 232 decisions, b5 100 % of 116 probes, d 0 differing bytes over 240 strands, e 0 violations and 0 breaks over 9,442 stances with 72 bound pass. See BENCHMARKS.md §10. +With action-addressed feedback (development build): c1, c2, c3 and c4 100 % (8,393 payments, 15,000 events, 3,802 open +outcomes, 2,793 refusable, 50 of 50 runs byte-identical without their refused events); metric a re-measured with Design B +(`twins_addressed.py`): a1 0.1725 (interval 0.1175–0.235), a2 0.1223 against 0.1366, both still below their bars; the +plain-inputs control 0.155 and 0.0295. See BENCHMARKS.md §11. + ## Changes after freezing - `p0.py` (listed in MANIFEST since the P0 record): `check` accepts the one stderr line `live` writes when a script sends a diff --git a/bench/individuality/twins_addressed.py b/bench/individuality/twins_addressed.py new file mode 100644 index 0000000..5557621 --- /dev/null +++ b/bench/individuality/twins_addressed.py @@ -0,0 +1,150 @@ +"""Metric a re-measured with RFC Design B, and its reported control (Python 3.9, standard library only). + + python3 twins_addressed.py [--out FILE] + +The frozen fixture, streams, probes, seeds and bars of metric a (twins.py), three ways: +- `frozen`: as run.py runs metric a (rewards unaddressed: feedback pays the previous stance). +- `addressed` (Design B): fixtures/sensed.yaml with the credit block the benchmark names (max_open 8, half_life_events 32), + added at run time, and each room's feedback addressed to the decision it was about, as the shared fixtures describe: room + A's praise names the decision awaited 2 events earlier, room B's criticism the one awaited 3 events earlier (those + decisions carry `await: true`). Nothing else in the streams changes. +- `plain` (reported, not gated): fixtures/sensed-plain.yaml, the same lives with each reading sent as plain 0.8 number + inputs: the push of its z against the fixed prior (the 0.5 dead zone and the cap of 6 of a sense with zero spreads, a + normal that never moves), tool_fail and tempo also raw for the habits; rewards unaddressed. +Each gets metric a's statistics and bars, and the mean learned caution deltas per room. Exit 0 when the addressed run passes +a1 and a2, 1 when it does not, 2 on a setup error. +""" +import json +import math +import os +import shutil +import sys +import tempfile + +HERE = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, os.path.join(HERE, "fixtures")) +sys.path.insert(0, HERE) +import common # noqa: E402 +import twins # noqa: E402 +from fixtures import lives # noqa: E402 + +LAG = {"A": ("praise", 2), "B": ("criticism", 3)} +CREDIT_BLOCK = " credit:\n max_open: 8\n half_life_events: 32\n" +PRIOR = {"tool_fail": (0.05, 0.05, False), "tool_latency": (0.405, 0.1, True), "tempo": (1.0, 1.0, False), "silence": (0.69, 0.5, True)} +ZCAP, DEAD_ZONE, VAR_FLOOR = 6.0, 0.5, 0.01 + + +def credit_persona(tmp): + """fixtures/sensed.yaml with the credit block under its learning block""" + with open(twins.PERSONA, encoding="utf-8") as f: + src = f.read() + anchor = " total_cap: 0.4\nreward_from" + if src.count(anchor) != 1: + raise common.SetupError("sensed.yaml: the learning block's end was not found") + path = os.path.join(tmp, "sensed-credit.yaml") + with open(path, "w", encoding="utf-8", newline="\n") as f: + f.write(src.replace(anchor, " total_cap: 0.4\n" + CREDIT_BLOCK + "reward_from")) + return path + + +def addressed(room): + flag, lag = LAG[room] + evs = [dict(e) for e in lives.load("room-" + room.lower())] + for i, e in enumerate(evs): + if e.get(flag): + evs[i - lag]["await"] = True + e["for"] = i - lag + return evs + lives.load("tail") + + +def plain(ev): + """An event with its readings as plain inputs: each sense's push against the fixed prior; tool_fail and tempo also raw""" + e = {k: v for k, v in ev.items() if k != "senses"} + for sid, r in sorted((ev.get("senses") or {}).items()): + v = r["v"] if isinstance(r, dict) else r + x = (1.0 if v else 0.0) if isinstance(v, bool) else float(v) + mean, var, log = PRIOR[sid] + x = math.log1p(x) if log else x + z = max(-ZCAP, min(ZCAP, (x - mean) / math.sqrt(var + VAR_FLOOR))) + zd = math.copysign(max(abs(z) - DEAD_ZONE, 0.0), z) + if zd > 0: + e[sid + "_up"] = common.r6(zd) + elif zd < 0: + e[sid + "_down"] = common.r6(-zd) + if sid == "tool_fail": + e["tool_fail"] = bool(v) + if sid == "tempo": + e["tempo"] = v + return e + + +class Probes: + """The frozen probes, mapped""" + + def __init__(self, f): + self.f = f + + def load(self, name): + return [self.f(e) for e in lives.load(name)] + + +def learned(lv, room): + """Mean learned caution deltas [bold, measured, careful] over the individuals' final states in a room""" + rows = [] + for (s, r), life in lv.items(): + if r == room: + with open(life["state"], encoding="utf-8") as f: + rows.append(json.load(f)["learned"]["caution"]) + return [common.r6(sum(x[i] for x in rows) / len(rows)) for i in range(3)] + + +def measure(tmp, name, persona, events, probes): + twins.events, twins.lives = events, probes + sub = os.path.join(tmp, name) + os.makedirs(sub) + lv = twins.run_lives(sub, persona=persona) + with open(os.path.join(common.FIXTURES, "bars.json"), encoding="utf-8") as f: + r = twins.metric(lv, json.load(f)) + r["learned_caution_mean"] = {room: learned(lv, room) for room in twins.ROOMS} + def failed(p): + x = (p.get("senses") or {}).get("tool_fail") + return (x.get("v") if isinstance(x, dict) else x) is True + fail_probe = [i for i, p in enumerate(lives.load("probes")) if failed(p)] + split = {"with_failure": 0, "without": 0} + for s in twins.SEEDS: + for i, (a, b) in enumerate(zip(lv[(s, "A")]["probes"], lv[(s, "B")]["probes"])): + if twins.action(a) != twins.action(b): + split["with_failure" if i in fail_probe else "without"] += 1 + r["differing_actions"] = {k: "%d/%d" % (v, len(twins.SEEDS) * (len(fail_probe) if k == "with_failure" else 20 - len(fail_probe))) for k, v in split.items()} + return r + + +def main(argv): + out = argv[argv.index("--out") + 1] if "--out" in argv else None + events0, lives0 = twins.events, twins.lives + tmp = tempfile.mkdtemp(prefix="pbit-twins-b-") + try: + common.binary() + res = {"frozen": measure(tmp, "frozen", twins.PERSONA, events0, lives0), + "addressed": measure(tmp, "addressed", credit_persona(tmp), addressed, lives0), + "plain": measure(tmp, "plain", os.path.join(common.FIXTURES, "sensed-plain.yaml"), + lambda room: [plain(e) for e in events0(room)], Probes(plain))} + except common.SetupError as e: + common.fail(str(e)) + finally: + twins.events, twins.lives = events0, lives0 + shutil.rmtree(tmp, ignore_errors=True) + res["plain"]["note"] = "reported, not gated" + if out: + with open(out, "w", encoding="utf-8", newline="\n") as f: + f.write(json.dumps(res, indent=1, sort_keys=True) + "\n") + for k in ("frozen", "addressed", "plain"): + r = res[k] + print("%-9s a1 d_life %.6f [%.6f, %.6f] a2 tv_life %.6f vs min(tv_seed_A %.6f, tv_seed_B %.6f) pass %s learned %s differ %s" % ( + k, r["d_life"], r["d_life_ci95"][0], r["d_life_ci95"][1], r["tv_life"], r["tv_seed_A"], r["tv_seed_B"], + json.dumps(r["pass"], sort_keys=True), json.dumps(r["learned_caution_mean"], sort_keys=True), json.dumps(r["differing_actions"], sort_keys=True))) + return 0 if all(res["addressed"]["pass"].values()) else 1 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) From 739b935b99ba80e098e2418f5f0c0d44a27fae6f Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 10:33:55 -0700 Subject: [PATCH 13/15] examples/agent-harness: README section for the addressed variant; docs, bench and comments: plainer wording (law check) --- BENCHMARKS.md | 2 +- bench/individuality/README.md | 10 +++++----- bench/individuality/credit.py | 2 +- docs/persona.md | 6 +++--- examples/agent-harness/README.md | 15 +++++++++++++++ probbit-cli/src/fuzz.rs | 2 +- probbit-cli/src/persona.rs | 8 ++++---- 7 files changed, 30 insertions(+), 15 deletions(-) diff --git a/BENCHMARKS.md b/BENCHMARKS.md index c6a67a5..023fb7a 100644 --- a/BENCHMARKS.md +++ b/BENCHMARKS.md @@ -1144,7 +1144,7 @@ removed. All 8 recorded strands verify, and the tutor's continues with the recor ## §11 Action-addressed feedback: credit accuracy, and the twins re-measured (`python3 bench/individuality/run.py --only c,d,e`, `python3 bench/individuality/twins_addressed.py`, stdlib; development build of 0.9.0) -Metric c's fixtures, draws and bars were frozen in `bench/individuality/fixtures/MANIFEST` before its first run; three runs +Metric c's fixtures, draws and bars were frozen in `bench/individuality/fixtures/MANIFEST` before it was ever run; three runs gave the same values. Ten individuals of an act-or-ask policy (`fixtures/dispatch.yaml`: the shipped dispatch policy with a credit block) make 300 decisions each; a host reads each stance's action, draws its outcome (good with probability 0.8 after act, 0.4 after ask) and sends it back, on time (stream 1) or 0 to 6 events late with cancels, duplicates and payments of diff --git a/bench/individuality/README.md b/bench/individuality/README.md index 78568cc..0818940 100644 --- a/bench/individuality/README.md +++ b/bench/individuality/README.md @@ -118,8 +118,8 @@ refused, each refused run byte-identical to the run without the refused events. of a turn never opened; the draws are committed as `fixtures/credit/draws-.jsonl`. - **Host.** `credit.py` drives one `probbit live --checkpoint-every 1` per run event by event: it reads each stance's action, decides the outcome (good when the draw is below 0.8 after `act`, 0.4 after `ask`) and queues it. One message rides on - an event; a second one due on the same event moves to the next (the older decision first). A second copy of an outcome - is due one event after the first; for a cancelled decision the second copy is an outcome sent after the cancel. A payment + an event; a second one due on the same event moves to the next (the older decision goes ahead). A second copy of an outcome + is due one event after the original; for a cancelled decision the second copy is an outcome sent after the cancel. A payment of a turn never opened names turn k + 1000. A refused event is followed by the same decision without its message, so each run makes 300 decisions. Five runs per individual: stream 1, and on stream 2 (i) addressed, (ii) unaddressed, (iii) 0.8 semantics (cancels not sent), (iv) the 0.8 workaround. @@ -208,11 +208,11 @@ plain-inputs control 0.155 and 0.0295. See BENCHMARKS.md §11. `stderr_warnings_only` (the key was `stderr_senses_warning_only`). EXPECTED, the scripts and the strands are unchanged; MANIFEST's p0.py line was updated. - Metric c (wave 2): its fixtures, the draws generator, the draws and its bars (`fixtures/bars-c.json`, the bars of the - metric c section above) were added to MANIFEST in their own section before their first run; `run.py` runs metric c. + metric c section above) were added to MANIFEST in their own section before they were ever run; `run.py` runs metric c. `fixtures/sensed-plain.yaml` (metric a's reported control: the senses replaced by plain 0.8 number inputs) was frozen in the same section. No earlier fixture, stream or bar changed. -- `credit.py` after its first run (no fixture, bar or gated computation changed; every gated value was the same in each +- `credit.py`, changed after it had run once (no fixture, bar or gated computation changed; every gated value was the same in each run): the 50 runs go side by side (the host waits on each stance, so a run is latency-bound); a run that refused no event is not re-run (without refused events it is the same run, and metric d replays every strand); the reported - eviction and expiry shares are given per run, with the age of the addressed payments. The first run's numbers stay in + eviction and expiry shares are given per run, with the age of the addressed payments. The numbers of the run before the change stay in the history: c1, c2, c3 and c4 1.0, 50/50 pairs identical. diff --git a/bench/individuality/credit.py b/bench/individuality/credit.py index d26274e..6206047 100644 --- a/bench/individuality/credit.py +++ b/bench/individuality/credit.py @@ -218,7 +218,7 @@ def evaluate(tmp, r): s["step_total"] += w s["step_equal"] += w if same else 0.0 prev = eng - # the open decisions on arrival of each message: the oracle's row of the first event sent at its step (the one carrying it) + # the open decisions on arrival of each message: the oracle's row of the earliest event sent at its step (the one carrying it) at, step = {}, 0 for row in o: at.setdefault(step, row) diff --git a/docs/persona.md b/docs/persona.md index 9fa7333..1ee283d 100644 --- a/docs/persona.md +++ b/docs/persona.md @@ -320,7 +320,7 @@ state change; `persona turn` exits 2, `live` at the end of the run) when: | B-R5 | `for` not a whole number or `{turn, stance}`; `cancel` not a list of at most `max_open` whole numbers; `await` not true or false; a cancel without an env or human `src` | `inputs.for`, `inputs.cancel`, `inputs.await`, `inputs.src` | | B-R6 | `for: {turn, stance}` whose digest is not that turn's stance | `inputs.for.stance` | -Reward provenance (section 2.10) is checked first. A stance's digest is the sha256 of its canonical JSON without `credit`, +Reward provenance (section 2.10) is checked before these rows. A stance's digest is the sha256 of its canonical JSON without `credit`, `state_digest` and `timing`. Without the block, `await`, `for` and `cancel` are undeclared inputs (listed in `ignored`; `live` says so once on stderr) and every document is as before. @@ -691,8 +691,8 @@ senses block, rule S4) a mean outside prior ± drift_cap, a variance outside [0, to 1e6, a sense set that differs from the persona's or sense genes that do not match the seed, even with a recomputed digest. Each normal starts at its prior with n = 0; a persona without the block refuses a state with a `senses` field. With a credit block (section 2.8) the state keeps `open_credit` (the decisions awaiting an outcome: at most `max_open`, turns increasing and -before the state's turn, credits within ±1, a stance digest each), `prev_stance` (the previous stance's digest, null before the -first turn) and `control_closed` (decisions a control line closed, listed by the next stance); a persona without the block +before the state's turn, credits within ±1, a stance digest each), `prev_stance` (the previous stance's digest, null before any +turn) and `control_closed` (decisions a control line closed, listed by the next stance); a persona without the block refuses a state with any of them. ### 5.2 Canonical JSON and the number rule diff --git a/examples/agent-harness/README.md b/examples/agent-harness/README.md index b36390a..0b2eead 100644 --- a/examples/agent-harness/README.md +++ b/examples/agent-harness/README.md @@ -49,6 +49,21 @@ A plain circuit breaker can enforce this single static retry rule. The additiona shown here is history-dependent reproduction, bounded learning, deterministic replay and a scoped rule check. +## Late outcomes, addressed + +`addressed.json` is the retry policy with a `learning.credit` block (docs/persona.md §2.8). The host marks each decision +it acts on with `await: true` and reports its outcome later, naming the decision: `for: {turn, stance}` with the stance's +turn and digest (`credit.stance`). `late.py` makes four decisions and then reports their outcomes in another order: each one +credits the stance it was about, scaled by how late it came, and a duplicate is refused without changing anything. `live +verify --actions` then compares the host's action log with the levels the strand released. + +```sh +python3 examples/agent-harness/late.py +``` + +`golden/` holds the addressed policy's documents for a fixed 16-event script; CI checks them byte for byte on Linux, macOS +and Windows. + ## Replaying generated counterexamples When `reward_from` requires a source, fuzz searches an abstract accepted-source history. diff --git a/probbit-cli/src/fuzz.rs b/probbit-cli/src/fuzz.rs index 54eab3c..579fbc9 100644 --- a/probbit-cli/src/fuzz.rs +++ b/probbit-cli/src/fuzz.rs @@ -30,7 +30,7 @@ pub fn grid(p: &Persona, props: &[Prop], given: &[f64]) -> Vec { pub struct Found { pub script: Vec, pub doc: Json, pub broken: Vec } /// One turn of the search: (the stance, the new state, the event as it ran). A credit block's payments (§2.8) are resolved -/// against the state first; the credit step may refuse the event (B-R1 to B-R6, at inputs.for / inputs.cancel): None, and it +/// against the state before the turn runs; the credit step may refuse the event (B-R1 to B-R6, at inputs.for / inputs.cancel): None, and it /// changes nothing fn step(p: &Persona, st: &State, e: &Event, eng: persona::Engine, turns: &AtomicUsize) -> Option<(Json, State, Event)> { turns.fetch_add(1, Ordering::Relaxed); diff --git a/probbit-cli/src/persona.rs b/probbit-cli/src/persona.rs index 0738677..f05702c 100644 --- a/probbit-cli/src/persona.rs +++ b/probbit-cli/src/persona.rs @@ -875,7 +875,7 @@ struct Settled { paid: Option<(u64, f64, f64, bool, String)>, closed: Vec<(u64, fn credit_step(p: &Persona, st: &State, host: &[(String, Json)], k: &Pay, src: Option<&Json>, check: bool) -> R<(State, Settled)> { let (c, l) = (p.credit().unwrap(), p.learning.as_ref().unwrap()); let t = st.turn; if k.cancel.is_some() && check { cancel_src(src)?; } - // feedback, read as compile reads it (the inputs are checked first) + // feedback, read as compile reads it (the inputs are checked before it) let (vals, _, _, _) = resolve_inputs(p, st, host)?; let on = |id: &String| matches!(get(&vals, id), Some(Json::Bool(true))); let flags = l.from.iter().enumerate().fold(0.0, |s, (i, id)| if on(id) { s + if i == 0 { 1.0 } else { -1.0 } } else { s }); @@ -1519,7 +1519,7 @@ impl State { let w = |k: &str| num(get(e, k), &at(&tp, k), Some(0.0), Some(9_007_199_254_740_992.0), true).map(|x| x as u64); Ok((t.clone(), w("rewards")?, w("corrections")?)) }).collect::>>()?) } }; // a credit block (§2.8): at most max_open open decisions, turns increasing and before this state's turn, credits within ±1, a - // stance digest each; the previous stance's digest (null before the first turn); the decisions a control line closed + // stance digest each; the previous stance's digest (null before any turn); the decisions a control line closed let (mut open, mut prev_stance, mut control_closed) = (vec![], None, vec![]); if let (Some(c), Some(l)) = (p.credit(), &p.learning) { let turn_at = |x: &Json, path: &str, after: Option| -> R { let n = num(Some(x), path, Some(0.0), Some(9_007_199_254_740_992.0), true)? as u64; @@ -1534,7 +1534,7 @@ impl State { let stance = get(ok, "stance").and_then(Json::as_str).filter(|s| is_digest(s)).ok_or_else(|| perr(&at(&op, "stance"), "a stance digest (sha256:<64 hex>)"))?.to_string(); open.push(Open { turn: n, credit, stance }); } prev_stance = match get(kv, "prev_stance").unwrap() { Json::Null if turn == 0 => None, Json::Str(s) if turn > 0 && is_digest(s) => Some(s.clone()), - _ => return Err(perr("state.prev_stance", "the previous stance's digest (sha256:<64 hex>); null before the first turn")) }; + _ => return Err(perr("state.prev_stance", "the previous stance's digest (sha256:<64 hex>); null before any turn")) }; let ca = get(kv, "control_closed").and_then(Json::as_arr).filter(|a| a.len() <= c.max_open).ok_or_else(|| perr("state.control_closed", format!("a list of at most {} turns", c.max_open)))?; for (i, x) in ca.iter().enumerate() { let n = turn_at(x, &ix("state.control_closed", i), control_closed.last().copied())?; control_closed.push(n); } } Ok(State { seed, turn, persona, genes: g.clone(), mood, history, prev, agenda, rest, learned, credit, drives, senses, learned_from, open, prev_stance, control_closed, elig: 1.0, @@ -3409,7 +3409,7 @@ mod tests { } /// The credit state is read strictly: at most max_open open decisions, turns increasing and before the state's turn, credits - /// within ±1, stance digests; prev_stance a digest after the first turn; without the block the fields are refused + /// within ±1, stance digests; prev_stance a digest once a turn has run; without the block the fields are refused #[test] fn the_credit_state_is_strict() { let p = persona(CREDIT).unwrap(); let mut st = init(&p, Some(4), true, &run); From dbcb36428b99ffc9e39c121516459b8a87cc39df Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 10:58:15 -0700 Subject: [PATCH 14/15] bench/individuality: README intro: this release runs metric c; metric a's frozen streams and twins_addressed.py --- bench/individuality/README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/bench/individuality/README.md b/bench/individuality/README.md index 0818940..4415caf 100644 --- a/bench/individuality/README.md +++ b/bench/individuality/README.md @@ -10,9 +10,10 @@ PROBBIT_BIN=target/release/probbit python3 bench/individuality/run.py --only a,b PROBBIT_BIN=target/release/probbit python3 bench/individuality/p0.py check # P0: byte-identical documents ``` -**This release** ships senses (RFC 0001 Design A) and metrics a, b, d and e. Metric c (credit) needs action-addressed feedback -(Design B) and metric f a lineage budget (Design C); `run.py` skips both with a note. Without the credit block, rewards pay the -stance just before them, so the streams below carry no `await` or `for` keys. +**This release** ships senses (RFC 0001 Design A), action-addressed feedback (Design B) and metrics a, b, c, d and e. Metric f +needs a lineage budget (Design C); `run.py` skips it with a note. Metric a's frozen streams carry no `await` or `for` keys (the +fixture was frozen before Design B, so its rewards pay the stance just before them); `twins_addressed.py` re-measures it with +the credit block and addressed feedback added at run time. **Freezing.** The fixtures, generators and bars are committed with their sha256 in `fixtures/MANIFEST` before any run. `run.py` checks every listed file before it measures anything (exit 2 when one differs). Any later change is logged at the end From fb9ee7b2654973ad1bf8b9cba09e3afb790956e8 Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Thu, 15 Oct 2026 16:09:50 -0700 Subject: [PATCH 15/15] bench/individuality: record the frozen metric a result on this release --- bench/individuality/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/bench/individuality/README.md b/bench/individuality/README.md index 4415caf..97c2188 100644 --- a/bench/individuality/README.md +++ b/bench/individuality/README.md @@ -188,6 +188,12 @@ outcomes, 2,793 refusable, 50 of 50 runs byte-identical without their refused ev (`twins_addressed.py`): a1 0.1725 (interval 0.1175–0.235), a2 0.1223 against 0.1366, both still below their bars; the plain-inputs control 0.155 and 0.0295. See BENCHMARKS.md §11. +Metric a fails its bars on this release: a1 0.1725 (interval 0.1175–0.235) against ≥ 0.30, a2 0.1223 against 0.1366. +The bars and the fixtures stay frozen and unchanged. Why they fail: the frozen fixture's readings and its feedback push the +same probes in opposite directions, so the two mechanisms cancel; and at the fixture's gene spread, two individuals differ in +odds more than one individual's two lives do. A pre-registered revision of the fixture is planned for 0.9.1; nothing will be +relabelled. + ## Changes after freezing - `p0.py` (listed in MANIFEST since the P0 record): `check` accepts the one stderr line `live` writes when a script sends a