diff --git a/.github/workflows/vardiff-sim.yaml b/.github/workflows/vardiff-sim.yaml new file mode 100644 index 0000000000..fcac9ad7ad --- /dev/null +++ b/.github/workflows/vardiff-sim.yaml @@ -0,0 +1,122 @@ +name: vardiff_sim + +on: + pull_request: + branches: + - main + paths: + - 'sv2/channels-sv2/sim/**' + - 'sv2/channels-sv2/src/vardiff/**' + - 'sv2/channels-sv2/src/target.rs' + - '.github/workflows/vardiff-sim.yaml' + +jobs: + # Fast tests in the sim crate. Always run. + test-fast: + name: cargo test --lib + runs-on: ubuntu-latest + defaults: + run: + working-directory: sv2/channels-sv2/sim + + steps: + - uses: actions/checkout@v4 + + - name: Install stable Rust + uses: dtolnay/rust-toolchain@stable + id: toolchain + + # The repo root's `rust-toolchain.toml` pins 1.75, but the sim + # crate's Cargo.lock is v4 format (needs newer rustup). Override + # explicitly so the sim crate gets the stable toolchain. + - name: Override toolchain + run: rustup override set ${{ steps.toolchain.outputs.name }} + working-directory: sv2/channels-sv2/sim + + - name: Cache cargo registry + uses: actions/cache@v3 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + sv2/channels-sv2/sim/target + key: ${{ runner.os }}-vardiff-sim-${{ hashFiles('sv2/channels-sv2/sim/Cargo.lock') }} + + - name: Build sim crate + run: cargo build --release --verbose + + - name: Fast unit tests + run: cargo test --lib --verbose + + # Slow regression check: cargo test --release --lib -- --ignored runs + # the full 50-cell × 1000-trial baseline regression. ~15-20s. + # The current algorithm's behavior is asserted against the checked-in + # baseline_VardiffState.toml with CI-aware tolerance budgets. + test-regression: + name: regression vs checked-in baseline + runs-on: ubuntu-latest + defaults: + run: + working-directory: sv2/channels-sv2/sim + + steps: + - uses: actions/checkout@v4 + + - name: Install stable Rust + uses: dtolnay/rust-toolchain@stable + id: toolchain + + # The repo root's `rust-toolchain.toml` pins 1.75, but the sim + # crate's Cargo.lock is v4 format (needs newer rustup). Override + # explicitly so the sim crate gets the stable toolchain. + - name: Override toolchain + run: rustup override set ${{ steps.toolchain.outputs.name }} + working-directory: sv2/channels-sv2/sim + + - name: Cache cargo registry + uses: actions/cache@v3 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + sv2/channels-sv2/sim/target + key: ${{ runner.os }}-vardiff-sim-regression-${{ hashFiles('sv2/channels-sv2/sim/Cargo.lock') }} + + - name: Slow regression test + run: cargo test --release --lib -- --ignored + + # Verify that the binaries still build (compare-algorithms, + # generate-baseline, trace-trial, sweep-ewma-tau). Doesn't run them + # (full sweep takes ~150s). + build-binaries: + name: cargo build --release (all bins) + runs-on: ubuntu-latest + defaults: + run: + working-directory: sv2/channels-sv2/sim + + steps: + - uses: actions/checkout@v4 + + - name: Install stable Rust + uses: dtolnay/rust-toolchain@stable + id: toolchain + + # The repo root's `rust-toolchain.toml` pins 1.75, but the sim + # crate's Cargo.lock is v4 format (needs newer rustup). Override + # explicitly so the sim crate gets the stable toolchain. + - name: Override toolchain + run: rustup override set ${{ steps.toolchain.outputs.name }} + working-directory: sv2/channels-sv2/sim + + - name: Cache cargo registry + uses: actions/cache@v3 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + sv2/channels-sv2/sim/target + key: ${{ runner.os }}-vardiff-sim-bins-${{ hashFiles('sv2/channels-sv2/sim/Cargo.lock') }} + + - name: Build all binaries + run: cargo build --release --bins --verbose diff --git a/asymmetric_poisson_sweep.md b/asymmetric_poisson_sweep.md new file mode 100644 index 0000000000..b529bcda57 --- /dev/null +++ b/asymmetric_poisson_sweep.md @@ -0,0 +1,27 @@ +# AsymmetricPoissonCI Sweep Results + +## Comprehensive Fitness + +| Algorithm | Avg | 4 | 6 | 8 | 10 | 12 | 15 | 20 | 30 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| AsymPoisson-t300 | 0.846 | 0.858 | 0.872 | 0.882 | 0.779 | 0.792 | 0.811 | 0.894 | 0.877 | +| AsymPoisson-t250 | 0.844 | 0.852 | 0.866 | 0.879 | 0.779 | 0.792 | 0.811 | 0.894 | 0.877 | +| AsymPoisson-t200 | 0.822 | 0.799 | 0.821 | 0.801 | 0.779 | 0.792 | 0.811 | 0.894 | 0.877 | +| AsymPoisson-t150 | 0.807 | 0.743 | 0.771 | 0.784 | 0.779 | 0.792 | 0.811 | 0.894 | 0.877 | +| AsymPoisson-t125 | 0.803 | 0.730 | 0.766 | 0.778 | 0.779 | 0.792 | 0.811 | 0.894 | 0.877 | +| AsymPoisson-t100 | 0.795 | 0.706 | 0.744 | 0.758 | 0.779 | 0.792 | 0.811 | 0.894 | 0.877 | +| AdaptiveBoundary-spm10 | 0.788 | 0.689 | 0.742 | 0.756 | 0.771 | 0.788 | 0.802 | 0.885 | 0.872 | +| FullRemedy | 0.740 | 0.705 | 0.723 | 0.724 | 0.733 | 0.745 | 0.752 | 0.763 | 0.774 | + +## Operational Fitness + +| Algorithm | Avg | 4 | 6 | 8 | 10 | 12 | 15 | 20 | 30 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| AsymPoisson-t300 | 0.807 | 0.823 | 0.841 | 0.853 | 0.724 | 0.740 | 0.764 | 0.868 | 0.847 | +| AsymPoisson-t250 | 0.805 | 0.815 | 0.833 | 0.848 | 0.724 | 0.740 | 0.764 | 0.868 | 0.847 | +| AsymPoisson-t200 | 0.777 | 0.748 | 0.776 | 0.752 | 0.724 | 0.740 | 0.764 | 0.868 | 0.847 | +| AsymPoisson-t150 | 0.758 | 0.678 | 0.714 | 0.731 | 0.724 | 0.740 | 0.764 | 0.868 | 0.847 | +| AsymPoisson-t125 | 0.754 | 0.662 | 0.707 | 0.722 | 0.724 | 0.740 | 0.764 | 0.868 | 0.847 | +| AsymPoisson-t100 | 0.744 | 0.633 | 0.680 | 0.697 | 0.724 | 0.740 | 0.764 | 0.868 | 0.847 | +| AdaptiveBoundary-spm10 | 0.735 | 0.611 | 0.677 | 0.695 | 0.714 | 0.735 | 0.752 | 0.856 | 0.840 | +| FullRemedy | 0.675 | 0.631 | 0.653 | 0.656 | 0.667 | 0.682 | 0.690 | 0.704 | 0.717 | diff --git a/sv2/channels-sv2/sim/.gitignore b/sv2/channels-sv2/sim/.gitignore new file mode 100644 index 0000000000..90ddda6b56 --- /dev/null +++ b/sv2/channels-sv2/sim/.gitignore @@ -0,0 +1,29 @@ +# Build artifacts (sim is its own Cargo workspace; root .gitignore +# covers the parent workspace's target/, this entry covers ours). +/target + +# macOS finder noise +.DS_Store + +# Editor swap files +*.swp +*.swo +*~ + +# Locally generated reports & traces — regenerate via `cargo run`, no +# need to track. The checked-in baselines are explicitly named. +/trace-*.txt +/scratch-* +# Sweep/comparison reports and charts (regenerate via the sweep / radar +# / trajectory bins; the analysis lives in commit messages / docs, not +# the raw output files). +/*_sweep.md +/*_sweep_big.md +/confirm_*.md +/champion_weights.md +/*.svg +/compare_out*/ +/sweep_out/ + +# Optional: cargo-semver-checks scratch directory +.semver-checks/ diff --git a/sv2/channels-sv2/sim/Cargo.lock b/sv2/channels-sv2/sim/Cargo.lock new file mode 100644 index 0000000000..28eb54d7e5 --- /dev/null +++ b/sv2/channels-sv2/sim/Cargo.lock @@ -0,0 +1,641 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "base58ck" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c8d66485a3a2ea485c1913c4572ce0256067a5377ac8c75c4960e1cda98605f" +dependencies = [ + "bitcoin-internals", + "bitcoin_hashes", +] + +[[package]] +name = "bech32" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32637268377fc7b10a8c6d51de3e7fba1ce5dd371a96e342b34e6078db558e7f" + +[[package]] +name = "binary_sv2" +version = "5.0.1" +dependencies = [ + "derive_codec_sv2", +] + +[[package]] +name = "bitcoin" +version = "0.32.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e499f9fc0407f50fe98af744ab44fa67d409f76b6772e1689ec8485eb0c0f66" +dependencies = [ + "base58ck", + "bech32", + "bitcoin-internals", + "bitcoin-io", + "bitcoin-units", + "bitcoin_hashes", + "hex-conservative", + "hex_lit", + "secp256k1", +] + +[[package]] +name = "bitcoin-internals" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30bdbe14aa07b06e6cfeffc529a1f099e5fbe249524f8125358604df99a4bed2" + +[[package]] +name = "bitcoin-io" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dee39a0ee5b4095224a0cfc6bf4cc1baf0f9624b96b367e53b66d974e51d953" + +[[package]] +name = "bitcoin-units" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5285c8bcaa25876d07f37e3d30c303f2609179716e11d688f51e8f1fe70063e2" +dependencies = [ + "bitcoin-internals", +] + +[[package]] +name = "bitcoin_hashes" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26ec84b80c482df901772e931a9a681e26a1b9ee2302edeff23cb30328745c8b" +dependencies = [ + "bitcoin-io", + "hex-conservative", +] + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cc" +version = "1.2.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "channels_sv2" +version = "6.0.0" +dependencies = [ + "binary_sv2", + "bitcoin", + "mining_sv2", + "primitive-types", + "template_distribution_sv2", + "tracing", +] + +[[package]] +name = "const_format" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "derive_codec_sv2" +version = "1.1.2" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex-conservative" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda06d18ac606267c40c04e41b9947729bf8b9efe74bd4e82b61a5f26a510b9f" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "hex_lit" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" + +[[package]] +name = "impl-codec" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d40b9d5e17727407e55028eafc22b2dc68781786e6d7eb8a21103f5058e3a14" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "libc" +version = "0.2.183" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "mining_sv2" +version = "10.0.0" +dependencies = [ + "binary_sv2", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "parity-scale-codec" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "primitive-types" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d15600a7d856470b7d278b3fe0e311fe28c2526348549f8ef2ff7db3299c87f5" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "secp256k1" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" +dependencies = [ + "bitcoin_hashes", + "secp256k1-sys", +] + +[[package]] +name = "secp256k1-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" +dependencies = [ + "cc", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "template_distribution_sv2" +version = "5.1.0" +dependencies = [ + "binary_sv2", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.23.10+spec-1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow 0.7.15", +] + +[[package]] +name = "toml_parser" +version = "1.0.10+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df25b4befd31c4816df190124375d5a20c6b6921e2cad937316de3fccd63420" +dependencies = [ + "winnow 1.0.0", +] + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "uint" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "909988d098b2f738727b161a106cfc7cab00c539c2687a8836f8e565976fb53e" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "vardiff_sim" +version = "0.1.0" +dependencies = [ + "bitcoin", + "channels_sv2", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zerocopy" +version = "0.8.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbb2a062be311f2ba113ce66f697a4dc589f85e78a4aea276200804cea0ed87" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e8bc7269b54418e7aeeef514aa68f8690b8c0489a06b0136e5f57c4c5ccab89" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/sv2/channels-sv2/sim/Cargo.toml b/sv2/channels-sv2/sim/Cargo.toml new file mode 100644 index 0000000000..41a4a0d4f0 --- /dev/null +++ b/sv2/channels-sv2/sim/Cargo.toml @@ -0,0 +1,22 @@ +# `[workspace]` declaration intentionally marks this crate as the root of a +# separate workspace, isolating its lockfile from the parent stratum workspace. +# The parent's `Cargo.lock` is v4 and the parent's pinned 1.75 toolchain cannot +# update it in-place; adding members triggers an update and breaks the build. +# Keeping `vardiff_sim` in its own workspace sidesteps the issue and lets the +# sim crate be built and tested via `cd sv2/channels-sv2/sim && cargo test`. +[workspace] + +[package] +name = "vardiff_sim" +version = "0.1.0" +authors = ["The Stratum V2 Developers"] +edition = "2021" +description = "Vardiff algorithm simulation framework for behavioral characterization and CI regression testing" +license = "MIT OR Apache-2.0" +repository = "https://github.com/stratum-mining/stratum" +homepage = "https://stratumprotocol.org" +keywords = ["stratum", "mining", "bitcoin", "protocol", "vardiff"] + +[dependencies] +channels_sv2 = { path = ".." } +bitcoin = "0.32.5" diff --git a/sv2/channels-sv2/sim/README.md b/sv2/channels-sv2/sim/README.md new file mode 100644 index 0000000000..3bd69098b8 --- /dev/null +++ b/sv2/channels-sv2/sim/README.md @@ -0,0 +1,251 @@ +# vardiff_sim + +Deterministic in-process simulation framework for characterizing the +behavioral attributes of any [`Vardiff`](../src/vardiff/mod.rs) +implementation. The framework decomposes a vardiff algorithm into four +orthogonal axes (Estimator, Statistic, Boundary, UpdateRule) and lets +each be characterized in isolation, so a metric change can be +attributed to the specific axis that changed. + +## Docs + +- [`docs/DESIGN.md`](./docs/DESIGN.md) — architectural reference. The + four-axis decomposition, the trait surface, the `Composed` adapter, the algorithm registry, the trial-recording model, the + scenario DSL, the Grid, the Metric trait, the recommended production + composition, and the production migration plan. +- [`docs/FINDINGS.md`](./docs/FINDINGS.md) — what the framework has + measured about the algorithm registry: the cross-algorithm + decoupling Pareto, the SPM=6 cold-start cascade mechanism, the + composition argument (no single axis closes the cascade — the right + composition does), the FullRemedy validation, the EWMA τ + Pareto, the asymmetric step-response analysis, the U256 precision + fix to `channels_sv2::target`. + +## What the framework measures + +Given any `Vardiff` implementation, the framework produces a +distribution for each metric across many independent simulated trials +(1000 per cell by default), reported as percentiles plus mean and +count, over a parameterized grid of share rates × hashrate scenarios × +algorithms: + +| Metric | Category | What it measures | +|--------|----------|------------------| +| `convergence_time` | Behavioral | seconds to first fire-followed-by-quiet-window after cold start | +| `settled_accuracy` | Behavioral | `\|final_hashrate / true_hashrate − 1\|` at trial end | +| `jitter` | Behavioral | fires per minute under stable load (post-convergence) | +| `reaction_time` | Behavioral | seconds from a step change to the first subsequent fire | +| `bias` | Estimator | `E[H̃ − H_true] / H_true` averaged over post-settle ticks (introspectable algorithms only) | +| `variance` | Estimator | population variance of `H̃ / H_true` over post-settle ticks (introspectable algorithms only) | +| `ramp_target_overshoot` | Behavioral | peak fire-target above truth during cold start (works for any algorithm) | +| `reaction_asymmetry` | Robustness | `reaction_rate(+δ%) − reaction_rate(−δ%)` per share rate, per magnitude δ ∈ {5, 10, 25, 50} (derived cross-cell) | + +Plus the cross-cutting `decoupling_score` (`reaction_rate × clamp(1 − +jitter_p50 / J_max, 0, 1)`) that summarizes the +variance-vs-detection trade-off in one number per share rate. + +## Algorithms shipped + +The eight algorithms in the registry are accessible via +`AlgorithmSpec` factories in `sim/src/grid.rs`: + +| Factory | Composition | Role | +|---------|-------------|------| +| `classic_vardiff_state()` | (production reference, not introspectable) | the existing production algorithm | +| `classic_composed()` | `CumulativeCounter + AbsoluteRatio + StepFunction(classic) + FullRetargetWithClamp` | fire-for-fire equivalent four-axis representation of `VardiffState`; introspectable | +| `parametric()` | `… + PoissonCI(z=2.576) + …` | classic with rate-aware threshold | +| `parametric_strict()` | `… + PoissonCI(z=3.0) + …` | parametric with 99.7% CI | +| `ewma_60s()` / `ewma(τ)` | `EwmaEstimator(τ) + … + PartialRetarget(0.5)` | smoothed estimator | +| `sliding_window(n)` | `SlidingWindowEstimator(n) + … + FullRetargetNoClamp` | last-n-ticks averaging | +| `classic_partial_retarget(η)` | `… + PartialRetarget(η)` | classic with damped update | +| `full_remedy()` | `EwmaEstimator(120s) + AbsoluteRatio + PoissonCI + PartialRetarget(0.3)` | **production recommendation** | + +`FullRemedy` dominates every other algorithm on every operationally +meaningful metric — see [`docs/FINDINGS.md`](./docs/FINDINGS.md) for +the case. + +## Running + +The crate is structured as its own Cargo workspace (see the note on +`Cargo.lock` below). All commands run from `sv2/channels-sv2/sim/`: + +```bash +# Fast unit tests (~1 second) +cargo test --lib + +# Slow regression test against the committed baseline (~5–15 seconds) +cargo test --release --lib -- --ignored + +# Generate a fresh single-algorithm baseline +cargo run --release --bin generate-baseline + +# Generate cross-algorithm comparison baselines (~2–3 minutes for 8 algorithms × 50 cells × 1000 trials) +cargo run --release --bin compare-algorithms + +# EWMA τ Pareto sweep (~90 seconds for 5 τ values × 50 cells × 1000 trials) +cargo run --release --bin sweep-ewma-tau + +# Trace one trial for a chosen (algorithm, scenario, SPM, seed) +cargo run --release --bin trace-trial -- -a full_remedy -s cold_start --spm 6 --seed 0xCAFE + +# Find worst-case seeds via overshoot-scan +cargo run --release --bin trace-trial -- -a vardiff_state -s cold_start --spm 6 --scan-overshoot 100 +``` + +The slow regression test is `#[ignore]`-d by default so `cargo test` +stays fast. CI workflows that want full regression coverage should +invoke `cargo test --release --lib -- --ignored` explicitly. + +## Reading the baseline output + +`baseline_.md` is organized by metric, with a final +decoupling-score table per share rate. For cross-algorithm +comparison: + +```bash +diff baseline_VardiffState.md baseline_FullRemedy.md +``` + +The `baseline_*.toml` files are the machine-readable form consumed +by the regression comparator. + +## Updating the baseline + +When a proposed algorithm change legitimately improves metrics, the +baseline must be regenerated. Workflow: + +1. Make the algorithm change. +2. Run `cargo test --release --lib -- --ignored` to see which metrics + changed and how. The failure message identifies the cell and + metric. +3. Decide whether each change is intended improvement vs. regression. + Discuss in PR review. +4. If the changes are intended, regenerate: + `cargo run --release --bin compare-algorithms` (or + `generate-baseline` for the single-algorithm path). +5. Review the diff on the `.toml` and `.md` files carefully. The + TOML diff is the structured source of truth; the markdown is for + human review. +6. Commit the regenerated baseline alongside the algorithm change. + +Updating the baseline is intentionally manual — automatic baseline +drift would defeat the purpose of regression detection. The PR review +is the gate. + +## Adding a new algorithm + +Any implementor of the [`Vardiff`](../src/vardiff/mod.rs) trait can be +plugged into the simulation harness. The four-axis decomposition makes +this especially cheap: an algorithm that fits the +`Estimator/Statistic/Boundary/UpdateRule` shape is one +`Composed` construction and one `AlgorithmSpec` factory. + +```rust +use vardiff_sim::{AlgorithmSpec, Composed, EwmaEstimator, AbsoluteRatio, + PoissonCI, PartialRetarget}; + +let spec = AlgorithmSpec::new("MyAlgo", |clock| { + let v = Composed::new( + EwmaEstimator::new(90), + AbsoluteRatio, + PoissonCI::default_parametric(), + PartialRetarget::new(0.4), + /* min_h */ 1.0, + clock, + ); + vardiff_sim::grid::VardiffBox(Box::new(v)) +}); +``` + +To characterize the new algorithm against the rest of the registry, +add it to the `algorithms` list in `bin/compare-algorithms.rs` (or +your own binary) and re-run the sweep. + +For algorithms outside the four-axis decomposition (no +`Estimator/Statistic/Boundary/Update` shape), implement `Vardiff` +directly and wrap with `AsObservable` so the grid's dispatch path +accepts it; introspection-only metrics will gracefully degrade to +`None` for that algorithm. See `AlgorithmSpec::classic_vardiff_state` +for the canonical example. + +## Project-specific notes + +### `Cargo.lock` is checked in + +The sim crate is declared as its own workspace (see the `[workspace]` +block in `Cargo.toml`) and ships with a `Cargo.lock` that pins +transitive dependency versions. This is **by design** — the parent +stratum workspace is pinned to Rust 1.75, which cannot write the `v4` +lockfile format produced by newer toolchains. Adding the sim crate as +a workspace member would force a lockfile rewrite that 1.75 can't +perform. + +If you delete `Cargo.lock` "to refresh" the dep tree, the build will +break with `feature 'edition2024' is required` errors from transitive +deps. Recover by copying the parent's lockfile back: + +```bash +cp ../../../Cargo.lock . +``` + +### Determinism + +Every trial is fully deterministic given its `(config, schedule, +seed)` triple. The grid uses a fixed `base_seed` (default +`0xDEADBEEFCAFEF00D`) and derives per-cell, per-trial seeds via +`base_seed.wrapping_add(cell_index << 20).wrapping_add(trial_index)`. +Re-runs produce byte-identical output across machines and time, +modulo Rust toolchain version changes that affect floating-point +determinism (e.g., a different `f64::ln` implementation). + +The `Trial` struct carries the seed it was produced from, so a +failing trial in the regression test can be reproduced in isolation +by replaying with the same seed via `trace-trial`. + +### Simulation fidelity vs production + +The simulation models share arrivals as pure Poisson with rate +matching the algorithm's configured target. Real miners cluster +shares (TCP batching, hash-device timing, network jitter) so the +variance under real-world load is wider than Poisson predicts. The +framework's claims are therefore **conservative comparisons between +algorithms under identical simulated load** — "A jitters 87% less +than B" — rather than absolute predictions about deployment +behavior. Real-world plausibility is the job of integration tests +and deployment observation. + +## Layout + +``` +sim/ +├── Cargo.toml # crate manifest + [workspace] declaration +├── Cargo.lock # copy of parent workspace's lockfile (see above) +├── README.md # this file +├── docs/ +│ ├── DESIGN.md # architectural reference +│ └── FINDINGS.md # characterization results +├── baseline_*.{toml,md} # per-algorithm baselines +├── ewma_tau_sweep.md # τ Pareto report +└── src/ + ├── lib.rs # module declarations + re-exports + ├── rng.rs # XorShift64 + Poisson / exponential samplers + ├── schedule.rs # HashrateSchedule for trial scenarios + ├── trial.rs # run_trial + TickRecord + Observable + ├── metrics.rs # Metric trait + registry + 8 metrics + bootstrap CI + ├── baseline.rs # Cell / CellResult / Scenario / Phase DSL / serializers + ├── regression.rs # baseline-parsing + tolerance assertions + ├── grid.rs # Grid + AlgorithmSpec + VardiffBox + run_paired + ├── composed/ + │ ├── mod.rs + │ ├── estimator.rs # Cumulative / EWMA / SlidingWindow + │ ├── statistic.rs # AbsoluteRatio + │ ├── boundary.rs # StepFunction (classic) + PoissonCI + │ ├── update.rs # FullRetargetWithClamp + PartialRetarget + FullRetargetNoClamp + │ └── composed.rs # Composed + classic_composed equivalence tests + └── bin/ + ├── generate-baseline.rs # single-algorithm baseline + ├── compare-algorithms.rs # cross-algorithm sweep + ├── sweep-ewma-tau.rs # τ Pareto sweep + └── trace-trial.rs # single-trial tick-by-tick trace +``` diff --git a/sv2/channels-sv2/sim/baseline_ClassicComposed.md b/sv2/channels-sv2/sim/baseline_ClassicComposed.md new file mode 100644 index 0000000000..ec94e3a965 --- /dev/null +++ b/sv2/channels-sv2/sim/baseline_ClassicComposed.md @@ -0,0 +1,227 @@ +# Vardiff baseline characterization — `ClassicComposed` + +*Generated by `cargo run --release --bin generate-baseline` from the vardiff_sim crate. 1000 trials per cell, base seed `0xdeadbeefcafef00d`.* + +## Summary + +Headline per-metric values at each share rate's best and worst cells. ↑ = higher is better; ↓ = lower is better; ↔ = near-zero is better. Where a `(floor: X.X%)` annotation appears, it's the Poisson-noise lower bound on that metric at that share rate — the algorithm cannot do better than this without exotic estimation techniques. + +| Metric | Dir | Best | Worst | +| --- | :-: | --- | --- | +| cold-start convergence rate | ↑ | 99.2% @ SPM=25 | 86.6% @ SPM=6 | +| cold-start p90 time | ↓ | 15m @ SPM=25 | 21m @ SPM=6 | +| settled accuracy p50 (stable) | ↓ | 0.0% @ SPM=10 (floor: 6.7%) | 4.3% @ SPM=6 (floor: 8.7%) | +| settled accuracy p99 (stable) | ↓ | 15.2% @ SPM=25 (floor: 16.3%) | 65.9% @ SPM=8 (floor: 28.8%) | +| stable-load jitter (mean) | ↓ | 0.002/min @ SPM=30 (floor: 0.020/min) | 0.052/min @ SPM=6 (floor: 0.020/min) | +| reaction rate at −50% step | ↑ | 70.2% @ SPM=6 | 30.8% @ SPM=30 | +| reaction rate at +50% step | ↑ | 64.3% @ SPM=6 | 33.0% @ SPM=25 | +| ramp target overshoot p99 (cold start) | ↓ | 25.8% @ SPM=30 (floor: 42.5%) | 132.6% @ SPM=6 (floor: 95.0%) | +| upward step magnitude p95 (stable) | ↓ | 1.216 @ SPM=25 | 4.000 @ SPM=6 | +| operational fitness | ↑ | 0.497 @ SPM=30 | 0.322 @ SPM=8 | +| decoupling score | ↑ | 0.702 @ SPM=6 | 0.308 @ SPM=30 | +| max |reaction asymmetry| | ↓ | 0.012 @ SPM=20 | 0.059 @ SPM=6 | + +## Convergence time (cold start: 10 GH/s → 1 PH/s) + +| share/min | rate | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 86.6% | 10m | 12m | 21m | 25m | 13m45s | +| 8 | 89.9% | 10m | 11m | 20m | 25m | 13m34s | +| 10 | 93.8% | 10m | 10m | 20m | 25m | 12m58s | +| 12 | 95.0% | 10m | 10m | 20m | 24m | 12m37s | +| 15 | 96.7% | 10m | 10m | 18m | 25m | 12m15s | +| 20 | 98.0% | 10m | 10m | 18m | 24m | 11m55s | +| 25 | 99.2% | 10m | 10m | 15m | 25m | 11m36s | +| 30 | 99.2% | 10m | 10m | 15m | 23m | 11m18s | + +## Settled accuracy (stable load, post-convergence) + +`|final_hashrate / true_hashrate - 1|` at trial end. Smaller is better. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.0% | 4.3% | 23.5% | 60.0% | 9.2% | +| 8 | 0.0% | 1.7% | 17.5% | 65.9% | 6.6% | +| 10 | 0.0% | 0.0% | 16.0% | 44.7% | 5.0% | +| 12 | 0.0% | 0.0% | 13.4% | 23.7% | 3.5% | +| 15 | 0.0% | 0.0% | 7.5% | 20.3% | 2.0% | +| 20 | 0.0% | 0.0% | 3.9% | 16.7% | 1.2% | +| 25 | 0.0% | 0.0% | 1.8% | 15.2% | 0.7% | +| 30 | 0.0% | 0.0% | 2.2% | 16.3% | 0.9% | + +## Steady-state jitter (fires per minute) + +Post-convergence rate of vardiff fires. Smaller is better — ideal is zero under stable load. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.000 | 0.000 | 0.190 | 0.333 | 0.052 | +| 8 | 0.000 | 0.000 | 0.150 | 0.304 | 0.036 | +| 10 | 0.000 | 0.000 | 0.095 | 0.278 | 0.024 | +| 12 | 0.000 | 0.000 | 0.056 | 0.174 | 0.014 | +| 15 | 0.000 | 0.000 | 0.043 | 0.136 | 0.009 | +| 20 | 0.000 | 0.000 | 0.000 | 0.095 | 0.005 | +| 25 | 0.000 | 0.000 | 0.000 | 0.059 | 0.003 | +| 30 | 0.000 | 0.000 | 0.000 | 0.056 | 0.002 | + +## Reaction time to a 50% drop (step at 15 min) + +| share/min | reacted | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 70.2% | 1m | 2m | 5m | 5m | 2m37s | +| 8 | 59.0% | 1m | 3m | 5m | 5m | 2m44s | +| 10 | 57.9% | 1m | 3m | 5m | 5m | 2m56s | +| 12 | 52.0% | 1m | 3m | 5m | 5m | 3m03s | +| 15 | 46.3% | 1m | 3m | 5m | 5m | 3m14s | +| 20 | 38.4% | 1m | 4m | 5m | 5m | 3m23s | +| 25 | 34.7% | 2m | 4m | 5m | 5m | 3m38s | +| 30 | 30.8% | 2m | 4m | 5m | 5m | 3m44s | + +## Reaction sensitivity (P[fire within 5 min of step change]) + +| Δ% | 6 | 8 | 10 | 12 | 15 | 20 | 25 | 30 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| -50% | 0.70 | 0.59 | 0.58 | 0.52 | 0.46 | 0.38 | 0.35 | 0.31 | +| -25% | 0.47 | 0.37 | 0.28 | 0.23 | 0.19 | 0.12 | 0.08 | 0.07 | +| -10% | 0.38 | 0.28 | 0.20 | 0.14 | 0.11 | 0.07 | 0.04 | 0.02 | +| -5% | 0.40 | 0.27 | 0.20 | 0.15 | 0.09 | 0.06 | 0.03 | 0.01 | +| +5% | 0.37 | 0.29 | 0.21 | 0.14 | 0.10 | 0.04 | 0.03 | 0.03 | +| +10% | 0.39 | 0.30 | 0.22 | 0.17 | 0.12 | 0.08 | 0.03 | 0.02 | +| +25% | 0.48 | 0.39 | 0.30 | 0.25 | 0.20 | 0.11 | 0.08 | 0.08 | +| +50% | 0.64 | 0.58 | 0.54 | 0.52 | 0.44 | 0.39 | 0.33 | 0.35 | + +## Estimator bias + +`E[H̃ − H_true] / H_true` averaged over post-settle ticks. Positive = systematic over-estimate. Populated only for algorithms that expose introspection (e.g. ClassicComposed, Parametric, EWMA-60s). + +### Bias — stable load + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | -9.8% | 0.1% | 11.5% | 23.8% | 0.6% | +| 8 | -9.6% | -0.6% | 9.2% | 22.0% | -0.3% | +| 10 | -8.0% | -0.5% | 8.2% | 21.2% | -0.1% | +| 12 | -7.4% | -0.2% | 7.3% | 15.3% | 0.0% | +| 15 | -6.5% | -0.5% | 6.6% | 11.8% | -0.3% | +| 20 | -5.8% | -0.3% | 5.4% | 10.2% | -0.3% | +| 25 | -5.0% | -0.0% | 5.0% | 9.2% | -0.0% | +| 30 | -5.3% | 0.1% | 4.9% | 8.4% | -0.1% | + +### Bias — cold start + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | -12.7% | 0.4% | 14.4% | 28.2% | 0.8% | +| 8 | -11.5% | -0.8% | 12.2% | 21.7% | -0.1% | +| 10 | -10.4% | -0.5% | 11.0% | 21.0% | 0.0% | +| 12 | -9.1% | -0.4% | 9.4% | 17.6% | -0.0% | +| 15 | -8.5% | -0.0% | 8.9% | 17.1% | 0.0% | +| 20 | -7.0% | 0.2% | 7.6% | 13.6% | 0.2% | +| 25 | -7.0% | -0.4% | 6.7% | 12.1% | -0.2% | +| 30 | -6.0% | -0.3% | 5.7% | 11.3% | -0.1% | + +## Estimator variance + +Population variance of `H̃ / H_true` over post-settle ticks (dimensionless). Populated only for algorithms that expose introspection. + +### Variance — stable load + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.001 | 0.007 | 0.077 | 0.169 | 0.026 | +| 8 | 0.000 | 0.002 | 0.045 | 0.117 | 0.014 | +| 10 | 0.000 | 0.001 | 0.033 | 0.087 | 0.010 | +| 12 | 0.000 | 0.001 | 0.017 | 0.060 | 0.006 | +| 15 | 0.000 | 0.000 | 0.007 | 0.043 | 0.003 | +| 20 | 0.000 | 0.000 | 0.003 | 0.020 | 0.001 | +| 25 | 0.000 | 0.000 | 0.001 | 0.016 | 0.001 | +| 30 | 0.000 | 0.000 | 0.001 | 0.011 | 0.001 | + +### Variance — cold start + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.004 | 0.030 | 0.106 | 0.194 | 0.044 | +| 8 | 0.003 | 0.017 | 0.065 | 0.123 | 0.027 | +| 10 | 0.002 | 0.011 | 0.046 | 0.098 | 0.019 | +| 12 | 0.002 | 0.008 | 0.034 | 0.075 | 0.014 | +| 15 | 0.001 | 0.005 | 0.027 | 0.051 | 0.010 | +| 20 | 0.001 | 0.003 | 0.015 | 0.036 | 0.006 | +| 25 | 0.001 | 0.002 | 0.011 | 0.027 | 0.004 | +| 30 | 0.000 | 0.002 | 0.007 | 0.023 | 0.003 | + +## Ramp target overshoot (cold start) + +`max(new_hashrate on fires) / H_true − 1`: how far the algorithm's actual *target* (not its belief) climbs past truth during the cold-start ramp. Reads `new_hashrate` (the actual target the algorithm set), so it's unaffected by estimator-belief noise. Works for any algorithm that fires, including those without introspection. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.0% | 25.1% | 79.3% | 132.6% | 33.5% | +| 8 | 0.0% | 16.9% | 57.5% | 106.7% | 23.5% | +| 10 | 0.0% | 12.2% | 48.0% | 89.0% | 18.2% | +| 12 | 0.0% | 9.3% | 34.3% | 79.1% | 13.8% | +| 15 | 0.0% | 6.3% | 27.3% | 61.7% | 10.9% | +| 20 | 0.0% | 5.3% | 19.1% | 52.7% | 8.1% | +| 25 | 0.0% | 3.1% | 15.0% | 39.3% | 6.0% | +| 30 | 0.0% | 2.4% | 12.9% | 25.8% | 4.9% | + +## Upward step magnitude (stable load) + +`new_hashrate / old_hashrate` for upward difficulty adjustments during steady-state. Per-trial p95 of ratios, then distribution across trials. Values near 1.0 indicate gentle retargeting; values >> 1.0 indicate aggressive jumps. + +| share/min | p50 | p90 | p95 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 1.333 | 3.333 | 4.000 | 5.500 | 1.807 | +| 8 | 1.163 | 2.500 | 3.250 | 5.000 | 1.519 | +| 10 | 1.000 | 1.900 | 2.400 | 4.000 | 1.316 | +| 12 | 1.000 | 1.563 | 1.833 | 2.667 | 1.179 | +| 15 | 1.000 | 1.280 | 1.500 | 2.067 | 1.095 | +| 20 | 1.000 | 1.210 | 1.325 | 1.700 | 1.057 | +| 25 | 1.000 | 1.160 | 1.216 | 1.600 | 1.034 | +| 30 | 1.000 | 1.162 | 1.220 | 1.433 | 1.032 | + +## Operational fitness (per share rate) + +`0.15×react(-10%) + 0.1×react(-50%) + 0.25×jitter + 0.25×step_safety + 0.15×convergence + 0.1×overshoot`. Higher is better. + +| share/min | fitness | react-10% | react-50% | jitter | step-safe | conv | overshoot | +| --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.335 | 0.383 | 0.702 | 0.828 | 0.000 | 0.000 | 0.000 | +| 8 | 0.322 | 0.282 | 0.590 | 0.881 | 0.000 | 0.000 | 0.000 | +| 10 | 0.329 | 0.201 | 0.579 | 0.919 | 0.000 | 0.000 | 0.110 | +| 12 | 0.333 | 0.144 | 0.520 | 0.952 | 0.000 | 0.000 | 0.209 | +| 15 | 0.344 | 0.107 | 0.463 | 0.971 | 0.000 | 0.000 | 0.383 | +| 20 | 0.430 | 0.071 | 0.384 | 0.983 | 0.350 | 0.000 | 0.473 | +| 25 | 0.491 | 0.036 | 0.347 | 0.991 | 0.568 | 0.000 | 0.607 | +| 30 | 0.497 | 0.024 | 0.308 | 0.993 | 0.560 | 0.000 | 0.742 | + +## Decoupling score (per share rate) + +`reaction_rate(Step−50) × clamp(1 − jitter_p50 / J_max, 0, 1)` where `J_max = 0.50` fires/min. Higher is better. Score of 1.0 = perfect decoupling between reactivity and jitter. + +| share/min | decoupling score | +| --- | --- | +| 6 | 0.702 | +| 8 | 0.590 | +| 10 | 0.579 | +| 12 | 0.520 | +| 15 | 0.463 | +| 20 | 0.384 | +| 25 | 0.347 | +| 30 | 0.308 | + +## Reaction asymmetry (per share rate) + +`reaction_rate(+δ%) − reaction_rate(−δ%)`. Positive = responds faster to up-steps; negative = responds faster to down-steps; near zero = symmetric. + +| share/min | δ=5% | δ=10% | δ=25% | δ=50% | +| --- | --- | --- | --- | --- | +| 6 | -0.03 | +0.01 | +0.01 | -0.06 | +| 8 | +0.01 | +0.01 | +0.02 | -0.01 | +| 10 | +0.00 | +0.02 | +0.03 | -0.04 | +| 12 | -0.01 | +0.02 | +0.02 | -0.01 | +| 15 | +0.02 | +0.02 | +0.00 | -0.03 | +| 20 | -0.01 | +0.01 | -0.01 | +0.01 | +| 25 | +0.00 | -0.01 | +0.00 | -0.02 | +| 30 | +0.02 | -0.00 | +0.01 | +0.04 | + diff --git a/sv2/channels-sv2/sim/baseline_ClassicComposed.toml b/sv2/channels-sv2/sim/baseline_ClassicComposed.toml new file mode 100644 index 0000000000..6510a08adc --- /dev/null +++ b/sv2/channels-sv2/sim/baseline_ClassicComposed.toml @@ -0,0 +1,6582 @@ +# Vardiff baseline characterization. Regenerate with +# `cargo run --release --bin generate-baseline` from the sim crate. + +[meta] +algorithm = "ClassicComposed" +trial_count = 1000 +base_seed = 16045690984503111693 +quiet_window_secs = 300 +settle_buffer_secs = 120 +min_settled_window_secs = 600 +react_window_secs = 300 +step_event_at_secs = 900 +trial_duration_secs = 1800 + +[cell.spm_6.cold_start_10gh_to_1ph] +shares_per_minute = 6 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.866 +convergence_rate_ci_low = 0.8448861507441205 +convergence_rate_ci_high = 0.8871138492558794 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 825.3117782909931 +settled_accuracy_p10 = 0.01695700086724794 +settled_accuracy_p10_ci_low = 0.01695700086724794 +settled_accuracy_p10_ci_high = 0.018889534848996026 +settled_accuracy_p50 = 0.10494786278733581 +settled_accuracy_p50_ci_low = 0.09357505767503616 +settled_accuracy_p50_ci_high = 0.114264116735602 +settled_accuracy_p90 = 0.2899278116651447 +settled_accuracy_p90_ci_low = 0.26310641164134796 +settled_accuracy_p90_ci_high = 0.33380170847090374 +settled_accuracy_p95 = 0.41860093988649605 +settled_accuracy_p95_ci_low = 0.37781237314327387 +settled_accuracy_p95_ci_high = 0.5033145403905105 +settled_accuracy_p99 = 0.6832893759083605 +settled_accuracy_p99_ci_low = 0.611158855340198 +settled_accuracy_p99_ci_high = 0.792585557595143 +settled_accuracy_mean = 0.1410922070099102 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.05555555555555555 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.05555555555555555 +jitter_p90_per_min = 0.2777777777777778 +jitter_p90_per_min_ci_low = 0.2222222222222222 +jitter_p90_per_min_ci_high = 0.2777777777777778 +jitter_p95_per_min = 0.3333333333333333 +jitter_p95_per_min_ci_low = 0.3076923076923077 +jitter_p95_per_min_ci_high = 0.35714285714285715 +jitter_p99_per_min = 0.4166666666666667 +jitter_p99_per_min_ci_low = 0.3888888888888889 +jitter_p99_per_min_ci_high = 0.46153846153846156 +jitter_mean_per_min = 0.08926169457745989 +bias_mean = 0.008443521110447987 +bias_p10 = -0.12703782293417126 +bias_p10_ci_low = -0.1359760614767216 +bias_p10_ci_high = -0.11626794329014116 +bias_p50 = 0.0037254850566059232 +bias_p50_ci_low = -0.0028706593999445343 +bias_p50_ci_high = 0.01078362459916979 +bias_p90 = 0.14398134551571626 +bias_p90_ci_low = 0.132464503587126 +bias_p90_ci_high = 0.15168220078535102 +bias_p99 = 0.2821220511115314 +bias_p99_ci_low = 0.25447377803931553 +bias_p99_ci_high = 0.3036844349171677 +variance_mean = 0.04429633769850716 +variance_p10 = 0.004015206139797473 +variance_p10_ci_low = 0.0035374169793671657 +variance_p10_ci_high = 0.004701564357529994 +variance_p50 = 0.0303683928389375 +variance_p50_ci_low = 0.02706896492105017 +variance_p50_ci_high = 0.033432604732589154 +variance_p90 = 0.10556742912373152 +variance_p90_ci_low = 0.0959674372811606 +variance_p90_ci_high = 0.11551439424967765 +variance_p99 = 0.1941010603399805 +variance_p99_ci_low = 0.17841577627609262 +variance_p99_ci_high = 0.21867271763731075 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.25119217220725276 +ramp_target_overshoot_p50_ci_low = 0.2393041052304583 +ramp_target_overshoot_p50_ci_high = 0.2793962832828931 +ramp_target_overshoot_p90 = 0.792585557595143 +ramp_target_overshoot_p90_ci_low = 0.7437708377219734 +ramp_target_overshoot_p90_ci_high = 0.8589509904630921 +ramp_target_overshoot_p99 = 1.3255127570261136 +ramp_target_overshoot_p99_ci_low = 1.2239387924202685 +ramp_target_overshoot_p99_ci_high = 1.5874700635742411 +ramp_target_overshoot_mean = 0.3346666699997404 + +[cell.spm_6.stable_1ph] +shares_per_minute = 6 +scenario = "stable_1ph" +convergence_rate = 0.92 +convergence_rate_ci_low = 0.9031850732978107 +convergence_rate_ci_high = 0.9368149267021894 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 300 +convergence_p50_secs_ci_high = 360 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 414.19565217391306 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0.04306845620955313 +settled_accuracy_p50_ci_low = 0.03402634197429322 +settled_accuracy_p50_ci_high = 0.054782040137677845 +settled_accuracy_p90 = 0.23475164116406766 +settled_accuracy_p90_ci_low = 0.22222248320114124 +settled_accuracy_p90_ci_high = 0.2617979229940539 +settled_accuracy_p95 = 0.3194439681579173 +settled_accuracy_p95_ci_low = 0.28332819167580303 +settled_accuracy_p95_ci_high = 0.35802505590000666 +settled_accuracy_p99 = 0.5999081212531023 +settled_accuracy_p99_ci_low = 0.47942361672355593 +settled_accuracy_p99_ci_high = 0.8212085118736722 +settled_accuracy_mean = 0.09172460728060043 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.19047619047619047 +jitter_p90_per_min_ci_low = 0.17647058823529413 +jitter_p90_per_min_ci_high = 0.21739130434782608 +jitter_p95_per_min = 0.23809523809523808 +jitter_p95_per_min_ci_low = 0.22727272727272727 +jitter_p95_per_min_ci_high = 0.2631578947368421 +jitter_p99_per_min = 0.3333333333333333 +jitter_p99_per_min_ci_low = 0.30434782608695654 +jitter_p99_per_min_ci_high = 0.42857142857142855 +jitter_mean_per_min = 0.05165970657933462 +bias_mean = 0.005661186256242929 +bias_p10 = -0.0981346600054219 +bias_p10_ci_low = -0.10294075143046343 +bias_p10_ci_high = -0.09031726136182133 +bias_p50 = 0.0010070956710582545 +bias_p50_ci_low = -0.005434631287419391 +bias_p50_ci_high = 0.006416048987549925 +bias_p90 = 0.11481139835875522 +bias_p90_ci_low = 0.10172396704701843 +bias_p90_ci_high = 0.1298562080604253 +bias_p99 = 0.23847946796685313 +bias_p99_ci_low = 0.21595278451969724 +bias_p99_ci_high = 0.3303573689395922 +variance_mean = 0.025910324558919312 +variance_p10 = 0.0005376468697867636 +variance_p10_ci_low = 0.0004801087878422314 +variance_p10_ci_high = 0.0005872492040405228 +variance_p50 = 0.006882888623118501 +variance_p50_ci_low = 0.005080295570687402 +variance_p50_ci_high = 0.009730018780738732 +variance_p90 = 0.07673943463194893 +variance_p90_ci_low = 0.06655017970180382 +variance_p90_ci_high = 0.08715179118731665 +variance_p99 = 0.16891601673934745 +variance_p99_ci_low = 0.1486648338535764 +variance_p99_ci_high = 0.1932343934428636 +upward_step_magnitude_p50 = 1.333333306489787 +upward_step_magnitude_p50_ci_low = 1.266667744882429 +upward_step_magnitude_p50_ci_high = 1.5000014834578554 +upward_step_magnitude_p90 = 3.3333332927865658 +upward_step_magnitude_p90_ci_low = 3.1666713475101487 +upward_step_magnitude_p90_ci_high = 3.5000033566774382 +upward_step_magnitude_p95 = 4 +upward_step_magnitude_p95_ci_low = 3.6666703066905515 +upward_step_magnitude_p95_ci_high = 4.166666616335016 +upward_step_magnitude_p99 = 5.500005414498629 +upward_step_magnitude_p99_ci_low = 4.999999898309673 +upward_step_magnitude_p99_ci_high = 6.000024084823223 +upward_step_magnitude_mean = 1.8070917531987758 +fire_decisiveness_mean = 24.983845533813433 +fire_decisiveness_p50 = 6.66667581787307 + +[cell.spm_6.step_minus_50_at_15min] +shares_per_minute = 6 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.667 +convergence_rate_ci_low = 0.6377893578023351 +convergence_rate_ci_high = 0.6962106421976649 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 754.992503748126 +settled_accuracy_p10 = 0.02777642627980459 +settled_accuracy_p10_ci_low = 0.02467539274288766 +settled_accuracy_p10_ci_high = 0.03160304086372867 +settled_accuracy_p50 = 0.13227526365227504 +settled_accuracy_p50_ci_low = 0.12367707455815025 +settled_accuracy_p50_ci_high = 0.14339117602984086 +settled_accuracy_p90 = 0.5126116683122879 +settled_accuracy_p90_ci_low = 0.45130315684797984 +settled_accuracy_p90_ci_high = 0.5909113390560641 +settled_accuracy_p95 = 0.6781621244143325 +settled_accuracy_p95_ci_low = 0.6452157989568732 +settled_accuracy_p95_ci_high = 0.6913590826916105 +settled_accuracy_p99 = 1.0254670089129299 +settled_accuracy_p99_ci_low = 0.8660979503543382 +settled_accuracy_p99_ci_high = 1.171474424039845 +settled_accuracy_mean = 0.20726289427213096 +jitter_p10_per_min = 0.043478260869565216 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.07142857142857142 +jitter_p50_per_min = 0.16666666666666666 +jitter_p50_per_min_ci_low = 0.15789473684210525 +jitter_p50_per_min_ci_high = 0.18181818181818182 +jitter_p90_per_min = 0.3181818181818182 +jitter_p90_per_min_ci_low = 0.3 +jitter_p90_per_min_ci_high = 0.3333333333333333 +jitter_p95_per_min = 0.3684210526315789 +jitter_p95_per_min_ci_low = 0.3333333333333333 +jitter_p95_per_min_ci_high = 0.4 +jitter_p99_per_min = 0.45454545454545453 +jitter_p99_per_min_ci_low = 0.4166666666666667 +jitter_p99_per_min_ci_high = 0.5 +jitter_mean_per_min = 0.1789919139300901 +reaction_rate = 0.702 +reaction_rate_ci_low = 0.6736513253643137 +reaction_rate_ci_high = 0.7303486746356862 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 157.17948717948718 +fire_decisiveness_mean = 25.8111512351071 +fire_decisiveness_p50 = 6.666672393283918 +step_correction_mean = 0.5804658650375499 +step_correction_p50 = 0.45049408078193665 + +[cell.spm_6.step_minus_25_at_15min] +shares_per_minute = 6 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.838 +convergence_rate_ci_low = 0.8151631821481188 +convergence_rate_ci_high = 0.8608368178518812 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 420 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 526.3245823389021 +settled_accuracy_p10 = 0.039778644545915065 +settled_accuracy_p10_ci_low = 0.032305222563860925 +settled_accuracy_p10_ci_high = 0.04488178147367661 +settled_accuracy_p50 = 0.16518166682489444 +settled_accuracy_p50_ci_low = 0.148979797637249 +settled_accuracy_p50_ci_high = 0.17602466957608942 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.366384329239305 +settled_accuracy_p95 = 0.4388703573976471 +settled_accuracy_p95_ci_low = 0.3934227587272616 +settled_accuracy_p95_ci_high = 0.493679195115978 +settled_accuracy_p99 = 0.7650475743680292 +settled_accuracy_p99_ci_low = 0.6581789464105303 +settled_accuracy_p99_ci_high = 0.8423701047551462 +settled_accuracy_mean = 0.20679271664821536 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.043478260869565216 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.05263157894736842 +jitter_p90_per_min = 0.25 +jitter_p90_per_min_ci_low = 0.23529411764705882 +jitter_p90_per_min_ci_high = 0.2692307692307692 +jitter_p95_per_min = 0.3 +jitter_p95_per_min_ci_low = 0.2777777777777778 +jitter_p95_per_min_ci_high = 0.3333333333333333 +jitter_p99_per_min = 0.42105263157894735 +jitter_p99_per_min_ci_low = 0.36363636363636365 +jitter_p99_per_min_ci_high = 0.46153846153846156 +jitter_mean_per_min = 0.08551775989801873 +reaction_rate = 0.47 +reaction_rate_ci_low = 0.439065511803167 +reaction_rate_ci_high = 0.500934488196833 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 159.19148936170214 +fire_decisiveness_mean = 25.80438660466944 +fire_decisiveness_p50 = 6.666667785147752 +step_correction_mean = -848.8160785641442 +step_correction_p50 = 0.7435880899429321 + +[cell.spm_6.step_minus_10_at_15min] +shares_per_minute = 6 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.914 +convergence_rate_ci_low = 0.8966228562070748 +convergence_rate_ci_high = 0.9313771437929252 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 360 +convergence_p50_secs_ci_low = 360 +convergence_p50_secs_ci_high = 420 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 446.3894967177243 +settled_accuracy_p10 = 0.02880662916275356 +settled_accuracy_p10_ci_low = 0.02297442145634443 +settled_accuracy_p10_ci_high = 0.0370380533358885 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.26041192166605953 +settled_accuracy_p90_ci_low = 0.23456904365021525 +settled_accuracy_p90_ci_high = 0.2968203447233233 +settled_accuracy_p95 = 0.3827164102424532 +settled_accuracy_p95_ci_low = 0.3290112739163876 +settled_accuracy_p95_ci_high = 0.43032105253542885 +settled_accuracy_p99 = 0.7125558261865499 +settled_accuracy_p99_ci_low = 0.6097621028040694 +settled_accuracy_p99_ci_high = 0.8909297523049098 +settled_accuracy_mean = 0.14048094598519328 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.2 +jitter_p90_per_min_ci_low = 0.17647058823529413 +jitter_p90_per_min_ci_high = 0.21739130434782608 +jitter_p95_per_min = 0.2727272727272727 +jitter_p95_per_min_ci_low = 0.23809523809523808 +jitter_p95_per_min_ci_high = 0.3 +jitter_p99_per_min = 0.38461538461538464 +jitter_p99_per_min_ci_low = 0.34615384615384615 +jitter_p99_per_min_ci_high = 0.4 +jitter_mean_per_min = 0.059604653344663486 +reaction_rate = 0.383 +reaction_rate_ci_low = 0.3528700757120102 +reaction_rate_ci_high = 0.41312992428798984 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 158.5378590078329 +fire_decisiveness_mean = 25.443164039177045 +fire_decisiveness_p50 = 6.666670876043781 +step_correction_mean = 1.3116092171432456 +step_correction_p50 = 1.0308359861373901 + +[cell.spm_6.step_minus_5_at_15min] +shares_per_minute = 6 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.922 +convergence_rate_ci_low = 0.9053785528427878 +convergence_rate_ci_high = 0.9386214471572123 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 360 +convergence_p50_secs_ci_low = 300 +convergence_p50_secs_ci_high = 420 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 450.13015184381777 +settled_accuracy_p10 = 0.03031879606979404 +settled_accuracy_p10_ci_low = 0.027775652663730943 +settled_accuracy_p10_ci_high = 0.03556882851163201 +settled_accuracy_p50 = 0.06120533313440846 +settled_accuracy_p50_ci_low = 0.05263199907488669 +settled_accuracy_p50_ci_high = 0.07212295643794053 +settled_accuracy_p90 = 0.2630924626643364 +settled_accuracy_p90_ci_low = 0.24035131702559664 +settled_accuracy_p90_ci_high = 0.2865513905910404 +settled_accuracy_p95 = 0.37174319796910216 +settled_accuracy_p95_ci_low = 0.3175330809616177 +settled_accuracy_p95_ci_high = 0.41034834940096154 +settled_accuracy_p99 = 0.6298491187864343 +settled_accuracy_p99_ci_low = 0.5479917036489492 +settled_accuracy_p99_ci_high = 0.7575129256971358 +settled_accuracy_mean = 0.11971043320502847 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.2222222222222222 +jitter_p90_per_min_ci_low = 0.21052631578947367 +jitter_p90_per_min_ci_high = 0.24 +jitter_p95_per_min = 0.2777777777777778 +jitter_p95_per_min_ci_low = 0.2608695652173913 +jitter_p95_per_min_ci_high = 0.2962962962962963 +jitter_p99_per_min = 0.36 +jitter_p99_per_min_ci_low = 0.3333333333333333 +jitter_p99_per_min_ci_high = 0.3684210526315789 +jitter_mean_per_min = 0.06320955260406268 +reaction_rate = 0.396 +reaction_rate_ci_low = 0.36568747363877435 +reaction_rate_ci_high = 0.4263125263612257 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 151.66666666666666 +fire_decisiveness_mean = 32.68948077793432 +fire_decisiveness_p50 = 7.222343340978924 +step_correction_mean = 311.5204877316049 +step_correction_p50 = 1.1655529737472534 + +[cell.spm_6.step_plus_5_at_15min] +shares_per_minute = 6 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.92 +convergence_rate_ci_low = 0.9031850732978107 +convergence_rate_ci_high = 0.9368149267021894 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 360 +convergence_p50_secs_ci_low = 300 +convergence_p50_secs_ci_high = 420 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 445.5652173913044 +settled_accuracy_p10 = 0.028808048053529545 +settled_accuracy_p10_ci_low = 0.024321276873427222 +settled_accuracy_p10_ci_high = 0.03493253129925722 +settled_accuracy_p50 = 0.0603164291843562 +settled_accuracy_p50_ci_low = 0.050921954430137695 +settled_accuracy_p50_ci_high = 0.06881835597586594 +settled_accuracy_p90 = 0.2540091158131633 +settled_accuracy_p90_ci_low = 0.231152921428041 +settled_accuracy_p90_ci_high = 0.27885128533937087 +settled_accuracy_p95 = 0.35818406722953755 +settled_accuracy_p95_ci_low = 0.3057956881337074 +settled_accuracy_p95_ci_high = 0.39582811641765436 +settled_accuracy_p99 = 0.661607680527013 +settled_accuracy_p99_ci_low = 0.550257704449727 +settled_accuracy_p99_ci_high = 0.6984899481778919 +settled_accuracy_mean = 0.11396125763427292 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.23076923076923078 +jitter_p90_per_min_ci_low = 0.21052631578947367 +jitter_p90_per_min_ci_high = 0.25 +jitter_p95_per_min = 0.3 +jitter_p95_per_min_ci_low = 0.2727272727272727 +jitter_p95_per_min_ci_high = 0.3157894736842105 +jitter_p99_per_min = 0.4 +jitter_p99_per_min_ci_low = 0.3333333333333333 +jitter_p99_per_min_ci_high = 0.5 +jitter_mean_per_min = 0.066126605640493 +reaction_rate = 0.366 +reaction_rate_ci_low = 0.33614333859253515 +reaction_rate_ci_high = 0.39585666140746484 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 158.36065573770492 +fire_decisiveness_mean = 31.81186025790661 +fire_decisiveness_p50 = 7.499997483417566 +step_correction_mean = 1.2438120850122691 +step_correction_p50 = 1.2921165227890015 + +[cell.spm_6.step_plus_10_at_15min] +shares_per_minute = 6 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.928 +convergence_rate_ci_low = 0.9119787533069365 +convergence_rate_ci_high = 0.9440212466930636 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 360 +convergence_p50_secs_ci_low = 300 +convergence_p50_secs_ci_high = 420 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 446.12068965517244 +settled_accuracy_p10 = 0.028466909564154097 +settled_accuracy_p10_ci_low = 0.021326343273925463 +settled_accuracy_p10_ci_high = 0.03198597644344614 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.23487938127090402 +settled_accuracy_p90_ci_low = 0.21212044674737662 +settled_accuracy_p90_ci_high = 0.25344657405277204 +settled_accuracy_p95 = 0.33333418744616417 +settled_accuracy_p95_ci_low = 0.27710269309706614 +settled_accuracy_p95_ci_high = 0.37394633743301386 +settled_accuracy_p99 = 0.612600653384114 +settled_accuracy_p99_ci_low = 0.5455286369695296 +settled_accuracy_p99_ci_high = 0.7566772405835128 +settled_accuracy_mean = 0.12088887459775066 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.21428571428571427 +jitter_p90_per_min_ci_low = 0.2 +jitter_p90_per_min_ci_high = 0.23529411764705882 +jitter_p95_per_min = 0.2692307692307692 +jitter_p95_per_min_ci_low = 0.25 +jitter_p95_per_min_ci_high = 0.29411764705882354 +jitter_p99_per_min = 0.375 +jitter_p99_per_min_ci_low = 0.3333333333333333 +jitter_p99_per_min_ci_high = 0.45454545454545453 +jitter_mean_per_min = 0.06179680443845266 +reaction_rate = 0.392 +reaction_rate_ci_low = 0.36174125617941155 +reaction_rate_ci_high = 0.4222587438205885 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 146.1734693877551 +fire_decisiveness_mean = 33.759947113932085 +fire_decisiveness_p50 = 7.222208054795189 +step_correction_mean = 0.8115256400968955 +step_correction_p50 = 1.1739552021026611 + +[cell.spm_6.step_plus_25_at_15min] +shares_per_minute = 6 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.856 +convergence_rate_ci_low = 0.8342392329546957 +convergence_rate_ci_high = 0.8777607670453043 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 420 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 522.9672897196261 +settled_accuracy_p10 = 0.028269688720106267 +settled_accuracy_p10_ci_low = 0.022635658148959292 +settled_accuracy_p10_ci_high = 0.0370379715900806 +settled_accuracy_p50 = 0.1475336258349147 +settled_accuracy_p50_ci_low = 0.13333296110284454 +settled_accuracy_p50_ci_high = 0.15711591235947675 +settled_accuracy_p90 = 0.29644690250188277 +settled_accuracy_p90_ci_low = 0.2627285647314904 +settled_accuracy_p90_ci_high = 0.3482975716470318 +settled_accuracy_p95 = 0.44415420607209577 +settled_accuracy_p95_ci_low = 0.38979651089751277 +settled_accuracy_p95_ci_high = 0.5096474626515022 +settled_accuracy_p99 = 0.7698559017036632 +settled_accuracy_p99_ci_low = 0.6895113465516676 +settled_accuracy_p99_ci_high = 0.8814378605222293 +settled_accuracy_mean = 0.16508401051096638 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.05 +jitter_p50_per_min_ci_low = 0.038461538461538464 +jitter_p50_per_min_ci_high = 0.0625 +jitter_p90_per_min = 0.25 +jitter_p90_per_min_ci_low = 0.23529411764705882 +jitter_p90_per_min_ci_high = 0.2608695652173913 +jitter_p95_per_min = 0.2857142857142857 +jitter_p95_per_min_ci_low = 0.26666666666666666 +jitter_p95_per_min_ci_high = 0.30434782608695654 +jitter_p99_per_min = 0.36363636363636365 +jitter_p99_per_min_ci_low = 0.3333333333333333 +jitter_p99_per_min_ci_high = 0.43478260869565216 +jitter_mean_per_min = 0.0872237892368747 +reaction_rate = 0.482 +reaction_rate_ci_low = 0.4510297671691025 +reaction_rate_ci_high = 0.5129702328308975 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 150.746887966805 +fire_decisiveness_mean = 30.624150675539674 +fire_decisiveness_p50 = 7.2223412286108655 +step_correction_mean = 786.9482210561695 +step_correction_p50 = 0.7013190984725952 + +[cell.spm_6.step_plus_50_at_15min] +shares_per_minute = 6 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.726 +convergence_rate_ci_low = 0.6983560777312625 +convergence_rate_ci_high = 0.7536439222687374 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 749.2561983471074 +settled_accuracy_p10 = 0.027776805942015592 +settled_accuracy_p10_ci_low = 0.02444060064759157 +settled_accuracy_p10_ci_high = 0.03209995892042783 +settled_accuracy_p50 = 0.13580167487616845 +settled_accuracy_p50_ci_low = 0.12373040096830046 +settled_accuracy_p50_ci_high = 0.14780449774339732 +settled_accuracy_p90 = 0.3692618678222037 +settled_accuracy_p90_ci_low = 0.3388369908707787 +settled_accuracy_p90_ci_high = 0.40799236140073547 +settled_accuracy_p95 = 0.4704416326924318 +settled_accuracy_p95_ci_low = 0.425928771010331 +settled_accuracy_p95_ci_high = 0.5327571336498068 +settled_accuracy_p99 = 0.840934366547359 +settled_accuracy_p99_ci_low = 0.6937865514016759 +settled_accuracy_p99_ci_high = 0.9257809972931863 +settled_accuracy_mean = 0.17768527842259443 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.13043478260869565 +jitter_p50_per_min_ci_low = 0.1111111111111111 +jitter_p50_per_min_ci_high = 0.13636363636363635 +jitter_p90_per_min = 0.29411764705882354 +jitter_p90_per_min_ci_low = 0.2692307692307692 +jitter_p90_per_min_ci_high = 0.3076923076923077 +jitter_p95_per_min = 0.3333333333333333 +jitter_p95_per_min_ci_low = 0.3125 +jitter_p95_per_min_ci_high = 0.34782608695652173 +jitter_p99_per_min = 0.4 +jitter_p99_per_min_ci_low = 0.3888888888888889 +jitter_p99_per_min_ci_high = 0.4166666666666667 +jitter_mean_per_min = 0.13703621883919587 +reaction_rate = 0.643 +reaction_rate_ci_low = 0.6133041564928693 +reaction_rate_ci_high = 0.6726958435071307 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 155.64541213063762 +fire_decisiveness_mean = 24.857463050828827 +fire_decisiveness_p50 = 6.666674817520715 +step_correction_mean = 0.6697225371610321 +step_correction_p50 = 0.47385191917419434 + +[cell.spm_8.cold_start_10gh_to_1ph] +shares_per_minute = 8 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.899 +convergence_rate_ci_low = 0.8803234521819475 +convergence_rate_ci_high = 0.9176765478180525 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 814.1713014460512 +settled_accuracy_p10 = 0.015849973032302622 +settled_accuracy_p10_ci_low = 0.015849973032302622 +settled_accuracy_p10_ci_high = 0.01860076540344746 +settled_accuracy_p50 = 0.08257007625110546 +settled_accuracy_p50_ci_low = 0.07735940843804046 +settled_accuracy_p50_ci_high = 0.0893996112115022 +settled_accuracy_p90 = 0.2246934316057655 +settled_accuracy_p90_ci_low = 0.20674462882455935 +settled_accuracy_p90_ci_high = 0.25479189171904126 +settled_accuracy_p95 = 0.3156251382023185 +settled_accuracy_p95_ci_low = 0.2835014667649052 +settled_accuracy_p95_ci_high = 0.39260209321944783 +settled_accuracy_p99 = 0.6782594322683984 +settled_accuracy_p99_ci_low = 0.5406323037513654 +settled_accuracy_p99_ci_high = 0.7502912692507651 +settled_accuracy_mean = 0.11330350790284067 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.2 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.2222222222222222 +jitter_p95_per_min = 0.25 +jitter_p95_per_min_ci_low = 0.23076923076923078 +jitter_p95_per_min_ci_high = 0.2777777777777778 +jitter_p99_per_min = 0.3888888888888889 +jitter_p99_per_min_ci_low = 0.3 +jitter_p99_per_min_ci_high = 0.4166666666666667 +jitter_mean_per_min = 0.06275183924896885 +bias_mean = -0.0006662004937594766 +bias_p10 = -0.11484997712594341 +bias_p10_ci_low = -0.11984360427387257 +bias_p10_ci_high = -0.10954746200118586 +bias_p50 = -0.007747783792431372 +bias_p50_ci_low = -0.014604252365938045 +bias_p50_ci_high = -0.0009474076338219906 +bias_p90 = 0.1223724570327457 +bias_p90_ci_low = 0.10963260902252761 +bias_p90_ci_high = 0.12911980129390055 +bias_p99 = 0.21661541745145338 +bias_p99_ci_low = 0.1977969226339937 +bias_p99_ci_high = 0.2735183767507145 +variance_mean = 0.026878838547837507 +variance_p10 = 0.002841886795826195 +variance_p10_ci_low = 0.0024471724688881345 +variance_p10_ci_high = 0.003183092429293151 +variance_p50 = 0.016950670728854186 +variance_p50_ci_low = 0.014848772478366934 +variance_p50_ci_high = 0.019533994052198744 +variance_p90 = 0.06506237290222056 +variance_p90_ci_low = 0.061348223768504184 +variance_p90_ci_high = 0.06906992656043277 +variance_p99 = 0.12314551570051271 +variance_p99_ci_low = 0.11547533122346165 +variance_p99_ci_high = 0.1319537380944961 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.16868356767637094 +ramp_target_overshoot_p50_ci_low = 0.1563814390033098 +ramp_target_overshoot_p50_ci_high = 0.18097992498705295 +ramp_target_overshoot_p90 = 0.574639989461224 +ramp_target_overshoot_p90_ci_low = 0.5305336275475447 +ramp_target_overshoot_p90_ci_high = 0.6392317350305792 +ramp_target_overshoot_p99 = 1.0667169491021538 +ramp_target_overshoot_p99_ci_low = 0.9375471481718773 +ramp_target_overshoot_p99_ci_high = 1.090813326558917 +ramp_target_overshoot_mean = 0.23514181163467754 + +[cell.spm_8.stable_1ph] +shares_per_minute = 8 +scenario = "stable_1ph" +convergence_rate = 0.959 +convergence_rate_ci_low = 0.9467098466079548 +convergence_rate_ci_high = 0.9712901533920452 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 240 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 960 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 344.859228362878 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0.017062227567368637 +settled_accuracy_p50_ci_low = 0.0072240008681202506 +settled_accuracy_p50_ci_high = 0.026691074608213405 +settled_accuracy_p90 = 0.1750015988687057 +settled_accuracy_p90_ci_low = 0.16072036266167444 +settled_accuracy_p90_ci_high = 0.19437807564122012 +settled_accuracy_p95 = 0.2545527828334987 +settled_accuracy_p95_ci_low = 0.21142178116188393 +settled_accuracy_p95_ci_high = 0.275000652633711 +settled_accuracy_p99 = 0.6589281868708083 +settled_accuracy_p99_ci_low = 0.3979183232769581 +settled_accuracy_p99_ci_high = 0.7202401879960898 +settled_accuracy_mean = 0.06568757994762954 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.15 +jitter_p90_per_min_ci_low = 0.125 +jitter_p90_per_min_ci_high = 0.17391304347826086 +jitter_p95_per_min = 0.21052631578947367 +jitter_p95_per_min_ci_low = 0.1875 +jitter_p95_per_min_ci_high = 0.23529411764705882 +jitter_p99_per_min = 0.30434782608695654 +jitter_p99_per_min_ci_low = 0.26666666666666666 +jitter_p99_per_min_ci_high = 0.3333333333333333 +jitter_mean_per_min = 0.03575391481983853 +bias_mean = -0.003118619165947789 +bias_p10 = -0.09587117689052975 +bias_p10_ci_low = -0.10435583367949439 +bias_p10_ci_high = -0.08958779859678824 +bias_p50 = -0.006412234378388722 +bias_p50_ci_low = -0.012448337697346289 +bias_p50_ci_high = -0.0005974454996457903 +bias_p90 = 0.09179596987884295 +bias_p90_ci_low = 0.08212091661851044 +bias_p90_ci_high = 0.10073902436545928 +bias_p99 = 0.2200812795021387 +bias_p99_ci_low = 0.18721899023770516 +bias_p99_ci_high = 0.23550244278210772 +variance_mean = 0.01398899444270378 +variance_p10 = 0.00034825615236586203 +variance_p10_ci_low = 0.00032206979312185554 +variance_p10_ci_high = 0.0003856305390289666 +variance_p50 = 0.0022730255152168576 +variance_p50_ci_low = 0.0017265493759789437 +variance_p50_ci_high = 0.002780290548882052 +variance_p90 = 0.04533880196951864 +variance_p90_ci_low = 0.04017240661484313 +variance_p90_ci_high = 0.05058583717089701 +variance_p99 = 0.11726045650698318 +variance_p99_ci_low = 0.10022491927420714 +variance_p99_ci_high = 0.13984365085231648 +upward_step_magnitude_p50 = 1.1625005432763642 +upward_step_magnitude_p50_ci_low = 1.1500016025597146 +upward_step_magnitude_p50_ci_high = 1.1750015988687057 +upward_step_magnitude_p90 = 2.500000044739242 +upward_step_magnitude_p90_ci_low = 2.375003573586041 +upward_step_magnitude_p90_ci_high = 2.7500026340229464 +upward_step_magnitude_p95 = 3.2500034313309074 +upward_step_magnitude_p95_ci_low = 2.999999880293353 +upward_step_magnitude_p95_ci_high = 3.5000116350210253 +upward_step_magnitude_p99 = 5.000000212188429 +upward_step_magnitude_p99_ci_low = 4.500018033474757 +upward_step_magnitude_p99_ci_high = 6.500034359705159 +upward_step_magnitude_mean = 1.5187287232332671 +fire_decisiveness_mean = 18.9999089646844 +fire_decisiveness_p50 = 4.9999999999999964 + +[cell.spm_8.step_minus_50_at_15min] +shares_per_minute = 8 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.586 +convergence_rate_ci_low = 0.5554715292489125 +convergence_rate_ci_high = 0.6165284707510874 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 767.3037542662116 +settled_accuracy_p10 = 0.021628046297868964 +settled_accuracy_p10_ci_low = 0.01931587746753416 +settled_accuracy_p10_ci_high = 0.026408009416179157 +settled_accuracy_p50 = 0.12304692231699266 +settled_accuracy_p50_ci_low = 0.11382717091641381 +settled_accuracy_p50_ci_high = 0.13400116943907925 +settled_accuracy_p90 = 0.4160714054428376 +settled_accuracy_p90_ci_low = 0.38482283360336833 +settled_accuracy_p90_ci_high = 0.47945156756577556 +settled_accuracy_p95 = 0.6452883771942334 +settled_accuracy_p95_ci_low = 0.562499995805696 +settled_accuracy_p95_ci_high = 0.6724142501379591 +settled_accuracy_p99 = 0.7368413105529159 +settled_accuracy_p99_ci_low = 0.692308941565023 +settled_accuracy_p99_ci_high = 0.7857781685601544 +settled_accuracy_mean = 0.1810762547629678 +jitter_p10_per_min = 0.07692307692307693 +jitter_p10_per_min_ci_low = 0.043478260869565216 +jitter_p10_per_min_ci_high = 0.08695652173913043 +jitter_p50_per_min = 0.17391304347826086 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.18181818181818182 +jitter_p90_per_min = 0.3 +jitter_p90_per_min_ci_low = 0.2727272727272727 +jitter_p90_per_min_ci_high = 0.3157894736842105 +jitter_p95_per_min = 0.34782608695652173 +jitter_p95_per_min_ci_low = 0.3157894736842105 +jitter_p95_per_min_ci_high = 0.3684210526315789 +jitter_p99_per_min = 0.4 +jitter_p99_per_min_ci_low = 0.375 +jitter_p99_per_min_ci_high = 0.4782608695652174 +jitter_mean_per_min = 0.17625723795160492 +reaction_rate = 0.59 +reaction_rate_ci_low = 0.5595158559247598 +reaction_rate_ci_high = 0.6204841440752401 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 164.33898305084745 +fire_decisiveness_mean = 18.949631674227824 +fire_decisiveness_p50 = 4.999998908060078 +step_correction_mean = 0.5532898090400938 +step_correction_p50 = 0.3951628804206848 + +[cell.spm_8.step_minus_25_at_15min] +shares_per_minute = 8 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.849 +convergence_rate_ci_low = 0.8268079005409582 +convergence_rate_ci_high = 0.8711920994590417 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 360 +convergence_p50_secs_ci_low = 360 +convergence_p50_secs_ci_high = 420 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 472.29681978798584 +settled_accuracy_p10 = 0.041282509434835135 +settled_accuracy_p10_ci_low = 0.03333431461404657 +settled_accuracy_p10_ci_high = 0.04759396381722736 +settled_accuracy_p50 = 0.1616869056559439 +settled_accuracy_p50_ci_low = 0.13637532144027076 +settled_accuracy_p50_ci_high = 0.18495730668330013 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.37302327487495157 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.4120384889911488 +settled_accuracy_p99 = 0.6818877025334311 +settled_accuracy_p99_ci_low = 0.6041697331688958 +settled_accuracy_p99_ci_high = 0.8105661742158621 +settled_accuracy_mean = 0.20541959098758472 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.18181818181818182 +jitter_p90_per_min_ci_low = 0.17391304347826086 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.25 +jitter_p95_per_min_ci_low = 0.21739130434782608 +jitter_p95_per_min_ci_high = 0.2727272727272727 +jitter_p99_per_min = 0.35 +jitter_p99_per_min_ci_low = 0.3076923076923077 +jitter_p99_per_min_ci_high = 0.375 +jitter_mean_per_min = 0.061924582552398195 +reaction_rate = 0.371 +reaction_rate_ci_low = 0.3410588588327031 +reaction_rate_ci_high = 0.4009411411672969 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 165.28301886792454 +fire_decisiveness_mean = 17.376380142449566 +fire_decisiveness_p50 = 4.444404794079141 +step_correction_mean = 0.7716197470288393 +step_correction_p50 = 0.6785696744918823 + +[cell.spm_8.step_minus_10_at_15min] +shares_per_minute = 8 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.952 +convergence_rate_ci_low = 0.938750631954693 +convergence_rate_ci_high = 0.9652493680453069 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 120 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 363.2773109243698 +settled_accuracy_p10 = 0.03067374690040936 +settled_accuracy_p10_ci_low = 0.02647765330740448 +settled_accuracy_p10_ci_high = 0.03601978816714135 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.18945846501894525 +settled_accuracy_p90_ci_low = 0.16821500487098517 +settled_accuracy_p90_ci_high = 0.2172278894001176 +settled_accuracy_p95 = 0.2839053183402189 +settled_accuracy_p95_ci_low = 0.24595629945317454 +settled_accuracy_p95_ci_high = 0.31194727927614885 +settled_accuracy_p99 = 0.4824490559833331 +settled_accuracy_p99_ci_low = 0.4237718984613056 +settled_accuracy_p99_ci_high = 0.6216060717117868 +settled_accuracy_mean = 0.11739954149732519 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.15789473684210525 +jitter_p90_per_min_ci_low = 0.13043478260869565 +jitter_p90_per_min_ci_high = 0.17391304347826086 +jitter_p95_per_min = 0.21428571428571427 +jitter_p95_per_min_ci_low = 0.19047619047619047 +jitter_p95_per_min_ci_high = 0.22727272727272727 +jitter_p99_per_min = 0.3 +jitter_p99_per_min_ci_low = 0.2857142857142857 +jitter_p99_per_min_ci_high = 0.3333333333333333 +jitter_mean_per_min = 0.03969491009509315 +reaction_rate = 0.282 +reaction_rate_ci_low = 0.25411036390341385 +reaction_rate_ci_high = 0.3098896360965861 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 163.19148936170214 +fire_decisiveness_mean = 18.227248698311385 +fire_decisiveness_p50 = 4.9999986578227045 +step_correction_mean = 3.4346559818120714 +step_correction_p50 = 1.2417253255844116 + +[cell.spm_8.step_minus_5_at_15min] +shares_per_minute = 8 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.954 +convergence_rate_ci_low = 0.9410159800369838 +convergence_rate_ci_high = 0.9669840199630161 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 240 +convergence_p50_secs_ci_low = 120 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 960 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 343.45911949685535 +settled_accuracy_p10 = 0.030239113123152528 +settled_accuracy_p10_ci_low = 0.023622249710955057 +settled_accuracy_p10_ci_high = 0.03410811577169226 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.21052806694045678 +settled_accuracy_p90_ci_low = 0.19160075339943483 +settled_accuracy_p90_ci_high = 0.2171064310566262 +settled_accuracy_p95 = 0.2475293518279713 +settled_accuracy_p95_ci_low = 0.23684378391425942 +settled_accuracy_p95_ci_high = 0.28467559186309965 +settled_accuracy_p99 = 0.5431109818853395 +settled_accuracy_p99_ci_low = 0.39899038598405223 +settled_accuracy_p99_ci_high = 0.6407066973163448 +settled_accuracy_mean = 0.09285480721636494 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.15 +jitter_p90_per_min_ci_low = 0.11764705882352941 +jitter_p90_per_min_ci_high = 0.17391304347826086 +jitter_p95_per_min = 0.23076923076923078 +jitter_p95_per_min_ci_low = 0.2 +jitter_p95_per_min_ci_high = 0.2692307692307692 +jitter_p99_per_min = 0.3333333333333333 +jitter_p99_per_min_ci_low = 0.3076923076923077 +jitter_p99_per_min_ci_high = 0.36 +jitter_mean_per_min = 0.03940342458421117 +reaction_rate = 0.273 +reaction_rate_ci_low = 0.24538757175473336 +reaction_rate_ci_high = 0.3006124282452667 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 157.58241758241758 +fire_decisiveness_mean = 17.86184168376885 +fire_decisiveness_p50 = 4.9999986578227045 +step_correction_mean = 2.476443329136887 +step_correction_p50 = 1.1955680847167969 + +[cell.spm_8.step_plus_5_at_15min] +shares_per_minute = 8 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.946 +convergence_rate_ci_low = 0.9319912779169547 +convergence_rate_ci_high = 0.9600087220830452 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 120 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 355.05285412262157 +settled_accuracy_p10 = 0.029685448585722085 +settled_accuracy_p10_ci_low = 0.024900010980289267 +settled_accuracy_p10_ci_high = 0.0338702937668387 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.18281926021994588 +settled_accuracy_p90_ci_low = 0.16493212608951247 +settled_accuracy_p90_ci_high = 0.20479779842003987 +settled_accuracy_p95 = 0.24798695761493295 +settled_accuracy_p95_ci_low = 0.22629270536815993 +settled_accuracy_p95_ci_high = 0.29456926907192527 +settled_accuracy_p99 = 0.5838194572004558 +settled_accuracy_p99_ci_low = 0.43533600260459115 +settled_accuracy_p99_ci_high = 0.7086791836851564 +settled_accuracy_mean = 0.08744353443752342 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.15384615384615385 +jitter_p90_per_min_ci_low = 0.13043478260869565 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.21428571428571427 +jitter_p95_per_min_ci_low = 0.1875 +jitter_p95_per_min_ci_high = 0.22727272727272727 +jitter_p99_per_min = 0.3333333333333333 +jitter_p99_per_min_ci_low = 0.3076923076923077 +jitter_p99_per_min_ci_high = 0.36363636363636365 +jitter_mean_per_min = 0.03834426080383181 +reaction_rate = 0.287 +reaction_rate_ci_low = 0.25896233872806074 +reaction_rate_ci_high = 0.3150376612719392 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 153.65853658536585 +fire_decisiveness_mean = 19.832332816382642 +fire_decisiveness_p50 = 4.9999999999999964 +step_correction_mean = 0.9259464190396698 +step_correction_p50 = 1.3185642957687378 + +[cell.spm_8.step_plus_10_at_15min] +shares_per_minute = 8 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.944 +convergence_rate_ci_low = 0.9297493037924457 +convergence_rate_ci_high = 0.9582506962075542 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 300 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 370.10593220338984 +settled_accuracy_p10 = 0.027326546918827632 +settled_accuracy_p10_ci_low = 0.02272727134072583 +settled_accuracy_p10_ci_high = 0.03195888886509579 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.19432884942399542 +settled_accuracy_p90_ci_low = 0.18173495573285714 +settled_accuracy_p90_ci_high = 0.2175648059635622 +settled_accuracy_p95 = 0.2613648100755055 +settled_accuracy_p95_ci_low = 0.2370129551224105 +settled_accuracy_p95_ci_high = 0.28318910112982665 +settled_accuracy_p99 = 0.5877668347621725 +settled_accuracy_p99_ci_low = 0.4215345149740317 +settled_accuracy_p99_ci_high = 0.7012690347432966 +settled_accuracy_mean = 0.10652618801451477 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.15384615384615385 +jitter_p90_per_min_ci_high = 0.18181818181818182 +jitter_p95_per_min = 0.23529411764705882 +jitter_p95_per_min_ci_low = 0.21428571428571427 +jitter_p95_per_min_ci_high = 0.25 +jitter_p99_per_min = 0.3125 +jitter_p99_per_min_ci_low = 0.2857142857142857 +jitter_p99_per_min_ci_high = 0.3333333333333333 +jitter_mean_per_min = 0.04382575646017828 +reaction_rate = 0.296 +reaction_rate_ci_low = 0.26770639693499604 +reaction_rate_ci_high = 0.32429360306500393 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 156.6891891891892 +fire_decisiveness_mean = 21.09719348297117 +fire_decisiveness_p50 = 4.9999986589490035 +step_correction_mean = 10.15159831004771 +step_correction_p50 = 1.2168076038360596 + +[cell.spm_8.step_plus_25_at_15min] +shares_per_minute = 8 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.846 +convergence_rate_ci_low = 0.8236281647064886 +convergence_rate_ci_high = 0.8683718352935114 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 420 +convergence_p50_secs_ci_low = 360 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 496.2411347517731 +settled_accuracy_p10 = 0.031250073819748314 +settled_accuracy_p10_ci_low = 0.02499896383916811 +settled_accuracy_p10_ci_high = 0.038517158286505704 +settled_accuracy_p50 = 0.12851406161516965 +settled_accuracy_p50_ci_low = 0.11447526345865544 +settled_accuracy_p50_ci_high = 0.14499873620590764 +settled_accuracy_p90 = 0.232571345310422 +settled_accuracy_p90_ci_low = 0.21104158752294855 +settled_accuracy_p90_ci_high = 0.2558320285580957 +settled_accuracy_p95 = 0.3165100900590192 +settled_accuracy_p95_ci_low = 0.291264272981242 +settled_accuracy_p95_ci_high = 0.3590920052836686 +settled_accuracy_p99 = 0.5928917648943557 +settled_accuracy_p99_ci_low = 0.48304873091236056 +settled_accuracy_p99_ci_high = 0.6659861470128611 +settled_accuracy_mean = 0.14590666524950724 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.2 +jitter_p90_per_min_ci_low = 0.1875 +jitter_p90_per_min_ci_high = 0.2222222222222222 +jitter_p95_per_min = 0.25 +jitter_p95_per_min_ci_low = 0.23076923076923078 +jitter_p95_per_min_ci_high = 0.2777777777777778 +jitter_p99_per_min = 0.35 +jitter_p99_per_min_ci_low = 0.3181818181818182 +jitter_p99_per_min_ci_high = 0.42105263157894735 +jitter_mean_per_min = 0.06584037350889158 +reaction_rate = 0.394 +reaction_rate_ci_low = 0.3637140992803582 +reaction_rate_ci_high = 0.42428590071964184 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 162.79187817258884 +fire_decisiveness_mean = 19.95392981869039 +fire_decisiveness_p50 = 4.9999986578227045 +step_correction_mean = 2.463995379844898 +step_correction_p50 = 0.6908756494522095 + +[cell.spm_8.step_plus_50_at_15min] +shares_per_minute = 8 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.68 +convergence_rate_ci_low = 0.6510875085819295 +convergence_rate_ci_high = 0.7089124914180706 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 769.3235294117648 +settled_accuracy_p10 = 0.02281611876157119 +settled_accuracy_p10_ci_low = 0.01932788952198894 +settled_accuracy_p10_ci_high = 0.027662541917314543 +settled_accuracy_p50 = 0.11952902820728695 +settled_accuracy_p50_ci_low = 0.10994659834566811 +settled_accuracy_p50_ci_high = 0.13067545249940693 +settled_accuracy_p90 = 0.33333334824641403 +settled_accuracy_p90_ci_low = 0.29911386772449333 +settled_accuracy_p90_ci_high = 0.33333334824641403 +settled_accuracy_p95 = 0.39545696259378804 +settled_accuracy_p95_ci_low = 0.3580141538856345 +settled_accuracy_p95_ci_high = 0.46030819432328807 +settled_accuracy_p99 = 0.6331036748724104 +settled_accuracy_p99_ci_low = 0.5553153754190613 +settled_accuracy_p99_ci_high = 0.698672076655144 +settled_accuracy_mean = 0.15315145879905018 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.1111111111111111 +jitter_p50_per_min_ci_low = 0.1 +jitter_p50_per_min_ci_high = 0.11764705882352941 +jitter_p90_per_min = 0.25 +jitter_p90_per_min_ci_low = 0.23529411764705882 +jitter_p90_per_min_ci_high = 0.2727272727272727 +jitter_p95_per_min = 0.2777777777777778 +jitter_p95_per_min_ci_low = 0.2727272727272727 +jitter_p95_per_min_ci_high = 0.3125 +jitter_p99_per_min = 0.3684210526315789 +jitter_p99_per_min_ci_low = 0.3333333333333333 +jitter_p99_per_min_ci_high = 0.4 +jitter_mean_per_min = 0.11896771378358095 +reaction_rate = 0.578 +reaction_rate_ci_low = 0.5473890917220674 +reaction_rate_ci_high = 0.6086109082779325 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 164.42906574394465 +fire_decisiveness_mean = 18.871669823196644 +fire_decisiveness_p50 = 4.9999986578227045 +step_correction_mean = 0.5941247326228445 +step_correction_p50 = 0.39865365624427795 + +[cell.spm_10.cold_start_10gh_to_1ph] +shares_per_minute = 10 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.938 +convergence_rate_ci_low = 0.9230530240650491 +convergence_rate_ci_high = 0.9529469759349508 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 778.3368869936035 +settled_accuracy_p10 = 0.015155127845407512 +settled_accuracy_p10_ci_low = 0.011104906523726532 +settled_accuracy_p10_ci_high = 0.015849973032302622 +settled_accuracy_p50 = 0.07428689616869444 +settled_accuracy_p50_ci_low = 0.0655222770896845 +settled_accuracy_p50_ci_high = 0.07524024470308044 +settled_accuracy_p90 = 0.2063747918702442 +settled_accuracy_p90_ci_low = 0.18483009478254753 +settled_accuracy_p90_ci_high = 0.21936726943625406 +settled_accuracy_p95 = 0.263177144384924 +settled_accuracy_p95_ci_low = 0.23727412917691448 +settled_accuracy_p95_ci_high = 0.2902228222351264 +settled_accuracy_p99 = 0.47662641857235144 +settled_accuracy_p99_ci_low = 0.42237682016857603 +settled_accuracy_p99_ci_high = 0.5608821352913373 +settled_accuracy_mean = 0.09620953528386143 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.15384615384615385 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.2222222222222222 +jitter_p95_per_min_ci_low = 0.17647058823529413 +jitter_p95_per_min_ci_high = 0.23076923076923078 +jitter_p99_per_min = 0.2857142857142857 +jitter_p99_per_min_ci_low = 0.2777777777777778 +jitter_p99_per_min_ci_high = 0.3333333333333333 +jitter_mean_per_min = 0.04839307261366087 +bias_mean = 0.0003979711498742672 +bias_p10 = -0.1040150036490092 +bias_p10_ci_low = -0.11000506498859562 +bias_p10_ci_high = -0.096499831544387 +bias_p50 = -0.005125135798761618 +bias_p50_ci_low = -0.011541227170857779 +bias_p50_ci_high = 0.0018438619789777585 +bias_p90 = 0.10993821219702275 +bias_p90_ci_low = 0.1017849018963231 +bias_p90_ci_high = 0.11965671314929226 +bias_p99 = 0.2103785385369778 +bias_p99_ci_low = 0.18645052662604433 +bias_p99_ci_high = 0.2410626506499092 +variance_mean = 0.018848046444414793 +variance_p10 = 0.0019681775111085958 +variance_p10_ci_low = 0.0017862267971171237 +variance_p10_ci_high = 0.0022486395268845566 +variance_p50 = 0.011100592486839686 +variance_p50_ci_low = 0.010273215450705179 +variance_p50_ci_high = 0.012235683753099547 +variance_p90 = 0.04599915545201597 +variance_p90_ci_low = 0.04281589097264362 +variance_p90_ci_high = 0.04934194997559384 +variance_p99 = 0.09781837683963815 +variance_p99_ci_low = 0.07990437533313664 +variance_p99_ci_high = 0.10612371972689708 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.1219326467246411 +ramp_target_overshoot_p50_ci_low = 0.10225679730592807 +ramp_target_overshoot_p50_ci_high = 0.1337419950029397 +ramp_target_overshoot_p90 = 0.4801682902426194 +ramp_target_overshoot_p90_ci_low = 0.43687260341660616 +ramp_target_overshoot_p90_ci_high = 0.5211040267265081 +ramp_target_overshoot_p99 = 0.8895679336663767 +ramp_target_overshoot_p99_ci_low = 0.771471766528796 +ramp_target_overshoot_p99_ci_high = 0.9289494288398066 +ramp_target_overshoot_mean = 0.18186102002387608 + +[cell.spm_10.stable_1ph] +shares_per_minute = 10 +scenario = "stable_1ph" +convergence_rate = 0.974 +convergence_rate_ci_low = 0.9641367004303834 +convergence_rate_ci_high = 0.9838632995696166 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1020 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 290.4517453798768 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0.16000088852137084 +settled_accuracy_p90_ci_low = 0.1503384199392248 +settled_accuracy_p90_ci_high = 0.17399704627042145 +settled_accuracy_p95 = 0.2180021409070072 +settled_accuracy_p95_ci_low = 0.19222294155468833 +settled_accuracy_p95_ci_high = 0.23806688619765937 +settled_accuracy_p99 = 0.447357021375717 +settled_accuracy_p99_ci_low = 0.35871278754722535 +settled_accuracy_p99_ci_high = 0.665127234045723 +settled_accuracy_mean = 0.05030852075888581 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.09523809523809523 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.125 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.13636363636363635 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.2777777777777778 +jitter_p99_per_min_ci_low = 0.2222222222222222 +jitter_p99_per_min_ci_high = 0.3125 +jitter_mean_per_min = 0.024349108977664034 +bias_mean = -0.0005368469686249358 +bias_p10 = -0.08040496060393514 +bias_p10_ci_low = -0.08472045267232249 +bias_p10_ci_high = -0.07533836845966141 +bias_p50 = -0.0052072452609565134 +bias_p50_ci_low = -0.010618732820108518 +bias_p50_ci_high = 0.0001858244468333702 +bias_p90 = 0.08154928683956766 +bias_p90_ci_low = 0.0709607618387658 +bias_p90_ci_high = 0.09271077320047323 +bias_p99 = 0.21174806093085105 +bias_p99_ci_low = 0.18135715804468625 +bias_p99_ci_high = 0.22502598428757548 +variance_mean = 0.009556328098416247 +variance_p10 = 0.0002724401009175699 +variance_p10_ci_low = 0.0002498956563635946 +variance_p10_ci_high = 0.0002873288230447479 +variance_p50 = 0.0010577557402069256 +variance_p50_ci_low = 0.0009652324449965556 +variance_p50_ci_high = 0.0012550825697520342 +variance_p90 = 0.03278092633952281 +variance_p90_ci_low = 0.029899706232401995 +variance_p90_ci_high = 0.03802577609764746 +variance_p99 = 0.08748917397396054 +variance_p99_ci_low = 0.06733951177160402 +variance_p99_ci_high = 0.1050982767125612 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1.9000027802215678 +upward_step_magnitude_p90_ci_low = 1.8000017582522596 +upward_step_magnitude_p90_ci_high = 2 +upward_step_magnitude_p95 = 2.4 +upward_step_magnitude_p95_ci_low = 2.1000020858140163 +upward_step_magnitude_p95_ci_high = 2.60000252300616 +upward_step_magnitude_p99 = 4 +upward_step_magnitude_p99_ci_low = 3.4000114308761384 +upward_step_magnitude_p99_ci_high = 5.800015277128894 +upward_step_magnitude_mean = 1.3155240703673825 +fire_decisiveness_mean = 13.300440485111148 +fire_decisiveness_p50 = 4.999986812127148 + +[cell.spm_10.step_minus_50_at_15min] +shares_per_minute = 10 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.575 +convergence_rate_ci_low = 0.5443603035263075 +convergence_rate_ci_high = 0.6056396964736924 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 831.9652173913043 +settled_accuracy_p10 = 0.020948099278975674 +settled_accuracy_p10_ci_low = 0.01671762354624584 +settled_accuracy_p10_ci_high = 0.025329301522210246 +settled_accuracy_p50 = 0.11483668957069859 +settled_accuracy_p50_ci_low = 0.10899888941539526 +settled_accuracy_p50_ci_high = 0.12395302621050797 +settled_accuracy_p90 = 0.3218259973165849 +settled_accuracy_p90_ci_low = 0.2905480317943012 +settled_accuracy_p90_ci_high = 0.365469979151289 +settled_accuracy_p95 = 0.5537817489523131 +settled_accuracy_p95_ci_low = 0.4215417174540963 +settled_accuracy_p95_ci_high = 0.6620706265773519 +settled_accuracy_p99 = 0.7735827429822415 +settled_accuracy_p99_ci_low = 0.6962976240576153 +settled_accuracy_p99_ci_high = 1 +settled_accuracy_mean = 0.15700602776857456 +jitter_p10_per_min = 0.07142857142857142 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.08695652173913043 +jitter_p50_per_min = 0.15789473684210525 +jitter_p50_per_min_ci_low = 0.14285714285714285 +jitter_p50_per_min_ci_high = 0.16666666666666666 +jitter_p90_per_min = 0.25 +jitter_p90_per_min_ci_low = 0.23529411764705882 +jitter_p90_per_min_ci_high = 0.2727272727272727 +jitter_p95_per_min = 0.29411764705882354 +jitter_p95_per_min_ci_low = 0.2631578947368421 +jitter_p95_per_min_ci_high = 0.3125 +jitter_p99_per_min = 0.36363636363636365 +jitter_p99_per_min_ci_low = 0.3157894736842105 +jitter_p99_per_min_ci_high = 0.4166666666666667 +jitter_mean_per_min = 0.15550072916374655 +reaction_rate = 0.579 +reaction_rate_ci_low = 0.5483989448809359 +reaction_rate_ci_high = 0.609601055119064 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 176.37305699481865 +fire_decisiveness_mean = 14.227529259863745 +fire_decisiveness_p50 = 4.999994831051353 +step_correction_mean = 0.4890199491500031 +step_correction_p50 = 0.35805583000183105 + +[cell.spm_10.step_minus_25_at_15min] +shares_per_minute = 10 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.846 +convergence_rate_ci_low = 0.8236281647064886 +convergence_rate_ci_high = 0.8683718352935114 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 120 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 417.02127659574467 +settled_accuracy_p10 = 0.04305293072906802 +settled_accuracy_p10_ci_low = 0.03480390924340493 +settled_accuracy_p10_ci_high = 0.05231055369196724 +settled_accuracy_p50 = 0.18893203044308582 +settled_accuracy_p50_ci_low = 0.16145945134835582 +settled_accuracy_p50_ci_high = 0.2282870838433979 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.5422438215330152 +settled_accuracy_p99_ci_low = 0.4213353035302574 +settled_accuracy_p99_ci_high = 0.6957590151139004 +settled_accuracy_mean = 0.21208539370220122 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13043478260869565 +jitter_p90_per_min_ci_high = 0.15789473684210525 +jitter_p95_per_min = 0.1875 +jitter_p95_per_min_ci_low = 0.17391304347826086 +jitter_p95_per_min_ci_high = 0.21428571428571427 +jitter_p99_per_min = 0.2857142857142857 +jitter_p99_per_min_ci_low = 0.23809523809523808 +jitter_p99_per_min_ci_high = 0.35294117647058826 +jitter_mean_per_min = 0.03922844958166298 +reaction_rate = 0.275 +reaction_rate_ci_low = 0.24732475835697187 +reaction_rate_ci_high = 0.30267524164302817 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 167.34545454545454 +fire_decisiveness_mean = 13.59928597036953 +fire_decisiveness_p50 = 3.8888850650266846 +step_correction_mean = 0.7804124531962655 +step_correction_p50 = 0.65733402967453 + +[cell.spm_10.step_minus_10_at_15min] +shares_per_minute = 10 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.98 +convergence_rate_ci_low = 0.971322710100498 +convergence_rate_ci_high = 0.988677289899502 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 1020 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 285 +settled_accuracy_p10 = 0.04000105882874894 +settled_accuracy_p10_ci_low = 0.03199892327555387 +settled_accuracy_p10_ci_high = 0.048397570808240475 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.14369484257192489 +settled_accuracy_p90_ci_low = 0.12978049063290742 +settled_accuracy_p90_ci_high = 0.16420062716962036 +settled_accuracy_p95 = 0.2133357989627207 +settled_accuracy_p95_ci_low = 0.18055617589829875 +settled_accuracy_p95_ci_high = 0.2444456789161471 +settled_accuracy_p99 = 0.34579900373162564 +settled_accuracy_p99_ci_low = 0.31111259413416326 +settled_accuracy_p99_ci_high = 0.3977798150703393 +settled_accuracy_mean = 0.10878455109202934 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.10526315789473684 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.125 +jitter_p95_per_min_ci_high = 0.17391304347826086 +jitter_p99_per_min = 0.25 +jitter_p99_per_min_ci_low = 0.21739130434782608 +jitter_p99_per_min_ci_high = 0.2727272727272727 +jitter_mean_per_min = 0.023268659236709194 +reaction_rate = 0.201 +reaction_rate_ci_low = 0.1761613784923559 +reaction_rate_ci_high = 0.2258386215076441 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 166.56716417910448 +fire_decisiveness_mean = 12.374450781775133 +fire_decisiveness_p50 = 4.999990041930403 +step_correction_mean = 1.517494324427932 +step_correction_p50 = 1.1320313215255737 + +[cell.spm_10.step_minus_5_at_15min] +shares_per_minute = 10 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.975 +convergence_rate_ci_low = 0.9653232753475155 +convergence_rate_ci_high = 0.9846767246524845 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 840 +convergence_p90_secs_ci_low = 780 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 1020 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 282.15384615384613 +settled_accuracy_p10 = 0.02884988898427765 +settled_accuracy_p10_ci_low = 0.02467600016756033 +settled_accuracy_p10_ci_high = 0.034304709424620494 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.14526441351832498 +settled_accuracy_p90_ci_low = 0.13006143004186965 +settled_accuracy_p90_ci_high = 0.16665652969606115 +settled_accuracy_p95 = 0.2105266541222539 +settled_accuracy_p95_ci_low = 0.18421051330299032 +settled_accuracy_p95_ci_high = 0.2210535625517842 +settled_accuracy_p99 = 0.28458700816178006 +settled_accuracy_p99_ci_low = 0.2587746783136573 +settled_accuracy_p99_ci_high = 0.3513981920024176 +settled_accuracy_mean = 0.07275376334150768 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.08695652173913043 +jitter_p90_per_min_ci_low = 0.06666666666666667 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.125 +jitter_p95_per_min_ci_high = 0.15789473684210525 +jitter_p99_per_min = 0.2608695652173913 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2777777777777778 +jitter_mean_per_min = 0.021313424050083758 +reaction_rate = 0.205 +reaction_rate_ci_low = 0.17997831420547367 +reaction_rate_ci_high = 0.2300216857945263 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 156.58536585365854 +fire_decisiveness_mean = 13.405075758813673 +fire_decisiveness_p50 = 4.9999986578227045 +step_correction_mean = 8.917094943872312 +step_correction_p50 = 1.2445534467697144 + +[cell.spm_10.step_plus_5_at_15min] +shares_per_minute = 10 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.972 +convergence_rate_ci_low = 0.9617748845678887 +convergence_rate_ci_high = 0.9822251154321112 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 900 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1020 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 287.5925925925926 +settled_accuracy_p10 = 0.03799480487872531 +settled_accuracy_p10_ci_low = 0.031744093045360855 +settled_accuracy_p10_ci_high = 0.041602385956785226 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.13218913350178307 +settled_accuracy_p90_ci_low = 0.12348760575878459 +settled_accuracy_p90_ci_high = 0.1428572706835607 +settled_accuracy_p95 = 0.18095478408903665 +settled_accuracy_p95_ci_low = 0.154284760700637 +settled_accuracy_p95_ci_high = 0.20634807721584858 +settled_accuracy_p99 = 0.3317692492843958 +settled_accuracy_p99_ci_low = 0.24400938297037666 +settled_accuracy_p99_ci_high = 0.39174029148769374 +settled_accuracy_mean = 0.07052910025924462 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.08695652173913043 +jitter_p90_per_min_ci_high = 0.125 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.13636363636363635 +jitter_p95_per_min_ci_high = 0.1875 +jitter_p99_per_min = 0.26666666666666666 +jitter_p99_per_min_ci_low = 0.23076923076923078 +jitter_p99_per_min_ci_high = 0.3125 +jitter_mean_per_min = 0.024476411978371863 +reaction_rate = 0.207 +reaction_rate_ci_low = 0.1818882003512293 +reaction_rate_ci_high = 0.23211179964877068 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 172.7536231884058 +fire_decisiveness_mean = 12.24682695479561 +fire_decisiveness_p50 = 4.9999986578227045 +step_correction_mean = -0.9232657419310676 +step_correction_p50 = 1.3777787685394287 + +[cell.spm_10.step_plus_10_at_15min] +shares_per_minute = 10 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.95 +convergence_rate_ci_low = 0.9364916322229515 +convergence_rate_ci_high = 0.9635083677770484 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 180 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 900 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 1020 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 298.9263157894737 +settled_accuracy_p10 = 0.038765314014277186 +settled_accuracy_p10_ci_low = 0.032920558904593 +settled_accuracy_p10_ci_high = 0.04545484772174868 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.13461385589420516 +settled_accuracy_p90_ci_low = 0.12181704939767657 +settled_accuracy_p90_ci_high = 0.14758886693208828 +settled_accuracy_p95 = 0.17781366271828603 +settled_accuracy_p95_ci_low = 0.16060505841003114 +settled_accuracy_p95_ci_high = 0.20018385388765014 +settled_accuracy_p99 = 0.36805143369854587 +settled_accuracy_p99_ci_low = 0.2966146566859922 +settled_accuracy_p99_ci_high = 0.4773909317742602 +settled_accuracy_mean = 0.09469400157168904 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.1111111111111111 +jitter_p90_per_min_ci_low = 0.08695652173913043 +jitter_p90_per_min_ci_high = 0.13043478260869565 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.19047619047619047 +jitter_p99_per_min = 0.26666666666666666 +jitter_p99_per_min_ci_low = 0.22727272727272727 +jitter_p99_per_min_ci_high = 0.3157894736842105 +jitter_mean_per_min = 0.027305161566594814 +reaction_rate = 0.223 +reaction_rate_ci_low = 0.19720004120933524 +reaction_rate_ci_high = 0.24879995879066477 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 165.73991031390133 +fire_decisiveness_mean = 12.717705152548923 +fire_decisiveness_p50 = 4.999936443988247 +step_correction_mean = -8.980125761887418 +step_correction_p50 = 1.263520359992981 + +[cell.spm_10.step_plus_25_at_15min] +shares_per_minute = 10 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.862 +convergence_rate_ci_low = 0.840622877424686 +convergence_rate_ci_high = 0.883377122575314 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 300 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 425.01160092807424 +settled_accuracy_p10 = 0.037255296929334714 +settled_accuracy_p10_ci_low = 0.026778798238118462 +settled_accuracy_p10_ci_high = 0.041188305749264575 +settled_accuracy_p50 = 0.14625700052806623 +settled_accuracy_p50_ci_low = 0.129599077698748 +settled_accuracy_p50_ci_high = 0.1654947490805012 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.2298035610861371 +settled_accuracy_p95_ci_low = 0.2103987919975312 +settled_accuracy_p95_ci_high = 0.2627737155739591 +settled_accuracy_p99 = 0.40569304342018553 +settled_accuracy_p99_ci_low = 0.357119541606743 +settled_accuracy_p99_ci_high = 0.5379432432972204 +settled_accuracy_mean = 0.13912207958338071 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.15384615384615385 +jitter_p90_per_min_ci_low = 0.13333333333333333 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.1875 +jitter_p95_per_min_ci_low = 0.17391304347826086 +jitter_p95_per_min_ci_high = 0.21739130434782608 +jitter_p99_per_min = 0.2692307692307692 +jitter_p99_per_min_ci_low = 0.23809523809523808 +jitter_p99_per_min_ci_high = 0.2777777777777778 +jitter_mean_per_min = 0.03936683389432069 +reaction_rate = 0.304 +reaction_rate_ci_low = 0.27548998256051044 +reaction_rate_ci_high = 0.33251001743948955 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 162.23684210526315 +fire_decisiveness_mean = 12.044614399632156 +fire_decisiveness_p50 = 4.166781702445878 +step_correction_mean = 0.8342680604638237 +step_correction_p50 = 0.6823604106903076 + +[cell.spm_10.step_plus_50_at_15min] +shares_per_minute = 10 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.629 +convergence_rate_ci_low = 0.5990588588327032 +convergence_rate_ci_high = 0.6589411411672969 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 833.0365659777425 +settled_accuracy_p10 = 0.02139833217473608 +settled_accuracy_p10_ci_low = 0.01670867532382936 +settled_accuracy_p10_ci_high = 0.02524707022835182 +settled_accuracy_p50 = 0.10555409954177175 +settled_accuracy_p50_ci_low = 0.09754523830849515 +settled_accuracy_p50_ci_high = 0.11650742926434998 +settled_accuracy_p90 = 0.287976078106127 +settled_accuracy_p90_ci_low = 0.26222287283022494 +settled_accuracy_p90_ci_high = 0.3273073749688056 +settled_accuracy_p95 = 0.36828091519667683 +settled_accuracy_p95_ci_low = 0.33333334824641403 +settled_accuracy_p95_ci_high = 0.38967016530523657 +settled_accuracy_p99 = 0.583553174513199 +settled_accuracy_p99_ci_low = 0.499911371561107 +settled_accuracy_p99_ci_high = 0.7328446257119468 +settled_accuracy_mean = 0.14274790756800979 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.10526315789473684 +jitter_p50_per_min_ci_low = 0.1 +jitter_p50_per_min_ci_high = 0.1111111111111111 +jitter_p90_per_min = 0.2222222222222222 +jitter_p90_per_min_ci_low = 0.21052631578947367 +jitter_p90_per_min_ci_high = 0.2608695652173913 +jitter_p95_per_min = 0.2727272727272727 +jitter_p95_per_min_ci_low = 0.25 +jitter_p95_per_min_ci_high = 0.30434782608695654 +jitter_p99_per_min = 0.35294117647058826 +jitter_p99_per_min_ci_low = 0.30434782608695654 +jitter_p99_per_min_ci_high = 0.4 +jitter_mean_per_min = 0.11079975602491256 +reaction_rate = 0.542 +reaction_rate_ci_low = 0.5111192063314429 +reaction_rate_ci_high = 0.5728807936685572 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 169.04059040590406 +fire_decisiveness_mean = 12.947368949005883 +fire_decisiveness_p50 = 4.999989947891045 +step_correction_mean = 0.5044028459604816 +step_correction_p50 = 0.3603914976119995 + +[cell.spm_12.cold_start_10gh_to_1ph] +shares_per_minute = 12 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.95 +convergence_rate_ci_low = 0.9364916322229515 +convergence_rate_ci_high = 0.9635083677770484 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 757.0105263157894 +settled_accuracy_p10 = 0.014227146461943452 +settled_accuracy_p10_ci_low = 0.011373945963002452 +settled_accuracy_p10_ci_high = 0.015849973032302622 +settled_accuracy_p50 = 0.06616524712403282 +settled_accuracy_p50_ci_low = 0.06439827071192639 +settled_accuracy_p50_ci_high = 0.06662185584062874 +settled_accuracy_p90 = 0.16019201456852927 +settled_accuracy_p90_ci_low = 0.14843346770093957 +settled_accuracy_p90_ci_high = 0.17069683362256138 +settled_accuracy_p95 = 0.21146882447616 +settled_accuracy_p95_ci_low = 0.19601942425828423 +settled_accuracy_p95_ci_high = 0.2307806754118018 +settled_accuracy_p99 = 0.3500964119507197 +settled_accuracy_p99_ci_low = 0.3118082544038012 +settled_accuracy_p99_ci_high = 0.46928229283610845 +settled_accuracy_mean = 0.08193447309239874 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.15384615384615385 +jitter_p90_per_min_ci_low = 0.1111111111111111 +jitter_p90_per_min_ci_high = 0.15384615384615385 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.2222222222222222 +jitter_p99_per_min_ci_low = 0.2222222222222222 +jitter_p99_per_min_ci_high = 0.2727272727272727 +jitter_mean_per_min = 0.03757510562323394 +bias_mean = -0.0001111058843705295 +bias_p10 = -0.09146197259041551 +bias_p10_ci_low = -0.09836452552783957 +bias_p10_ci_high = -0.07887829750489346 +bias_p50 = -0.004207711699355796 +bias_p50_ci_low = -0.009874313608322551 +bias_p50_ci_high = 0.0018353532813209735 +bias_p90 = 0.09428164338123862 +bias_p90_ci_low = 0.086805973673708 +bias_p90_ci_high = 0.10249603334510927 +bias_p99 = 0.17616836772156985 +bias_p99_ci_low = 0.15593841806582792 +bias_p99_ci_high = 0.1932984176270066 +variance_mean = 0.013807287038308632 +variance_p10 = 0.0015898264117435125 +variance_p10_ci_low = 0.0014437866895627956 +variance_p10_ci_high = 0.0017727439584511921 +variance_p50 = 0.007550332337783963 +variance_p50_ci_low = 0.006564697473463391 +variance_p50_ci_high = 0.008211776660153802 +variance_p90 = 0.033503554825029806 +variance_p90_ci_low = 0.03134642262254655 +variance_p90_ci_high = 0.03752787275621268 +variance_p99 = 0.07502751317037137 +variance_p99_ci_low = 0.06436231281688935 +variance_p99_ci_high = 0.08157295683922025 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.09282115668705271 +ramp_target_overshoot_p50_ci_low = 0.08256604971921311 +ramp_target_overshoot_p50_ci_high = 0.09897040908423183 +ramp_target_overshoot_p90 = 0.3433674060699028 +ramp_target_overshoot_p90_ci_low = 0.3116341740083206 +ramp_target_overshoot_p90_ci_high = 0.36830251011984916 +ramp_target_overshoot_p99 = 0.7911671446271871 +ramp_target_overshoot_p99_ci_low = 0.7222641913606598 +ramp_target_overshoot_p99_ci_high = 0.8658002554297615 +ramp_target_overshoot_mean = 0.13834696001204214 + +[cell.spm_12.stable_1ph] +shares_per_minute = 12 +scenario = "stable_1ph" +convergence_rate = 0.987 +convergence_rate_ci_low = 0.9799792044895183 +convergence_rate_ci_high = 0.9940207955104817 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 780 +convergence_p90_secs_ci_high = 900 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 1020 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 257.2644376899696 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0.1340717008560608 +settled_accuracy_p90_ci_low = 0.11770660017699297 +settled_accuracy_p90_ci_high = 0.150001667655292 +settled_accuracy_p95 = 0.1666678858110453 +settled_accuracy_p95_ci_low = 0.1547614981141402 +settled_accuracy_p95_ci_high = 0.18333396974906857 +settled_accuracy_p99 = 0.2367503444865806 +settled_accuracy_p99_ci_low = 0.20665195148216975 +settled_accuracy_p99_ci_high = 0.32450028558177446 +settled_accuracy_mean = 0.03539346356971782 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05555555555555555 +jitter_p90_per_min_ci_low = 0.045454545454545456 +jitter_p90_per_min_ci_high = 0.0625 +jitter_p95_per_min = 0.10526315789473684 +jitter_p95_per_min_ci_low = 0.08695652173913043 +jitter_p95_per_min_ci_high = 0.13043478260869565 +jitter_p99_per_min = 0.17391304347826086 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.2222222222222222 +jitter_mean_per_min = 0.01435141921095629 +bias_mean = 0.00007562974102275716 +bias_p10 = -0.07398143780806568 +bias_p10_ci_low = -0.08170956753320303 +bias_p10_ci_high = -0.06500981966933209 +bias_p50 = -0.0016750425652986625 +bias_p50_ci_low = -0.006470993487653323 +bias_p50_ci_high = 0.0038543764617083405 +bias_p90 = 0.07286020408604049 +bias_p90_ci_low = 0.06588599654115967 +bias_p90_ci_high = 0.08057222061951731 +bias_p99 = 0.1529147116014722 +bias_p99_ci_low = 0.1344191799622367 +bias_p99_ci_high = 0.17399629394472582 +variance_mean = 0.005596906843523883 +variance_p10 = 0.0002073822252399638 +variance_p10_ci_low = 0.0001897693283111443 +variance_p10_ci_high = 0.00022142245400465089 +variance_p50 = 0.0007981440510399209 +variance_p50_ci_low = 0.0007093861649124156 +variance_p50_ci_high = 0.0008855373597650304 +variance_p90 = 0.01730406683184843 +variance_p90_ci_low = 0.014498245246765617 +variance_p90_ci_high = 0.020117184877042896 +variance_p99 = 0.05995508126144818 +variance_p99_ci_low = 0.04946862380974124 +variance_p99_ci_high = 0.06637484569798635 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1.5625000492374153 +upward_step_magnitude_p90_ci_low = 1.500001471436475 +upward_step_magnitude_p90_ci_high = 1.6666666447536704 +upward_step_magnitude_p95 = 1.833335134087874 +upward_step_magnitude_p95_ci_low = 1.750001705110541 +upward_step_magnitude_p95_ci_high = 1.9166708927073917 +upward_step_magnitude_p99 = 2.6666666666666665 +upward_step_magnitude_p99_ci_low = 2.2500022329343063 +upward_step_magnitude_p99_ci_high = 3.416677394486855 +upward_step_magnitude_mean = 1.1786337919163539 +fire_decisiveness_mean = 8.819178626401168 +fire_decisiveness_p50 = 4.444628936808851 + +[cell.spm_12.step_minus_50_at_15min] +shares_per_minute = 12 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.526 +convergence_rate_ci_low = 0.49505160620646044 +convergence_rate_ci_high = 0.5569483937935397 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 1140 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 912.5475285171103 +settled_accuracy_p10 = 0.02007997900297842 +settled_accuracy_p10_ci_low = 0.016682995371971376 +settled_accuracy_p10_ci_high = 0.023056122942366697 +settled_accuracy_p50 = 0.10507114177210752 +settled_accuracy_p50_ci_low = 0.09596762292548877 +settled_accuracy_p50_ci_high = 0.11111348974754387 +settled_accuracy_p90 = 0.3055573320763396 +settled_accuracy_p90_ci_low = 0.28557184235510236 +settled_accuracy_p90_ci_high = 0.32942030490107443 +settled_accuracy_p95 = 0.4228723520267985 +settled_accuracy_p95_ci_low = 0.3696007982196823 +settled_accuracy_p95_ci_high = 0.614042422600494 +settled_accuracy_p99 = 0.6913605590866376 +settled_accuracy_p99_ci_low = 0.6851868119537801 +settled_accuracy_p99_ci_high = 0.6964304996100639 +settled_accuracy_mean = 0.14493455999837868 +jitter_p10_per_min = 0.08695652173913043 +jitter_p10_per_min_ci_low = 0.07692307692307693 +jitter_p10_per_min_ci_high = 0.08695652173913043 +jitter_p50_per_min = 0.14285714285714285 +jitter_p50_per_min_ci_low = 0.13636363636363635 +jitter_p50_per_min_ci_high = 0.15789473684210525 +jitter_p90_per_min = 0.2222222222222222 +jitter_p90_per_min_ci_low = 0.21739130434782608 +jitter_p90_per_min_ci_high = 0.24 +jitter_p95_per_min = 0.25 +jitter_p95_per_min_ci_low = 0.23529411764705882 +jitter_p95_per_min_ci_high = 0.2727272727272727 +jitter_p99_per_min = 0.2777777777777778 +jitter_p99_per_min_ci_low = 0.2727272727272727 +jitter_p99_per_min_ci_high = 0.3157894736842105 +jitter_mean_per_min = 0.14808556591027044 +reaction_rate = 0.52 +reaction_rate_ci_low = 0.48903448111204983 +reaction_rate_ci_high = 0.5509655188879502 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 183 +fire_decisiveness_mean = 12.320900634675063 +fire_decisiveness_p50 = 4.166816978683883 +step_correction_mean = 0.4649608728117668 +step_correction_p50 = 0.34272223711013794 + +[cell.spm_12.step_minus_25_at_15min] +shares_per_minute = 12 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.848 +convergence_rate_ci_low = 0.8257476546494532 +convergence_rate_ci_high = 0.8702523453505467 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 347.9009433962264 +settled_accuracy_p10 = 0.05864053012065007 +settled_accuracy_p10_ci_low = 0.05308382675497958 +settled_accuracy_p10_ci_high = 0.06666666070143434 +settled_accuracy_p50 = 0.2480453648758114 +settled_accuracy_p50_ci_low = 0.1923893001270327 +settled_accuracy_p50_ci_high = 0.31481680488259034 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.38413847117598254 +settled_accuracy_p99_ci_low = 0.3389598895692336 +settled_accuracy_p99_ci_high = 0.43648266877812025 +settled_accuracy_mean = 0.21939555556788495 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.1111111111111111 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.13043478260869565 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.13043478260869565 +jitter_p95_per_min_ci_high = 0.17391304347826086 +jitter_p99_per_min = 0.21739130434782608 +jitter_p99_per_min_ci_low = 0.1875 +jitter_p99_per_min_ci_high = 0.2608695652173913 +jitter_mean_per_min = 0.030367119933380787 +reaction_rate = 0.226 +reaction_rate_ci_low = 0.2000772679217641 +reaction_rate_ci_high = 0.2519227320782359 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 169.91150442477877 +fire_decisiveness_mean = 7.831881341784982 +fire_decisiveness_p50 = 3.333216147399689 +step_correction_mean = 0.7898179936198007 +step_correction_p50 = 0.6939160823822021 + +[cell.spm_12.step_minus_10_at_15min] +shares_per_minute = 12 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.983 +convergence_rate_ci_low = 0.9749876983581495 +convergence_rate_ci_high = 0.9910123016418505 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 780 +convergence_p90_secs_ci_low = 660 +convergence_p90_secs_ci_high = 840 +convergence_p95_secs = 960 +convergence_p95_secs_ci_low = 900 +convergence_p95_secs_ci_high = 1080 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 238.96236012207527 +settled_accuracy_p10 = 0.04629818183445056 +settled_accuracy_p10_ci_low = 0.03974015447714918 +settled_accuracy_p10_ci_high = 0.053242905381347905 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.13150906584833622 +settled_accuracy_p90_ci_low = 0.11856741961569739 +settled_accuracy_p90_ci_high = 0.1536303099422901 +settled_accuracy_p95 = 0.20447705603851163 +settled_accuracy_p95_ci_low = 0.1766994294628048 +settled_accuracy_p95_ci_high = 0.21897570248999987 +settled_accuracy_p99 = 0.3030219494454012 +settled_accuracy_p99_ci_low = 0.2906387235297473 +settled_accuracy_p99_ci_high = 0.37037389703785206 +settled_accuracy_mean = 0.1094583732289323 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.07692307692307693 +jitter_p90_per_min_ci_low = 0.05555555555555555 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.13043478260869565 +jitter_p95_per_min_ci_low = 0.1111111111111111 +jitter_p95_per_min_ci_high = 0.14285714285714285 +jitter_p99_per_min = 0.21052631578947367 +jitter_p99_per_min_ci_low = 0.17391304347826086 +jitter_p99_per_min_ci_high = 0.2222222222222222 +jitter_mean_per_min = 0.018108774335658735 +reaction_rate = 0.144 +reaction_rate_ci_low = 0.12223923295469573 +reaction_rate_ci_high = 0.16576076704530424 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 160.83333333333334 +fire_decisiveness_mean = 10.039217763480469 +fire_decisiveness_p50 = 4.166819838392598 +step_correction_mean = 0.5184962364534537 +step_correction_p50 = 1.0596944093704224 + +[cell.spm_12.step_minus_5_at_15min] +shares_per_minute = 12 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.978 +convergence_rate_ci_low = 0.9689084728675541 +convergence_rate_ci_high = 0.9870915271324459 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 780 +convergence_p90_secs_ci_low = 720 +convergence_p90_secs_ci_high = 840 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 960 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 247.9754601226994 +settled_accuracy_p10 = 0.026318471969298374 +settled_accuracy_p10_ci_low = 0.023392878675720263 +settled_accuracy_p10_ci_high = 0.03299509759147701 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.12280703241563018 +settled_accuracy_p90_ci_low = 0.10818570619329348 +settled_accuracy_p90_ci_high = 0.13450212957619767 +settled_accuracy_p95 = 0.183605827112165 +settled_accuracy_p95_ci_low = 0.15497330020839772 +settled_accuracy_p95_ci_high = 0.2082890326525597 +settled_accuracy_p99 = 0.33507597394565436 +settled_accuracy_p99_ci_low = 0.24634710555581574 +settled_accuracy_p99_ci_high = 0.3749372973621341 +settled_accuracy_mean = 0.06705796171446385 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05555555555555555 +jitter_p90_per_min_ci_low = 0.05 +jitter_p90_per_min_ci_high = 0.07142857142857142 +jitter_p95_per_min = 0.1111111111111111 +jitter_p95_per_min_ci_low = 0.08695652173913043 +jitter_p95_per_min_ci_high = 0.13043478260869565 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.23809523809523808 +jitter_mean_per_min = 0.016160694663098038 +reaction_rate = 0.154 +reaction_rate_ci_low = 0.13162816470648864 +reaction_rate_ci_high = 0.17637183529351136 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 170.64935064935065 +fire_decisiveness_mean = 9.35125940171132 +fire_decisiveness_p50 = 4.9999986578227045 +step_correction_mean = 2.227507058289144 +step_correction_p50 = 1.2369732856750488 + +[cell.spm_12.step_plus_5_at_15min] +shares_per_minute = 12 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.987 +convergence_rate_ci_low = 0.9799792044895183 +convergence_rate_ci_high = 0.9940207955104817 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 780 +convergence_p90_secs_ci_low = 720 +convergence_p90_secs_ci_high = 900 +convergence_p95_secs = 1020 +convergence_p95_secs_ci_low = 900 +convergence_p95_secs_ci_high = 1080 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 238.72340425531914 +settled_accuracy_p10 = 0.04465430559640682 +settled_accuracy_p10_ci_low = 0.03895848824297343 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.11111234676648385 +settled_accuracy_p90_ci_low = 0.10389756808961748 +settled_accuracy_p90_ci_high = 0.12177549871796489 +settled_accuracy_p95 = 0.15704472480186582 +settled_accuracy_p95_ci_low = 0.13512696806346436 +settled_accuracy_p95_ci_high = 0.17187923624737933 +settled_accuracy_p99 = 0.27728745694326906 +settled_accuracy_p99_ci_low = 0.22266786772368885 +settled_accuracy_p99_ci_high = 0.3813725463878874 +settled_accuracy_mean = 0.06477562533003171 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.0625 +jitter_p90_per_min_ci_low = 0.047619047619047616 +jitter_p90_per_min_ci_high = 0.08695652173913043 +jitter_p95_per_min = 0.13043478260869565 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.13636363636363635 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.17391304347826086 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.015504133619533275 +reaction_rate = 0.145 +reaction_rate_ci_low = 0.12317656397356272 +reaction_rate_ci_high = 0.16682343602643726 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 161.79310344827587 +fire_decisiveness_mean = 10.089998497062636 +fire_decisiveness_p50 = 4.047613714992785 +step_correction_mean = 1.4249522003634223 +step_correction_p50 = 1.2837923765182495 + +[cell.spm_12.step_plus_10_at_15min] +shares_per_minute = 12 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.979 +convergence_rate_ci_low = 0.9701129614381392 +convergence_rate_ci_high = 0.9878870385618608 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 840 +convergence_p90_secs_ci_low = 720 +convergence_p90_secs_ci_high = 900 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 1020 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 254.46373850868233 +settled_accuracy_p10 = 0.04040197722239702 +settled_accuracy_p10_ci_low = 0.031209221831831613 +settled_accuracy_p10_ci_high = 0.04432229410801858 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.11212494304135057 +settled_accuracy_p90_ci_low = 0.10457336545529672 +settled_accuracy_p90_ci_high = 0.12121319162625332 +settled_accuracy_p95 = 0.14496289703358678 +settled_accuracy_p95_ci_low = 0.12878661009755377 +settled_accuracy_p95_ci_high = 0.16666639213039958 +settled_accuracy_p99 = 0.23178090395275497 +settled_accuracy_p99_ci_low = 0.2085939368848443 +settled_accuracy_p99_ci_high = 0.31916866513817077 +settled_accuracy_mean = 0.08766439347587078 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.08695652173913043 +jitter_p90_per_min_ci_low = 0.07142857142857142 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.13043478260869565 +jitter_p95_per_min_ci_low = 0.1111111111111111 +jitter_p95_per_min_ci_high = 0.14285714285714285 +jitter_p99_per_min = 0.19047619047619047 +jitter_p99_per_min_ci_low = 0.17391304347826086 +jitter_p99_per_min_ci_high = 0.21428571428571427 +jitter_mean_per_min = 0.01928773625809214 +reaction_rate = 0.168 +reaction_rate_ci_low = 0.14482752750352265 +reaction_rate_ci_high = 0.19117247249647737 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 179.64285714285714 +fire_decisiveness_mean = 9.387516332200496 +fire_decisiveness_p50 = 4.166824396039701 +step_correction_mean = 1.2730624980869747 +step_correction_p50 = 1.1419358253479004 + +[cell.spm_12.step_plus_25_at_15min] +shares_per_minute = 12 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.859 +convergence_rate_ci_low = 0.8374294007871825 +convergence_rate_ci_high = 0.8805705992128174 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 381.58323632130384 +settled_accuracy_p10 = 0.043988624349929895 +settled_accuracy_p10_ci_low = 0.038121054938428434 +settled_accuracy_p10_ci_high = 0.05238496306220841 +settled_accuracy_p50 = 0.14674582148011872 +settled_accuracy_p50_ci_low = 0.12021945993794203 +settled_accuracy_p50_ci_high = 0.18066951236875384 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.2149077022290664 +settled_accuracy_p99 = 0.43148083166885465 +settled_accuracy_p99_ci_low = 0.2944799149081103 +settled_accuracy_p99_ci_high = 0.5432098394262095 +settled_accuracy_mean = 0.13976323563929527 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.13043478260869565 +jitter_p90_per_min_ci_low = 0.1111111111111111 +jitter_p90_per_min_ci_high = 0.15 +jitter_p95_per_min = 0.17391304347826086 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.2222222222222222 +jitter_p99_per_min_ci_low = 0.21739130434782608 +jitter_p99_per_min_ci_high = 0.22727272727272727 +jitter_mean_per_min = 0.0333053455024695 +reaction_rate = 0.251 +reaction_rate_ci_low = 0.22412590544036878 +reaction_rate_ci_high = 0.2778740945596312 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 168.04780876494024 +fire_decisiveness_mean = 9.591182786734487 +fire_decisiveness_p50 = 3.333395724428936 +step_correction_mean = 0.9721747640357075 +step_correction_p50 = 0.6333402991294861 + +[cell.spm_12.step_plus_50_at_15min] +shares_per_minute = 12 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.601 +convergence_rate_ci_low = 0.5706485282333789 +convergence_rate_ci_high = 0.6313514717666211 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 840 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 901.4975041597338 +settled_accuracy_p10 = 0.01842487265645787 +settled_accuracy_p10_ci_low = 0.016108722085285354 +settled_accuracy_p10_ci_high = 0.022635282744405405 +settled_accuracy_p50 = 0.09892562288881113 +settled_accuracy_p50_ci_low = 0.09172502080598466 +settled_accuracy_p50_ci_high = 0.10493580321390605 +settled_accuracy_p90 = 0.23843430189915393 +settled_accuracy_p90_ci_low = 0.2329053368636771 +settled_accuracy_p90_ci_high = 0.27105735203994397 +settled_accuracy_p95 = 0.33333334824641403 +settled_accuracy_p95_ci_low = 0.3131304486245412 +settled_accuracy_p95_ci_high = 0.33333334824641403 +settled_accuracy_p99 = 0.4992637262903268 +settled_accuracy_p99_ci_low = 0.40963107036579083 +settled_accuracy_p99_ci_high = 0.6480859523163787 +settled_accuracy_mean = 0.12994714845939062 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.1111111111111111 +jitter_p90_per_min = 0.2 +jitter_p90_per_min_ci_low = 0.18181818181818182 +jitter_p90_per_min_ci_high = 0.2222222222222222 +jitter_p95_per_min = 0.2222222222222222 +jitter_p95_per_min_ci_low = 0.2222222222222222 +jitter_p95_per_min_ci_high = 0.23809523809523808 +jitter_p99_per_min = 0.3 +jitter_p99_per_min_ci_low = 0.2608695652173913 +jitter_p99_per_min_ci_high = 0.3333333333333333 +jitter_mean_per_min = 0.10093885562024157 +reaction_rate = 0.515 +reaction_rate_ci_low = 0.484023627714014 +reaction_rate_ci_high = 0.545976372285986 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 176.50485436893203 +fire_decisiveness_mean = 9.712704531992593 +fire_decisiveness_p50 = 4.166781928099617 +step_correction_mean = 0.528416565205287 +step_correction_p50 = 0.35000506043434143 + +[cell.spm_15.cold_start_10gh_to_1ph] +shares_per_minute = 15 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.967 +convergence_rate_ci_low = 0.9559279948699434 +convergence_rate_ci_high = 0.9780720051300565 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 734.8293691830403 +settled_accuracy_p10 = 0.010395028951099894 +settled_accuracy_p10_ci_low = 0.010395028951099894 +settled_accuracy_p10_ci_high = 0.010592127687231834 +settled_accuracy_p50 = 0.055212207961513826 +settled_accuracy_p50_ci_low = 0.05013139580197812 +settled_accuracy_p50_ci_high = 0.061801224750205774 +settled_accuracy_p90 = 0.1416225890049776 +settled_accuracy_p90_ci_low = 0.13394714680285646 +settled_accuracy_p90_ci_high = 0.15178716611410348 +settled_accuracy_p95 = 0.17206021732132148 +settled_accuracy_p95_ci_low = 0.16038810667168812 +settled_accuracy_p95_ci_high = 0.19235407227665013 +settled_accuracy_p99 = 0.26431933726506274 +settled_accuracy_p99_ci_low = 0.22817195250759315 +settled_accuracy_p99_ci_high = 0.3314961163093264 +settled_accuracy_mean = 0.07147954441268027 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.1111111111111111 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.1111111111111111 +jitter_p95_per_min = 0.1111111111111111 +jitter_p95_per_min_ci_low = 0.1111111111111111 +jitter_p95_per_min_ci_high = 0.15384615384615385 +jitter_p99_per_min = 0.2222222222222222 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.23076923076923078 +jitter_mean_per_min = 0.026338531312530063 +bias_mean = 0.0003412475094354976 +bias_p10 = -0.08465875136914004 +bias_p10_ci_low = -0.09178986650418502 +bias_p10_ci_high = -0.07867590070048198 +bias_p50 = -0.0003726696548219191 +bias_p50_ci_low = -0.004852504269192252 +bias_p50_ci_high = 0.004464558517497924 +bias_p90 = 0.0885548836729815 +bias_p90_ci_low = 0.08089901253508472 +bias_p90_ci_high = 0.09606477183750631 +bias_p99 = 0.17149778498891177 +bias_p99_ci_low = 0.15353918784547976 +bias_p99_ci_high = 0.19034729823012486 +variance_mean = 0.009741137915844664 +variance_p10 = 0.0011679885934380546 +variance_p10_ci_low = 0.001069405791473205 +variance_p10_ci_high = 0.0013129402485741162 +variance_p50 = 0.004857243941113175 +variance_p50_ci_low = 0.004361895319999976 +variance_p50_ci_high = 0.005381765277275543 +variance_p90 = 0.02671413480621607 +variance_p90_ci_low = 0.024335860477259698 +variance_p90_ci_high = 0.02896202590348851 +variance_p99 = 0.050837860480897314 +variance_p99_ci_low = 0.04524638997893895 +variance_p99_ci_high = 0.0600350637896336 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.06288308676082344 +ramp_target_overshoot_p50_ci_low = 0.055012626197381564 +ramp_target_overshoot_p50_ci_high = 0.07601474811257991 +ramp_target_overshoot_p90 = 0.27284780024858457 +ramp_target_overshoot_p90_ci_low = 0.24221662996594695 +ramp_target_overshoot_p90_ci_high = 0.3122000359569297 +ramp_target_overshoot_p99 = 0.6165332352291208 +ramp_target_overshoot_p99_ci_low = 0.5676540908456731 +ramp_target_overshoot_p99_ci_high = 0.6901296482871369 +ramp_target_overshoot_mean = 0.10888952310494457 + +[cell.spm_15.stable_1ph] +shares_per_minute = 15 +scenario = "stable_1ph" +convergence_rate = 0.992 +convergence_rate_ci_low = 0.9864785022321837 +convergence_rate_ci_high = 0.9975214977678163 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 660 +convergence_p95_secs = 840 +convergence_p95_secs_ci_low = 780 +convergence_p95_secs_ci_high = 900 +convergence_p99_secs = 1200 +convergence_p99_secs_ci_low = 1140 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 160.8266129032258 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0.07520212686783267 +settled_accuracy_p90_ci_low = 0.06443484504328212 +settled_accuracy_p90_ci_high = 0.09077151773610126 +settled_accuracy_p95 = 0.1500003254779947 +settled_accuracy_p95_ci_low = 0.12233986331669056 +settled_accuracy_p95_ci_high = 0.1599991436908842 +settled_accuracy_p99 = 0.20313027958022878 +settled_accuracy_p99_ci_low = 0.18666619332547307 +settled_accuracy_p99_ci_high = 0.21540395409458357 +settled_accuracy_mean = 0.020247802570551386 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.043478260869565216 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.045454545454545456 +jitter_p95_per_min = 0.06666666666666667 +jitter_p95_per_min_ci_low = 0.05263157894736842 +jitter_p95_per_min_ci_high = 0.08695652173913043 +jitter_p99_per_min = 0.13636363636363635 +jitter_p99_per_min_ci_low = 0.125 +jitter_p99_per_min_ci_high = 0.17391304347826086 +jitter_mean_per_min = 0.008609139107339405 +bias_mean = -0.0029147196245136067 +bias_p10 = -0.06501161748050159 +bias_p10_ci_low = -0.07176459535426027 +bias_p10_ci_high = -0.061238213162330815 +bias_p50 = -0.004861380299583084 +bias_p50_ci_low = -0.009358408911542987 +bias_p50_ci_high = -0.0006354149889818379 +bias_p90 = 0.06592422740186415 +bias_p90_ci_low = 0.061830477151199305 +bias_p90_ci_high = 0.07111704425687296 +bias_p99 = 0.11764696512043943 +bias_p99_ci_low = 0.1031821049309337 +bias_p99_ci_high = 0.13732488078578156 +variance_mean = 0.0030855549286850025 +variance_p10 = 0.00015483425487820376 +variance_p10_ci_low = 0.0001408190242642552 +variance_p10_ci_high = 0.00016336354450837307 +variance_p50 = 0.00048185895208729626 +variance_p50_ci_low = 0.000433789923513582 +variance_p50_ci_high = 0.0005229030578329752 +variance_p90 = 0.007263355465797775 +variance_p90_ci_low = 0.006055751488429583 +variance_p90_ci_high = 0.009213273580077069 +variance_p99 = 0.04268835456206292 +variance_p99_ci_low = 0.030807528897092228 +variance_p99_ci_high = 0.05667301953059376 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1.2799999946312908 +upward_step_magnitude_p90_ci_low = 1.240002467047184 +upward_step_magnitude_p90_ci_high = 1.3166686987231222 +upward_step_magnitude_p95 = 1.5000037535424056 +upward_step_magnitude_p95_ci_low = 1.3666710035769862 +upward_step_magnitude_p95_ci_high = 1.6 +upward_step_magnitude_p99 = 2.0666707614402 +upward_step_magnitude_p99_ci_low = 1.8000018119375387 +upward_step_magnitude_p99_ci_high = 2.8000028588377397 +upward_step_magnitude_mean = 1.0947913778158975 +fire_decisiveness_mean = 6.6551539969628575 +fire_decisiveness_p50 = 3.666619332547306 + +[cell.spm_15.step_minus_50_at_15min] +shares_per_minute = 15 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.469 +convergence_rate_ci_low = 0.43806929967815145 +convergence_rate_ci_high = 0.4999307003218485 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 1140 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1260 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 972.0255863539446 +settled_accuracy_p10 = 0.018462722468403747 +settled_accuracy_p10_ci_low = 0.01586252239003394 +settled_accuracy_p10_ci_high = 0.021261833222256943 +settled_accuracy_p50 = 0.09416897112916245 +settled_accuracy_p50_ci_low = 0.08814944016778292 +settled_accuracy_p50_ci_high = 0.10029265504882479 +settled_accuracy_p90 = 0.28738143289640317 +settled_accuracy_p90_ci_low = 0.2560280370100021 +settled_accuracy_p90_ci_high = 0.3227906201402697 +settled_accuracy_p95 = 0.48123263683950523 +settled_accuracy_p95_ci_low = 0.37354250450686366 +settled_accuracy_p95_ci_high = 0.6689684783621894 +settled_accuracy_p99 = 0.6888896106820133 +settled_accuracy_p99_ci_low = 0.68571522715579 +settled_accuracy_p99_ci_high = 0.6938278836125589 +settled_accuracy_mean = 0.13602565716188156 +jitter_p10_per_min = 0.08695652173913043 +jitter_p10_per_min_ci_low = 0.045454545454545456 +jitter_p10_per_min_ci_high = 0.09090909090909091 +jitter_p50_per_min = 0.13636363636363635 +jitter_p50_per_min_ci_low = 0.13043478260869565 +jitter_p50_per_min_ci_high = 0.15789473684210525 +jitter_p90_per_min = 0.2222222222222222 +jitter_p90_per_min_ci_low = 0.21052631578947367 +jitter_p90_per_min_ci_high = 0.22727272727272727 +jitter_p95_per_min = 0.23809523809523808 +jitter_p95_per_min_ci_low = 0.2222222222222222 +jitter_p95_per_min_ci_high = 0.2631578947368421 +jitter_p99_per_min = 0.2777777777777778 +jitter_p99_per_min_ci_low = 0.25 +jitter_p99_per_min_ci_high = 0.3333333333333333 +jitter_mean_per_min = 0.1425894570435256 +reaction_rate = 0.463 +reaction_rate_ci_low = 0.4320946469102843 +reaction_rate_ci_high = 0.4939053530897157 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 193.866090712743 +fire_decisiveness_mean = 9.427261781352358 +fire_decisiveness_p50 = 3.33333599570485 +step_correction_mean = 0.4311758358329213 +step_correction_p50 = 0.3314262628555298 + +[cell.spm_15.step_minus_25_at_15min] +shares_per_minute = 15 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.832 +convergence_rate_ci_low = 0.8088275275035226 +convergence_rate_ci_high = 0.8551724724964773 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 317.09134615384613 +settled_accuracy_p10 = 0.053323450136459116 +settled_accuracy_p10_ci_low = 0.04671367448675812 +settled_accuracy_p10_ci_high = 0.06351317047235061 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.230003012740573 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.35206589267181054 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.40740949855273034 +settled_accuracy_mean = 0.22328869517194808 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.10526315789473684 +jitter_p90_per_min_ci_low = 0.09090909090909091 +jitter_p90_per_min_ci_high = 0.1111111111111111 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.13043478260869565 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.2222222222222222 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.23529411764705882 +jitter_mean_per_min = 0.025687429818365935 +reaction_rate = 0.194 +reaction_rate_ci_low = 0.1694910640296238 +reaction_rate_ci_high = 0.2185089359703762 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 180.30927835051546 +fire_decisiveness_mean = 6.828686145132661 +fire_decisiveness_p50 = 2.333361736678455 +step_correction_mean = 1.0073282064236317 +step_correction_p50 = 0.6717745065689087 + +[cell.spm_15.step_minus_10_at_15min] +shares_per_minute = 15 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.983 +convergence_rate_ci_low = 0.9749876983581495 +convergence_rate_ci_high = 0.9910123016418505 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 660 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 720 +convergence_p95_secs = 900 +convergence_p95_secs_ci_low = 840 +convergence_p95_secs_ci_high = 960 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 183.78433367243133 +settled_accuracy_p10 = 0.05982852193844701 +settled_accuracy_p10_ci_low = 0.05180379306757976 +settled_accuracy_p10_ci_high = 0.06630929953631504 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11525007931894948 +settled_accuracy_p95 = 0.15086728886526002 +settled_accuracy_p95_ci_low = 0.13264596457621303 +settled_accuracy_p95_ci_high = 0.17570606913928044 +settled_accuracy_p99 = 0.2839537858533767 +settled_accuracy_p99_ci_low = 0.23697265947582757 +settled_accuracy_p99_ci_high = 0.30864447923334826 +settled_accuracy_mean = 0.10637912653339186 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.045454545454545456 +jitter_p90_per_min_ci_low = 0.043478260869565216 +jitter_p90_per_min_ci_high = 0.05263157894736842 +jitter_p95_per_min = 0.08333333333333333 +jitter_p95_per_min_ci_low = 0.05555555555555555 +jitter_p95_per_min_ci_high = 0.10526315789473684 +jitter_p99_per_min = 0.15789473684210525 +jitter_p99_per_min_ci_low = 0.14285714285714285 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.01157539705712231 +reaction_rate = 0.107 +reaction_rate_ci_low = 0.08784096240412896 +reaction_rate_ci_high = 0.12615903759587105 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 166.54205607476635 +fire_decisiveness_mean = 7.814020412727104 +fire_decisiveness_p50 = 3.666619332547306 +step_correction_mean = 0.7151710508025695 +step_correction_p50 = 1.1882885694503784 + +[cell.spm_15.step_minus_5_at_15min] +shares_per_minute = 15 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.988 +convergence_rate_ci_low = 0.9812512216216562 +convergence_rate_ci_high = 0.9947487783783437 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 660 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 660 +convergence_p95_secs = 840 +convergence_p95_secs_ci_low = 780 +convergence_p95_secs_ci_high = 900 +convergence_p99_secs = 1200 +convergence_p99_secs_ci_low = 1140 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 169.97975708502025 +settled_accuracy_p10 = 0.0355747623480841 +settled_accuracy_p10_ci_low = 0.030390425952679156 +settled_accuracy_p10_ci_high = 0.04280415309213281 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.0794764632611108 +settled_accuracy_p90_ci_low = 0.07031207670642126 +settled_accuracy_p90_ci_high = 0.10399684150362565 +settled_accuracy_p95 = 0.1390143883525008 +settled_accuracy_p95_ci_low = 0.12222509259787095 +settled_accuracy_p95_ci_high = 0.1602362599367919 +settled_accuracy_p99 = 0.23508807473356197 +settled_accuracy_p99_ci_low = 0.2210546928063466 +settled_accuracy_p99_ci_high = 0.2514641918047644 +settled_accuracy_mean = 0.05999119468119211 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.043478260869565216 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.045454545454545456 +jitter_p95_per_min = 0.058823529411764705 +jitter_p95_per_min_ci_low = 0.05 +jitter_p95_per_min_ci_high = 0.08333333333333333 +jitter_p99_per_min = 0.17391304347826086 +jitter_p99_per_min_ci_low = 0.14285714285714285 +jitter_p99_per_min_ci_high = 0.19047619047619047 +jitter_mean_per_min = 0.009396157631623832 +reaction_rate = 0.085 +reaction_rate_ci_low = 0.06771473344145368 +reaction_rate_ci_high = 0.10228526655854633 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 161.64705882352942 +fire_decisiveness_mean = 9.053209573036613 +fire_decisiveness_p50 = 3.666892487993181 +step_correction_mean = 1.8272046958698946 +step_correction_p50 = 1.1188422441482544 + +[cell.spm_15.step_plus_5_at_15min] +shares_per_minute = 15 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.993 +convergence_rate_ci_low = 0.9878325091582084 +convergence_rate_ci_high = 0.9981674908417916 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 660 +convergence_p95_secs = 780 +convergence_p95_secs_ci_low = 720 +convergence_p95_secs_ci_high = 900 +convergence_p99_secs = 1200 +convergence_p99_secs_ci_low = 1140 +convergence_p99_secs_ci_high = 1260 +convergence_mean_secs = 165.9214501510574 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.04367962916022261 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.08935181652205026 +settled_accuracy_p90_ci_low = 0.07999875752721841 +settled_accuracy_p90_ci_high = 0.10063134746045344 +settled_accuracy_p95 = 0.12239098291996187 +settled_accuracy_p95_ci_low = 0.107481820846418 +settled_accuracy_p95_ci_high = 0.13378696372503573 +settled_accuracy_p99 = 0.18095478408903665 +settled_accuracy_p99_ci_low = 0.16507950994930531 +settled_accuracy_p99_ci_high = 0.1993390990717373 +settled_accuracy_mean = 0.055872507592569426 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05 +jitter_p90_per_min_ci_low = 0.043478260869565216 +jitter_p90_per_min_ci_high = 0.05555555555555555 +jitter_p95_per_min = 0.08695652173913043 +jitter_p95_per_min_ci_low = 0.07692307692307693 +jitter_p95_per_min_ci_high = 0.1111111111111111 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.16 +jitter_p99_per_min_ci_high = 0.21052631578947367 +jitter_mean_per_min = 0.012469760492405441 +reaction_rate = 0.103 +reaction_rate_ci_low = 0.08416043350817222 +reaction_rate_ci_high = 0.12183956649182777 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 161.35922330097088 +fire_decisiveness_mean = 8.728148238922481 +fire_decisiveness_p50 = 3.666619332547306 +step_correction_mean = 2.015630472632288 +step_correction_p50 = 1.6848777532577515 + +[cell.spm_15.step_plus_10_at_15min] +shares_per_minute = 15 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.987 +convergence_rate_ci_low = 0.9799792044895183 +convergence_rate_ci_high = 0.9940207955104817 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 720 +convergence_p90_secs_ci_low = 660 +convergence_p90_secs_ci_high = 780 +convergence_p95_secs = 960 +convergence_p95_secs_ci_low = 840 +convergence_p95_secs_ci_high = 1020 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1200 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 202.67477203647417 +settled_accuracy_p10 = 0.0429053209216097 +settled_accuracy_p10_ci_low = 0.03458955638416694 +settled_accuracy_p10_ci_high = 0.04762038979635319 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09733945683426615 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.106713223136916 +settled_accuracy_p95 = 0.12659031996103787 +settled_accuracy_p95_ci_low = 0.1182519214335771 +settled_accuracy_p95_ci_high = 0.13911917906091154 +settled_accuracy_p99 = 0.19377215088244792 +settled_accuracy_p99_ci_low = 0.1653070105520149 +settled_accuracy_p99_ci_high = 0.20682146973661664 +settled_accuracy_mean = 0.08553513457188221 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05555555555555555 +jitter_p90_per_min_ci_low = 0.043478260869565216 +jitter_p90_per_min_ci_high = 0.0625 +jitter_p95_per_min = 0.08695652173913043 +jitter_p95_per_min_ci_low = 0.08695652173913043 +jitter_p95_per_min_ci_high = 0.10526315789473684 +jitter_p99_per_min = 0.17391304347826086 +jitter_p99_per_min_ci_low = 0.15789473684210525 +jitter_p99_per_min_ci_high = 0.2222222222222222 +jitter_mean_per_min = 0.012568410121530649 +reaction_rate = 0.125 +reaction_rate_ci_low = 0.10450182934991514 +reaction_rate_ci_high = 0.14549817065008486 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 172.32 +fire_decisiveness_mean = 7.609427725765259 +fire_decisiveness_p50 = 3.6666220722215073 +step_correction_mean = 1.0149431960582733 +step_correction_p50 = 1.2124196290969849 + +[cell.spm_15.step_plus_25_at_15min] +shares_per_minute = 15 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.839 +convergence_rate_ci_low = 0.816220195646143 +convergence_rate_ci_high = 0.8617798043538569 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 341.90703218116806 +settled_accuracy_p10 = 0.054381693303695244 +settled_accuracy_p10_ci_low = 0.04888724916586373 +settled_accuracy_p10_ci_high = 0.06133309768280082 +settled_accuracy_p50 = 0.20000003221225382 +settled_accuracy_p50_ci_low = 0.16105139078553443 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.2624406408692326 +settled_accuracy_p99_ci_low = 0.2191326614429845 +settled_accuracy_p99_ci_high = 0.3621325199238159 +settled_accuracy_mean = 0.1425360779122091 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.09090909090909091 +jitter_p90_per_min_ci_high = 0.1111111111111111 +jitter_p95_per_min = 0.13043478260869565 +jitter_p95_per_min_ci_low = 0.11764705882352941 +jitter_p95_per_min_ci_high = 0.15789473684210525 +jitter_p99_per_min = 0.21052631578947367 +jitter_p99_per_min_ci_low = 0.17391304347826086 +jitter_p99_per_min_ci_high = 0.2222222222222222 +jitter_mean_per_min = 0.023463352856087753 +reaction_rate = 0.197 +reaction_rate_ci_low = 0.172348295280042 +reaction_rate_ci_high = 0.22165170471995801 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 178.4771573604061 +fire_decisiveness_mean = 6.125664325296747 +fire_decisiveness_p50 = 2.33336831278627 +step_correction_mean = 0.6172359488942296 +step_correction_p50 = 0.6166720986366272 + +[cell.spm_15.step_plus_50_at_15min] +shares_per_minute = 15 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.529 +convergence_rate_ci_low = 0.4980618485620101 +convergence_rate_ci_high = 0.55993815143799 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 1080 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1140 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 940.2646502835539 +settled_accuracy_p10 = 0.015573014398609253 +settled_accuracy_p10_ci_low = 0.011685263725753403 +settled_accuracy_p10_ci_high = 0.020447086406061743 +settled_accuracy_p50 = 0.09113133106135529 +settled_accuracy_p50_ci_low = 0.08641008830542152 +settled_accuracy_p50_ci_high = 0.09824370735846899 +settled_accuracy_p90 = 0.23285012863874321 +settled_accuracy_p90_ci_low = 0.23091640911030553 +settled_accuracy_p90_ci_high = 0.24931918058109293 +settled_accuracy_p95 = 0.33333334824641403 +settled_accuracy_p95_ci_low = 0.30107926263644247 +settled_accuracy_p95_ci_high = 0.33333334824641403 +settled_accuracy_p99 = 0.5155625901551655 +settled_accuracy_p99_ci_low = 0.436507722753779 +settled_accuracy_p99_ci_high = 0.5502253023500361 +settled_accuracy_mean = 0.12292102508162463 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.1111111111111111 +jitter_p90_per_min = 0.18181818181818182 +jitter_p90_per_min_ci_low = 0.17391304347826086 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.21739130434782608 +jitter_p95_per_min_ci_low = 0.1875 +jitter_p95_per_min_ci_high = 0.2222222222222222 +jitter_p99_per_min = 0.2631578947368421 +jitter_p99_per_min_ci_low = 0.2222222222222222 +jitter_p99_per_min_ci_high = 0.2777777777777778 +jitter_mean_per_min = 0.09375270100281413 +reaction_rate = 0.436 +reaction_rate_ci_low = 0.4052646001099709 +reaction_rate_ci_high = 0.4667353998900291 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 183.71559633027522 +fire_decisiveness_mean = 6.669694263129233 +fire_decisiveness_p50 = 3.3333372237012213 +step_correction_mean = 0.45038254811949685 +step_correction_p50 = 0.3407418727874756 + +[cell.spm_20.cold_start_10gh_to_1ph] +shares_per_minute = 20 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.98 +convergence_rate_ci_low = 0.971322710100498 +convergence_rate_ci_high = 0.988677289899502 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 715.4081632653061 +settled_accuracy_p10 = 0.00902654497860933 +settled_accuracy_p10_ci_low = 0.005992754524295152 +settled_accuracy_p10_ci_high = 0.013681954043715194 +settled_accuracy_p50 = 0.053054859282441136 +settled_accuracy_p50_ci_low = 0.04576643390404278 +settled_accuracy_p50_ci_high = 0.05521603316681167 +settled_accuracy_p90 = 0.12409704183452552 +settled_accuracy_p90_ci_low = 0.1182106548610542 +settled_accuracy_p90_ci_high = 0.1317923482606489 +settled_accuracy_p95 = 0.151456587845739 +settled_accuracy_p95_ci_low = 0.1416170860780579 +settled_accuracy_p95_ci_high = 0.17017459243611954 +settled_accuracy_p99 = 0.2026473641886024 +settled_accuracy_p99_ci_low = 0.1891469396243689 +settled_accuracy_p99_ci_high = 0.22281102794607754 +settled_accuracy_mean = 0.06183989811263703 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.07142857142857142 +jitter_p90_per_min_ci_low = 0.05555555555555555 +jitter_p90_per_min_ci_high = 0.07692307692307693 +jitter_p95_per_min = 0.1111111111111111 +jitter_p95_per_min_ci_low = 0.1111111111111111 +jitter_p95_per_min_ci_high = 0.1111111111111111 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.15384615384615385 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.018735790667351697 +bias_mean = 0.0018385139181260322 +bias_p10 = -0.06990576456637028 +bias_p10_ci_low = -0.07830261646973964 +bias_p10_ci_high = -0.06469274441098918 +bias_p50 = 0.0024618286630926204 +bias_p50_ci_low = -0.002133860576367166 +bias_p50_ci_high = 0.00541392996862883 +bias_p90 = 0.07635637815137533 +bias_p90_ci_low = 0.06780408092468698 +bias_p90_ci_high = 0.07976179983912876 +bias_p99 = 0.13627116917795515 +bias_p99_ci_low = 0.1229149015195598 +bias_p99_ci_high = 0.15936343907416978 +variance_mean = 0.006095884492350654 +variance_p10 = 0.0008066719074878954 +variance_p10_ci_low = 0.0007259928007145142 +variance_p10_ci_high = 0.0008746357182728501 +variance_p50 = 0.0031197027203909095 +variance_p50_ci_low = 0.002829268221170454 +variance_p50_ci_high = 0.0034982529188156003 +variance_p90 = 0.014744746911899326 +variance_p90_ci_low = 0.013750772002206877 +variance_p90_ci_high = 0.016379805886284404 +variance_p99 = 0.03624472068708471 +variance_p99_ci_low = 0.03085250491131522 +variance_p99_ci_high = 0.044056894904412724 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.053054859282441136 +ramp_target_overshoot_p50_ci_low = 0.043213277139948936 +ramp_target_overshoot_p50_ci_high = 0.06170593016208592 +ramp_target_overshoot_p90 = 0.1908400962851149 +ramp_target_overshoot_p90_ci_low = 0.18097992498705295 +ramp_target_overshoot_p90_ci_high = 0.2105165496836119 +ramp_target_overshoot_p99 = 0.5265066930019748 +ramp_target_overshoot_p99_ci_low = 0.44399285397963295 +ramp_target_overshoot_p99_ci_high = 0.6144497734102732 +ramp_target_overshoot_mean = 0.08144612201693543 + +[cell.spm_20.stable_1ph] +shares_per_minute = 20 +scenario = "stable_1ph" +convergence_rate = 0.997 +convergence_rate_ci_low = 0.9936102764714508 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 480 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 660 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 780 +convergence_p99_secs = 1140 +convergence_p99_secs_ci_low = 960 +convergence_p99_secs_ci_high = 1200 +convergence_mean_secs = 110.01003009027082 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0.039035347648414875 +settled_accuracy_p90_ci_low = 0.03207951380432705 +settled_accuracy_p90_ci_high = 0.05699623002529808 +settled_accuracy_p95 = 0.09975283133978619 +settled_accuracy_p95_ci_low = 0.0734799120685965 +settled_accuracy_p95_ci_high = 0.11867451133505647 +settled_accuracy_p99 = 0.16667057016564013 +settled_accuracy_p99_ci_low = 0.15769328309384756 +settled_accuracy_p99_ci_high = 0.1810742129421996 +settled_accuracy_mean = 0.01242165204442795 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0.043478260869565216 +jitter_p95_per_min_ci_low = 0.043478260869565216 +jitter_p95_per_min_ci_high = 0.047619047619047616 +jitter_p99_per_min = 0.09523809523809523 +jitter_p99_per_min_ci_low = 0.0625 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.005124796458008921 +bias_mean = -0.0027805252327583537 +bias_p10 = -0.05827039072218672 +bias_p10_ci_low = -0.062307667097038166 +bias_p10_ci_high = -0.05436689763548236 +bias_p50 = -0.0031821151738657015 +bias_p50_ci_low = -0.005596886394500261 +bias_p50_ci_high = 0.00032561221236385493 +bias_p90 = 0.05423824287742977 +bias_p90_ci_low = 0.04903322633719615 +bias_p90_ci_high = 0.05848988615895874 +bias_p99 = 0.10185099000004094 +bias_p99_ci_low = 0.09241170784223493 +bias_p99_ci_high = 0.12778157282333127 +variance_mean = 0.001409469902467735 +variance_p10 = 0.00011489419516459403 +variance_p10_ci_low = 0.00010421225691507645 +variance_p10_ci_high = 0.00012403864170704065 +variance_p50 = 0.00033652782292591045 +variance_p50_ci_low = 0.00030856137635107113 +variance_p50_ci_high = 0.000377464767080127 +variance_p90 = 0.0029967785827439714 +variance_p90_ci_low = 0.002317417520311065 +variance_p90_ci_high = 0.00409132233093501 +variance_p99 = 0.0198610707969854 +variance_p99_ci_low = 0.014000378445014176 +variance_p99_ci_high = 0.02282053878723814 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1.2100043025765246 +upward_step_magnitude_p90_ci_low = 1.1800013435194747 +upward_step_magnitude_p90_ci_high = 1.2400024400783267 +upward_step_magnitude_p95 = 1.325000585051051 +upward_step_magnitude_p95_ci_low = 1.300001256145185 +upward_step_magnitude_p95_ci_high = 1.3500013913436737 +upward_step_magnitude_p99 = 1.7000057058529083 +upward_step_magnitude_p99_ci_low = 1.6 +upward_step_magnitude_p99_ci_high = 1.80000726187479 +upward_step_magnitude_mean = 1.0573853382738194 +fire_decisiveness_mean = 5.048387774313518 +fire_decisiveness_p50 = 2.8573510388265966 + +[cell.spm_20.step_minus_50_at_15min] +shares_per_minute = 20 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.412 +convergence_rate_ci_low = 0.3814934326808144 +convergence_rate_ci_high = 0.44250656731918553 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1260 +convergence_p50_secs_ci_high = 1380 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1073.009708737864 +settled_accuracy_p10 = 0.01700089006487482 +settled_accuracy_p10_ci_low = 0.014303315023574292 +settled_accuracy_p10_ci_high = 0.01799960419191493 +settled_accuracy_p50 = 0.08333746612092852 +settled_accuracy_p50_ci_low = 0.07874071020372164 +settled_accuracy_p50_ci_high = 0.09061481853662279 +settled_accuracy_p90 = 0.22629021993655396 +settled_accuracy_p90_ci_low = 0.20606944653507198 +settled_accuracy_p90_ci_high = 0.24624718839022008 +settled_accuracy_p95 = 0.3466690280039253 +settled_accuracy_p95_ci_low = 0.27339312688454265 +settled_accuracy_p95_ci_high = 0.3978236997774871 +settled_accuracy_p99 = 0.68571522715579 +settled_accuracy_p99_ci_low = 0.6769238316396957 +settled_accuracy_p99_ci_high = 0.6925963017244092 +settled_accuracy_mean = 0.11542937781827874 +jitter_p10_per_min = 0.05555555555555555 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.08695652173913043 +jitter_p50_per_min = 0.13043478260869565 +jitter_p50_per_min_ci_low = 0.13043478260869565 +jitter_p50_per_min_ci_high = 0.16666666666666666 +jitter_p90_per_min = 0.21739130434782608 +jitter_p90_per_min_ci_low = 0.18181818181818182 +jitter_p90_per_min_ci_high = 0.2222222222222222 +jitter_p95_per_min = 0.2222222222222222 +jitter_p95_per_min_ci_low = 0.21739130434782608 +jitter_p95_per_min_ci_high = 0.23529411764705882 +jitter_p99_per_min = 0.2777777777777778 +jitter_p99_per_min_ci_low = 0.2222222222222222 +jitter_p99_per_min_ci_high = 0.3333333333333333 +jitter_mean_per_min = 0.13602310352672092 +reaction_rate = 0.384 +reaction_rate_ci_low = 0.3538552254876571 +reaction_rate_ci_high = 0.41414477451234294 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 202.96875 +fire_decisiveness_mean = 6.8454281843132705 +fire_decisiveness_p50 = 2.8570547357142715 +step_correction_mean = 0.4118804175717135 +step_correction_p50 = 0.3299978971481323 + +[cell.spm_20.step_minus_25_at_15min] +shares_per_minute = 20 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.849 +convergence_rate_ci_low = 0.8268079005409582 +convergence_rate_ci_high = 0.8711920994590417 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 780 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 233.92226148409895 +settled_accuracy_p10 = 0.08470597056820006 +settled_accuracy_p10_ci_low = 0.07541658274330476 +settled_accuracy_p10_ci_high = 0.0947386561638015 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.33333330350717194 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.33333330350717194 +settled_accuracy_mean = 0.24881238321380217 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.08695652173913043 +jitter_p90_per_min_ci_low = 0.05555555555555555 +jitter_p90_per_min_ci_high = 0.08695652173913043 +jitter_p95_per_min = 0.10526315789473684 +jitter_p95_per_min_ci_low = 0.09523809523809523 +jitter_p95_per_min_ci_high = 0.13043478260869565 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.14285714285714285 +jitter_p99_per_min_ci_high = 0.17391304347826086 +jitter_mean_per_min = 0.014723111119196929 +reaction_rate = 0.119 +reaction_rate_ci_low = 0.09893138015707109 +reaction_rate_ci_high = 0.1390686198429289 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 191.5966386554622 +fire_decisiveness_mean = 4.551408878828451 +fire_decisiveness_p50 = 1.923053259133514 +step_correction_mean = 0.7584339836064506 +step_correction_p50 = 0.6666573882102966 + +[cell.spm_20.step_minus_10_at_15min] +shares_per_minute = 20 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.996 +convergence_rate_ci_low = 0.9920878478557194 +convergence_rate_ci_high = 0.9999121521442806 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 540 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 660 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 780 +convergence_p99_secs = 1200 +convergence_p99_secs_ci_low = 1080 +convergence_p99_secs_ci_high = 1200 +convergence_mean_secs = 118.73493975903614 +settled_accuracy_p10 = 0.07333820742529751 +settled_accuracy_p10_ci_low = 0.06363434020242265 +settled_accuracy_p10_ci_high = 0.08212201211762404 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.1293400327864085 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.14605282436976386 +settled_accuracy_p99 = 0.2387214419159729 +settled_accuracy_p99_ci_low = 0.18533850270430086 +settled_accuracy_p99_ci_high = 0.28889225261715246 +settled_accuracy_mean = 0.10726739847640643 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.043478260869565216 +jitter_p95_per_min = 0.05263157894736842 +jitter_p95_per_min_ci_low = 0.045454545454545456 +jitter_p95_per_min_ci_high = 0.058823529411764705 +jitter_p99_per_min = 0.13043478260869565 +jitter_p99_per_min_ci_low = 0.10526315789473684 +jitter_p99_per_min_ci_high = 0.13636363636363635 +jitter_mean_per_min = 0.006888645963601502 +reaction_rate = 0.071 +reaction_rate_ci_low = 0.05508183131135996 +reaction_rate_ci_high = 0.08691816868864002 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 184.22535211267606 +fire_decisiveness_mean = 4.3844367147637096 +fire_decisiveness_p50 = 2.9998524947150074 +step_correction_mean = 2.250221218861325 +step_correction_p50 = 1.075939655303955 + +[cell.spm_20.step_minus_5_at_15min] +shares_per_minute = 20 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.994 +convergence_rate_ci_low = 0.9892134247733896 +convergence_rate_ci_high = 0.9987865752266104 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 540 +convergence_p90_secs_ci_low = 480 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 660 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 780 +convergence_p99_secs = 1140 +convergence_p99_secs_ci_low = 900 +convergence_p99_secs_ci_high = 1200 +convergence_mean_secs = 107.2635814889336 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.05726625470300695 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.08082457439028246 +settled_accuracy_p95 = 0.11410901714970567 +settled_accuracy_p95_ci_low = 0.09508987042549766 +settled_accuracy_p95_ci_high = 0.12554394383821588 +settled_accuracy_p99 = 0.21052891463137846 +settled_accuracy_p99_ci_low = 0.1790477930260892 +settled_accuracy_p99_ci_high = 0.21930209182569516 +settled_accuracy_mean = 0.05785813652246018 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0.045454545454545456 +jitter_p95_per_min_ci_low = 0.043478260869565216 +jitter_p95_per_min_ci_high = 0.05555555555555555 +jitter_p99_per_min = 0.15384615384615385 +jitter_p99_per_min_ci_low = 0.125 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.006378120387228587 +reaction_rate = 0.057 +reaction_rate_ci_low = 0.042630245597088307 +reaction_rate_ci_high = 0.0713697544029117 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 185.26315789473685 +fire_decisiveness_mean = 4.698391805463663 +fire_decisiveness_p50 = 2.9998524947150074 +step_correction_mean = 1.27063327609447 +step_correction_p50 = 1.0514665842056274 + +[cell.spm_20.step_plus_5_at_15min] +shares_per_minute = 20 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.995 +convergence_rate_ci_low = 0.9906282772274537 +convergence_rate_ci_high = 0.9993717227725463 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 540 +convergence_p90_secs_ci_low = 360 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 660 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 780 +convergence_p99_secs = 1140 +convergence_p99_secs_ci_low = 900 +convergence_p99_secs_ci_high = 1200 +convergence_mean_secs = 98.05025125628141 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.059928539919359425 +settled_accuracy_p90_ci_low = 0.047618983705838724 +settled_accuracy_p90_ci_high = 0.07447934063043227 +settled_accuracy_p95 = 0.0977484782584519 +settled_accuracy_p95_ci_low = 0.08856804884094038 +settled_accuracy_p95_ci_high = 0.10582110002557799 +settled_accuracy_p99 = 0.14531000398946248 +settled_accuracy_p99_ci_low = 0.12813371256874984 +settled_accuracy_p99_ci_high = 0.17143082117352582 +settled_accuracy_mean = 0.05227268608937941 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0.043478260869565216 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.05555555555555555 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.08695652173913043 +jitter_p99_per_min_ci_high = 0.17391304347826086 +jitter_mean_per_min = 0.005129008368753156 +reaction_rate = 0.045 +reaction_rate_ci_low = 0.03215115725055365 +reaction_rate_ci_high = 0.05784884274944635 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 178.66666666666666 +fire_decisiveness_mean = 4.359255070728153 +fire_decisiveness_p50 = 2.999852001953677 +step_correction_mean = -1572.9431804802682 +step_correction_p50 = 1.637995719909668 + +[cell.spm_20.step_plus_10_at_15min] +shares_per_minute = 20 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.993 +convergence_rate_ci_low = 0.9878325091582084 +convergence_rate_ci_high = 0.9981674908417916 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 540 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 780 +convergence_p95_secs_ci_low = 660 +convergence_p95_secs_ci_high = 900 +convergence_p99_secs = 1260 +convergence_p99_secs_ci_low = 1140 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 126.58610271903324 +settled_accuracy_p10 = 0.06060961571206436 +settled_accuracy_p10_ci_low = 0.050737657596781505 +settled_accuracy_p10_ci_high = 0.06939441020977188 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.1009502188267577 +settled_accuracy_p95_ci_low = 0.09090908536290365 +settled_accuracy_p95_ci_high = 0.11242028305665264 +settled_accuracy_p99 = 0.15757314088463026 +settled_accuracy_p99_ci_low = 0.13775272054764254 +settled_accuracy_p99_ci_high = 0.1730717502974295 +settled_accuracy_mean = 0.08673402365172682 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.043478260869565216 +jitter_p95_per_min = 0.058823529411764705 +jitter_p95_per_min_ci_low = 0.05263157894736842 +jitter_p95_per_min_ci_high = 0.08695652173913043 +jitter_p99_per_min = 0.13333333333333333 +jitter_p99_per_min_ci_low = 0.10526315789473684 +jitter_p99_per_min_ci_high = 0.14285714285714285 +jitter_mean_per_min = 0.007089493603859028 +reaction_rate = 0.078 +reaction_rate_ci_low = 0.061378552842787724 +reaction_rate_ci_high = 0.09462144715721227 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 172.30769230769232 +fire_decisiveness_mean = 5.116138103665127 +fire_decisiveness_p50 = 2.9998524947150074 +step_correction_mean = 15.393175757084137 +step_correction_p50 = 1.3238517045974731 + +[cell.spm_20.step_plus_25_at_15min] +shares_per_minute = 20 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.843 +convergence_rate_ci_low = 0.8204513946861451 +convergence_rate_ci_high = 0.8655486053138548 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 259.5729537366548 +settled_accuracy_p10 = 0.06545336707173222 +settled_accuracy_p10_ci_low = 0.0618388300681203 +settled_accuracy_p10_ci_high = 0.06999819396630125 +settled_accuracy_p50 = 0.20000003221225382 +settled_accuracy_p50_ci_low = 0.20000003221225382 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.2100048898201332 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.23255819197343652 +settled_accuracy_mean = 0.15143275729591482 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.058823529411764705 +jitter_p90_per_min_ci_low = 0.05555555555555555 +jitter_p90_per_min_ci_high = 0.08695652173913043 +jitter_p95_per_min = 0.1111111111111111 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.11764705882352941 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.14285714285714285 +jitter_p99_per_min_ci_high = 0.2222222222222222 +jitter_mean_per_min = 0.013497936493886508 +reaction_rate = 0.108 +reaction_rate_ci_low = 0.08876242277208483 +reaction_rate_ci_high = 0.12723757722791518 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 182.77777777777777 +fire_decisiveness_mean = 4.0013566332141615 +fire_decisiveness_p50 = 1.667050634053581 +step_correction_mean = 0.722437261707253 +step_correction_p50 = 0.6389351487159729 + +[cell.spm_20.step_plus_50_at_15min] +shares_per_minute = 20 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.462 +convergence_rate_ci_low = 0.4310993085902597 +convergence_rate_ci_high = 0.49290069140974035 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 1260 +convergence_p50_secs_ci_low = 1200 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1057.142857142857 +settled_accuracy_p10 = 0.013546774117203064 +settled_accuracy_p10_ci_low = 0.01099726365846565 +settled_accuracy_p10_ci_high = 0.01624714530080018 +settled_accuracy_p50 = 0.07639681954095567 +settled_accuracy_p50_ci_low = 0.07146279694889102 +settled_accuracy_p50_ci_high = 0.08235671295776414 +settled_accuracy_p90 = 0.2307692170033101 +settled_accuracy_p90_ci_low = 0.22839508437418432 +settled_accuracy_p90_ci_high = 0.2320983304120099 +settled_accuracy_p95 = 0.24949724276523955 +settled_accuracy_p95_ci_low = 0.23333170184229934 +settled_accuracy_p95_ci_high = 0.2705024959575857 +settled_accuracy_p99 = 0.47250974890458197 +settled_accuracy_p99_ci_low = 0.33333334824641403 +settled_accuracy_p99_ci_high = 0.6327180226042337 +settled_accuracy_mean = 0.10719977239357914 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.10526315789473684 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.1111111111111111 +jitter_p90_per_min = 0.17391304347826086 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.21052631578947367 +jitter_p95_per_min = 0.2222222222222222 +jitter_p95_per_min_ci_low = 0.17647058823529413 +jitter_p95_per_min_ci_high = 0.22727272727272727 +jitter_p99_per_min = 0.23529411764705882 +jitter_p99_per_min_ci_low = 0.2222222222222222 +jitter_p99_per_min_ci_high = 0.2777777777777778 +jitter_mean_per_min = 0.09147775707381299 +reaction_rate = 0.389 +reaction_rate_ci_low = 0.3587829907767165 +reaction_rate_ci_high = 0.41921700922328353 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 196.96658097686375 +fire_decisiveness_mean = 5.084538133162696 +fire_decisiveness_p50 = 2.499930353532811 +step_correction_mean = 0.40774651319937716 +step_correction_p50 = 0.32500457763671875 + +[cell.spm_25.cold_start_10gh_to_1ph] +shares_per_minute = 25 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.992 +convergence_rate_ci_low = 0.9864785022321837 +convergence_rate_ci_high = 0.9975214977678163 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 696.108870967742 +settled_accuracy_p10 = 0.00796192994626388 +settled_accuracy_p10_ci_low = 0.0077695959395378544 +settled_accuracy_p10_ci_high = 0.007975821481292611 +settled_accuracy_p50 = 0.04732785586304311 +settled_accuracy_p50_ci_low = 0.04715377546756261 +settled_accuracy_p50_ci_high = 0.0547362718918345 +settled_accuracy_p90 = 0.11800818741573216 +settled_accuracy_p90_ci_low = 0.11012618412753206 +settled_accuracy_p90_ci_high = 0.12586871586717296 +settled_accuracy_p95 = 0.13979454352583676 +settled_accuracy_p95_ci_low = 0.1337589064368876 +settled_accuracy_p95_ci_high = 0.1462539059875938 +settled_accuracy_p99 = 0.17711928620863837 +settled_accuracy_p99_ci_low = 0.16840278418574228 +settled_accuracy_p99_ci_high = 0.19250432902510084 +settled_accuracy_mean = 0.05684676764448081 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05555555555555555 +jitter_p90_per_min_ci_low = 0.05555555555555555 +jitter_p90_per_min_ci_high = 0.05555555555555555 +jitter_p95_per_min = 0.07692307692307693 +jitter_p95_per_min_ci_low = 0.07692307692307693 +jitter_p95_per_min_ci_high = 0.1111111111111111 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.1111111111111111 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.0121061902483417 +bias_mean = -0.0023803548472356934 +bias_p10 = -0.06953191874039033 +bias_p10_ci_low = -0.07343660565848034 +bias_p10_ci_high = -0.0650208679077175 +bias_p50 = -0.0043067891082269934 +bias_p50_ci_low = -0.00839647397449875 +bias_p50_ci_high = -0.0003244607655244546 +bias_p90 = 0.06657328315064281 +bias_p90_ci_low = 0.061090517146881865 +bias_p90_ci_high = 0.07166133600349382 +bias_p99 = 0.12144108488558288 +bias_p99_ci_low = 0.11050764504365236 +bias_p99_ci_high = 0.13245988367158634 +variance_mean = 0.004317414682433855 +variance_p10 = 0.0006550274409809652 +variance_p10_ci_low = 0.0005888834808139507 +variance_p10_ci_high = 0.0007211147371453225 +variance_p50 = 0.0023041808321542165 +variance_p50_ci_low = 0.0021280384415721006 +variance_p50_ci_high = 0.0025505272487501463 +variance_p90 = 0.01065103114854094 +variance_p90_ci_low = 0.00940976853995677 +variance_p90_ci_high = 0.012250207929474163 +variance_p99 = 0.027184515090844373 +variance_p99_ci_low = 0.023687680975249426 +variance_p99_ci_high = 0.029325278854325395 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.031401043180461 +ramp_target_overshoot_p50_ci_low = 0.023534743366641075 +ramp_target_overshoot_p50_ci_high = 0.03927485918714657 +ramp_target_overshoot_p90 = 0.15013239572406478 +ramp_target_overshoot_p90_ci_low = 0.1416225890049776 +ramp_target_overshoot_p90_ci_high = 0.16524907018989987 +ramp_target_overshoot_p99 = 0.3925443795956569 +ramp_target_overshoot_p99_ci_low = 0.28357555495172493 +ramp_target_overshoot_p99_ci_high = 0.5140543746893278 +ramp_target_overshoot_mean = 0.05975806771029456 + +[cell.spm_25.stable_1ph] +shares_per_minute = 25 +scenario = "stable_1ph" +convergence_rate = 0.998 +convergence_rate_ci_low = 0.995230914663648 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 300 +convergence_p90_secs_ci_low = 300 +convergence_p90_secs_ci_high = 540 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 660 +convergence_p99_secs = 1080 +convergence_p99_secs_ci_low = 840 +convergence_p99_secs_ci_high = 1200 +convergence_mean_secs = 75.03006012024048 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0.018457622194673284 +settled_accuracy_p90_ci_low = 0.005008066150013368 +settled_accuracy_p90_ci_high = 0.02573282712669167 +settled_accuracy_p95 = 0.05040466309974101 +settled_accuracy_p95_ci_low = 0.03385051674832584 +settled_accuracy_p95_ci_high = 0.06790551420791968 +settled_accuracy_p99 = 0.15200178026396727 +settled_accuracy_p99_ci_low = 0.11506747695699682 +settled_accuracy_p99_ci_high = 0.16000303600504684 +settled_accuracy_mean = 0.006915664893493867 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.043478260869565216 +jitter_p99_per_min = 0.058823529411764705 +jitter_p99_per_min_ci_low = 0.05 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.0025921471391531104 +bias_mean = -0.00022419111822014702 +bias_p10 = -0.049612167450364585 +bias_p10_ci_low = -0.05493403818456971 +bias_p10_ci_high = -0.04719441165126593 +bias_p50 = -0.0004754945639894464 +bias_p50_ci_low = -0.0032914355147438366 +bias_p50_ci_high = 0.0031330197411428124 +bias_p90 = 0.04986290736180327 +bias_p90_ci_low = 0.04398906974606313 +bias_p90_ci_high = 0.05437349549651304 +bias_p99 = 0.09219552193211478 +bias_p99_ci_low = 0.08264228538970889 +bias_p99_ci_high = 0.1025050683175485 +variance_mean = 0.0009534223494857692 +variance_p10 = 0.00009668219631915143 +variance_p10_ci_low = 0.00008992874706657068 +variance_p10_ci_high = 0.00010150884863317414 +variance_p50 = 0.00026031858637603594 +variance_p50_ci_low = 0.00024011664261518198 +variance_p50_ci_high = 0.0002828542117380725 +variance_p90 = 0.001276671171966377 +variance_p90_ci_low = 0.0010639166947508897 +variance_p90_ci_high = 0.0016860698219225525 +variance_p99 = 0.01587546383297605 +variance_p99_ci_low = 0.011439763012630428 +variance_p99_ci_high = 0.023630398928096027 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1.1600030360050468 +upward_step_magnitude_p90_ci_low = 1.1520017802639673 +upward_step_magnitude_p90_ci_high = 1.1733359655867501 +upward_step_magnitude_p95 = 1.2160026258007273 +upward_step_magnitude_p95_ci_low = 1.200000017269302 +upward_step_magnitude_p95_ci_high = 1.2480045301721814 +upward_step_magnitude_p99 = 1.599999964854349 +upward_step_magnitude_p99_ci_low = 1.360004546071035 +upward_step_magnitude_p99_ci_high = 1.6400052318071054 +upward_step_magnitude_mean = 1.0342421825260681 +fire_decisiveness_mean = 4.389085721589672 +fire_decisiveness_p50 = 2.5999641907097057 + +[cell.spm_25.step_minus_50_at_15min] +shares_per_minute = 25 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.402 +convergence_rate_ci_low = 0.3716107704342476 +convergence_rate_ci_high = 0.43238922956575243 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1380 +convergence_p50_secs_ci_low = 1380 +convergence_p50_secs_ci_high = 1380 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1176.5671641791046 +settled_accuracy_p10 = 0.015500000301989836 +settled_accuracy_p10_ci_low = 0.012307161837926683 +settled_accuracy_p10_ci_high = 0.018635326468857016 +settled_accuracy_p50 = 0.08134741984198413 +settled_accuracy_p50_ci_low = 0.07707674589919533 +settled_accuracy_p50_ci_high = 0.085502800754921 +settled_accuracy_p90 = 0.18382198541442518 +settled_accuracy_p90_ci_low = 0.16880261880265568 +settled_accuracy_p90_ci_high = 0.19706967799354702 +settled_accuracy_p95 = 0.25614588017671913 +settled_accuracy_p95_ci_low = 0.21200341369373832 +settled_accuracy_p95_ci_high = 0.28767711455503364 +settled_accuracy_p99 = 0.6740780131158908 +settled_accuracy_p99_ci_low = 0.5315849550246454 +settled_accuracy_p99_ci_high = 0.6829645690023751 +settled_accuracy_mean = 0.10149549474701992 +jitter_p10_per_min = 0.08695652173913043 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.08695652173913043 +jitter_p50_per_min = 0.11764705882352941 +jitter_p50_per_min_ci_low = 0.1111111111111111 +jitter_p50_per_min_ci_high = 0.13043478260869565 +jitter_p90_per_min = 0.17391304347826086 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.21052631578947367 +jitter_p95_per_min = 0.21739130434782608 +jitter_p95_per_min_ci_low = 0.17391304347826086 +jitter_p95_per_min_ci_high = 0.2222222222222222 +jitter_p99_per_min = 0.2222222222222222 +jitter_p99_per_min_ci_low = 0.21739130434782608 +jitter_p99_per_min_ci_high = 0.2222222222222222 +jitter_mean_per_min = 0.12561775199014202 +reaction_rate = 0.347 +reaction_rate_ci_low = 0.3174962377721078 +reaction_rate_ci_high = 0.37650376222789217 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 217.52161383285303 +fire_decisiveness_mean = 5.540235152871903 +fire_decisiveness_p50 = 2.043430374317815 +step_correction_mean = 0.3860099234051938 +step_correction_p50 = 0.32420963048934937 + +[cell.spm_25.step_minus_25_at_15min] +shares_per_minute = 25 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.829 +convergence_rate_ci_low = 0.8056637326378017 +convergence_rate_ci_high = 0.8523362673621983 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 660 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 840 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 174.93365500603136 +settled_accuracy_p10 = 0.11546661553269533 +settled_accuracy_p10_ci_low = 0.10745757534244982 +settled_accuracy_p10_ci_high = 0.1200011166914865 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.33333330350717194 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.33333330350717194 +settled_accuracy_mean = 0.25824636209562724 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05555555555555555 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.08695652173913043 +jitter_p95_per_min = 0.10526315789473684 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.11764705882352941 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.13043478260869565 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.012136161016774493 +reaction_rate = 0.079 +reaction_rate_ci_low = 0.062281418289818966 +reaction_rate_ci_high = 0.09571858171018104 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 201.26582278481013 +fire_decisiveness_mean = 3.040808967182597 +fire_decisiveness_p50 = 1.0000744991005597 +step_correction_mean = 0.8118832088723967 +step_correction_p50 = 0.608422040939331 + +[cell.spm_25.step_minus_10_at_15min] +shares_per_minute = 25 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 300 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 360 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 540 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 960 +convergence_p99_secs_ci_low = 840 +convergence_p99_secs_ci_high = 1140 +convergence_mean_secs = 68.4084084084084 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.09870595468138388 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.11111110282606607 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.11111110282606607 +settled_accuracy_p99 = 0.17040193363007883 +settled_accuracy_p99_ci_low = 0.1279660160710816 +settled_accuracy_p99_ci_high = 0.2386355425695761 +settled_accuracy_mean = 0.10813825723498977 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0.043478260869565216 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.043478260869565216 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.08695652173913043 +jitter_p99_per_min_ci_high = 0.13043478260869565 +jitter_mean_per_min = 0.004078225339000557 +reaction_rate = 0.036 +reaction_rate_ci_low = 0.024453620203717528 +reaction_rate_ci_high = 0.04754637979628247 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 181.66666666666666 +fire_decisiveness_mean = 4.258094916757764 +fire_decisiveness_p50 = 2.6003630846405485 +step_correction_mean = 0.9725857145256467 +step_correction_p50 = 1.062527060508728 + +[cell.spm_25.step_minus_5_at_15min] +shares_per_minute = 25 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 300 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 360 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 960 +convergence_p99_secs_ci_low = 900 +convergence_p99_secs_ci_high = 1200 +convergence_mean_secs = 69.42942942942943 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.05263157522942574 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.05263157522942574 +settled_accuracy_p95 = 0.05263157522942574 +settled_accuracy_p95_ci_low = 0.05263157522942574 +settled_accuracy_p95_ci_high = 0.06062452357121173 +settled_accuracy_p99 = 0.1295072521017966 +settled_accuracy_p99_ci_low = 0.10906045258359587 +settled_accuracy_p99_ci_high = 0.16267266492762866 +settled_accuracy_mean = 0.05346252976543116 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.043478260869565216 +jitter_p99_per_min = 0.07692307692307693 +jitter_p99_per_min_ci_low = 0.05263157894736842 +jitter_p99_per_min_ci_high = 0.13043478260869565 +jitter_mean_per_min = 0.0031480466485198167 +reaction_rate = 0.03 +reaction_rate_ci_low = 0.019426894495939234 +reaction_rate_ci_high = 0.040573105504060764 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 178 +fire_decisiveness_mean = 3.734971943624159 +fire_decisiveness_p50 = 2.1428873325719664 +step_correction_mean = 1.4374160170555115 +step_correction_p50 = 1.5971602201461792 + +[cell.spm_25.step_plus_5_at_15min] +shares_per_minute = 25 +scenario = "step_plus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 360 +convergence_p90_secs_ci_low = 300 +convergence_p90_secs_ci_high = 540 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 900 +convergence_p99_secs_ci_low = 840 +convergence_p99_secs_ci_high = 1080 +convergence_mean_secs = 78.36 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.047618983705838724 +settled_accuracy_p90_ci_low = 0.047618983705838724 +settled_accuracy_p90_ci_high = 0.047620134143599335 +settled_accuracy_p95 = 0.07599804630102946 +settled_accuracy_p95_ci_low = 0.06379656732380945 +settled_accuracy_p95_ci_high = 0.09714462626048026 +settled_accuracy_p99 = 0.14688175762347178 +settled_accuracy_p99_ci_low = 0.12000356891358677 +settled_accuracy_p99_ci_high = 0.15809775883219834 +settled_accuracy_mean = 0.05041913106413308 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.043478260869565216 +jitter_p99_per_min = 0.08695652173913043 +jitter_p99_per_min_ci_low = 0.07692307692307693 +jitter_p99_per_min_ci_high = 0.13043478260869565 +jitter_mean_per_min = 0.003759284354180695 +reaction_rate = 0.03 +reaction_rate_ci_low = 0.019426894495939234 +reaction_rate_ci_high = 0.040573105504060764 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 190 +fire_decisiveness_mean = 5.00360896713515 +fire_decisiveness_p50 = 2.599963639232861 +step_correction_mean = 2.166685073574384 +step_correction_p50 = 1.728419542312622 + +[cell.spm_25.step_plus_10_at_15min] +shares_per_minute = 25 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.997 +convergence_rate_ci_low = 0.9936102764714508 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 300 +convergence_p90_secs_ci_low = 300 +convergence_p90_secs_ci_high = 480 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 900 +convergence_p99_secs_ci_low = 660 +convergence_p99_secs_ci_high = 1080 +convergence_mean_secs = 72.03610832497492 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.08328173576714004 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.09090908536290365 +settled_accuracy_p95_ci_low = 0.09090908536290365 +settled_accuracy_p95_ci_high = 0.09863075341841887 +settled_accuracy_p99 = 0.13308975255558186 +settled_accuracy_p99_ci_low = 0.11886615057508942 +settled_accuracy_p99_ci_high = 0.14466395754278327 +settled_accuracy_mean = 0.08842345913622286 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.045454545454545456 +jitter_p99_per_min = 0.09090909090909091 +jitter_p99_per_min_ci_low = 0.08695652173913043 +jitter_p99_per_min_ci_high = 0.13043478260869565 +jitter_mean_per_min = 0.003765604759886243 +reaction_rate = 0.029 +reaction_rate_ci_low = 0.018599249334783574 +reaction_rate_ci_high = 0.03940075066521643 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 167.58620689655172 +fire_decisiveness_mean = 3.8010379388623927 +fire_decisiveness_p50 = 2.5999641907097057 +step_correction_mean = 0.8649776711546141 +step_correction_p50 = 0.906680703163147 + +[cell.spm_25.step_plus_25_at_15min] +shares_per_minute = 25 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.842 +convergence_rate_ci_low = 0.8193931183574558 +convergence_rate_ci_high = 0.8646068816425442 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 720 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 218.90736342042754 +settled_accuracy_p10 = 0.07199760856227477 +settled_accuracy_p10_ci_low = 0.0708928356296733 +settled_accuracy_p10_ci_high = 0.07322940514919318 +settled_accuracy_p50 = 0.20000003221225382 +settled_accuracy_p50_ci_low = 0.20000003221225382 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.22374577831569864 +settled_accuracy_mean = 0.15697880380010112 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.043478260869565216 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.05555555555555555 +jitter_p95_per_min = 0.08695652173913043 +jitter_p95_per_min_ci_low = 0.07692307692307693 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.13636363636363635 +jitter_p99_per_min_ci_low = 0.1111111111111111 +jitter_p99_per_min_ci_high = 0.17391304347826086 +jitter_mean_per_min = 0.009450278953463174 +reaction_rate = 0.082 +reaction_rate_ci_low = 0.06499469842666705 +reaction_rate_ci_high = 0.09900530157333295 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 187.3170731707317 +fire_decisiveness_mean = 3.253337375287998 +fire_decisiveness_p50 = 1.000303600504683 +step_correction_mean = 0.7042650863891695 +step_correction_p50 = 0.6147409677505493 + +[cell.spm_25.step_plus_50_at_15min] +shares_per_minute = 25 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.402 +convergence_rate_ci_low = 0.3716107704342476 +convergence_rate_ci_high = 0.43238922956575243 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 1380 +convergence_p50_secs_ci_low = 1320 +convergence_p50_secs_ci_high = 1380 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1160.8955223880596 +settled_accuracy_p10 = 0.01441328376105977 +settled_accuracy_p10_ci_low = 0.011616454771176232 +settled_accuracy_p10_ci_high = 0.016891300910685247 +settled_accuracy_p50 = 0.061595020200215234 +settled_accuracy_p50_ci_low = 0.056481235332798696 +settled_accuracy_p50_ci_high = 0.06895095693212638 +settled_accuracy_p90 = 0.22190342032401766 +settled_accuracy_p90_ci_low = 0.20533227343085836 +settled_accuracy_p90_ci_high = 0.22666465996252105 +settled_accuracy_p95 = 0.23047331165508267 +settled_accuracy_p95_ci_low = 0.22864061333564067 +settled_accuracy_p95_ci_high = 0.23198675074184383 +settled_accuracy_p99 = 0.33333334824641403 +settled_accuracy_p99_ci_low = 0.2700234281515954 +settled_accuracy_p99_ci_high = 0.3356518699974258 +settled_accuracy_mean = 0.08564212928012502 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.045454545454545456 +jitter_p50_per_min = 0.1111111111111111 +jitter_p50_per_min_ci_low = 0.10526315789473684 +jitter_p50_per_min_ci_high = 0.1111111111111111 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.17647058823529413 +jitter_p95_per_min = 0.17647058823529413 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.23529411764705882 +jitter_p99_per_min = 0.2727272727272727 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.2777777777777778 +jitter_mean_per_min = 0.10268074451267285 +reaction_rate = 0.33 +reaction_rate_ci_low = 0.30085591380742915 +reaction_rate_ci_high = 0.3591440861925709 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 218.72727272727272 +fire_decisiveness_mean = 4.589667544349065 +fire_decisiveness_p50 = 2.091453478020945 +step_correction_mean = 0.38579294415134374 +step_correction_p50 = 0.3280065059661865 + +[cell.spm_30.cold_start_10gh_to_1ph] +shares_per_minute = 30 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.992 +convergence_rate_ci_low = 0.9864785022321837 +convergence_rate_ci_high = 0.9975214977678163 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 900 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 900 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1200 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 678.266129032258 +settled_accuracy_p10 = 0.009286524721127454 +settled_accuracy_p10_ci_low = 0.009286524721127454 +settled_accuracy_p10_ci_high = 0.010395028951099894 +settled_accuracy_p50 = 0.0450540061945508 +settled_accuracy_p50_ci_low = 0.0424707175501291 +settled_accuracy_p50_ci_high = 0.04864788723509528 +settled_accuracy_p90 = 0.10588168264204378 +settled_accuracy_p90_ci_low = 0.10225679730592807 +settled_accuracy_p90_ci_high = 0.11336123406760046 +settled_accuracy_p95 = 0.1248581234710503 +settled_accuracy_p95_ci_low = 0.12014439680236988 +settled_accuracy_p95_ci_high = 0.12851528817116997 +settled_accuracy_p99 = 0.16226755754132183 +settled_accuracy_p99_ci_low = 0.14819885510934339 +settled_accuracy_p99_ci_high = 0.18144418411424446 +settled_accuracy_mean = 0.05324573796632368 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05555555555555555 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.05555555555555555 +jitter_p95_per_min = 0.07142857142857142 +jitter_p95_per_min_ci_low = 0.05555555555555555 +jitter_p95_per_min_ci_high = 0.07692307692307693 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.1111111111111111 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.009228701511659693 +bias_mean = -0.0010773130132541173 +bias_p10 = -0.05971442161629661 +bias_p10_ci_low = -0.06371089226925974 +bias_p10_ci_high = -0.05559643446927602 +bias_p50 = -0.0028262509916261946 +bias_p50_ci_low = -0.006685826624339434 +bias_p50_ci_high = 0.0013171845433633264 +bias_p90 = 0.05749754737408149 +bias_p90_ci_low = 0.05361528894504118 +bias_p90_ci_high = 0.06265680979665382 +bias_p99 = 0.11271037697560683 +bias_p99_ci_low = 0.10235047774924526 +bias_p99_ci_high = 0.11689561426932119 +variance_mean = 0.0031779948890747725 +variance_p10 = 0.0004975016997597342 +variance_p10_ci_low = 0.0004695482502960075 +variance_p10_ci_high = 0.000530814667961068 +variance_p50 = 0.0017011646276491872 +variance_p50_ci_low = 0.0015610048787808705 +variance_p50_ci_high = 0.0018060353991318657 +variance_p90 = 0.00697267053228421 +variance_p90_ci_low = 0.006022270605873179 +variance_p90_ci_high = 0.008158783368749756 +variance_p99 = 0.023044878682690638 +variance_p99_ci_low = 0.019747523652622365 +variance_p99_ci_high = 0.025348773988371275 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.023530314181559486 +ramp_target_overshoot_p50_ci_low = 0.023530314181559486 +ramp_target_overshoot_p50_ci_high = 0.030092084771112804 +ramp_target_overshoot_p90 = 0.12851528817116997 +ramp_target_overshoot_p90_ci_low = 0.1219539873436708 +ramp_target_overshoot_p90_ci_high = 0.14163909778573625 +ramp_target_overshoot_p99 = 0.2577605194655639 +ramp_target_overshoot_p99_ci_low = 0.22206571689279775 +ramp_target_overshoot_p99_ci_high = 0.3039723549057687 +ramp_target_overshoot_mean = 0.04855386154139264 + +[cell.spm_30.stable_1ph] +shares_per_minute = 30 +scenario = "stable_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 300 +convergence_p90_secs_ci_low = 300 +convergence_p90_secs_ci_high = 480 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 660 +convergence_p99_secs = 900 +convergence_p99_secs_ci_low = 840 +convergence_p99_secs_ci_high = 1140 +convergence_mean_secs = 74.28 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0.0222191411796705 +settled_accuracy_p90_ci_low = 0.006572575116797985 +settled_accuracy_p90_ci_high = 0.03578399025418211 +settled_accuracy_p95 = 0.06425901981731486 +settled_accuracy_p95_ci_low = 0.04734812274023481 +settled_accuracy_p95_ci_high = 0.09180378629557784 +settled_accuracy_p99 = 0.16306413976736445 +settled_accuracy_p99_ci_low = 0.1533360387153726 +settled_accuracy_p99_ci_high = 0.18666901189779783 +settled_accuracy_mean = 0.009197857468958289 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.05555555555555555 +jitter_p99_per_min_ci_low = 0.043478260869565216 +jitter_p99_per_min_ci_high = 0.08695652173913043 +jitter_mean_per_min = 0.0020477672351240446 +bias_mean = -0.0007701497148267063 +bias_p10 = -0.05314214672336782 +bias_p10_ci_low = -0.05679562043591947 +bias_p10_ci_high = -0.04781538763816351 +bias_p50 = 0.000655695994355565 +bias_p50_ci_low = -0.0022968326886885202 +bias_p50_ci_high = 0.003177438745597708 +bias_p90 = 0.04859116611609554 +bias_p90_ci_low = 0.04478837871124694 +bias_p90_ci_high = 0.05340068892335938 +bias_p99 = 0.08389091292953617 +bias_p99_ci_low = 0.07702307999957007 +bias_p99_ci_high = 0.09097665540783598 +variance_mean = 0.0006934694404706627 +variance_p10 = 0.00007953603321485568 +variance_p10_ci_low = 0.00007478155722997295 +variance_p10_ci_high = 0.00008434847651898624 +variance_p50 = 0.0002082675418271472 +variance_p50_ci_low = 0.00019287979001238902 +variance_p50_ci_high = 0.00022539673059024766 +variance_p90 = 0.000894568452933274 +variance_p90_ci_low = 0.000821483714306933 +variance_p90_ci_high = 0.0011496902154841386 +variance_p99 = 0.011365740753179797 +variance_p99_ci_low = 0.0072398674981637885 +variance_p99_ci_high = 0.018230723961746048 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1.1619057065419265 +upward_step_magnitude_p90_ci_low = 1.1533360387153726 +upward_step_magnitude_p90_ci_high = 1.1866689251131588 +upward_step_magnitude_p95 = 1.2200031930397908 +upward_step_magnitude_p95_ci_low = 1.200004751307633 +upward_step_magnitude_p95_ci_high = 1.2400024631059545 +upward_step_magnitude_p99 = 1.4333423379997527 +upward_step_magnitude_p99_ci_low = 1.3416695517886157 +upward_step_magnitude_p99_ci_high = 1.477781604440131 +upward_step_magnitude_mean = 1.031968119302843 +fire_decisiveness_mean = 4.483768092480616 +fire_decisiveness_p50 = 3.333330605335611 + +[cell.spm_30.step_minus_50_at_15min] +shares_per_minute = 30 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.357 +convergence_rate_ci_low = 0.3273041564928692 +convergence_rate_ci_high = 0.38669584350713077 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1440 +convergence_p50_secs_ci_low = 1380 +convergence_p50_secs_ci_high = 1440 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1210.5882352941176 +settled_accuracy_p10 = 0.01289282090167343 +settled_accuracy_p10_ci_low = 0.010643667295454406 +settled_accuracy_p10_ci_high = 0.015518253913235247 +settled_accuracy_p50 = 0.0755580722871192 +settled_accuracy_p50_ci_low = 0.06787330195278063 +settled_accuracy_p50_ci_high = 0.08209387174596672 +settled_accuracy_p90 = 0.17286538948206798 +settled_accuracy_p90_ci_low = 0.16200368548464117 +settled_accuracy_p90_ci_high = 0.18956985969079865 +settled_accuracy_p95 = 0.21532583937587146 +settled_accuracy_p95_ci_low = 0.20474478465134371 +settled_accuracy_p95_ci_high = 0.2396136113152525 +settled_accuracy_p99 = 0.6769238316396957 +settled_accuracy_p99_ci_low = 0.6556466975962476 +settled_accuracy_p99_ci_high = 0.6850619894651162 +settled_accuracy_mean = 0.09566671845234062 +jitter_p10_per_min = 0.08695652173913043 +jitter_p10_per_min_ci_low = 0.08695652173913043 +jitter_p10_per_min_ci_high = 0.10526315789473684 +jitter_p50_per_min = 0.13043478260869565 +jitter_p50_per_min_ci_low = 0.1111111111111111 +jitter_p50_per_min_ci_high = 0.13043478260869565 +jitter_p90_per_min = 0.17391304347826086 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.21052631578947367 +jitter_p95_per_min = 0.21052631578947367 +jitter_p95_per_min_ci_low = 0.17391304347826086 +jitter_p95_per_min_ci_high = 0.23529411764705882 +jitter_p99_per_min = 0.23529411764705882 +jitter_p99_per_min_ci_low = 0.1875 +jitter_p99_per_min_ci_high = 0.2608695652173913 +jitter_mean_per_min = 0.13279772717874988 +reaction_rate = 0.308 +reaction_rate_ci_low = 0.27938561100425174 +reaction_rate_ci_high = 0.33661438899574825 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 224.2207792207792 +fire_decisiveness_mean = 5.193056314661683 +fire_decisiveness_p50 = 2.1928348401846023 +step_correction_mean = 0.36606684868985956 +step_correction_p50 = 0.3233291804790497 + +[cell.spm_30.step_minus_25_at_15min] +shares_per_minute = 30 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.858 +convergence_rate_ci_low = 0.8363656482047647 +convergence_rate_ci_high = 0.8796343517952353 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 660 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 900 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 160.41958041958043 +settled_accuracy_p10 = 0.11690972453064274 +settled_accuracy_p10_ci_low = 0.10373867056983754 +settled_accuracy_p10_ci_high = 0.12063650340989085 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.33333330350717194 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.33333330350717194 +settled_accuracy_mean = 0.26603888359126737 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05555555555555555 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.06666666666666667 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.08695652173913043 +jitter_p95_per_min_ci_high = 0.10526315789473684 +jitter_p99_per_min = 0.14285714285714285 +jitter_p99_per_min_ci_low = 0.1111111111111111 +jitter_p99_per_min_ci_high = 0.17391304347826086 +jitter_mean_per_min = 0.010865002706387931 +reaction_rate = 0.071 +reaction_rate_ci_low = 0.05508183131135996 +reaction_rate_ci_high = 0.08691816868864002 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 206.19718309859155 +fire_decisiveness_mean = 2.7991426378935764 +fire_decisiveness_p50 = 1.11090064535977 +step_correction_mean = 0.6878355376317468 +step_correction_p50 = 0.6199944019317627 + +[cell.spm_30.step_minus_10_at_15min] +shares_per_minute = 30 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.998 +convergence_rate_ci_low = 0.995230914663648 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 300 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 300 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 540 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 840 +convergence_p99_secs_ci_low = 720 +convergence_p99_secs_ci_high = 900 +convergence_mean_secs = 61.86372745490982 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.11111110282606607 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.11111110282606607 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.11111110282606607 +settled_accuracy_p99 = 0.15398017082188598 +settled_accuracy_p99_ci_low = 0.11794412739648541 +settled_accuracy_p99_ci_high = 0.18004719244473488 +settled_accuracy_mean = 0.10855096310541223 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.043478260869565216 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.05555555555555555 +jitter_p99_per_min_ci_high = 0.13043478260869565 +jitter_mean_per_min = 0.003307767946221226 +reaction_rate = 0.024 +reaction_rate_ci_low = 0.014513923972474183 +reaction_rate_ci_high = 0.03348607602752582 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 177.5 +fire_decisiveness_mean = 3.7728834877562907 +fire_decisiveness_p50 = 2.333703058439532 +step_correction_mean = 0.6372525120774905 +step_correction_p50 = 0.7939595580101013 + +[cell.spm_30.step_minus_5_at_15min] +shares_per_minute = 30 +scenario = "step_minus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 300 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 300 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 540 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 780 +convergence_p99_secs_ci_low = 660 +convergence_p99_secs_ci_high = 900 +convergence_mean_secs = 58.44 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.05263157522942574 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.05263157522942574 +settled_accuracy_p95 = 0.05263157522942574 +settled_accuracy_p95_ci_low = 0.05263157522942574 +settled_accuracy_p95_ci_high = 0.0554417412758299 +settled_accuracy_p99 = 0.16602761367305674 +settled_accuracy_p99_ci_low = 0.1157885754292689 +settled_accuracy_p99_ci_high = 0.22105822485185356 +settled_accuracy_mean = 0.05406907677911141 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.045454545454545456 +jitter_p99_per_min_ci_low = 0.043478260869565216 +jitter_p99_per_min_ci_high = 0.05 +jitter_mean_per_min = 0.0017332921362949376 +reaction_rate = 0.011 +reaction_rate_ci_low = 0.004535267491999379 +reaction_rate_ci_high = 0.01746473250800062 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 180 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 163.63636363636363 +fire_decisiveness_mean = 3.397158725853267 +fire_decisiveness_p50 = 2.0836822714686356 +step_correction_mean = 1.0713501518422908 +step_correction_p50 = 0.8886323571205139 + +[cell.spm_30.step_plus_5_at_15min] +shares_per_minute = 30 +scenario = "step_plus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 300 +convergence_p90_secs_ci_low = 300 +convergence_p90_secs_ci_high = 420 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 960 +convergence_p99_secs_ci_low = 780 +convergence_p99_secs_ci_high = 1140 +convergence_mean_secs = 71.04 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.047618983705838724 +settled_accuracy_p90_ci_low = 0.047618983705838724 +settled_accuracy_p90_ci_high = 0.048323562921084195 +settled_accuracy_p95 = 0.0741909003185307 +settled_accuracy_p95_ci_low = 0.06193209119290044 +settled_accuracy_p95_ci_high = 0.09260525450942836 +settled_accuracy_p99 = 0.13016103955601288 +settled_accuracy_p99_ci_low = 0.11223185053410356 +settled_accuracy_p99_ci_high = 0.1428617446081859 +settled_accuracy_mean = 0.05020275788053045 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.043478260869565216 +jitter_p99_per_min = 0.08695652173913043 +jitter_p99_per_min_ci_low = 0.047619047619047616 +jitter_p99_per_min_ci_high = 0.09090909090909091 +jitter_mean_per_min = 0.0027413517729555823 +reaction_rate = 0.027 +reaction_rate_ci_low = 0.016953972247699095 +reaction_rate_ci_high = 0.037046027752300904 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 135.55555555555554 +fire_decisiveness_mean = 4.421463761534215 +fire_decisiveness_p50 = 2.9998524947150074 +step_correction_mean = 1.043228723384716 +step_correction_p50 = 1.158152461051941 + +[cell.spm_30.step_plus_10_at_15min] +shares_per_minute = 30 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 300 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 360 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 780 +convergence_p99_secs_ci_low = 660 +convergence_p99_secs_ci_high = 960 +convergence_mean_secs = 52.132132132132135 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.09090908536290365 +settled_accuracy_p95_ci_low = 0.09090908536290365 +settled_accuracy_p95_ci_high = 0.09090908536290365 +settled_accuracy_p99 = 0.12999151926967012 +settled_accuracy_p99_ci_low = 0.12036627774638908 +settled_accuracy_p99_ci_high = 0.13466089310796225 +settled_accuracy_mean = 0.08899336793588514 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.08695652173913043 +jitter_p99_per_min_ci_low = 0.05555555555555555 +jitter_p99_per_min_ci_high = 0.08695652173913043 +jitter_mean_per_min = 0.0022760366512104063 +reaction_rate = 0.022 +reaction_rate_ci_low = 0.012908472867554099 +reaction_rate_ci_high = 0.0310915271324459 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 177.27272727272728 +fire_decisiveness_mean = 3.553947906231098 +fire_decisiveness_p50 = 2.333703058439532 +step_correction_mean = 1.2968148656866767 +step_correction_p50 = 1.114599585533142 + +[cell.spm_30.step_plus_25_at_15min] +shares_per_minute = 30 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.827 +convergence_rate_ci_low = 0.8035559910936717 +convergence_rate_ci_high = 0.8504440089063282 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 660 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 185.94921402660216 +settled_accuracy_p10 = 0.07047547219406036 +settled_accuracy_p10_ci_low = 0.06920469877999313 +settled_accuracy_p10_ci_high = 0.07199578320122368 +settled_accuracy_p50 = 0.20000003221225382 +settled_accuracy_p50_ci_low = 0.20000003221225382 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.20883451126387365 +settled_accuracy_mean = 0.15659017879518877 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05555555555555555 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.05555555555555555 +jitter_p95_per_min = 0.08695652173913043 +jitter_p95_per_min_ci_low = 0.07142857142857142 +jitter_p95_per_min_ci_high = 0.10526315789473684 +jitter_p99_per_min = 0.11764705882352941 +jitter_p99_per_min_ci_low = 0.1111111111111111 +jitter_p99_per_min_ci_high = 0.13043478260869565 +jitter_mean_per_min = 0.009503732647962233 +reaction_rate = 0.084 +reaction_rate_ci_low = 0.06680732509468058 +reaction_rate_ci_high = 0.10119267490531943 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 189.28571428571428 +fire_decisiveness_mean = 2.9903495502816617 +fire_decisiveness_p50 = 1.1116506291019803 +step_correction_mean = 0.6287333273461887 +step_correction_p50 = 0.5958689451217651 + +[cell.spm_30.step_plus_50_at_15min] +shares_per_minute = 30 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.436 +convergence_rate_ci_low = 0.4052646001099709 +convergence_rate_ci_high = 0.4667353998900291 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1320 +convergence_p50_secs_ci_high = 1380 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1117.2935779816514 +settled_accuracy_p10 = 0.011543529806312236 +settled_accuracy_p10_ci_low = 0.009860707948400549 +settled_accuracy_p10_ci_high = 0.013107971629235937 +settled_accuracy_p50 = 0.05900604972981527 +settled_accuracy_p50_ci_low = 0.054022277100371 +settled_accuracy_p50_ci_high = 0.06401818703884465 +settled_accuracy_p90 = 0.2174584871282068 +settled_accuracy_p90_ci_low = 0.1897651646122258 +settled_accuracy_p90_ci_high = 0.2245980648846072 +settled_accuracy_p95 = 0.22962550301448537 +settled_accuracy_p95_ci_low = 0.22797954629218609 +settled_accuracy_p95_ci_high = 0.23094969510653796 +settled_accuracy_p99 = 0.25731488847714856 +settled_accuracy_p99_ci_low = 0.2333331334980513 +settled_accuracy_p99_ci_high = 0.33333334824641403 +settled_accuracy_mean = 0.07976708562580935 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.1111111111111111 +jitter_p50_per_min_ci_low = 0.1111111111111111 +jitter_p50_per_min_ci_high = 0.1111111111111111 +jitter_p90_per_min = 0.17391304347826086 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.18181818181818182 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.17391304347826086 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.2222222222222222 +jitter_p99_per_min_ci_low = 0.19047619047619047 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.0982240915402113 +reaction_rate = 0.353 +reaction_rate_ci_low = 0.32337928316870096 +reaction_rate_ci_high = 0.382620716831299 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 221.643059490085 +fire_decisiveness_mean = 4.263233659533254 +fire_decisiveness_p50 = 2.017915583893096 +step_correction_mean = 0.38450463871780266 +step_correction_p50 = 0.32667720317840576 + +[derived.operational_fitness.spm_6] +score = 0.33460024451722115 +reaction_10_component = 0.383 +reaction_50_component = 0.702 +jitter_component = 0.8278009780688846 +step_safety_component = 0 +convergence_component = 0 +overshoot_component = 0 + +[derived.operational_fitness.spm_8] +score = 0.3215050709834679 +reaction_10_component = 0.282 +reaction_50_component = 0.59 +jitter_component = 0.8808202839338716 +step_safety_component = 0 +convergence_component = 0 +overshoot_component = 0 + +[derived.operational_fitness.spm_10] +score = 0.32880228248530896 +reaction_10_component = 0.201 +reaction_50_component = 0.579 +jitter_component = 0.9188363034077865 +step_safety_component = 0 +convergence_component = 0 +overshoot_component = 0.11043206633362335 + +[derived.operational_fitness.spm_12] +score = 0.33252376952815105 +reaction_10_component = 0.144 +reaction_50_component = 0.52 +jitter_component = 0.952161935963479 +step_safety_component = 0 +convergence_component = 0 +overshoot_component = 0.20883285537281293 + +[derived.operational_fitness.spm_15] +score = 0.3435223938876384 +reaction_10_component = 0.107 +reaction_50_component = 0.463 +jitter_component = 0.971302869642202 +step_safety_component = 0 +convergence_component = 0 +overshoot_component = 0.38346676477087915 + +[derived.operational_fitness.spm_20] +score = 0.42962837445926966 +reaction_10_component = 0.071 +reaction_50_component = 0.384 +jitter_component = 0.9829173451399703 +step_safety_component = 0.3499988298978982 +convergence_component = 0 +overshoot_component = 0.47349330699802517 + +[derived.operational_fitness.spm_25] +score = 0.49068412652410975 +reaction_10_component = 0.036 +reaction_50_component = 0.347 +jitter_component = 0.9913595095361563 +step_safety_component = 0.5679947483985455 +convergence_component = 0 +overshoot_component = 0.6074556204043431 + +[derived.operational_fitness.spm_30] +score = 0.4969158788376115 +reaction_10_component = 0.024 +reaction_50_component = 0.308 +jitter_component = 0.9931741092162532 +step_safety_component = 0.5599936139204185 +convergence_component = 0 +overshoot_component = 0.7422394805344361 + +[derived.decoupling_score.spm_6] +score = 0.702 +score_ci_low = 0.6736513253643137 +score_ci_high = 0.7303486746356862 + +[derived.decoupling_score.spm_8] +score = 0.59 +score_ci_low = 0.5595158559247598 +score_ci_high = 0.6204841440752401 + +[derived.decoupling_score.spm_10] +score = 0.579 +score_ci_low = 0.5483989448809359 +score_ci_high = 0.609601055119064 + +[derived.decoupling_score.spm_12] +score = 0.52 +score_ci_low = 0.48903448111204983 +score_ci_high = 0.5509655188879502 + +[derived.decoupling_score.spm_15] +score = 0.463 +score_ci_low = 0.4320946469102843 +score_ci_high = 0.4939053530897157 + +[derived.decoupling_score.spm_20] +score = 0.384 +score_ci_low = 0.3538552254876571 +score_ci_high = 0.41414477451234294 + +[derived.decoupling_score.spm_25] +score = 0.347 +score_ci_low = 0.3174962377721078 +score_ci_high = 0.37650376222789217 + +[derived.decoupling_score.spm_30] +score = 0.308 +score_ci_low = 0.27938561100425174 +score_ci_high = 0.33661438899574825 + +[derived.reaction_asymmetry.spm_6] +asymmetry_at_5 = -0.030000000000000027 +asymmetry_at_5_ci_low = -0.09016918776869054 +asymmetry_at_5_ci_high = 0.030169187768690486 +asymmetry_at_10 = 0.009000000000000008 +asymmetry_at_10_ci_low = -0.051388668108578284 +asymmetry_at_10_ci_high = 0.0693886681085783 +asymmetry_at_25 = 0.01200000000000001 +asymmetry_at_25_ci_low = -0.04990472102773047 +asymmetry_at_25_ci_high = 0.07390472102773049 +asymmetry_at_50 = -0.05899999999999994 +asymmetry_at_50_ci_low = -0.11704451814281691 +asymmetry_at_50_ci_high = -0.0009554818571829715 +max_abs_asymmetry = 0.05899999999999994 +max_abs_asymmetry_ci_low = 0.0009554818571829715 +max_abs_asymmetry_ci_high = 0.11704451814281691 + +[derived.reaction_asymmetry.spm_8] +asymmetry_at_5 = 0.013999999999999957 +asymmetry_at_5_ci_low = -0.041650089517205946 +asymmetry_at_5_ci_high = 0.06965008951720586 +asymmetry_at_10 = 0.014000000000000012 +asymmetry_at_10_ci_low = -0.04218323916159006 +asymmetry_at_10_ci_high = 0.07018323916159008 +asymmetry_at_25 = 0.02300000000000002 +asymmetry_at_25_ci_low = -0.037227041886938705 +asymmetry_at_25_ci_high = 0.08322704188693875 +asymmetry_at_50 = -0.01200000000000001 +asymmetry_at_50_ci_low = -0.07309505235317271 +asymmetry_at_50_ci_high = 0.049095052353172686 +max_abs_asymmetry = 0.02300000000000002 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.08322704188693875 + +[derived.reaction_asymmetry.spm_10] +asymmetry_at_5 = 0.0020000000000000018 +asymmetry_at_5_ci_low = -0.048133485443297014 +asymmetry_at_5_ci_high = 0.05213348544329702 +asymmetry_at_10 = 0.021999999999999992 +asymmetry_at_10_ci_low = -0.028638580298308874 +asymmetry_at_10_ci_high = 0.07263858029830886 +asymmetry_at_25 = 0.02899999999999997 +asymmetry_at_25_ci_low = -0.027185259082517732 +asymmetry_at_25_ci_high = 0.08518525908251767 +asymmetry_at_50 = -0.03699999999999992 +asymmetry_at_50_ci_low = -0.09848184878762112 +asymmetry_at_50_ci_high = 0.024481848787621274 +max_abs_asymmetry = 0.03699999999999992 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.09848184878762112 + +[derived.reaction_asymmetry.spm_12] +asymmetry_at_5 = -0.009000000000000008 +asymmetry_at_5_ci_low = -0.05319527131994864 +asymmetry_at_5_ci_high = 0.03519527131994862 +asymmetry_at_10 = 0.02400000000000002 +asymmetry_at_10_ci_low = -0.020933239541781584 +asymmetry_at_10_ci_high = 0.06893323954178164 +asymmetry_at_25 = 0.024999999999999994 +asymmetry_at_25_ci_low = -0.027796826637867117 +asymmetry_at_25_ci_high = 0.07779682663786708 +asymmetry_at_50 = -0.0050000000000000044 +asymmetry_at_50_ci_low = -0.06694189117393617 +asymmetry_at_50_ci_high = 0.05694189117393611 +max_abs_asymmetry = 0.024999999999999994 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.07779682663786709 + +[derived.reaction_asymmetry.spm_15] +asymmetry_at_5 = 0.017999999999999988 +asymmetry_at_5_ci_low = -0.018124833050374115 +asymmetry_at_5_ci_high = 0.05412483305037409 +asymmetry_at_10 = 0.018000000000000002 +asymmetry_at_10_ci_low = -0.021657208245955906 +asymmetry_at_10_ci_high = 0.057657208245955896 +asymmetry_at_25 = 0.0030000000000000027 +asymmetry_at_25_ci_low = -0.04616064069033421 +asymmetry_at_25_ci_high = 0.052160640690334215 +asymmetry_at_50 = -0.027000000000000024 +asymmetry_at_50_ci_low = -0.08864075297974483 +asymmetry_at_50_ci_high = 0.03464075297974478 +max_abs_asymmetry = 0.027000000000000024 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.08864075297974483 + +[derived.reaction_asymmetry.spm_20] +asymmetry_at_5 = -0.012000000000000004 +asymmetry_at_5_ci_low = -0.03921859715235805 +asymmetry_at_5_ci_high = 0.015218597152358043 +asymmetry_at_10 = 0.007000000000000006 +asymmetry_at_10_ci_low = -0.0255396158458523 +asymmetry_at_10_ci_high = 0.039539615845852305 +asymmetry_at_25 = -0.010999999999999996 +asymmetry_at_25_ci_low = -0.050306197070844064 +asymmetry_at_25_ci_high = 0.028306197070844086 +asymmetry_at_50 = 0.0050000000000000044 +asymmetry_at_50_ci_low = -0.055361783735626446 +asymmetry_at_50_ci_high = 0.06536178373562646 +max_abs_asymmetry = 0.012000000000000004 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.03921859715235805 + +[derived.reaction_asymmetry.spm_25] +asymmetry_at_5 = 0 +asymmetry_at_5_ci_low = -0.02114621100812153 +asymmetry_at_5_ci_high = 0.02114621100812153 +asymmetry_at_10 = -0.006999999999999996 +asymmetry_at_10_ci_low = -0.028947130461498896 +asymmetry_at_10_ci_high = 0.014947130461498901 +asymmetry_at_25 = 0.0030000000000000027 +asymmetry_at_25_ci_low = -0.030723883283513984 +asymmetry_at_25_ci_high = 0.03672388328351399 +asymmetry_at_50 = -0.01699999999999996 +asymmetry_at_50_ci_low = -0.07564784842046302 +asymmetry_at_50_ci_high = 0.041647848420463096 +max_abs_asymmetry = 0.01699999999999996 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.07564784842046302 + +[derived.reaction_asymmetry.spm_30] +asymmetry_at_5 = 0.016 +asymmetry_at_5_ci_low = -0.0005107602603015259 +asymmetry_at_5_ci_high = 0.03251076026030152 +asymmetry_at_10 = -0.0020000000000000018 +asymmetry_at_10_ci_low = -0.02057760315997172 +asymmetry_at_10_ci_high = 0.016577603159971716 +asymmetry_at_25 = 0.013000000000000012 +asymmetry_at_25_ci_low = -0.02011084359395944 +asymmetry_at_25_ci_high = 0.046110843593959464 +asymmetry_at_50 = 0.044999999999999984 +asymmetry_at_50_ci_low = -0.013235105827047289 +asymmetry_at_50_ci_high = 0.10323510582704726 +max_abs_asymmetry = 0.044999999999999984 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.10323510582704726 + diff --git a/sv2/channels-sv2/sim/baseline_ClassicPartialRetarget-30.md b/sv2/channels-sv2/sim/baseline_ClassicPartialRetarget-30.md new file mode 100644 index 0000000000..17904d9f79 --- /dev/null +++ b/sv2/channels-sv2/sim/baseline_ClassicPartialRetarget-30.md @@ -0,0 +1,227 @@ +# Vardiff baseline characterization — `ClassicPartialRetarget-30` + +*Generated by `cargo run --release --bin generate-baseline` from the vardiff_sim crate. 1000 trials per cell, base seed `0xdeadbeefcafef00d`.* + +## Summary + +Headline per-metric values at each share rate's best and worst cells. ↑ = higher is better; ↓ = lower is better; ↔ = near-zero is better. Where a `(floor: X.X%)` annotation appears, it's the Poisson-noise lower bound on that metric at that share rate — the algorithm cannot do better than this without exotic estimation techniques. + +| Metric | Dir | Best | Worst | +| --- | :-: | --- | --- | +| cold-start convergence rate | ↑ | 98.8% @ SPM=25 | 94.3% @ SPM=6 | +| cold-start p90 time | ↓ | 17m @ SPM=10 | 18m @ SPM=6 | +| settled accuracy p50 (stable) | ↓ | 0.0% @ SPM=10 (floor: 6.7%) | 4.4% @ SPM=6 (floor: 8.7%) | +| settled accuracy p99 (stable) | ↓ | 6.5% @ SPM=25 (floor: 16.3%) | 25.6% @ SPM=6 (floor: 33.3%) | +| stable-load jitter (mean) | ↓ | 0.001/min @ SPM=30 (floor: 0.020/min) | 0.044/min @ SPM=6 (floor: 0.020/min) | +| reaction rate at −50% step | ↑ | 66.8% @ SPM=6 | 27.7% @ SPM=30 | +| reaction rate at +50% step | ↑ | 63.8% @ SPM=6 | 33.4% @ SPM=30 | +| ramp target overshoot p99 (cold start) | ↓ | 5.2% @ SPM=30 (floor: 42.5%) | 40.4% @ SPM=6 (floor: 95.0%) | +| upward step magnitude p95 (stable) | ↓ | 1.048 @ SPM=25 | 1.300 @ SPM=6 | +| operational fitness | ↑ | 0.602 @ SPM=20 | 0.500 @ SPM=6 | +| decoupling score | ↑ | 0.668 @ SPM=6 | 0.277 @ SPM=30 | +| max |reaction asymmetry| | ↓ | 0.018 @ SPM=25 | 0.057 @ SPM=8 | + +## Convergence time (cold start: 10 GH/s → 1 PH/s) + +| share/min | rate | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 94.3% | 4m | 9m | 18m | 23m | 9m48s | +| 8 | 96.2% | 4m | 9m | 18m | 24m | 10m | +| 10 | 97.1% | 4m | 9m | 17m | 24m | 9m41s | +| 12 | 97.5% | 4m | 9m | 18m | 24m | 10m16s | +| 15 | 98.7% | 4m | 10m | 17m | 23m | 10m17s | +| 20 | 98.5% | 5m | 10m | 18m | 23m | 11m02s | +| 25 | 98.8% | 5m | 11m | 18m | 23m | 11m29s | +| 30 | 97.9% | 5m | 11m | 18m | 23m | 11m41s | + +## Settled accuracy (stable load, post-convergence) + +`|final_hashrate / true_hashrate - 1|` at trial end. Smaller is better. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.0% | 4.4% | 14.1% | 25.6% | 5.6% | +| 8 | 0.0% | 1.4% | 10.0% | 21.5% | 3.8% | +| 10 | 0.0% | 0.0% | 7.4% | 18.0% | 2.7% | +| 12 | 0.0% | 0.0% | 6.0% | 15.9% | 2.0% | +| 15 | 0.0% | 0.0% | 5.9% | 12.9% | 1.6% | +| 20 | 0.0% | 0.0% | 4.7% | 7.8% | 0.8% | +| 25 | 0.0% | 0.0% | 0.7% | 6.5% | 0.5% | +| 30 | 0.0% | 0.0% | 4.0% | 6.6% | 0.6% | + +## Steady-state jitter (fires per minute) + +Post-convergence rate of vardiff fires. Smaller is better — ideal is zero under stable load. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.000 | 0.000 | 0.167 | 0.250 | 0.044 | +| 8 | 0.000 | 0.000 | 0.100 | 0.208 | 0.023 | +| 10 | 0.000 | 0.000 | 0.048 | 0.154 | 0.012 | +| 12 | 0.000 | 0.000 | 0.043 | 0.174 | 0.010 | +| 15 | 0.000 | 0.000 | 0.000 | 0.095 | 0.005 | +| 20 | 0.000 | 0.000 | 0.000 | 0.045 | 0.002 | +| 25 | 0.000 | 0.000 | 0.000 | 0.043 | 0.001 | +| 30 | 0.000 | 0.000 | 0.000 | 0.043 | 0.001 | + +## Reaction time to a 50% drop (step at 15 min) + +| share/min | reacted | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 66.8% | 1m | 3m | 5m | 5m | 2m49s | +| 8 | 58.4% | 1m | 3m | 5m | 5m | 2m55s | +| 10 | 57.2% | 1m | 3m | 5m | 5m | 3m06s | +| 12 | 50.3% | 2m | 3m | 5m | 5m | 3m17s | +| 15 | 41.9% | 2m | 4m | 5m | 5m | 3m28s | +| 20 | 40.8% | 2m | 4m | 5m | 5m | 3m49s | +| 25 | 33.0% | 2m | 4m | 5m | 5m | 3m56s | +| 30 | 27.7% | 2m | 4m | 5m | 5m | 3m57s | + +## Reaction sensitivity (P[fire within 5 min of step change]) + +| Δ% | 6 | 8 | 10 | 12 | 15 | 20 | 25 | 30 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| -50% | 0.67 | 0.58 | 0.57 | 0.50 | 0.42 | 0.41 | 0.33 | 0.28 | +| -25% | 0.39 | 0.28 | 0.24 | 0.16 | 0.12 | 0.08 | 0.04 | 0.03 | +| -10% | 0.31 | 0.21 | 0.14 | 0.08 | 0.05 | 0.02 | 0.01 | 0.01 | +| -5% | 0.29 | 0.17 | 0.13 | 0.07 | 0.05 | 0.01 | 0.01 | 0.01 | +| +5% | 0.30 | 0.18 | 0.12 | 0.09 | 0.04 | 0.02 | 0.01 | 0.00 | +| +10% | 0.34 | 0.22 | 0.13 | 0.10 | 0.06 | 0.01 | 0.01 | 0.00 | +| +25% | 0.40 | 0.34 | 0.25 | 0.21 | 0.17 | 0.09 | 0.05 | 0.05 | +| +50% | 0.64 | 0.56 | 0.53 | 0.46 | 0.44 | 0.38 | 0.35 | 0.33 | + +## Estimator bias + +`E[H̃ − H_true] / H_true` averaged over post-settle ticks. Positive = systematic over-estimate. Populated only for algorithms that expose introspection (e.g. ClassicComposed, Parametric, EWMA-60s). + +### Bias — stable load + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | -9.9% | -0.7% | 9.3% | 18.1% | -0.5% | +| 8 | -8.0% | -0.7% | 7.6% | 17.7% | -0.4% | +| 10 | -7.3% | -0.4% | 6.4% | 12.9% | -0.4% | +| 12 | -6.9% | -0.5% | 6.2% | 11.9% | -0.3% | +| 15 | -6.1% | 0.1% | 6.3% | 11.5% | 0.1% | +| 20 | -5.6% | -0.3% | 5.3% | 9.7% | -0.3% | +| 25 | -5.0% | -0.2% | 4.9% | 9.3% | -0.2% | +| 30 | -4.9% | 0.0% | 4.6% | 8.5% | -0.0% | + +### Bias — cold start + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | -14.1% | -3.2% | 9.6% | 22.1% | -2.7% | +| 8 | -13.2% | -3.8% | 7.5% | 18.3% | -3.1% | +| 10 | -12.6% | -4.1% | 6.0% | 15.1% | -3.5% | +| 12 | -11.5% | -3.2% | 6.2% | 14.8% | -2.7% | +| 15 | -10.8% | -2.9% | 5.6% | 13.6% | -2.8% | +| 20 | -9.7% | -2.8% | 4.4% | 10.3% | -2.6% | +| 25 | -8.2% | -2.3% | 4.0% | 10.7% | -2.1% | +| 30 | -7.4% | -2.0% | 3.9% | 9.2% | -1.8% | + +## Estimator variance + +Population variance of `H̃ / H_true` over post-settle ticks (dimensionless). Populated only for algorithms that expose introspection. + +### Variance — stable load + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.001 | 0.004 | 0.061 | 0.121 | 0.019 | +| 8 | 0.000 | 0.001 | 0.028 | 0.077 | 0.009 | +| 10 | 0.000 | 0.001 | 0.014 | 0.048 | 0.005 | +| 12 | 0.000 | 0.001 | 0.008 | 0.044 | 0.003 | +| 15 | 0.000 | 0.000 | 0.003 | 0.022 | 0.002 | +| 20 | 0.000 | 0.000 | 0.001 | 0.011 | 0.001 | +| 25 | 0.000 | 0.000 | 0.001 | 0.011 | 0.001 | +| 30 | 0.000 | 0.000 | 0.001 | 0.004 | 0.000 | + +### Variance — cold start + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.002 | 0.020 | 0.070 | 0.140 | 0.030 | +| 8 | 0.001 | 0.013 | 0.049 | 0.094 | 0.020 | +| 10 | 0.001 | 0.010 | 0.038 | 0.082 | 0.016 | +| 12 | 0.001 | 0.009 | 0.031 | 0.057 | 0.013 | +| 15 | 0.001 | 0.006 | 0.022 | 0.044 | 0.009 | +| 20 | 0.001 | 0.005 | 0.016 | 0.031 | 0.007 | +| 25 | 0.001 | 0.004 | 0.014 | 0.026 | 0.006 | +| 30 | 0.001 | 0.004 | 0.012 | 0.024 | 0.005 | + +## Ramp target overshoot (cold start) + +`max(new_hashrate on fires) / H_true − 1`: how far the algorithm's actual *target* (not its belief) climbs past truth during the cold-start ramp. Reads `new_hashrate` (the actual target the algorithm set), so it's unaffected by estimator-belief noise. Works for any algorithm that fires, including those without introspection. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.0% | 1.2% | 21.5% | 40.4% | 6.7% | +| 8 | 0.0% | 0.0% | 14.5% | 37.9% | 4.3% | +| 10 | 0.0% | 0.0% | 10.1% | 26.7% | 2.7% | +| 12 | 0.0% | 0.0% | 8.0% | 19.7% | 2.1% | +| 15 | 0.0% | 0.0% | 4.3% | 18.5% | 1.3% | +| 20 | 0.0% | 0.0% | 1.1% | 11.7% | 0.6% | +| 25 | 0.0% | 0.0% | 0.0% | 7.7% | 0.3% | +| 30 | 0.0% | 0.0% | 0.0% | 5.2% | 0.2% | + +## Upward step magnitude (stable load) + +`new_hashrate / old_hashrate` for upward difficulty adjustments during steady-state. Per-trial p95 of ratios, then distribution across trials. Values near 1.0 indicate gentle retargeting; values >> 1.0 indicate aggressive jumps. + +| share/min | p50 | p90 | p95 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 1.060 | 1.250 | 1.300 | 1.400 | 1.100 | +| 8 | 1.000 | 1.188 | 1.225 | 1.338 | 1.060 | +| 10 | 1.000 | 1.150 | 1.180 | 1.240 | 1.038 | +| 12 | 1.000 | 1.075 | 1.119 | 1.225 | 1.024 | +| 15 | 1.000 | 1.060 | 1.090 | 1.180 | 1.017 | +| 20 | 1.000 | 1.047 | 1.057 | 1.093 | 1.008 | +| 25 | 1.000 | 1.000 | 1.048 | 1.062 | 1.004 | +| 30 | 1.000 | 1.000 | 1.048 | 1.064 | 1.004 | + +## Operational fitness (per share rate) + +`0.15×react(-10%) + 0.1×react(-50%) + 0.25×jitter + 0.25×step_safety + 0.15×convergence + 0.1×overshoot`. Higher is better. + +| share/min | fitness | react-10% | react-50% | jitter | step-safe | conv | overshoot | +| --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.500 | 0.313 | 0.668 | 0.852 | 0.400 | 0.094 | 0.596 | +| 8 | 0.534 | 0.206 | 0.584 | 0.922 | 0.550 | 0.096 | 0.621 | +| 10 | 0.566 | 0.142 | 0.572 | 0.960 | 0.640 | 0.097 | 0.733 | +| 12 | 0.589 | 0.077 | 0.503 | 0.967 | 0.762 | 0.097 | 0.803 | +| 15 | 0.582 | 0.053 | 0.419 | 0.984 | 0.820 | 0.000 | 0.815 | +| 20 | 0.602 | 0.020 | 0.408 | 0.995 | 0.886 | 0.000 | 0.883 | +| 25 | 0.602 | 0.011 | 0.330 | 0.997 | 0.904 | 0.000 | 0.923 | +| 30 | 0.599 | 0.007 | 0.277 | 0.997 | 0.904 | 0.000 | 0.948 | + +## Decoupling score (per share rate) + +`reaction_rate(Step−50) × clamp(1 − jitter_p50 / J_max, 0, 1)` where `J_max = 0.50` fires/min. Higher is better. Score of 1.0 = perfect decoupling between reactivity and jitter. + +| share/min | decoupling score | +| --- | --- | +| 6 | 0.668 | +| 8 | 0.584 | +| 10 | 0.572 | +| 12 | 0.503 | +| 15 | 0.419 | +| 20 | 0.408 | +| 25 | 0.330 | +| 30 | 0.277 | + +## Reaction asymmetry (per share rate) + +`reaction_rate(+δ%) − reaction_rate(−δ%)`. Positive = responds faster to up-steps; negative = responds faster to down-steps; near zero = symmetric. + +| share/min | δ=5% | δ=10% | δ=25% | δ=50% | +| --- | --- | --- | --- | --- | +| 6 | +0.01 | +0.02 | +0.01 | -0.03 | +| 8 | +0.02 | +0.01 | +0.06 | -0.02 | +| 10 | -0.00 | -0.01 | +0.01 | -0.04 | +| 12 | +0.01 | +0.02 | +0.05 | -0.05 | +| 15 | -0.01 | +0.01 | +0.05 | +0.02 | +| 20 | +0.01 | -0.01 | +0.01 | -0.03 | +| 25 | +0.01 | -0.00 | +0.01 | +0.02 | +| 30 | -0.00 | -0.00 | +0.01 | +0.06 | + diff --git a/sv2/channels-sv2/sim/baseline_ClassicPartialRetarget-30.toml b/sv2/channels-sv2/sim/baseline_ClassicPartialRetarget-30.toml new file mode 100644 index 0000000000..41f8dfb971 --- /dev/null +++ b/sv2/channels-sv2/sim/baseline_ClassicPartialRetarget-30.toml @@ -0,0 +1,6582 @@ +# Vardiff baseline characterization. Regenerate with +# `cargo run --release --bin generate-baseline` from the sim crate. + +[meta] +algorithm = "ClassicPartialRetarget-30" +trial_count = 1000 +base_seed = 16045690984503111693 +quiet_window_secs = 300 +settle_buffer_secs = 120 +min_settled_window_secs = 600 +react_window_secs = 300 +step_event_at_secs = 900 +trial_duration_secs = 1800 + +[cell.spm_6.cold_start_10gh_to_1ph] +shares_per_minute = 6 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.943 +convergence_rate_ci_low = 0.9286302455970883 +convergence_rate_ci_high = 0.9573697544029116 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 588.356309650053 +settled_accuracy_p10 = 0.014325192513523044 +settled_accuracy_p10_ci_low = 0.011730965124126858 +settled_accuracy_p10_ci_high = 0.017176379746517756 +settled_accuracy_p50 = 0.07655041107199634 +settled_accuracy_p50_ci_low = 0.07146664612240627 +settled_accuracy_p50_ci_high = 0.08287401230011537 +settled_accuracy_p90 = 0.1637764332591265 +settled_accuracy_p90_ci_low = 0.15598777840196476 +settled_accuracy_p90_ci_high = 0.17279512650054585 +settled_accuracy_p95 = 0.19924004579240506 +settled_accuracy_p95_ci_low = 0.18583317098580443 +settled_accuracy_p95_ci_high = 0.22332608848397784 +settled_accuracy_p99 = 0.30750402602857585 +settled_accuracy_p99_ci_low = 0.2731769021219219 +settled_accuracy_p99_ci_high = 0.35893746802682025 +settled_accuracy_mean = 0.08601592922860177 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.058823529411764705 +jitter_p50_per_min_ci_low = 0.05263157894736842 +jitter_p50_per_min_ci_high = 0.07142857142857142 +jitter_p90_per_min = 0.2 +jitter_p90_per_min_ci_low = 0.19047619047619047 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.2222222222222222 +jitter_p95_per_min_ci_low = 0.21052631578947367 +jitter_p95_per_min_ci_high = 0.24 +jitter_p99_per_min = 0.3 +jitter_p99_per_min_ci_low = 0.2727272727272727 +jitter_p99_per_min_ci_high = 0.3181818181818182 +jitter_mean_per_min = 0.0790772478871563 +bias_mean = -0.02672463143625978 +bias_p10 = -0.14064638813607946 +bias_p10_ci_low = -0.15159289654643268 +bias_p10_ci_high = -0.13255937079773783 +bias_p50 = -0.03179561151750454 +bias_p50_ci_low = -0.03957955109389764 +bias_p50_ci_high = -0.024693123611396167 +bias_p90 = 0.09590058823357174 +bias_p90_ci_low = 0.08319193789841717 +bias_p90_ci_high = 0.1137594686678935 +bias_p99 = 0.22134621096408458 +bias_p99_ci_low = 0.2014063446748245 +bias_p99_ci_high = 0.23458846772515174 +variance_mean = 0.030083064306697136 +variance_p10 = 0.0017339995664323816 +variance_p10_ci_low = 0.001388411465953673 +variance_p10_ci_high = 0.002035129724008068 +variance_p50 = 0.019693748697328255 +variance_p50_ci_low = 0.01698262374479444 +variance_p50_ci_high = 0.022039923288778126 +variance_p90 = 0.0702153515140781 +variance_p90_ci_low = 0.06754690471765146 +variance_p90_ci_high = 0.07816474860385311 +variance_p99 = 0.1398358185157937 +variance_p99_ci_low = 0.11804534321930193 +variance_p99_ci_high = 0.15757140639980136 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.011553596394267451 +ramp_target_overshoot_p50_ci_low = 0.001983201174727167 +ramp_target_overshoot_p50_ci_high = 0.020021594290538847 +ramp_target_overshoot_p90 = 0.21458576281405195 +ramp_target_overshoot_p90_ci_low = 0.19730415636741316 +ramp_target_overshoot_p90_ci_high = 0.22594232758105215 +ramp_target_overshoot_p99 = 0.4044073478569892 +ramp_target_overshoot_p99_ci_low = 0.3389103037004968 +ramp_target_overshoot_p99_ci_high = 0.46643003186127574 +ramp_target_overshoot_mean = 0.06675574238812666 + +[cell.spm_6.stable_1ph] +shares_per_minute = 6 +scenario = "stable_1ph" +convergence_rate = 0.971 +convergence_rate_ci_low = 0.9605992493347836 +convergence_rate_ci_high = 0.9814007506652164 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 300 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 960 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 368.83625128733263 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0.04353902357004258 +settled_accuracy_p50_ci_low = 0.038124814569817755 +settled_accuracy_p50_ci_high = 0.04732349378682632 +settled_accuracy_p90 = 0.1411403447020001 +settled_accuracy_p90_ci_low = 0.12855904315106725 +settled_accuracy_p90_ci_high = 0.15415859207212113 +settled_accuracy_p95 = 0.18789012480302714 +settled_accuracy_p95_ci_low = 0.16830104714659477 +settled_accuracy_p95_ci_high = 0.20000005368709195 +settled_accuracy_p99 = 0.2559097911900958 +settled_accuracy_p99_ci_low = 0.23886306577051286 +settled_accuracy_p99_ci_high = 0.29861210143290173 +settled_accuracy_mean = 0.0557394833194541 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.14814814814814814 +jitter_p90_per_min_ci_high = 0.17647058823529413 +jitter_p95_per_min = 0.20833333333333334 +jitter_p95_per_min_ci_low = 0.19047619047619047 +jitter_p95_per_min_ci_high = 0.2222222222222222 +jitter_p99_per_min = 0.25 +jitter_p99_per_min_ci_low = 0.23529411764705882 +jitter_p99_per_min_ci_high = 0.2777777777777778 +jitter_mean_per_min = 0.04436545617383231 +bias_mean = -0.005055346914879567 +bias_p10 = -0.09888723294428994 +bias_p10_ci_low = -0.10636454152094171 +bias_p10_ci_high = -0.09315166784655238 +bias_p50 = -0.007075527802657015 +bias_p50_ci_low = -0.012390037753999238 +bias_p50_ci_high = -0.0024702243352927858 +bias_p90 = 0.09256609708394355 +bias_p90_ci_low = 0.08607785661801788 +bias_p90_ci_high = 0.10259981543861266 +bias_p99 = 0.18145195108234216 +bias_p99_ci_low = 0.1688558573247731 +bias_p99_ci_high = 0.21444521565873473 +variance_mean = 0.019199977213579418 +variance_p10 = 0.0005125690752566378 +variance_p10_ci_low = 0.0004613878413172271 +variance_p10_ci_high = 0.0005601892286817799 +variance_p50 = 0.0041804579737092845 +variance_p50_ci_low = 0.003057269007536084 +variance_p50_ci_high = 0.004930091950742017 +variance_p90 = 0.06111834092039182 +variance_p90_ci_low = 0.05649699576579343 +variance_p90_ci_high = 0.0677204013151225 +variance_p99 = 0.12132760691297656 +variance_p99_ci_low = 0.10631780423693972 +variance_p99_ci_high = 0.14350930122682573 +upward_step_magnitude_p50 = 1.06000013319651 +upward_step_magnitude_p50_ci_low = 1.05625011366564 +upward_step_magnitude_p50_ci_high = 1.0642859402899583 +upward_step_magnitude_p90 = 1.2500005778818877 +upward_step_magnitude_p90_ci_low = 1.2500005530949794 +upward_step_magnitude_p90_ci_high = 1.2500006208120509 +upward_step_magnitude_p95 = 1.3000000166738281 +upward_step_magnitude_p95_ci_low = 1.2999999664455653 +upward_step_magnitude_p95_ci_high = 1.3000000691341569 +upward_step_magnitude_p99 = 1.4000007515987285 +upward_step_magnitude_p99_ci_low = 1.350000774599742 +upward_step_magnitude_p99_ci_high = 1.4500000559240536 +upward_step_magnitude_mean = 1.0998233079048694 +fire_decisiveness_mean = 8.562495240920457 +fire_decisiveness_p50 = 5.833276011177926 + +[cell.spm_6.step_minus_50_at_15min] +shares_per_minute = 6 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.647 +convergence_rate_ci_low = 0.617379283168701 +convergence_rate_ci_high = 0.676620716831299 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 120 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 420 +convergence_p50_secs_ci_low = 420 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 589.8918083462133 +settled_accuracy_p10 = 0.04684708795509285 +settled_accuracy_p10_ci_low = 0.03955893101215402 +settled_accuracy_p10_ci_high = 0.057066560115684895 +settled_accuracy_p50 = 0.23685704758172865 +settled_accuracy_p50_ci_low = 0.21709335265889695 +settled_accuracy_p50_ci_high = 0.250700130010004 +settled_accuracy_p90 = 0.5463638034647098 +settled_accuracy_p90_ci_low = 0.5253636948154576 +settled_accuracy_p90_ci_high = 0.6118650083708244 +settled_accuracy_p95 = 0.6930770696323596 +settled_accuracy_p95_ci_low = 0.6462501143367285 +settled_accuracy_p95_ci_high = 0.714285752633637 +settled_accuracy_p99 = 0.9066668697828311 +settled_accuracy_p99_ci_low = 0.9000000067108864 +settled_accuracy_p99_ci_high = 1 +settled_accuracy_mean = 0.2747360752628602 +jitter_p10_per_min = 0.09523809523809523 +jitter_p10_per_min_ci_low = 0.08695652173913043 +jitter_p10_per_min_ci_high = 0.11538461538461539 +jitter_p50_per_min = 0.19047619047619047 +jitter_p50_per_min_ci_low = 0.18518518518518517 +jitter_p50_per_min_ci_high = 0.2 +jitter_p90_per_min = 0.2857142857142857 +jitter_p90_per_min_ci_low = 0.2692307692307692 +jitter_p90_per_min_ci_high = 0.3 +jitter_p95_per_min = 0.3157894736842105 +jitter_p95_per_min_ci_low = 0.30434782608695654 +jitter_p95_per_min_ci_high = 0.3333333333333333 +jitter_p99_per_min = 0.4090909090909091 +jitter_p99_per_min_ci_low = 0.34782608695652173 +jitter_p99_per_min_ci_high = 0.4117647058823529 +jitter_mean_per_min = 0.1922641920324326 +reaction_rate = 0.668 +reaction_rate_ci_low = 0.638811394661615 +reaction_rate_ci_high = 0.6971886053383851 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 169.1317365269461 +fire_decisiveness_mean = 9.02561525745943 +fire_decisiveness_p50 = 6.666666666666671 +step_correction_mean = 0.15301132885861896 +step_correction_p50 = 0.11136343330144882 + +[cell.spm_6.step_minus_25_at_15min] +shares_per_minute = 6 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.872 +convergence_rate_ci_low = 0.8512928991502915 +convergence_rate_ci_high = 0.8927071008497085 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 300 +convergence_p50_secs_ci_high = 360 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 418.9678899082569 +settled_accuracy_p10 = 0.04104637571425074 +settled_accuracy_p10_ci_low = 0.029705604153805965 +settled_accuracy_p10_ci_high = 0.047427175922127196 +settled_accuracy_p50 = 0.20556241209298132 +settled_accuracy_p50_ci_low = 0.19576970779279756 +settled_accuracy_p50_ci_high = 0.22156519165262378 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.34055573834021535 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.3585762577252367 +settled_accuracy_p99 = 0.44780017593259624 +settled_accuracy_p99_ci_low = 0.4250001632982343 +settled_accuracy_p99_ci_high = 0.5036334975591612 +settled_accuracy_mean = 0.20473037126144392 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.045454545454545456 +jitter_p50_per_min_ci_low = 0.043478260869565216 +jitter_p50_per_min_ci_high = 0.05555555555555555 +jitter_p90_per_min = 0.18518518518518517 +jitter_p90_per_min_ci_low = 0.17647058823529413 +jitter_p90_per_min_ci_high = 0.19047619047619047 +jitter_p95_per_min = 0.21739130434782608 +jitter_p95_per_min_ci_low = 0.20833333333333334 +jitter_p95_per_min_ci_high = 0.22727272727272727 +jitter_p99_per_min = 0.28 +jitter_p99_per_min_ci_low = 0.25 +jitter_p99_per_min_ci_high = 0.3333333333333333 +jitter_mean_per_min = 0.07166319099903704 +reaction_rate = 0.39 +reaction_rate_ci_low = 0.35976894576763824 +reaction_rate_ci_high = 0.4202310542323618 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 170.6153846153846 +fire_decisiveness_mean = 7.857580182255091 +fire_decisiveness_p50 = 5.000045634028108 +step_correction_mean = 0.37995595024564327 +step_correction_p50 = 0.22999981045722961 + +[cell.spm_6.step_minus_10_at_15min] +shares_per_minute = 6 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.951 +convergence_rate_ci_low = 0.9376203617986135 +convergence_rate_ci_high = 0.9643796382013864 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 300 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 375.0788643533123 +settled_accuracy_p10 = 0.020833723248262936 +settled_accuracy_p10_ci_low = 0.018247944138581218 +settled_accuracy_p10_ci_high = 0.023589213219402327 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.18518556905893613 +settled_accuracy_p90_ci_low = 0.17171756563340135 +settled_accuracy_p90_ci_high = 0.19770375835738374 +settled_accuracy_p95 = 0.22222220565213235 +settled_accuracy_p95_ci_low = 0.20861155860710334 +settled_accuracy_p95_ci_high = 0.2396130204618656 +settled_accuracy_p99 = 0.34039174426750485 +settled_accuracy_p99_ci_low = 0.2714287365376822 +settled_accuracy_p99_ci_high = 0.40784450428732444 +settled_accuracy_mean = 0.10282818773630212 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.17391304347826086 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.18518518518518517 +jitter_p95_per_min = 0.21739130434782608 +jitter_p95_per_min_ci_low = 0.2 +jitter_p95_per_min_ci_high = 0.22727272727272727 +jitter_p99_per_min = 0.2777777777777778 +jitter_p99_per_min_ci_low = 0.26666666666666666 +jitter_p99_per_min_ci_high = 0.3333333333333333 +jitter_mean_per_min = 0.04889158664176687 +reaction_rate = 0.313 +reaction_rate_ci_low = 0.2842586867105903 +reaction_rate_ci_high = 0.3417413132894097 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 167.73162939297126 +fire_decisiveness_mean = 8.43893513048512 +fire_decisiveness_p50 = 6.6666594186590515 +step_correction_mean = 0.49398011652131874 +step_correction_p50 = 0.3963779807090759 + +[cell.spm_6.step_minus_5_at_15min] +shares_per_minute = 6 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.96 +convergence_rate_ci_low = 0.9478543242262935 +convergence_rate_ci_high = 0.9721456757737065 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 300 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 362.9375 +settled_accuracy_p10 = 0.014199670629692407 +settled_accuracy_p10_ci_low = 0.01052634330224922 +settled_accuracy_p10_ci_high = 0.019593174760031085 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.14861032022725462 +settled_accuracy_p90_ci_low = 0.1375006242890433 +settled_accuracy_p90_ci_high = 0.16042119783954667 +settled_accuracy_p95 = 0.19733785491670974 +settled_accuracy_p95_ci_low = 0.17894790677914685 +settled_accuracy_p95_ci_high = 0.2128140067926887 +settled_accuracy_p99 = 0.29446486790891524 +settled_accuracy_p99_ci_low = 0.26846011222156263 +settled_accuracy_p99_ci_high = 0.328572701116967 +settled_accuracy_mean = 0.07505672521597244 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.15384615384615385 +jitter_p90_per_min_ci_low = 0.13636363636363635 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.1875 +jitter_p95_per_min_ci_low = 0.17647058823529413 +jitter_p95_per_min_ci_high = 0.20833333333333334 +jitter_p99_per_min = 0.2727272727272727 +jitter_p99_per_min_ci_low = 0.23076923076923078 +jitter_p99_per_min_ci_high = 0.29411764705882354 +jitter_mean_per_min = 0.04109312184859635 +reaction_rate = 0.291 +reaction_rate_ci_low = 0.26284693497325734 +reaction_rate_ci_high = 0.3191530650267426 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 165.56701030927834 +fire_decisiveness_mean = 8.2907421795791 +fire_decisiveness_p50 = 5.8333672872158076 +step_correction_mean = 0.4422849255820943 +step_correction_p50 = 0.5256184935569763 + +[cell.spm_6.step_plus_5_at_15min] +shares_per_minute = 6 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.958 +convergence_rate_ci_low = 0.9455673567733969 +convergence_rate_ci_high = 0.970432643226603 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 300 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 363.25678496868477 +settled_accuracy_p10 = 0.015621155221025251 +settled_accuracy_p10_ci_low = 0.011110672240409736 +settled_accuracy_p10_ci_high = 0.01904805365743978 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.14439904902258172 +settled_accuracy_p90_ci_low = 0.13797391804204695 +settled_accuracy_p90_ci_high = 0.15551055213470755 +settled_accuracy_p95 = 0.18679939139285928 +settled_accuracy_p95_ci_low = 0.1636360301256189 +settled_accuracy_p95_ci_high = 0.1984197075612778 +settled_accuracy_p99 = 0.2642472449252593 +settled_accuracy_p99_ci_low = 0.23765998914242403 +settled_accuracy_p99_ci_high = 0.2977667830014895 +settled_accuracy_mean = 0.07176298719601122 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.14814814814814814 +jitter_p90_per_min_ci_high = 0.17647058823529413 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.18518518518518517 +jitter_p95_per_min_ci_high = 0.21739130434782608 +jitter_p99_per_min = 0.2727272727272727 +jitter_p99_per_min_ci_low = 0.25 +jitter_p99_per_min_ci_high = 0.3076923076923077 +jitter_mean_per_min = 0.04547262536402174 +reaction_rate = 0.298 +reaction_rate_ci_low = 0.26965132536431374 +reaction_rate_ci_high = 0.32634867463568623 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 159.46308724832215 +fire_decisiveness_mean = 8.339872810619324 +fire_decisiveness_p50 = 5.370404516869598 +step_correction_mean = 67.58891807259029 +step_correction_p50 = 0.4168742299079895 + +[cell.spm_6.step_plus_10_at_15min] +shares_per_minute = 6 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.958 +convergence_rate_ci_low = 0.9455673567733969 +convergence_rate_ci_high = 0.970432643226603 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 300 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 960 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 365.5114822546973 +settled_accuracy_p10 = 0.023514702362726236 +settled_accuracy_p10_ci_low = 0.020474792781550732 +settled_accuracy_p10_ci_high = 0.027272371762126935 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.15442372183692588 +settled_accuracy_p90_ci_low = 0.14545456098386966 +settled_accuracy_p90_ci_high = 0.1660896219373268 +settled_accuracy_p95 = 0.19863937385720465 +settled_accuracy_p95_ci_low = 0.18369886617131792 +settled_accuracy_p95_ci_high = 0.22282406672768684 +settled_accuracy_p99 = 0.27922534650594943 +settled_accuracy_p99_ci_low = 0.2541363311717568 +settled_accuracy_p99_ci_high = 0.29623774889534227 +settled_accuracy_mean = 0.08858105314186271 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.17647058823529413 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.1875 +jitter_p95_per_min = 0.2222222222222222 +jitter_p95_per_min_ci_low = 0.2 +jitter_p95_per_min_ci_high = 0.24 +jitter_p99_per_min = 0.29411764705882354 +jitter_p99_per_min_ci_low = 0.2692307692307692 +jitter_p99_per_min_ci_high = 0.34782608695652173 +jitter_mean_per_min = 0.05557393410472076 +reaction_rate = 0.337 +reaction_rate_ci_low = 0.3077026873314292 +reaction_rate_ci_high = 0.36629731266857085 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 157.74480712166172 +fire_decisiveness_mean = 8.752035799365622 +fire_decisiveness_p50 = 6.212074118181366 +step_correction_mean = 0.7547304436166492 +step_correction_p50 = 0.36190471053123474 + +[cell.spm_6.step_plus_25_at_15min] +shares_per_minute = 6 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.893 +convergence_rate_ci_low = 0.873840962404129 +convergence_rate_ci_high = 0.912159037595871 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 300 +convergence_p50_secs_ci_high = 360 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 464.6808510638298 +settled_accuracy_p10 = 0.027674298894926452 +settled_accuracy_p10_ci_low = 0.022350794450816558 +settled_accuracy_p10_ci_high = 0.03157853143475742 +settled_accuracy_p50 = 0.13721228283303766 +settled_accuracy_p50_ci_low = 0.12350113698518639 +settled_accuracy_p50_ci_high = 0.14864527071500255 +settled_accuracy_p90 = 0.203519704128301 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.21127958239175126 +settled_accuracy_p95 = 0.2400000279172867 +settled_accuracy_p95_ci_low = 0.2281650847944633 +settled_accuracy_p95_ci_high = 0.24571432068758992 +settled_accuracy_p99 = 0.31165699189518214 +settled_accuracy_p99_ci_low = 0.28694922683074586 +settled_accuracy_p99_ci_high = 0.34626798490662636 +settled_accuracy_mean = 0.13259244374613147 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.05555555555555555 +jitter_p50_per_min_ci_low = 0.043478260869565216 +jitter_p50_per_min_ci_high = 0.08333333333333333 +jitter_p90_per_min = 0.20833333333333334 +jitter_p90_per_min_ci_low = 0.1875 +jitter_p90_per_min_ci_high = 0.21739130434782608 +jitter_p95_per_min = 0.24 +jitter_p95_per_min_ci_low = 0.2222222222222222 +jitter_p95_per_min_ci_high = 0.2608695652173913 +jitter_p99_per_min = 0.3076923076923077 +jitter_p99_per_min_ci_low = 0.29411764705882354 +jitter_p99_per_min_ci_high = 0.3181818181818182 +jitter_mean_per_min = 0.08083714798383901 +reaction_rate = 0.403 +reaction_rate_ci_low = 0.37259844764489813 +reaction_rate_ci_high = 0.4334015523551019 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 155.88089330024815 +fire_decisiveness_mean = 9.27916761819639 +fire_decisiveness_p50 = 6.428556819843557 +step_correction_mean = 0.2102434424493952 +step_correction_p50 = 0.2014136016368866 + +[cell.spm_6.step_plus_50_at_15min] +shares_per_minute = 6 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.757 +convergence_rate_ci_low = 0.7304168067832324 +convergence_rate_ci_high = 0.7835831932167676 +convergence_p10_secs = 120 +convergence_p10_secs_ci_low = 120 +convergence_p10_secs_ci_high = 180 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 641.3738441215323 +settled_accuracy_p10 = 0.02271975043376928 +settled_accuracy_p10_ci_low = 0.01901310421353286 +settled_accuracy_p10_ci_high = 0.0262707935694676 +settled_accuracy_p50 = 0.11573388776588422 +settled_accuracy_p50_ci_low = 0.11002113392325308 +settled_accuracy_p50_ci_high = 0.12236406451005022 +settled_accuracy_p90 = 0.2634085969675205 +settled_accuracy_p90_ci_low = 0.2583330641522258 +settled_accuracy_p90_ci_high = 0.27696798755103746 +settled_accuracy_p95 = 0.29885053254462224 +settled_accuracy_p95_ci_low = 0.29166643924218527 +settled_accuracy_p95_ci_high = 0.3022987201623927 +settled_accuracy_p99 = 0.33333334824641403 +settled_accuracy_p99_ci_low = 0.33333334824641403 +settled_accuracy_p99_ci_high = 0.342183709887131 +settled_accuracy_mean = 0.13000666176264922 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.045454545454545456 +jitter_p50_per_min = 0.15789473684210525 +jitter_p50_per_min_ci_low = 0.14814814814814814 +jitter_p50_per_min_ci_high = 0.16666666666666666 +jitter_p90_per_min = 0.25 +jitter_p90_per_min_ci_low = 0.23809523809523808 +jitter_p90_per_min_ci_high = 0.2608695652173913 +jitter_p95_per_min = 0.2727272727272727 +jitter_p95_per_min_ci_low = 0.2631578947368421 +jitter_p95_per_min_ci_high = 0.2857142857142857 +jitter_p99_per_min = 0.3181818181818182 +jitter_p99_per_min_ci_low = 0.3 +jitter_p99_per_min_ci_high = 0.3333333333333333 +jitter_mean_per_min = 0.15004111567982636 +reaction_rate = 0.638 +reaction_rate_ci_low = 0.6082134162818225 +reaction_rate_ci_high = 0.6677865837181776 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 159.21630094043888 +fire_decisiveness_mean = 12.633561900582105 +fire_decisiveness_p50 = 6.666667785147752 +step_correction_mean = 0.17000108798469496 +step_correction_p50 = 0.11764760315418243 + +[cell.spm_8.cold_start_10gh_to_1ph] +shares_per_minute = 8 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.962 +convergence_rate_ci_low = 0.9501495346251718 +convergence_rate_ci_high = 0.9738504653748281 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 600.4365904365904 +settled_accuracy_p10 = 0.012495402203895445 +settled_accuracy_p10_ci_low = 0.00983889778789715 +settled_accuracy_p10_ci_high = 0.015314511399480812 +settled_accuracy_p50 = 0.06489024580031044 +settled_accuracy_p50_ci_low = 0.06055306697243257 +settled_accuracy_p50_ci_high = 0.06986462330015764 +settled_accuracy_p90 = 0.1516744232211169 +settled_accuracy_p90_ci_low = 0.14523801199114617 +settled_accuracy_p90_ci_high = 0.15725298183141567 +settled_accuracy_p95 = 0.17570456422825043 +settled_accuracy_p95_ci_low = 0.1646156967232285 +settled_accuracy_p95_ci_high = 0.18334839815501625 +settled_accuracy_p99 = 0.2486308952705094 +settled_accuracy_p99_ci_low = 0.22622324528941062 +settled_accuracy_p99_ci_high = 0.30318791938426815 +settled_accuracy_mean = 0.07630659765369951 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.043478260869565216 +jitter_p50_per_min_ci_low = 0.04 +jitter_p50_per_min_ci_high = 0.05 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.15789473684210525 +jitter_p90_per_min_ci_high = 0.18181818181818182 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.1875 +jitter_p95_per_min_ci_high = 0.20833333333333334 +jitter_p99_per_min = 0.25 +jitter_p99_per_min_ci_low = 0.23809523809523808 +jitter_p99_per_min_ci_high = 0.2857142857142857 +jitter_mean_per_min = 0.06258156141736444 +bias_mean = -0.03105460792398024 +bias_p10 = -0.1322482152476858 +bias_p10_ci_low = -0.137612864351202 +bias_p10_ci_high = -0.12463211494234012 +bias_p50 = -0.03756503833563884 +bias_p50_ci_low = -0.04315025838378775 +bias_p50_ci_high = -0.03341939350617679 +bias_p90 = 0.07530435839335287 +bias_p90_ci_low = 0.06274607518307147 +bias_p90_ci_high = 0.08724547669385238 +bias_p99 = 0.1828373182324165 +bias_p99_ci_low = 0.1719518894852344 +bias_p99_ci_high = 0.1965011917351166 +variance_mean = 0.020246453431415748 +variance_p10 = 0.0013188602888240105 +variance_p10_ci_low = 0.001165345638863565 +variance_p10_ci_high = 0.0015250688644246394 +variance_p50 = 0.013324519483782663 +variance_p50_ci_low = 0.012084833322204032 +variance_p50_ci_high = 0.014421019099563804 +variance_p90 = 0.049257011154505495 +variance_p90_ci_low = 0.04572185395783218 +variance_p90_ci_high = 0.05286312800876983 +variance_p99 = 0.09421143250868576 +variance_p99_ci_low = 0.08915347905230346 +variance_p99_ci_high = 0.10439638642813108 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0.14521264484022423 +ramp_target_overshoot_p90_ci_low = 0.1326882516067036 +ramp_target_overshoot_p90_ci_high = 0.16460026168430764 +ramp_target_overshoot_p99 = 0.3787094844488963 +ramp_target_overshoot_p99_ci_low = 0.3044288294046349 +ramp_target_overshoot_p99_ci_high = 0.4336154075511298 +ramp_target_overshoot_mean = 0.04287188300294187 + +[cell.spm_8.stable_1ph] +shares_per_minute = 8 +scenario = "stable_1ph" +convergence_rate = 0.99 +convergence_rate_ci_low = 0.9838330039727595 +convergence_rate_ci_high = 0.9961669960272405 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 240 +convergence_p50_secs_ci_low = 180 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 840 +convergence_p90_secs_ci_low = 720 +convergence_p90_secs_ci_high = 900 +convergence_p95_secs = 1020 +convergence_p95_secs_ci_low = 960 +convergence_p95_secs_ci_high = 1080 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 298.6666666666667 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0.013780536966213619 +settled_accuracy_p50_ci_low = 0.00876898115522673 +settled_accuracy_p50_ci_high = 0.018954697556787692 +settled_accuracy_p90 = 0.100064753343716 +settled_accuracy_p90_ci_low = 0.09421869879803324 +settled_accuracy_p90_ci_high = 0.11250002600468512 +settled_accuracy_p95 = 0.13654137419225254 +settled_accuracy_p95_ci_low = 0.12187526864517473 +settled_accuracy_p95_ci_high = 0.1517275734420962 +settled_accuracy_p99 = 0.2150540484731358 +settled_accuracy_p99_ci_low = 0.1875000209715203 +settled_accuracy_p99_ci_high = 0.22726235895310443 +settled_accuracy_mean = 0.03751053545425087 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.08695652173913043 +jitter_p90_per_min_ci_high = 0.1111111111111111 +jitter_p95_per_min = 0.13636363636363635 +jitter_p95_per_min_ci_low = 0.125 +jitter_p95_per_min_ci_high = 0.15384615384615385 +jitter_p99_per_min = 0.20833333333333334 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.22727272727272727 +jitter_mean_per_min = 0.02331770134559061 +bias_mean = -0.004481817342250966 +bias_p10 = -0.08040941098128988 +bias_p10_ci_low = -0.08791123548589339 +bias_p10_ci_high = -0.0748496781736106 +bias_p50 = -0.007360041133354431 +bias_p50_ci_low = -0.014838374003206863 +bias_p50_ci_high = -0.0032918381679330764 +bias_p90 = 0.07614380905586733 +bias_p90_ci_low = 0.07015445942345311 +bias_p90_ci_high = 0.08407611926840361 +bias_p99 = 0.17702113419569337 +bias_p99_ci_low = 0.14290367957517572 +bias_p99_ci_high = 0.18940098199836844 +variance_mean = 0.00881315328134807 +variance_p10 = 0.0003602452989933446 +variance_p10_ci_low = 0.0003277369452796148 +variance_p10_ci_high = 0.00039943336352136544 +variance_p50 = 0.0014771418852004036 +variance_p50_ci_low = 0.001317593231787985 +variance_p50_ci_high = 0.0017476819616140942 +variance_p90 = 0.027667788819160526 +variance_p90_ci_low = 0.02343432725697229 +variance_p90_ci_high = 0.031360560273285765 +variance_p99 = 0.07695188299082538 +variance_p99_ci_low = 0.06378469035666541 +variance_p99_ci_high = 0.09974843919355927 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1.0450005204292472 +upward_step_magnitude_p90 = 1.1875004920994086 +upward_step_magnitude_p90_ci_low = 1.1875004812286318 +upward_step_magnitude_p90_ci_high = 1.187500531754631 +upward_step_magnitude_p95 = 1.2250005430655975 +upward_step_magnitude_p95_ci_low = 1.2250005011184613 +upward_step_magnitude_p95_ci_high = 1.243750091423601 +upward_step_magnitude_p99 = 1.3375003104195058 +upward_step_magnitude_p99_ci_low = 1.299999955382446 +upward_step_magnitude_p99_ci_high = 1.3750007715360975 +upward_step_magnitude_mean = 1.059659047862784 +fire_decisiveness_mean = 6.112355082035656 +fire_decisiveness_p50 = 2.857098517357141 + +[cell.spm_8.step_minus_50_at_15min] +shares_per_minute = 8 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.575 +convergence_rate_ci_low = 0.5443603035263075 +convergence_rate_ci_high = 0.6056396964736924 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 420 +convergence_p50_secs_ci_low = 420 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 605.1130434782609 +settled_accuracy_p10 = 0.0742513284703119 +settled_accuracy_p10_ci_low = 0.06617182379279041 +settled_accuracy_p10_ci_high = 0.08705596832354201 +settled_accuracy_p50 = 0.2617957755103779 +settled_accuracy_p50_ci_low = 0.2512933723754813 +settled_accuracy_p50_ci_high = 0.27894692232370355 +settled_accuracy_p90 = 0.5482643265179137 +settled_accuracy_p90_ci_low = 0.524701330319161 +settled_accuracy_p90_ci_high = 0.5802066698024402 +settled_accuracy_p95 = 0.6496811221622261 +settled_accuracy_p95_ci_low = 0.621538751242269 +settled_accuracy_p95_ci_high = 0.6939676042692244 +settled_accuracy_p99 = 0.9008932257023463 +settled_accuracy_p99_ci_low = 0.8125568873458919 +settled_accuracy_p99_ci_high = 0.9062505263851588 +settled_accuracy_mean = 0.2981033644962297 +jitter_p10_per_min = 0.09090909090909091 +jitter_p10_per_min_ci_low = 0.08695652173913043 +jitter_p10_per_min_ci_high = 0.12 +jitter_p50_per_min = 0.18181818181818182 +jitter_p50_per_min_ci_low = 0.17391304347826086 +jitter_p50_per_min_ci_high = 0.18518518518518517 +jitter_p90_per_min = 0.25925925925925924 +jitter_p90_per_min_ci_low = 0.25 +jitter_p90_per_min_ci_high = 0.2692307692307692 +jitter_p95_per_min = 0.2777777777777778 +jitter_p95_per_min_ci_low = 0.2692307692307692 +jitter_p95_per_min_ci_high = 0.29411764705882354 +jitter_p99_per_min = 0.3333333333333333 +jitter_p99_per_min_ci_low = 0.2962962962962963 +jitter_p99_per_min_ci_high = 0.3333333333333333 +jitter_mean_per_min = 0.1798451545551957 +reaction_rate = 0.584 +reaction_rate_ci_low = 0.5534501445109801 +reaction_rate_ci_high = 0.6145498554890199 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 175.06849315068493 +fire_decisiveness_mean = 6.75629198505178 +fire_decisiveness_p50 = 3.749918883744087 +step_correction_mean = 0.14193684990479521 +step_correction_p50 = 0.10599993914365768 + +[cell.spm_8.step_minus_25_at_15min] +shares_per_minute = 8 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.87 +convergence_rate_ci_low = 0.849155697181244 +convergence_rate_ci_high = 0.890844302818756 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 300 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 379.0344827586207 +settled_accuracy_p10 = 0.05117954564794103 +settled_accuracy_p10_ci_low = 0.03982687344905833 +settled_accuracy_p10_ci_high = 0.06095632277788465 +settled_accuracy_p50 = 0.26190486629632725 +settled_accuracy_p50_ci_low = 0.2473188890601905 +settled_accuracy_p50_ci_high = 0.2666666428057374 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.3632249334302444 +settled_accuracy_p99 = 0.4279344312403033 +settled_accuracy_p99_ci_low = 0.3933339960706419 +settled_accuracy_p99_ci_high = 0.45636138785066516 +settled_accuracy_mean = 0.22619172411707414 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.17391304347826086 +jitter_p90_per_min_ci_low = 0.15789473684210525 +jitter_p90_per_min_ci_high = 0.18181818181818182 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.1875 +jitter_p95_per_min_ci_high = 0.21739130434782608 +jitter_p99_per_min = 0.2608695652173913 +jitter_p99_per_min_ci_low = 0.25 +jitter_p99_per_min_ci_high = 0.2777777777777778 +jitter_mean_per_min = 0.0558622315739243 +reaction_rate = 0.28 +reaction_rate_ci_low = 0.2521707607002994 +reaction_rate_ci_high = 0.30782923929970063 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 179.57142857142858 +fire_decisiveness_mean = 5.9395901745501645 +fire_decisiveness_p50 = 2.5001626898732887 +step_correction_mean = 0.26106658224016427 +step_correction_p50 = 0.21157890558242798 + +[cell.spm_8.step_minus_10_at_15min] +shares_per_minute = 8 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.971 +convergence_rate_ci_low = 0.9605992493347836 +convergence_rate_ci_high = 0.9814007506652164 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 240 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 840 +convergence_p90_secs_ci_low = 780 +convergence_p90_secs_ci_high = 900 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 317.9196704428424 +settled_accuracy_p10 = 0.028587257741659933 +settled_accuracy_p10_ci_low = 0.023752735152257065 +settled_accuracy_p10_ci_high = 0.03555532026027797 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.16586157156284242 +settled_accuracy_p90_ci_low = 0.16111168070795379 +settled_accuracy_p90_ci_high = 0.17777779434786778 +settled_accuracy_p95 = 0.20185086247939665 +settled_accuracy_p95_ci_low = 0.18915945774546272 +settled_accuracy_p95_ci_high = 0.21436323567626525 +settled_accuracy_p99 = 0.2804555498844422 +settled_accuracy_p99_ci_low = 0.26391627199819245 +settled_accuracy_p99_ci_high = 0.3194449798654766 +settled_accuracy_mean = 0.1013377374395503 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.11764705882352941 +jitter_p90_per_min_ci_low = 0.09523809523809523 +jitter_p90_per_min_ci_high = 0.13043478260869565 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.2222222222222222 +jitter_p99_per_min_ci_low = 0.18518518518518517 +jitter_p99_per_min_ci_high = 0.23529411764705882 +jitter_mean_per_min = 0.028277666594464974 +reaction_rate = 0.206 +reaction_rate_ci_low = 0.18093314015677273 +reaction_rate_ci_high = 0.23106685984322725 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 163.39805825242718 +fire_decisiveness_mean = 5.852240657589274 +fire_decisiveness_p50 = 2.857098517357141 +step_correction_mean = -2.058815829094174 +step_correction_p50 = 0.39326149225234985 + +[cell.spm_8.step_minus_5_at_15min] +shares_per_minute = 8 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.985 +convergence_rate_ci_low = 0.9774661006112372 +convergence_rate_ci_high = 0.9925338993887628 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 240 +convergence_p50_secs_ci_low = 120 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 840 +convergence_p90_secs_ci_low = 720 +convergence_p90_secs_ci_high = 900 +convergence_p95_secs = 960 +convergence_p95_secs_ci_low = 900 +convergence_p95_secs_ci_high = 1020 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 296.7715736040609 +settled_accuracy_p10 = 0.01052634330224922 +settled_accuracy_p10_ci_low = 0.007306036131554006 +settled_accuracy_p10_ci_high = 0.015458562289353273 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.12974269825530382 +settled_accuracy_p90_ci_low = 0.11578949376110081 +settled_accuracy_p90_ci_high = 0.13947390747298183 +settled_accuracy_p95 = 0.16190536336165406 +settled_accuracy_p95_ci_low = 0.1509314392527379 +settled_accuracy_p95_ci_high = 0.17410483662064347 +settled_accuracy_p99 = 0.25000051214659846 +settled_accuracy_p99_ci_low = 0.21208131927268403 +settled_accuracy_p99_ci_high = 0.2893960294015945 +settled_accuracy_mean = 0.0646935208792989 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.10526315789473684 +jitter_p90_per_min_ci_low = 0.08695652173913043 +jitter_p90_per_min_ci_high = 0.125 +jitter_p95_per_min = 0.14814814814814814 +jitter_p95_per_min_ci_low = 0.13333333333333333 +jitter_p95_per_min_ci_high = 0.17391304347826086 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.1875 +jitter_p99_per_min_ci_high = 0.2222222222222222 +jitter_mean_per_min = 0.02442285798752837 +reaction_rate = 0.165 +reaction_rate_ci_low = 0.1419939912196835 +reaction_rate_ci_high = 0.1880060087803165 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 162.9090909090909 +fire_decisiveness_mean = 6.1164714547899655 +fire_decisiveness_p50 = 2.857098460464261 +step_correction_mean = -6.010047686354416 +step_correction_p50 = 0.5453990697860718 + +[cell.spm_8.step_plus_5_at_15min] +shares_per_minute = 8 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.982 +convergence_rate_ci_low = 0.9737596042813467 +convergence_rate_ci_high = 0.9902403957186533 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 180 +convergence_p50_secs_ci_low = 60 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 840 +convergence_p90_secs_ci_low = 720 +convergence_p90_secs_ci_high = 900 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 960 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 293.4012219959267 +settled_accuracy_p10 = 0.009658244567473107 +settled_accuracy_p10_ci_low = 0.007283485376466059 +settled_accuracy_p10_ci_high = 0.015967053507754958 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.11011900767329208 +settled_accuracy_p90_ci_low = 0.10476186641397944 +settled_accuracy_p90_ci_high = 0.11904755513441012 +settled_accuracy_p95 = 0.14644983215752205 +settled_accuracy_p95_ci_low = 0.12619023971160315 +settled_accuracy_p95_ci_high = 0.16324385867562374 +settled_accuracy_p99 = 0.21366454180812267 +settled_accuracy_p99_ci_low = 0.19192126813010013 +settled_accuracy_p99_ci_high = 0.2494258996007852 +settled_accuracy_mean = 0.058912255217203266 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.1111111111111111 +jitter_p90_per_min_ci_low = 0.09090909090909091 +jitter_p90_per_min_ci_high = 0.125 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.22727272727272727 +jitter_p99_per_min_ci_low = 0.21052631578947367 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.026878527640591142 +reaction_rate = 0.184 +reaction_rate_ci_low = 0.15998348088502415 +reaction_rate_ci_high = 0.20801651911497585 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 173.80434782608697 +fire_decisiveness_mean = 6.367959170609598 +fire_decisiveness_p50 = 2.85725603356245 +step_correction_mean = -2232.2163224997726 +step_correction_p50 = 0.47867318987846375 + +[cell.spm_8.step_plus_10_at_15min] +shares_per_minute = 8 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.973 +convergence_rate_ci_low = 0.9629539722476991 +convergence_rate_ci_high = 0.9830460277523009 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 240 +convergence_p50_secs_ci_low = 180 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 840 +convergence_p90_secs_ci_low = 780 +convergence_p90_secs_ci_high = 900 +convergence_p95_secs = 1020 +convergence_p95_secs_ci_low = 960 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 304.4398766700925 +settled_accuracy_p10 = 0.024198419683835404 +settled_accuracy_p10_ci_low = 0.020295429087068717 +settled_accuracy_p10_ci_high = 0.027710775676599297 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.13712445955248032 +settled_accuracy_p90_ci_low = 0.1328669511228442 +settled_accuracy_p90_ci_high = 0.14204524760334414 +settled_accuracy_p95 = 0.15561649040523196 +settled_accuracy_p95_ci_low = 0.14907746358017138 +settled_accuracy_p95_ci_high = 0.1647805109998446 +settled_accuracy_p99 = 0.212729063147429 +settled_accuracy_p99_ci_low = 0.19488634107031444 +settled_accuracy_p99_ci_high = 0.23224102673635494 +settled_accuracy_mean = 0.08359448449318455 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.12 +jitter_p90_per_min_ci_low = 0.10526315789473684 +jitter_p90_per_min_ci_high = 0.13636363636363635 +jitter_p95_per_min = 0.17391304347826086 +jitter_p95_per_min_ci_low = 0.15789473684210525 +jitter_p95_per_min_ci_high = 0.1875 +jitter_p99_per_min = 0.2222222222222222 +jitter_p99_per_min_ci_low = 0.21739130434782608 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.030551829201409985 +reaction_rate = 0.217 +reaction_rate_ci_low = 0.19145141691600098 +reaction_rate_ci_high = 0.24254858308399901 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 168.38709677419354 +fire_decisiveness_mean = 6.556346805387939 +fire_decisiveness_p50 = 2.8572605301379426 +step_correction_mean = 1.7864119012921638 +step_correction_p50 = 0.34140899777412415 + +[cell.spm_8.step_plus_25_at_15min] +shares_per_minute = 8 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.878 +convergence_rate_ci_low = 0.8577146154682738 +convergence_rate_ci_high = 0.8982853845317262 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 300 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 402.4373576309795 +settled_accuracy_p10 = 0.03551433198335352 +settled_accuracy_p10_ci_low = 0.029429115110059634 +settled_accuracy_p10_ci_high = 0.03964136594559187 +settled_accuracy_p50 = 0.1526313223795922 +settled_accuracy_p50_ci_low = 0.14000003865470456 +settled_accuracy_p50_ci_high = 0.1589471789903949 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20055993487111767 +settled_accuracy_p95 = 0.21429277030322258 +settled_accuracy_p95_ci_low = 0.20646830647081904 +settled_accuracy_p95_ci_high = 0.2266996956801005 +settled_accuracy_p99 = 0.25499982498008744 +settled_accuracy_p99_ci_low = 0.24999994631291023 +settled_accuracy_p99_ci_high = 0.28187848120511627 +settled_accuracy_mean = 0.13543946522934278 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.043478260869565216 +jitter_p90_per_min = 0.18181818181818182 +jitter_p90_per_min_ci_low = 0.17391304347826086 +jitter_p90_per_min_ci_high = 0.1875 +jitter_p95_per_min = 0.2222222222222222 +jitter_p95_per_min_ci_low = 0.2 +jitter_p95_per_min_ci_high = 0.23076923076923078 +jitter_p99_per_min = 0.2727272727272727 +jitter_p99_per_min_ci_low = 0.2608695652173913 +jitter_p99_per_min_ci_high = 0.3 +jitter_mean_per_min = 0.06233830928719718 +reaction_rate = 0.337 +reaction_rate_ci_low = 0.3077026873314292 +reaction_rate_ci_high = 0.36629731266857085 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 173.05637982195844 +fire_decisiveness_mean = 7.188372629293839 +fire_decisiveness_p50 = 3.055573390702474 +step_correction_mean = 0.42121871032417707 +step_correction_p50 = 0.2044374942779541 + +[cell.spm_8.step_plus_50_at_15min] +shares_per_minute = 8 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.702 +convergence_rate_ci_low = 0.6736513253643137 +convergence_rate_ci_high = 0.7303486746356862 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 120 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 685.4700854700855 +settled_accuracy_p10 = 0.02232300283351507 +settled_accuracy_p10_ci_low = 0.01980794159130861 +settled_accuracy_p10_ci_high = 0.027117081075828442 +settled_accuracy_p50 = 0.11196254860135735 +settled_accuracy_p50_ci_low = 0.10547643221722947 +settled_accuracy_p50_ci_high = 0.12018544236954776 +settled_accuracy_p90 = 0.2605236316704085 +settled_accuracy_p90_ci_low = 0.24034627815585918 +settled_accuracy_p90_ci_high = 0.27140229159767504 +settled_accuracy_p95 = 0.3013331130969569 +settled_accuracy_p95_ci_low = 0.296666362738081 +settled_accuracy_p95_ci_high = 0.30277765375065624 +settled_accuracy_p99 = 0.33333334824641403 +settled_accuracy_p99_ci_low = 0.33333334824641403 +settled_accuracy_p99_ci_high = 0.33333334824641403 +settled_accuracy_mean = 0.12867535814434491 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.038461538461538464 +jitter_p50_per_min = 0.14285714285714285 +jitter_p50_per_min_ci_low = 0.13636363636363635 +jitter_p50_per_min_ci_high = 0.15 +jitter_p90_per_min = 0.21739130434782608 +jitter_p90_per_min_ci_low = 0.21428571428571427 +jitter_p90_per_min_ci_high = 0.22727272727272727 +jitter_p95_per_min = 0.25 +jitter_p95_per_min_ci_low = 0.22727272727272727 +jitter_p95_per_min_ci_high = 0.2631578947368421 +jitter_p99_per_min = 0.3 +jitter_p99_per_min_ci_low = 0.2777777777777778 +jitter_p99_per_min_ci_high = 0.3333333333333333 +jitter_mean_per_min = 0.13515784603270528 +reaction_rate = 0.562 +reaction_rate_ci_low = 0.5312488554749584 +reaction_rate_ci_high = 0.5927511445250417 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 169.4306049822064 +fire_decisiveness_mean = 9.828392540043476 +fire_decisiveness_p50 = 4.37513000668293 +step_correction_mean = 0.1536409183143509 +step_correction_p50 = 0.11053310334682465 + +[cell.spm_10.cold_start_10gh_to_1ph] +shares_per_minute = 10 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.971 +convergence_rate_ci_low = 0.9605992493347836 +convergence_rate_ci_high = 0.9814007506652164 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 580.5355303810504 +settled_accuracy_p10 = 0.012651027661535919 +settled_accuracy_p10_ci_low = 0.011230936971958094 +settled_accuracy_p10_ci_high = 0.014974604998899022 +settled_accuracy_p50 = 0.06592640667394978 +settled_accuracy_p50_ci_low = 0.06156963205752897 +settled_accuracy_p50_ci_high = 0.06841668243165755 +settled_accuracy_p90 = 0.1421774450997476 +settled_accuracy_p90_ci_low = 0.13486311569950815 +settled_accuracy_p90_ci_high = 0.15003461810794472 +settled_accuracy_p95 = 0.16468267137037174 +settled_accuracy_p95_ci_low = 0.1576971754080102 +settled_accuracy_p95_ci_high = 0.1725405825760824 +settled_accuracy_p99 = 0.2179636875274349 +settled_accuracy_p99_ci_low = 0.19256338482618907 +settled_accuracy_p99_ci_high = 0.24542456792460676 +settled_accuracy_mean = 0.07246990237874755 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.043478260869565216 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.05 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.15789473684210525 +jitter_p90_per_min_ci_high = 0.17391304347826086 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.1875 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.24 +jitter_p99_per_min_ci_low = 0.21739130434782608 +jitter_p99_per_min_ci_high = 0.2608695652173913 +jitter_mean_per_min = 0.05881874510182602 +bias_mean = -0.03483845620538523 +bias_p10 = -0.12559994662937937 +bias_p10_ci_low = -0.13330756753220702 +bias_p10_ci_high = -0.1183447807576166 +bias_p50 = -0.040932780161788807 +bias_p50_ci_low = -0.045589845756243245 +bias_p50_ci_high = -0.03386924718571646 +bias_p90 = 0.06006878467919025 +bias_p90_ci_low = 0.05213437643161533 +bias_p90_ci_high = 0.07026225392066678 +bias_p99 = 0.15083400477812997 +bias_p99_ci_low = 0.13869663190037765 +bias_p99_ci_high = 0.1713250503027742 +variance_mean = 0.015788809535893372 +variance_p10 = 0.0010319842904185901 +variance_p10_ci_low = 0.0009058490002852888 +variance_p10_ci_high = 0.0011565445091554687 +variance_p50 = 0.01010394382577666 +variance_p50_ci_low = 0.008776296661804928 +variance_p50_ci_high = 0.011287688789211889 +variance_p90 = 0.03755967803778089 +variance_p90_ci_low = 0.03379311611386566 +variance_p90_ci_high = 0.04054126507822909 +variance_p99 = 0.08193604580510357 +variance_p99_ci_low = 0.07465644594852973 +variance_p99_ci_high = 0.09344287718534584 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0.1009660253989606 +ramp_target_overshoot_p90_ci_low = 0.08439188060581326 +ramp_target_overshoot_p90_ci_high = 0.1145409408032032 +ramp_target_overshoot_p99 = 0.26733749135386153 +ramp_target_overshoot_p99_ci_low = 0.20918094905490925 +ramp_target_overshoot_p99_ci_high = 0.2968294215464151 +ramp_target_overshoot_mean = 0.026714419836145642 + +[cell.spm_10.stable_1ph] +shares_per_minute = 10 +scenario = "stable_1ph" +convergence_rate = 0.991 +convergence_rate_ci_low = 0.985146519804424 +convergence_rate_ci_high = 0.996853480195576 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 660 +convergence_p95_secs = 780 +convergence_p95_secs_ci_low = 720 +convergence_p95_secs_ci_high = 900 +convergence_p99_secs = 1140 +convergence_p99_secs_ci_low = 1080 +convergence_p99_secs_ci_high = 1320 +convergence_mean_secs = 207.36629667003027 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0.07366493120905138 +settled_accuracy_p90_ci_low = 0.06600022642531012 +settled_accuracy_p90_ci_high = 0.08602772629595767 +settled_accuracy_p95 = 0.10919974624796014 +settled_accuracy_p95_ci_low = 0.09596527411521827 +settled_accuracy_p95_ci_high = 0.117240462001585 +settled_accuracy_p99 = 0.1800000013421772 +settled_accuracy_p99_ci_low = 0.1615929792316182 +settled_accuracy_p99_ci_high = 0.1882604315193963 +settled_accuracy_mean = 0.027136328303546283 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.047619047619047616 +jitter_p90_per_min_ci_low = 0.043478260869565216 +jitter_p90_per_min_ci_high = 0.0625 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.08333333333333333 +jitter_p95_per_min_ci_high = 0.10526315789473684 +jitter_p99_per_min = 0.15384615384615385 +jitter_p99_per_min_ci_low = 0.13043478260869565 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.012003258917511167 +bias_mean = -0.0036822496220614213 +bias_p10 = -0.07298628045086379 +bias_p10_ci_low = -0.07682701615277528 +bias_p10_ci_high = -0.0677042723823932 +bias_p50 = -0.0044907768913901545 +bias_p50_ci_low = -0.008891253507025396 +bias_p50_ci_high = -0.0005846312385005653 +bias_p90 = 0.06397124640860287 +bias_p90_ci_low = 0.058754701271793185 +bias_p90_ci_high = 0.07015458657709182 +bias_p99 = 0.12868101881104219 +bias_p99_ci_low = 0.11996794993639122 +bias_p99_ci_high = 0.16192563081070274 +variance_mean = 0.0047569545132359736 +variance_p10 = 0.00024706563467951644 +variance_p10_ci_low = 0.0002324087425679984 +variance_p10_ci_high = 0.00026348652787427197 +variance_p50 = 0.0008921490487890073 +variance_p50_ci_low = 0.000790252902489137 +variance_p50_ci_high = 0.000984621629656355 +variance_p90 = 0.014126154682486979 +variance_p90_ci_low = 0.012281984362403749 +variance_p90_ci_high = 0.016362958744600226 +variance_p99 = 0.04826734758430108 +variance_p99_ci_low = 0.04128462880234876 +variance_p99_ci_high = 0.06020747838177153 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1.149999995173413 +upward_step_magnitude_p90_ci_low = 1.1050004235753597 +upward_step_magnitude_p90_ci_high = 1.1799999710737705 +upward_step_magnitude_p95 = 1.180000044263295 +upward_step_magnitude_p95_ci_low = 1.1800000013421772 +upward_step_magnitude_p95_ci_high = 1.210000214077279 +upward_step_magnitude_p99 = 1.2400005878396867 +upward_step_magnitude_p99_ci_low = 1.2400004991523323 +upward_step_magnitude_p99_ci_high = 1.270000887407671 +upward_step_magnitude_mean = 1.0376793551006604 +fire_decisiveness_mean = 4.954928161606487 +fire_decisiveness_p50 = 3.000134351947473 + +[cell.spm_10.step_minus_50_at_15min] +shares_per_minute = 10 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.486 +convergence_rate_ci_low = 0.45502182951819137 +convergence_rate_ci_high = 0.5169781704818086 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 420 +convergence_p50_secs_ci_low = 360 +convergence_p50_secs_ci_high = 420 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 560.3703703703703 +settled_accuracy_p10 = 0.09734234802241248 +settled_accuracy_p10_ci_low = 0.08881502588959345 +settled_accuracy_p10_ci_high = 0.10459339376307653 +settled_accuracy_p50 = 0.28809627652503056 +settled_accuracy_p50_ci_low = 0.2706905186783768 +settled_accuracy_p50_ci_high = 0.2995480016624208 +settled_accuracy_p90 = 0.5652891744475481 +settled_accuracy_p90_ci_low = 0.5358714666595441 +settled_accuracy_p90_ci_high = 0.615000602973151 +settled_accuracy_p95 = 0.6514012565866512 +settled_accuracy_p95_ci_low = 0.6223914364793455 +settled_accuracy_p95_ci_high = 0.6848848220618515 +settled_accuracy_p99 = 0.905714594990283 +settled_accuracy_p99_ci_low = 0.7615864965152714 +settled_accuracy_p99_ci_high = 0.9089656168401912 +settled_accuracy_mean = 0.31163671709875485 +jitter_p10_per_min = 0.13043478260869565 +jitter_p10_per_min_ci_low = 0.125 +jitter_p10_per_min_ci_high = 0.13043478260869565 +jitter_p50_per_min = 0.18181818181818182 +jitter_p50_per_min_ci_low = 0.17391304347826086 +jitter_p50_per_min_ci_high = 0.19047619047619047 +jitter_p90_per_min = 0.23809523809523808 +jitter_p90_per_min_ci_low = 0.22727272727272727 +jitter_p90_per_min_ci_high = 0.25925925925925924 +jitter_p95_per_min = 0.2727272727272727 +jitter_p95_per_min_ci_low = 0.25 +jitter_p95_per_min_ci_high = 0.2777777777777778 +jitter_p99_per_min = 0.30434782608695654 +jitter_p99_per_min_ci_low = 0.2777777777777778 +jitter_p99_per_min_ci_high = 0.32 +jitter_mean_per_min = 0.1823443114405829 +reaction_rate = 0.572 +reaction_rate_ci_low = 0.541332669734716 +reaction_rate_ci_high = 0.6026673302652839 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 186.3986013986014 +fire_decisiveness_mean = 6.617849982537479 +fire_decisiveness_p50 = 4.999986964451338 +step_correction_mean = 0.12988893674699575 +step_correction_p50 = 0.1033148542046547 + +[cell.spm_10.step_minus_25_at_15min] +shares_per_minute = 10 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.842 +convergence_rate_ci_low = 0.8193931183574558 +convergence_rate_ci_high = 0.8646068816425442 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 240 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 960 +convergence_p90_secs_ci_low = 780 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 325.65320665083135 +settled_accuracy_p10 = 0.08113372103167626 +settled_accuracy_p10_ci_low = 0.07252114846350688 +settled_accuracy_p10_ci_high = 0.09519231208019496 +settled_accuracy_p50 = 0.26962981229829874 +settled_accuracy_p50_ci_low = 0.26762683642286134 +settled_accuracy_p50_ci_high = 0.2711112180876103 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.40533386614788225 +settled_accuracy_p99_ci_low = 0.3911518842692441 +settled_accuracy_p99_ci_high = 0.448773880800879 +settled_accuracy_mean = 0.2441777884694634 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.15384615384615385 +jitter_p90_per_min_ci_low = 0.13636363636363635 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.17391304347826086 +jitter_p95_per_min_ci_high = 0.19047619047619047 +jitter_p99_per_min = 0.23076923076923078 +jitter_p99_per_min_ci_low = 0.20833333333333334 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.04474776300705548 +reaction_rate = 0.239 +reaction_rate_ci_low = 0.21256694557187913 +reaction_rate_ci_high = 0.2654330544281209 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 197.82426778242677 +fire_decisiveness_mean = 5.154097250684234 +fire_decisiveness_p50 = 2.99996653404261 +step_correction_mean = 0.21186701488918838 +step_correction_p50 = 0.19578932225704193 + +[cell.spm_10.step_minus_10_at_15min] +shares_per_minute = 10 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.987 +convergence_rate_ci_low = 0.9799792044895183 +convergence_rate_ci_high = 0.9940207955104817 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 660 +convergence_p95_secs = 840 +convergence_p95_secs_ci_low = 780 +convergence_p95_secs_ci_high = 960 +convergence_p99_secs = 1260 +convergence_p99_secs_ci_low = 1200 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 215.07598784194528 +settled_accuracy_p10 = 0.044444411304264575 +settled_accuracy_p10_ci_low = 0.03571123652183705 +settled_accuracy_p10_ci_high = 0.04733546118143661 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.1552662003594798 +settled_accuracy_p90_ci_low = 0.13858412972292622 +settled_accuracy_p90_ci_high = 0.16444475430512684 +settled_accuracy_p95 = 0.1722224479896981 +settled_accuracy_p95_ci_low = 0.1682540771431309 +settled_accuracy_p95_ci_high = 0.18159994243550748 +settled_accuracy_p99 = 0.2379998724931578 +settled_accuracy_p99_ci_low = 0.21250193404018858 +settled_accuracy_p99_ci_high = 0.26111127059822703 +settled_accuracy_mean = 0.1033311102900634 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.0625 +jitter_p90_per_min_ci_low = 0.05555555555555555 +jitter_p90_per_min_ci_high = 0.08695652173913043 +jitter_p95_per_min = 0.125 +jitter_p95_per_min_ci_low = 0.1111111111111111 +jitter_p95_per_min_ci_high = 0.13636363636363635 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.17391304347826086 +jitter_p99_per_min_ci_high = 0.21739130434782608 +jitter_mean_per_min = 0.01715172386920058 +reaction_rate = 0.142 +reaction_rate_ci_low = 0.12036564820476471 +reaction_rate_ci_high = 0.16363435179523528 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 160.56338028169014 +fire_decisiveness_mean = 4.974793146910006 +fire_decisiveness_p50 = 2.9999665797852977 +step_correction_mean = 0.12746202473489332 +step_correction_p50 = 0.3594072163105011 + +[cell.spm_10.step_minus_5_at_15min] +shares_per_minute = 10 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.989 +convergence_rate_ci_low = 0.9825352674919994 +convergence_rate_ci_high = 0.9954647325080006 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 660 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 660 +convergence_p95_secs = 960 +convergence_p95_secs_ci_low = 840 +convergence_p95_secs_ci_high = 1080 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 230.47522750252782 +settled_accuracy_p10 = 0.01052634330224922 +settled_accuracy_p10_ci_low = 0.00755794161712442 +settled_accuracy_p10_ci_high = 0.01572184096145679 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.10947412575339421 +settled_accuracy_p90_ci_low = 0.10315819261840642 +settled_accuracy_p90_ci_high = 0.11578949376110081 +settled_accuracy_p95 = 0.13677817970100947 +settled_accuracy_p95_ci_low = 0.12210549753699862 +settled_accuracy_p95_ci_high = 0.15280038581239475 +settled_accuracy_p99 = 0.21270069877281905 +settled_accuracy_p99_ci_low = 0.18580049890849204 +settled_accuracy_p99_ci_high = 0.24210526018354073 +settled_accuracy_mean = 0.05891915190218705 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.058823529411764705 +jitter_p90_per_min_ci_low = 0.05 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.1111111111111111 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.13043478260869565 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.17391304347826086 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.015300335873643003 +reaction_rate = 0.126 +reaction_rate_ci_low = 0.10543176336192137 +reaction_rate_ci_high = 0.14656823663807864 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 158.0952380952381 +fire_decisiveness_mean = 5.432890899963521 +fire_decisiveness_p50 = 3.3332351956828603 +step_correction_mean = 1.7994027826048078 +step_correction_p50 = 0.5088425874710083 + +[cell.spm_10.step_plus_5_at_15min] +shares_per_minute = 10 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.986 +convergence_rate_ci_low = 0.9787178680044921 +convergence_rate_ci_high = 0.9932821319955079 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 660 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 720 +convergence_p95_secs = 900 +convergence_p95_secs_ci_low = 840 +convergence_p95_secs_ci_high = 960 +convergence_p99_secs = 1260 +convergence_p99_secs_ci_low = 1200 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 234.64503042596348 +settled_accuracy_p10 = 0.015238379012742831 +settled_accuracy_p10_ci_low = 0.011284963561162153 +settled_accuracy_p10_ci_high = 0.020953178589228294 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.09921221856936935 +settled_accuracy_p90_ci_low = 0.09523771175884166 +settled_accuracy_p90_ci_high = 0.10409633816939023 +settled_accuracy_p95 = 0.11266952818885678 +settled_accuracy_p95_ci_low = 0.11009574326524141 +settled_accuracy_p95_ci_high = 0.1238096005053746 +settled_accuracy_p99 = 0.15482878993505012 +settled_accuracy_p99_ci_low = 0.1476188047488537 +settled_accuracy_p99_ci_high = 0.16420441029263433 +settled_accuracy_mean = 0.05401294702655929 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.07142857142857142 +jitter_p90_per_min_ci_low = 0.05263157894736842 +jitter_p90_per_min_ci_high = 0.08695652173913043 +jitter_p95_per_min = 0.1111111111111111 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.13043478260869565 +jitter_p99_per_min = 0.17647058823529413 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.19047619047619047 +jitter_mean_per_min = 0.015417360633913421 +reaction_rate = 0.124 +reaction_rate_ci_low = 0.1035723237151163 +reaction_rate_ci_high = 0.1444276762848837 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 157.25806451612902 +fire_decisiveness_mean = 5.426669147259719 +fire_decisiveness_p50 = 3.000134351947473 +step_correction_mean = 0.2925137615492267 +step_correction_p50 = 0.45039165019989014 + +[cell.spm_10.step_plus_10_at_15min] +shares_per_minute = 10 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.977 +convergence_rate_ci_low = 0.9677088970730058 +convergence_rate_ci_high = 0.9862911029269942 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 660 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 720 +convergence_p95_secs = 900 +convergence_p95_secs_ci_low = 840 +convergence_p95_secs_ci_high = 1080 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 236.25383828045037 +settled_accuracy_p10 = 0.03456198074134198 +settled_accuracy_p10_ci_low = 0.02677698632022385 +settled_accuracy_p10_ci_high = 0.0380653075413222 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.12146161644391706 +settled_accuracy_p90_ci_low = 0.10443615832982389 +settled_accuracy_p90_ci_high = 0.1345452218274391 +settled_accuracy_p95 = 0.1444775169134167 +settled_accuracy_p95_ci_low = 0.1399998914056544 +settled_accuracy_p95_ci_high = 0.14545456098386966 +settled_accuracy_p99 = 0.1754589346516443 +settled_accuracy_p99_ci_low = 0.161817959637922 +settled_accuracy_p99_ci_high = 0.20829304513614155 +settled_accuracy_mean = 0.0826414365396905 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.0625 +jitter_p90_per_min_ci_high = 0.08695652173913043 +jitter_p95_per_min = 0.1111111111111111 +jitter_p95_per_min_ci_low = 0.09523809523809523 +jitter_p95_per_min_ci_high = 0.13043478260869565 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.17391304347826086 +jitter_p99_per_min_ci_high = 0.23529411764705882 +jitter_mean_per_min = 0.017691723075690224 +reaction_rate = 0.127 +reaction_rate_ci_low = 0.10636212138808836 +reaction_rate_ci_high = 0.14763787861191163 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 169.13385826771653 +fire_decisiveness_mean = 5.0303229038051205 +fire_decisiveness_p50 = 3.0001325074446115 +step_correction_mean = 0.10873505179806957 +step_correction_p50 = 0.39523065090179443 + +[cell.spm_10.step_plus_25_at_15min] +shares_per_minute = 10 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.855 +convergence_rate_ci_low = 0.8331765639735627 +convergence_rate_ci_high = 0.8768234360264373 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 240 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 343.859649122807 +settled_accuracy_p10 = 0.03823540843956752 +settled_accuracy_p10_ci_low = 0.03314479859073538 +settled_accuracy_p10_ci_high = 0.045813126407541316 +settled_accuracy_p50 = 0.16193100006378025 +settled_accuracy_p50_ci_low = 0.16055736218577754 +settled_accuracy_p50_ci_high = 0.1631999481167965 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20460289485082828 +settled_accuracy_p99 = 0.2427457467476899 +settled_accuracy_p99_ci_low = 0.23427574934829243 +settled_accuracy_p99_ci_high = 0.24800004853312907 +settled_accuracy_mean = 0.14276326849579427 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13043478260869565 +jitter_p90_per_min_ci_high = 0.15789473684210525 +jitter_p95_per_min = 0.17391304347826086 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.1875 +jitter_p99_per_min = 0.2222222222222222 +jitter_p99_per_min_ci_low = 0.21052631578947367 +jitter_p99_per_min_ci_high = 0.23809523809523808 +jitter_mean_per_min = 0.04360705545063444 +reaction_rate = 0.253 +reaction_rate_ci_low = 0.22605509648189476 +reaction_rate_ci_high = 0.27994490351810525 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 183.79446640316206 +fire_decisiveness_mean = 5.190150056125009 +fire_decisiveness_p50 = 2.999962324877959 +step_correction_mean = 0.17058642844673202 +step_correction_p50 = 0.1920011043548584 + +[cell.spm_10.step_plus_50_at_15min] +shares_per_minute = 10 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.64 +convergence_rate_ci_low = 0.6102492917731359 +convergence_rate_ci_high = 0.6697507082268641 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 722.0625 +settled_accuracy_p10 = 0.022796880887404614 +settled_accuracy_p10_ci_low = 0.020074855910559464 +settled_accuracy_p10_ci_high = 0.028361368881226312 +settled_accuracy_p50 = 0.11641669808107125 +settled_accuracy_p50_ci_low = 0.11246488081331651 +settled_accuracy_p50_ci_high = 0.12367662439911842 +settled_accuracy_p90 = 0.26153326215021633 +settled_accuracy_p90_ci_low = 0.25041896063403024 +settled_accuracy_p90_ci_high = 0.2775140300026727 +settled_accuracy_p95 = 0.302666610951397 +settled_accuracy_p95_ci_low = 0.3009193645846485 +settled_accuracy_p95_ci_high = 0.3033332704001326 +settled_accuracy_p99 = 0.33333334824641403 +settled_accuracy_p99_ci_low = 0.33333334824641403 +settled_accuracy_p99_ci_high = 0.33333334824641403 +settled_accuracy_mean = 0.13027916969514047 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.045454545454545456 +jitter_p50_per_min = 0.13636363636363635 +jitter_p50_per_min_ci_low = 0.13043478260869565 +jitter_p50_per_min_ci_high = 0.14285714285714285 +jitter_p90_per_min = 0.21739130434782608 +jitter_p90_per_min_ci_low = 0.21052631578947367 +jitter_p90_per_min_ci_high = 0.21739130434782608 +jitter_p95_per_min = 0.2222222222222222 +jitter_p95_per_min_ci_low = 0.21739130434782608 +jitter_p95_per_min_ci_high = 0.22727272727272727 +jitter_p99_per_min = 0.2777777777777778 +jitter_p99_per_min_ci_low = 0.2727272727272727 +jitter_p99_per_min_ci_high = 0.2777777777777778 +jitter_mean_per_min = 0.1325306881887964 +reaction_rate = 0.53 +reaction_rate_ci_low = 0.49906551180316705 +reaction_rate_ci_high = 0.560934488196833 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 177.50943396226415 +fire_decisiveness_mean = 8.746121396651038 +fire_decisiveness_p50 = 4.000163812739146 +step_correction_mean = 0.13592612450274658 +step_correction_p50 = 0.102354034781456 + +[cell.spm_12.cold_start_10gh_to_1ph] +shares_per_minute = 12 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.975 +convergence_rate_ci_low = 0.9653232753475155 +convergence_rate_ci_high = 0.9846767246524845 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 616.3076923076923 +settled_accuracy_p10 = 0.011065782055505569 +settled_accuracy_p10_ci_low = 0.00894165226454502 +settled_accuracy_p10_ci_high = 0.013679940777768906 +settled_accuracy_p50 = 0.06182853805820909 +settled_accuracy_p50_ci_low = 0.057564306566448176 +settled_accuracy_p50_ci_high = 0.06607961621245484 +settled_accuracy_p90 = 0.13553078179612987 +settled_accuracy_p90_ci_low = 0.1284319389609977 +settled_accuracy_p90_ci_high = 0.14030296028611466 +settled_accuracy_p95 = 0.15573363713069066 +settled_accuracy_p95_ci_low = 0.14724926467139032 +settled_accuracy_p95_ci_high = 0.1610722144402037 +settled_accuracy_p99 = 0.1906187041398989 +settled_accuracy_p99_ci_low = 0.18063766977620066 +settled_accuracy_p99_ci_high = 0.21005994096701597 +settled_accuracy_mean = 0.0686570177317056 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.043478260869565216 +jitter_p50_per_min_ci_low = 0.04 +jitter_p50_per_min_ci_high = 0.047619047619047616 +jitter_p90_per_min = 0.15 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15789473684210525 +jitter_p95_per_min = 0.17391304347826086 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.1875 +jitter_p99_per_min = 0.20833333333333334 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.23076923076923078 +jitter_mean_per_min = 0.055015587286416624 +bias_mean = -0.02729747084807687 +bias_p10 = -0.11467719299116853 +bias_p10_ci_low = -0.11788110265191311 +bias_p10_ci_high = -0.1084055728769619 +bias_p50 = -0.03154708619860667 +bias_p50_ci_low = -0.03572091851733813 +bias_p50_ci_high = -0.027116739074011884 +bias_p90 = 0.06173046021821989 +bias_p90_ci_low = 0.05364013688527181 +bias_p90_ci_high = 0.07064359121519385 +bias_p99 = 0.14765731482618244 +bias_p99_ci_low = 0.12921157443263723 +bias_p99_ci_high = 0.17167281550463712 +variance_mean = 0.012851442206952309 +variance_p10 = 0.000926787263622565 +variance_p10_ci_low = 0.0008266654165239635 +variance_p10_ci_high = 0.001186596264728404 +variance_p50 = 0.00850873134959675 +variance_p50_ci_low = 0.0077581473991639215 +variance_p50_ci_high = 0.009459131552521363 +variance_p90 = 0.0309722780974111 +variance_p90_ci_low = 0.02883757971355839 +variance_p90_ci_high = 0.03344171339018528 +variance_p99 = 0.057398513709928725 +variance_p99_ci_low = 0.05090959113203073 +variance_p99_ci_high = 0.06185887114035512 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0.08047990354577061 +ramp_target_overshoot_p90_ci_low = 0.07156314867009361 +ramp_target_overshoot_p90_ci_high = 0.09053516031401854 +ramp_target_overshoot_p99 = 0.19732173889000992 +ramp_target_overshoot_p99_ci_low = 0.1718085590780476 +ramp_target_overshoot_p99_ci_high = 0.2513020965279149 +ramp_target_overshoot_mean = 0.02112771696111465 + +[cell.spm_12.stable_1ph] +shares_per_minute = 12 +scenario = "stable_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 540 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 720 +convergence_p95_secs_ci_low = 660 +convergence_p95_secs_ci_high = 840 +convergence_p99_secs = 1260 +convergence_p99_secs_ci_low = 1020 +convergence_p99_secs_ci_high = 1260 +convergence_mean_secs = 174 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0.06000055968793294 +settled_accuracy_p90_ci_low = 0.055000211057379955 +settled_accuracy_p90_ci_high = 0.06499970035891833 +settled_accuracy_p95 = 0.08500042379248174 +settled_accuracy_p95_ci_low = 0.07379015635090447 +settled_accuracy_p95_ci_high = 0.09507312886559649 +settled_accuracy_p99 = 0.158502616004216 +settled_accuracy_p99_ci_low = 0.128000563177594 +settled_accuracy_p99_ci_high = 0.19683318635373448 +settled_accuracy_mean = 0.019664741827834745 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.043478260869565216 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.045454545454545456 +jitter_p95_per_min = 0.08333333333333333 +jitter_p95_per_min_ci_low = 0.05555555555555555 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.17391304347826086 +jitter_p99_per_min_ci_low = 0.13043478260869565 +jitter_p99_per_min_ci_high = 0.17647058823529413 +jitter_mean_per_min = 0.009911121201692644 +bias_mean = -0.0034870268921716194 +bias_p10 = -0.06871748908833698 +bias_p10_ci_low = -0.0747319233080316 +bias_p10_ci_high = -0.06436871808706367 +bias_p50 = -0.004877055517599213 +bias_p50_ci_low = -0.00844805949931298 +bias_p50_ci_high = -0.0009693875530906624 +bias_p90 = 0.06192518895180823 +bias_p90_ci_low = 0.05777669905968014 +bias_p90_ci_high = 0.06859283966990366 +bias_p99 = 0.11917017741100845 +bias_p99_ci_low = 0.10777542416784981 +bias_p99_ci_high = 0.13003729603421682 +variance_mean = 0.003231752726952161 +variance_p10 = 0.00019710308446661265 +variance_p10_ci_low = 0.00018305451522008295 +variance_p10_ci_high = 0.0002093673840818968 +variance_p50 = 0.0006127292765599274 +variance_p50_ci_low = 0.0005768636555245614 +variance_p50_ci_high = 0.0006629371863948567 +variance_p90 = 0.007957550593916354 +variance_p90_ci_low = 0.00611597694029953 +variance_p90_ci_high = 0.010806987226674237 +variance_p99 = 0.04392032171873575 +variance_p99_ci_low = 0.034289516891116 +variance_p99_ci_high = 0.0519609836823219 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1.0749999949668352 +upward_step_magnitude_p90_ci_low = 1.0650008412096212 +upward_step_magnitude_p90_ci_high = 1.0850003731863733 +upward_step_magnitude_p95 = 1.118751145345117 +upward_step_magnitude_p95_ci_low = 1.0999999699652663 +upward_step_magnitude_p95_ci_high = 1.1500004660337804 +upward_step_magnitude_p99 = 1.2250005217714244 +upward_step_magnitude_p99_ci_low = 1.2000000536870918 +upward_step_magnitude_p99_ci_high = 1.250000521292048 +upward_step_magnitude_mean = 1.0241251938617089 +fire_decisiveness_mean = 4.503007828539524 +fire_decisiveness_p50 = 3.0556736485163896 + +[cell.spm_12.step_minus_50_at_15min] +shares_per_minute = 12 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.387 +convergence_rate_ci_low = 0.35681148215628994 +convergence_rate_ci_high = 0.4171885178437101 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 360 +convergence_p50_secs_ci_low = 360 +convergence_p50_secs_ci_high = 420 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 572.5581395348837 +settled_accuracy_p10 = 0.1300145002124331 +settled_accuracy_p10_ci_low = 0.11730441674980896 +settled_accuracy_p10_ci_high = 0.14631645144965555 +settled_accuracy_p50 = 0.3328003099892687 +settled_accuracy_p50_ci_low = 0.3144950249178571 +settled_accuracy_p50_ci_high = 0.3497581832717598 +settled_accuracy_p90 = 0.6168482442408347 +settled_accuracy_p90_ci_low = 0.586805752920863 +settled_accuracy_p90_ci_high = 0.6279335549760183 +settled_accuracy_p95 = 0.6743750369518187 +settled_accuracy_p95_ci_low = 0.6382975796315469 +settled_accuracy_p95_ci_high = 0.6942513405499076 +settled_accuracy_p99 = 0.905172892233028 +settled_accuracy_p99_ci_low = 0.7970837305898513 +settled_accuracy_p99_ci_high = 0.9074081543042183 +settled_accuracy_mean = 0.3519730863923958 +jitter_p10_per_min = 0.13043478260869565 +jitter_p10_per_min_ci_low = 0.13043478260869565 +jitter_p10_per_min_ci_high = 0.13043478260869565 +jitter_p50_per_min = 0.17391304347826086 +jitter_p50_per_min_ci_low = 0.17391304347826086 +jitter_p50_per_min_ci_high = 0.18181818181818182 +jitter_p90_per_min = 0.23529411764705882 +jitter_p90_per_min_ci_low = 0.2222222222222222 +jitter_p90_per_min_ci_high = 0.23809523809523808 +jitter_p95_per_min = 0.25 +jitter_p95_per_min_ci_low = 0.23529411764705882 +jitter_p95_per_min_ci_high = 0.2777777777777778 +jitter_p99_per_min = 0.2777777777777778 +jitter_p99_per_min_ci_low = 0.2777777777777778 +jitter_p99_per_min_ci_high = 0.3125 +jitter_mean_per_min = 0.17759517023552346 +reaction_rate = 0.503 +reaction_rate_ci_low = 0.47201023676114967 +reaction_rate_ci_high = 0.5339897632388504 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 196.58051689860835 +fire_decisiveness_mean = 6.4014350694873245 +fire_decisiveness_p50 = 4.9999986578227045 +step_correction_mean = 0.12353043095254992 +step_correction_p50 = 0.09999999403953552 + +[cell.spm_12.step_minus_25_at_15min] +shares_per_minute = 12 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.811 +convergence_rate_ci_low = 0.7867340442924661 +convergence_rate_ci_high = 0.835265955707534 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 240 +convergence_p90_secs = 720 +convergence_p90_secs_ci_low = 660 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 272.8483353884094 +settled_accuracy_p10 = 0.10959288989645644 +settled_accuracy_p10_ci_low = 0.09272458495628655 +settled_accuracy_p10_ci_high = 0.11908816771417641 +settled_accuracy_p50 = 0.2728400318865527 +settled_accuracy_p50_ci_low = 0.2716054077574803 +settled_accuracy_p50_ci_high = 0.3236672112625494 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.4055560412248853 +settled_accuracy_p99_ci_low = 0.3952388140485874 +settled_accuracy_p99_ci_high = 0.42000108984794116 +settled_accuracy_mean = 0.2590222327190438 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.13043478260869565 +jitter_p90_per_min_ci_low = 0.125 +jitter_p90_per_min_ci_high = 0.13636363636363635 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.17391304347826086 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.17647058823529413 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.03222187514890265 +reaction_rate = 0.158 +reaction_rate_ci_low = 0.13539311835745585 +reaction_rate_ci_high = 0.18060688164254415 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 197.08860759493672 +fire_decisiveness_mean = 4.185523326324878 +fire_decisiveness_p50 = 2.2221994885776652 +step_correction_mean = 0.23247440555427648 +step_correction_p50 = 0.19653107225894928 + +[cell.spm_12.step_minus_10_at_15min] +shares_per_minute = 12 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.99 +convergence_rate_ci_low = 0.9838330039727595 +convergence_rate_ci_high = 0.9961669960272405 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 540 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 720 +convergence_p95_secs_ci_low = 660 +convergence_p95_secs_ci_high = 840 +convergence_p99_secs = 1260 +convergence_p99_secs_ci_low = 1020 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 181.6969696969697 +settled_accuracy_p10 = 0.05000035418567306 +settled_accuracy_p10_ci_low = 0.044444411304264575 +settled_accuracy_p10_ci_high = 0.052469363871346264 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.12974559402343377 +settled_accuracy_p90_ci_low = 0.1188894675992811 +settled_accuracy_p90_ci_high = 0.16111168070795379 +settled_accuracy_p95 = 0.16666702706612346 +settled_accuracy_p95_ci_low = 0.16203785760170075 +settled_accuracy_p95_ci_high = 0.1722224479896981 +settled_accuracy_p99 = 0.20770924264291102 +settled_accuracy_p99_ci_low = 0.1888893072836606 +settled_accuracy_p99_ci_high = 0.2708341519993409 +settled_accuracy_mean = 0.103181914906706 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.045454545454545456 +jitter_p90_per_min_ci_low = 0.043478260869565216 +jitter_p90_per_min_ci_high = 0.07142857142857142 +jitter_p95_per_min = 0.09523809523809523 +jitter_p95_per_min_ci_low = 0.08695652173913043 +jitter_p95_per_min_ci_high = 0.11764705882352941 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.15 +jitter_p99_per_min_ci_high = 0.17391304347826086 +jitter_mean_per_min = 0.012077704092901534 +reaction_rate = 0.077 +reaction_rate_ci_low = 0.060476490881171754 +reaction_rate_ci_high = 0.09352350911882824 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 154.28571428571428 +fire_decisiveness_mean = 4.224210516243525 +fire_decisiveness_p50 = 3.0554924545812234 +step_correction_mean = 0.16385024708586854 +step_correction_p50 = 0.37290483713150024 + +[cell.spm_12.step_minus_5_at_15min] +shares_per_minute = 12 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.997 +convergence_rate_ci_low = 0.9936102764714508 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 720 +convergence_p95_secs_ci_low = 660 +convergence_p95_secs_ci_high = 840 +convergence_p99_secs = 1200 +convergence_p99_secs_ci_low = 960 +convergence_p99_secs_ci_high = 1260 +convergence_mean_secs = 185.2357071213641 +settled_accuracy_p10 = 0.012999764130001035 +settled_accuracy_p10_ci_low = 0.008771693735203812 +settled_accuracy_p10_ci_high = 0.01999914807062364 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.10087797467989601 +settled_accuracy_p90_ci_low = 0.10000054393500801 +settled_accuracy_p90_ci_high = 0.104463848560582 +settled_accuracy_p95 = 0.11052653403270662 +settled_accuracy_p95_ci_low = 0.1052635036634022 +settled_accuracy_p95_ci_high = 0.11513182688766821 +settled_accuracy_p99 = 0.14736880623148907 +settled_accuracy_p99_ci_low = 0.13157893807356436 +settled_accuracy_p99_ci_high = 0.17763271431410188 +settled_accuracy_mean = 0.05475292854255202 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.043478260869565216 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.045454545454545456 +jitter_p95_per_min = 0.08333333333333333 +jitter_p95_per_min_ci_low = 0.05555555555555555 +jitter_p95_per_min_ci_high = 0.08695652173913043 +jitter_p99_per_min = 0.13043478260869565 +jitter_p99_per_min_ci_low = 0.11764705882352941 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.008667171052463922 +reaction_rate = 0.074 +reaction_rate_ci_low = 0.0577752720084434 +reaction_rate_ci_high = 0.09022472799155659 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 149.1891891891892 +fire_decisiveness_mean = 4.245607695165242 +fire_decisiveness_p50 = 2.8572595786328208 +step_correction_mean = 0.9779534458297573 +step_correction_p50 = 0.733329176902771 + +[cell.spm_12.step_plus_5_at_15min] +shares_per_minute = 12 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.99 +convergence_rate_ci_low = 0.9838330039727595 +convergence_rate_ci_high = 0.9961669960272405 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 720 +convergence_p95_secs_ci_low = 660 +convergence_p95_secs_ci_high = 840 +convergence_p99_secs = 1140 +convergence_p99_secs_ci_low = 1080 +convergence_p99_secs_ci_high = 1320 +convergence_mean_secs = 193.03030303030303 +settled_accuracy_p10 = 0.012376025950808112 +settled_accuracy_p10_ci_low = 0.00750066246041059 +settled_accuracy_p10_ci_high = 0.018571900250910378 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.09313394457369828 +settled_accuracy_p90_ci_low = 0.09090874229158763 +settled_accuracy_p90_ci_high = 0.09523803132488629 +settled_accuracy_p95 = 0.10263975613787302 +settled_accuracy_p95_ci_low = 0.09999962930338824 +settled_accuracy_p95_ci_high = 0.10714244170699905 +settled_accuracy_p99 = 0.13670594389008262 +settled_accuracy_p99_ci_low = 0.12043613351162563 +settled_accuracy_p99_ci_high = 0.1488093800048037 +settled_accuracy_mean = 0.0505059203444565 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.043478260869565216 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.045454545454545456 +jitter_p95_per_min = 0.08695652173913043 +jitter_p95_per_min_ci_low = 0.05555555555555555 +jitter_p95_per_min_ci_high = 0.09523809523809523 +jitter_p99_per_min = 0.16 +jitter_p99_per_min_ci_low = 0.13043478260869565 +jitter_p99_per_min_ci_high = 0.17391304347826086 +jitter_mean_per_min = 0.010009501757087487 +reaction_rate = 0.085 +reaction_rate_ci_low = 0.06771473344145368 +reaction_rate_ci_high = 0.10228526655854633 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 154.58823529411765 +fire_decisiveness_mean = 4.465760527618577 +fire_decisiveness_p50 = 3.22929770371584 +step_correction_mean = 1660.7089892948375 +step_correction_p50 = 0.45331838726997375 + +[cell.spm_12.step_plus_10_at_15min] +shares_per_minute = 12 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.987 +convergence_rate_ci_low = 0.9799792044895183 +convergence_rate_ci_high = 0.9940207955104817 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 660 +convergence_p95_secs = 840 +convergence_p95_secs_ci_low = 720 +convergence_p95_secs_ci_high = 900 +convergence_p99_secs = 1200 +convergence_p99_secs_ci_low = 1080 +convergence_p99_secs_ci_high = 1320 +convergence_mean_secs = 199.08814589665653 +settled_accuracy_p10 = 0.03920420599322427 +settled_accuracy_p10_ci_low = 0.0361814396767256 +settled_accuracy_p10_ci_high = 0.04278074246442176 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.11788587307749121 +settled_accuracy_p90_ci_low = 0.10192549366348946 +settled_accuracy_p90_ci_high = 0.1325753936072217 +settled_accuracy_p95 = 0.1409087894738159 +settled_accuracy_p95_ci_low = 0.13636362804435553 +settled_accuracy_p95_ci_high = 0.14540069086746565 +settled_accuracy_p99 = 0.16799307338897385 +settled_accuracy_p99_ci_low = 0.15909071636090344 +settled_accuracy_p99_ci_high = 0.18534034901612606 +settled_accuracy_mean = 0.08424945518277724 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05263157894736842 +jitter_p90_per_min_ci_low = 0.045454545454545456 +jitter_p90_per_min_ci_high = 0.07142857142857142 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.08695652173913043 +jitter_p95_per_min_ci_high = 0.125 +jitter_p99_per_min = 0.17391304347826086 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.18518518518518517 +jitter_mean_per_min = 0.013793025431043862 +reaction_rate = 0.101 +reaction_rate_ci_low = 0.08232345218194755 +reaction_rate_ci_high = 0.11967654781805247 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 171.0891089108911 +fire_decisiveness_mean = 4.872084044891618 +fire_decisiveness_p50 = 3.3332155440314004 +step_correction_mean = 0.5712511011279455 +step_correction_p50 = 0.3494202196598053 + +[cell.spm_12.step_plus_25_at_15min] +shares_per_minute = 12 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.845 +convergence_rate_ci_low = 0.8225689153182464 +convergence_rate_ci_high = 0.8674310846817536 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 120 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 313.06508875739644 +settled_accuracy_p10 = 0.05062005367420486 +settled_accuracy_p10_ci_low = 0.038996691372033654 +settled_accuracy_p10_ci_high = 0.05761397822838188 +settled_accuracy_p50 = 0.16399961731842438 +settled_accuracy_p50_ci_low = 0.16333276997680501 +settled_accuracy_p50_ci_high = 0.16920925144520282 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20199976893076577 +settled_accuracy_p99 = 0.23666638176717714 +settled_accuracy_p99_ci_low = 0.22251945781193327 +settled_accuracy_p99_ci_high = 0.24181803383703993 +settled_accuracy_mean = 0.1525977565668444 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.13043478260869565 +jitter_p90_per_min_ci_low = 0.11764705882352941 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.15 +jitter_p95_per_min_ci_high = 0.17391304347826086 +jitter_p99_per_min = 0.21428571428571427 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.22727272727272727 +jitter_mean_per_min = 0.034214365639460315 +reaction_rate = 0.211 +reaction_rate_ci_low = 0.1857107586827916 +reaction_rate_ci_high = 0.23628924131720838 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 186.54028436018956 +fire_decisiveness_mean = 5.2960043968333155 +fire_decisiveness_p50 = 3.055668090830636 +step_correction_mean = 0.26693981207942513 +step_correction_p50 = 0.19000206887722015 + +[cell.spm_12.step_plus_50_at_15min] +shares_per_minute = 12 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.54 +convergence_rate_ci_low = 0.5091090071380022 +convergence_rate_ci_high = 0.5708909928619978 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 735.4444444444445 +settled_accuracy_p10 = 0.030848960228692657 +settled_accuracy_p10_ci_low = 0.02550539461309098 +settled_accuracy_p10_ci_high = 0.03558791972455655 +settled_accuracy_p50 = 0.13322281547451653 +settled_accuracy_p50_ci_low = 0.12563441363988548 +settled_accuracy_p50_ci_high = 0.14390762026512294 +settled_accuracy_p90 = 0.24824615459501997 +settled_accuracy_p90_ci_low = 0.23681724672734683 +settled_accuracy_p90_ci_high = 0.2572926530737515 +settled_accuracy_p95 = 0.3005554555882043 +settled_accuracy_p95_ci_low = 0.27999947386651114 +settled_accuracy_p95_ci_high = 0.3017854268360829 +settled_accuracy_p99 = 0.33333334824641403 +settled_accuracy_p99_ci_low = 0.33333334824641403 +settled_accuracy_p99_ci_high = 0.33333334824641403 +settled_accuracy_mean = 0.13899690520765656 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.043478260869565216 +jitter_p50_per_min = 0.13043478260869565 +jitter_p50_per_min_ci_low = 0.13043478260869565 +jitter_p50_per_min_ci_high = 0.13636363636363635 +jitter_p90_per_min = 0.2 +jitter_p90_per_min_ci_low = 0.19047619047619047 +jitter_p90_per_min_ci_high = 0.21739130434782608 +jitter_p95_per_min = 0.2222222222222222 +jitter_p95_per_min_ci_low = 0.21052631578947367 +jitter_p95_per_min_ci_high = 0.2222222222222222 +jitter_p99_per_min = 0.23529411764705882 +jitter_p99_per_min_ci_low = 0.22727272727272727 +jitter_p99_per_min_ci_high = 0.2608695652173913 +jitter_mean_per_min = 0.12698529829154284 +reaction_rate = 0.457 +reaction_rate_ci_low = 0.42612449382439216 +reaction_rate_ci_high = 0.4878755061756079 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 186.3019693654267 +fire_decisiveness_mean = 8.244549222303943 +fire_decisiveness_p50 = 4.166824731474009 +step_correction_mean = 0.12233997622190992 +step_correction_p50 = 0.10000065714120865 + +[cell.spm_15.cold_start_10gh_to_1ph] +shares_per_minute = 15 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.987 +convergence_rate_ci_low = 0.9799792044895183 +convergence_rate_ci_high = 0.9940207955104817 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 617.2644376899696 +settled_accuracy_p10 = 0.014669393881456605 +settled_accuracy_p10_ci_low = 0.012849669901560001 +settled_accuracy_p10_ci_high = 0.017613392674570738 +settled_accuracy_p50 = 0.06885168209376435 +settled_accuracy_p50_ci_low = 0.0649259477164229 +settled_accuracy_p50_ci_high = 0.07150570348176222 +settled_accuracy_p90 = 0.1331431826016778 +settled_accuracy_p90_ci_low = 0.12916342558811356 +settled_accuracy_p90_ci_high = 0.1395252356511013 +settled_accuracy_p95 = 0.15755181760669523 +settled_accuracy_p95_ci_low = 0.1460686184116795 +settled_accuracy_p95_ci_high = 0.1624252633737734 +settled_accuracy_p99 = 0.19048743920020728 +settled_accuracy_p99_ci_low = 0.1794678280437343 +settled_accuracy_p99_ci_high = 0.20004206383650236 +settled_accuracy_mean = 0.07215092159597498 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.13043478260869565 +jitter_p90_per_min_ci_low = 0.125 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.15 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.19047619047619047 +jitter_p99_per_min_ci_high = 0.21428571428571427 +jitter_mean_per_min = 0.04457933741638434 +bias_mean = -0.027623942321463556 +bias_p10 = -0.10786844765070039 +bias_p10_ci_low = -0.11442541819039255 +bias_p10_ci_high = -0.10288849305097772 +bias_p50 = -0.02872828782302689 +bias_p50_ci_low = -0.034485793987532425 +bias_p50_ci_high = -0.02338587471207957 +bias_p90 = 0.056464639514365776 +bias_p90_ci_low = 0.047025675240656546 +bias_p90_ci_high = 0.06316759655947544 +bias_p99 = 0.1362819383847445 +bias_p99_ci_low = 0.11403266179270051 +bias_p99_ci_high = 0.1437230611550476 +variance_mean = 0.009265361800742892 +variance_p10 = 0.0007895647931716653 +variance_p10_ci_low = 0.0006243386726270661 +variance_p10_ci_high = 0.0009268500212050628 +variance_p50 = 0.006274444105609761 +variance_p50_ci_low = 0.005651158982454124 +variance_p50_ci_high = 0.006810178745430207 +variance_p90 = 0.021642226288654885 +variance_p90_ci_low = 0.02006616573503675 +variance_p90_ci_high = 0.02369205002342088 +variance_p99 = 0.04440372574928757 +variance_p99_ci_low = 0.039887053042697504 +variance_p99_ci_high = 0.048371622517103155 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0.042979536963596354 +ramp_target_overshoot_p90_ci_low = 0.03415492255938979 +ramp_target_overshoot_p90_ci_high = 0.057606450933588293 +ramp_target_overshoot_p99 = 0.18492283923380204 +ramp_target_overshoot_p99_ci_low = 0.1455310092951818 +ramp_target_overshoot_p99_ci_high = 0.20492181783687857 +ramp_target_overshoot_mean = 0.013436594235845116 + +[cell.spm_15.stable_1ph] +shares_per_minute = 15 +scenario = "stable_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 420 +convergence_p90_secs_ci_low = 420 +convergence_p90_secs_ci_high = 540 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 660 +convergence_p99_secs = 960 +convergence_p99_secs_ci_low = 900 +convergence_p99_secs_ci_high = 1200 +convergence_mean_secs = 132.78 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0.05907036371192831 +settled_accuracy_p90_ci_low = 0.05599986470852847 +settled_accuracy_p90_ci_high = 0.060000358361338435 +settled_accuracy_p95 = 0.0768775667882523 +settled_accuracy_p95_ci_low = 0.06799980216306634 +settled_accuracy_p95_ci_high = 0.09500058418266866 +settled_accuracy_p99 = 0.12893304085500457 +settled_accuracy_p99_ci_low = 0.12320040029095725 +settled_accuracy_p99_ci_high = 0.15000113078437316 +settled_accuracy_mean = 0.016237222925113027 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0.043478260869565216 +jitter_p95_per_min_ci_low = 0.043478260869565216 +jitter_p95_per_min_ci_high = 0.045454545454545456 +jitter_p99_per_min = 0.09523809523809523 +jitter_p99_per_min_ci_low = 0.08695652173913043 +jitter_p99_per_min_ci_high = 0.13043478260869565 +jitter_mean_per_min = 0.004653605240272938 +bias_mean = 0.0005025662200344482 +bias_p10 = -0.06113845760071983 +bias_p10_ci_low = -0.06601501156785526 +bias_p10_ci_high = -0.05775509353723653 +bias_p50 = 0.00060791448256598 +bias_p50_ci_low = -0.003547907936060892 +bias_p50_ci_high = 0.0034013668994968688 +bias_p90 = 0.06265304816817541 +bias_p90_ci_low = 0.058422360512714405 +bias_p90_ci_high = 0.06887447085145702 +bias_p99 = 0.11531325081243493 +bias_p99_ci_low = 0.10151464390134292 +bias_p99_ci_high = 0.13506443523003628 +variance_mean = 0.0016519239141700767 +variance_p10 = 0.00016299668086059734 +variance_p10_ci_low = 0.00015028005516006744 +variance_p10_ci_high = 0.0001726196334919383 +variance_p50 = 0.000480301068644095 +variance_p50_ci_low = 0.00044225588787888707 +variance_p50_ci_high = 0.0005172968952819828 +variance_p90 = 0.0034317463406920937 +variance_p90_ci_low = 0.002701352142083159 +variance_p90_ci_high = 0.004450260215684181 +variance_p99 = 0.021867326647628364 +variance_p99_ci_low = 0.01608659154396777 +variance_p99_ci_high = 0.027174736301105253 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1.0600003583613384 +upward_step_magnitude_p90_ci_low = 1.0560007371237718 +upward_step_magnitude_p90_ci_high = 1.0640003822520943 +upward_step_magnitude_p95 = 1.0900003697698455 +upward_step_magnitude_p95_ci_low = 1.0720007438367185 +upward_step_magnitude_p95_ci_high = 1.0999999932891136 +upward_step_magnitude_p99 = 1.1800000444524394 +upward_step_magnitude_p99_ci_low = 1.179999974686752 +upward_step_magnitude_p99_ci_high = 1.2000000536870918 +upward_step_magnitude_mean = 1.0169224050063128 +fire_decisiveness_mean = 3.962301501803813 +fire_decisiveness_p50 = 2.7776964515360945 + +[cell.spm_15.step_minus_50_at_15min] +shares_per_minute = 15 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.318 +convergence_rate_ci_low = 0.28913564756312726 +convergence_rate_ci_high = 0.34686435243687275 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 360 +convergence_p50_secs_ci_low = 300 +convergence_p50_secs_ci_high = 420 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 563.5849056603773 +settled_accuracy_p10 = 0.14713544803656564 +settled_accuracy_p10_ci_low = 0.12865312977961918 +settled_accuracy_p10_ci_high = 0.15798775679291022 +settled_accuracy_p50 = 0.3543994323663773 +settled_accuracy_p50_ci_low = 0.3393159096797893 +settled_accuracy_p50_ci_high = 0.36517376062173956 +settled_accuracy_p90 = 0.61676610299023 +settled_accuracy_p90_ci_low = 0.597400497853825 +settled_accuracy_p90_ci_high = 0.6319360618947745 +settled_accuracy_p95 = 0.6774158738369447 +settled_accuracy_p95_ci_low = 0.6511124200322378 +settled_accuracy_p95_ci_high = 0.690922203981287 +settled_accuracy_p99 = 0.9048284895384997 +settled_accuracy_p99_ci_low = 0.9000000067108864 +settled_accuracy_p99_ci_high = 0.9071433427234294 +settled_accuracy_mean = 0.36473804732396364 +jitter_p10_per_min = 0.13043478260869565 +jitter_p10_per_min_ci_low = 0.13043478260869565 +jitter_p10_per_min_ci_high = 0.13043478260869565 +jitter_p50_per_min = 0.17391304347826086 +jitter_p50_per_min_ci_low = 0.17391304347826086 +jitter_p50_per_min_ci_high = 0.17391304347826086 +jitter_p90_per_min = 0.2222222222222222 +jitter_p90_per_min_ci_low = 0.2222222222222222 +jitter_p90_per_min_ci_high = 0.22727272727272727 +jitter_p95_per_min = 0.23809523809523808 +jitter_p95_per_min_ci_low = 0.22727272727272727 +jitter_p95_per_min_ci_high = 0.2631578947368421 +jitter_p99_per_min = 0.2777777777777778 +jitter_p99_per_min_ci_low = 0.2608695652173913 +jitter_p99_per_min_ci_high = 0.2777777777777778 +jitter_mean_per_min = 0.17246170206373207 +reaction_rate = 0.419 +reaction_rate_ci_low = 0.38841903758218194 +reaction_rate_ci_high = 0.44958096241781803 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 208.06682577565633 +fire_decisiveness_mean = 5.762233578517908 +fire_decisiveness_p50 = 3.3333351889029217 +step_correction_mean = 0.11282688197913204 +step_correction_p50 = 0.09812895953655243 + +[cell.spm_15.step_minus_25_at_15min] +shares_per_minute = 15 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.806 +convergence_rate_ci_low = 0.7814910640296239 +convergence_rate_ci_high = 0.8305089359703762 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 660 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 720 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 212.00992555831266 +settled_accuracy_p10 = 0.1429322153056347 +settled_accuracy_p10_ci_low = 0.12912201653007638 +settled_accuracy_p10_ci_high = 0.1560242597646304 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.2768282668974973 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.3584980535297875 +settled_accuracy_p99_ci_low = 0.3341827227604899 +settled_accuracy_p99_ci_high = 0.4000002326440597 +settled_accuracy_mean = 0.2725858329968209 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.11764705882352941 +jitter_p90_per_min_ci_low = 0.1111111111111111 +jitter_p90_per_min_ci_high = 0.13043478260869565 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.13043478260869565 +jitter_p95_per_min_ci_high = 0.15 +jitter_p99_per_min = 0.17647058823529413 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.026666479400507013 +reaction_rate = 0.121 +reaction_rate_ci_low = 0.10078642202874513 +reaction_rate_ci_high = 0.14121357797125486 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 195.86776859504133 +fire_decisiveness_mean = 3.6043750248428803 +fire_decisiveness_p50 = 1.6667214722396437 +step_correction_mean = 0.19947629994597316 +step_correction_p50 = 0.18666628003120422 + +[cell.spm_15.step_minus_10_at_15min] +shares_per_minute = 15 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.988 +convergence_rate_ci_low = 0.9812512216216562 +convergence_rate_ci_high = 0.9947487783783437 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 480 +convergence_p90_secs_ci_low = 420 +convergence_p90_secs_ci_high = 540 +convergence_p95_secs = 660 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 780 +convergence_p99_secs = 1140 +convergence_p99_secs_ci_low = 960 +convergence_p99_secs_ci_high = 1200 +convergence_mean_secs = 138.40080971659918 +settled_accuracy_p10 = 0.057143272578684234 +settled_accuracy_p10_ci_low = 0.053333875175275214 +settled_accuracy_p10_ci_high = 0.05925936420316247 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11978850268565955 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.14297282575668047 +settled_accuracy_p95 = 0.16666687793531376 +settled_accuracy_p95_ci_low = 0.1629638853646378 +settled_accuracy_p95_ci_high = 0.16888900156550068 +settled_accuracy_p99 = 0.1911119528716816 +settled_accuracy_p99_ci_low = 0.17777816717489214 +settled_accuracy_p99_ci_high = 0.22133368428783884 +settled_accuracy_mean = 0.1066620301400832 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.038461538461538464 +jitter_p95_per_min = 0.05 +jitter_p95_per_min_ci_low = 0.043478260869565216 +jitter_p95_per_min_ci_high = 0.07407407407407407 +jitter_p99_per_min = 0.125 +jitter_p99_per_min_ci_low = 0.10526315789473684 +jitter_p99_per_min_ci_high = 0.15384615384615385 +jitter_mean_per_min = 0.006479526827342164 +reaction_rate = 0.053 +reaction_rate_ci_low = 0.039114261071156495 +reaction_rate_ci_high = 0.0668857389288435 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 187.9245283018868 +fire_decisiveness_mean = 3.8146301387605597 +fire_decisiveness_p50 = 2.333363508525789 +step_correction_mean = 0.3428179587957994 +step_correction_p50 = 0.34129416942596436 + +[cell.spm_15.step_minus_5_at_15min] +shares_per_minute = 15 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.998 +convergence_rate_ci_low = 0.995230914663648 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 480 +convergence_p90_secs_ci_low = 420 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 660 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 660 +convergence_p99_secs = 1080 +convergence_p99_secs_ci_low = 960 +convergence_p99_secs_ci_high = 1200 +convergence_mean_secs = 135.09018036072143 +settled_accuracy_p10 = 0.023157573804033493 +settled_accuracy_p10_ci_low = 0.014316510695069118 +settled_accuracy_p10_ci_high = 0.03699033554644249 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.10047892417849735 +settled_accuracy_p90_ci_low = 0.07281919324831132 +settled_accuracy_p90_ci_high = 0.10315854582295714 +settled_accuracy_p95 = 0.1115797193620307 +settled_accuracy_p95_ci_low = 0.10736853214475772 +settled_accuracy_p95_ci_high = 0.11672795825235238 +settled_accuracy_p99 = 0.15705296860301177 +settled_accuracy_p99_ci_low = 0.1431582547824073 +settled_accuracy_p99_ci_high = 0.19578983001183303 +settled_accuracy_mean = 0.055334134118691355 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0.043478260869565216 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.045454545454545456 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.08695652173913043 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.004161396175661524 +reaction_rate = 0.049 +reaction_rate_ci_low = 0.03562036179861354 +reaction_rate_ci_high = 0.062379638201386464 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 165.30612244897958 +fire_decisiveness_mean = 3.9920682204007427 +fire_decisiveness_p50 = 2.778004009217806 +step_correction_mean = 1.4769956217128404 +step_correction_p50 = 0.6015164852142334 + +[cell.spm_15.step_plus_5_at_15min] +shares_per_minute = 15 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.997 +convergence_rate_ci_low = 0.9936102764714508 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 420 +convergence_p90_secs_ci_low = 360 +convergence_p90_secs_ci_high = 540 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 660 +convergence_p99_secs = 960 +convergence_p99_secs_ci_low = 780 +convergence_p99_secs_ci_high = 1020 +convergence_mean_secs = 114.64393179538615 +settled_accuracy_p10 = 0.027309986349416837 +settled_accuracy_p10_ci_low = 0.016382361539382773 +settled_accuracy_p10_ci_high = 0.03858440423110554 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.05608639736452603 +settled_accuracy_p90_ci_low = 0.047618983705838724 +settled_accuracy_p90_ci_high = 0.07214165110060466 +settled_accuracy_p95 = 0.09333303421951555 +settled_accuracy_p95_ci_low = 0.09206333441091008 +settled_accuracy_p95_ci_high = 0.09714232538495882 +settled_accuracy_p99 = 0.12380928093932986 +settled_accuracy_p99_ci_low = 0.10857109366621376 +settled_accuracy_p99_ci_high = 0.15238065838019133 +settled_accuracy_mean = 0.04837530155849787 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0.043478260869565216 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.045454545454545456 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.08695652173913043 +jitter_p99_per_min_ci_high = 0.13636363636363635 +jitter_mean_per_min = 0.00485933483449641 +reaction_rate = 0.04 +reaction_rate_ci_low = 0.027854324226293543 +reaction_rate_ci_high = 0.05214567577370646 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 139.5 +fire_decisiveness_mean = 4.2769539972922415 +fire_decisiveness_p50 = 2.3333675141151815 +step_correction_mean = -5133.253441312537 +step_correction_p50 = 0.6676305532455444 + +[cell.spm_15.step_plus_10_at_15min] +shares_per_minute = 15 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.993 +convergence_rate_ci_low = 0.9878325091582084 +convergence_rate_ci_high = 0.9981674908417916 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 420 +convergence_p90_secs_ci_low = 360 +convergence_p90_secs_ci_high = 540 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 720 +convergence_p99_secs = 1140 +convergence_p99_secs_ci_low = 1020 +convergence_p99_secs_ci_high = 1320 +convergence_mean_secs = 130.09063444108762 +settled_accuracy_p10 = 0.04675297720854821 +settled_accuracy_p10_ci_low = 0.04363625848065411 +settled_accuracy_p10_ci_high = 0.04784636364817707 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09336673402566498 +settled_accuracy_p95 = 0.13333323572043843 +settled_accuracy_p95_ci_low = 0.10319976899908412 +settled_accuracy_p95_ci_high = 0.1345452218274391 +settled_accuracy_p99 = 0.14545456098386966 +settled_accuracy_p99_ci_low = 0.1418180535903334 +settled_accuracy_p99_ci_high = 0.14909064132099048 +settled_accuracy_mean = 0.08526415763701628 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0.05263157894736842 +jitter_p95_per_min_ci_low = 0.043478260869565216 +jitter_p95_per_min_ci_high = 0.06666666666666667 +jitter_p99_per_min = 0.12 +jitter_p99_per_min_ci_low = 0.09090909090909091 +jitter_p99_per_min_ci_high = 0.13636363636363635 +jitter_mean_per_min = 0.006030133476221407 +reaction_rate = 0.058 +reaction_rate_ci_low = 0.0435124309285512 +reaction_rate_ci_high = 0.0724875690714488 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 178.9655172413793 +fire_decisiveness_mean = 3.775161234294088 +fire_decisiveness_p50 = 2.3333622822478226 +step_correction_mean = 0.54978099028612 +step_correction_p50 = 0.43371573090553284 + +[cell.spm_15.step_plus_25_at_15min] +shares_per_minute = 15 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.84 +convergence_rate_ci_low = 0.817277521261975 +convergence_rate_ci_high = 0.862722478738025 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 780 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 285 +settled_accuracy_p10 = 0.055620576586458914 +settled_accuracy_p10_ci_low = 0.04306971612199684 +settled_accuracy_p10_ci_high = 0.0658967150587777 +settled_accuracy_p50 = 0.17629922220291872 +settled_accuracy_p50_ci_low = 0.16373306091788176 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.23636342551979306 +settled_accuracy_p99_ci_low = 0.20703991291524548 +settled_accuracy_p99_ci_high = 0.2415996347559911 +settled_accuracy_mean = 0.154449788344018 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.11764705882352941 +jitter_p90_per_min_ci_low = 0.1111111111111111 +jitter_p90_per_min_ci_high = 0.13043478260869565 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.13043478260869565 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.17647058823529413 +jitter_p99_per_min_ci_low = 0.17391304347826086 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.02851983891165764 +reaction_rate = 0.17 +reaction_rate_ci_low = 0.14671803788337417 +reaction_rate_ci_high = 0.19328196211662585 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 184.58823529411765 +fire_decisiveness_mean = 4.427141093628297 +fire_decisiveness_p50 = 2.333168952189105 +step_correction_mean = 0.18575947223340764 +step_correction_p50 = 0.1866699755191803 + +[cell.spm_15.step_plus_50_at_15min] +shares_per_minute = 15 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.475 +convergence_rate_ci_low = 0.44404844107318664 +convergence_rate_ci_high = 0.5059515589268133 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 826.3578947368421 +settled_accuracy_p10 = 0.04150889000060931 +settled_accuracy_p10_ci_low = 0.03548671955859195 +settled_accuracy_p10_ci_high = 0.0463994260492091 +settled_accuracy_p50 = 0.13517854671014007 +settled_accuracy_p50_ci_low = 0.12766897542034983 +settled_accuracy_p50_ci_high = 0.14119758540520022 +settled_accuracy_p90 = 0.2387448817188388 +settled_accuracy_p90_ci_low = 0.23338404675572932 +settled_accuracy_p90_ci_high = 0.24940727214907898 +settled_accuracy_p95 = 0.2979305147670369 +settled_accuracy_p95_ci_low = 0.2622070798777115 +settled_accuracy_p95_ci_high = 0.300475998693972 +settled_accuracy_p99 = 0.30320956639531715 +settled_accuracy_p99_ci_low = 0.30222167918724185 +settled_accuracy_p99_ci_high = 0.33333334824641403 +settled_accuracy_mean = 0.14001306287447282 +jitter_p10_per_min = 0.058823529411764705 +jitter_p10_per_min_ci_low = 0.04 +jitter_p10_per_min_ci_high = 0.08695652173913043 +jitter_p50_per_min = 0.13636363636363635 +jitter_p50_per_min_ci_low = 0.13043478260869565 +jitter_p50_per_min_ci_high = 0.15 +jitter_p90_per_min = 0.2 +jitter_p90_per_min_ci_low = 0.18181818181818182 +jitter_p90_per_min_ci_high = 0.21052631578947367 +jitter_p95_per_min = 0.21739130434782608 +jitter_p95_per_min_ci_low = 0.2 +jitter_p95_per_min_ci_high = 0.2222222222222222 +jitter_p99_per_min = 0.22727272727272727 +jitter_p99_per_min_ci_low = 0.2222222222222222 +jitter_p99_per_min_ci_high = 0.22727272727272727 +jitter_mean_per_min = 0.13339220613001765 +reaction_rate = 0.442 +reaction_rate_ci_low = 0.41121888797330414 +reaction_rate_ci_high = 0.47278111202669587 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 206.06334841628959 +fire_decisiveness_mean = 6.766802205778948 +fire_decisiveness_p50 = 3.3336611833852317 +step_correction_mean = 0.11485353277414632 +step_correction_p50 = 0.0989483892917633 + +[cell.spm_20.cold_start_10gh_to_1ph] +shares_per_minute = 20 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.985 +convergence_rate_ci_low = 0.9774661006112372 +convergence_rate_ci_high = 0.9925338993887628 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 661.6446700507614 +settled_accuracy_p10 = 0.014044543240623986 +settled_accuracy_p10_ci_low = 0.010820163610070432 +settled_accuracy_p10_ci_high = 0.016502405416598087 +settled_accuracy_p50 = 0.07003830104244901 +settled_accuracy_p50_ci_low = 0.06601505748444703 +settled_accuracy_p50_ci_high = 0.07415153758824566 +settled_accuracy_p90 = 0.12874332409400846 +settled_accuracy_p90_ci_low = 0.125791070910515 +settled_accuracy_p90_ci_high = 0.13416484796050454 +settled_accuracy_p95 = 0.14565549623952123 +settled_accuracy_p95_ci_low = 0.13959697502765056 +settled_accuracy_p95_ci_high = 0.15391163144938835 +settled_accuracy_p99 = 0.17749093510230507 +settled_accuracy_p99_ci_low = 0.1633188179095575 +settled_accuracy_p99_ci_high = 0.18413384030948998 +settled_accuracy_mean = 0.07173534471575732 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.125 +jitter_p90_per_min_ci_low = 0.11764705882352941 +jitter_p90_per_min_ci_high = 0.13333333333333333 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.13636363636363635 +jitter_p95_per_min_ci_high = 0.15384615384615385 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.21052631578947367 +jitter_mean_per_min = 0.04184404914447263 +bias_mean = -0.026052926923295694 +bias_p10 = -0.09682037173938467 +bias_p10_ci_low = -0.10298117569143564 +bias_p10_ci_high = -0.09330577275859664 +bias_p50 = -0.027590248628419294 +bias_p50_ci_low = -0.031268093455056434 +bias_p50_ci_high = -0.02314462893899765 +bias_p90 = 0.044256498572582084 +bias_p90_ci_low = 0.03981177249067689 +bias_p90_ci_high = 0.049048873298848106 +bias_p99 = 0.10262601968432282 +bias_p99_ci_low = 0.0914459441678474 +bias_p99_ci_high = 0.12044931476003429 +variance_mean = 0.0071186367916888545 +variance_p10 = 0.0006909029168728341 +variance_p10_ci_low = 0.0005428728675238346 +variance_p10_ci_high = 0.0007812581712126729 +variance_p50 = 0.005103175952995591 +variance_p50_ci_low = 0.004609193963655726 +variance_p50_ci_high = 0.0055165630156722035 +variance_p90 = 0.016158982343633093 +variance_p90_ci_low = 0.014951145085504065 +variance_p90_ci_high = 0.016937948364486845 +variance_p99 = 0.031209117835819342 +variance_p99_ci_low = 0.029565874194875115 +variance_p99_ci_high = 0.03535431700340935 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0.010820163610070432 +ramp_target_overshoot_p90_ci_low = 0.004721712623600327 +ramp_target_overshoot_p90_ci_high = 0.019870398017979962 +ramp_target_overshoot_p99 = 0.1173625330267889 +ramp_target_overshoot_p99_ci_low = 0.08400332027819846 +ramp_target_overshoot_p99_ci_high = 0.1376694742107678 +ramp_target_overshoot_mean = 0.0058868021760183666 + +[cell.spm_20.stable_1ph] +shares_per_minute = 20 +scenario = "stable_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 300 +convergence_p90_secs_ci_low = 300 +convergence_p90_secs_ci_high = 360 +convergence_p95_secs = 480 +convergence_p95_secs_ci_low = 360 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 840 +convergence_p99_secs_ci_low = 720 +convergence_p99_secs_ci_high = 900 +convergence_mean_secs = 76.86 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0.04749952033938831 +settled_accuracy_p90_ci_low = 0.04500072175584169 +settled_accuracy_p90_ci_high = 0.048332676896786775 +settled_accuracy_p95 = 0.054000423188501845 +settled_accuracy_p95_ci_low = 0.05100038849321864 +settled_accuracy_p95_ci_high = 0.05699978679513629 +settled_accuracy_p99 = 0.07800036520644271 +settled_accuracy_p99_ci_low = 0.06899979135853906 +settled_accuracy_p99_ci_high = 0.10124989589737332 +settled_accuracy_mean = 0.008008012060268325 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.045454545454545456 +jitter_p99_per_min_ci_low = 0.043478260869565216 +jitter_p99_per_min_ci_high = 0.05263157894736842 +jitter_mean_per_min = 0.0015969376995735155 +bias_mean = -0.0027944235510804914 +bias_p10 = -0.05628276036237784 +bias_p10_ci_low = -0.059683360807996945 +bias_p10_ci_high = -0.05338926628814889 +bias_p50 = -0.003393829514357976 +bias_p50_ci_low = -0.006900673889207623 +bias_p50_ci_high = 0.0012616678518857483 +bias_p90 = 0.052794483950824894 +bias_p90_ci_low = 0.0482051453292094 +bias_p90_ci_high = 0.05739135995757929 +bias_p99 = 0.09706561932004035 +bias_p99_ci_low = 0.08308701936926788 +bias_p99_ci_high = 0.10782995188658191 +variance_mean = 0.0007737029372949656 +variance_p10 = 0.00011489758965746467 +variance_p10_ci_low = 0.00010440174977032869 +variance_p10_ci_high = 0.00012171355823320434 +variance_p50 = 0.0003161066822156783 +variance_p50_ci_low = 0.0002875654655959659 +variance_p50_ci_high = 0.0003348497235016813 +variance_p90 = 0.0011334370839994666 +variance_p90_ci_low = 0.0009725644863652787 +variance_p90_ci_high = 0.001299973894062613 +variance_p99 = 0.01097284005981718 +variance_p99_ci_low = 0.007410850069581957 +variance_p99_ci_high = 0.013482130083409666 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1.046875650116667 +upward_step_magnitude_p90_ci_low = 1.0450007217558417 +upward_step_magnitude_p90_ci_high = 1.0500011374952596 +upward_step_magnitude_p95 = 1.057001233922483 +upward_step_magnitude_p95_ci_low = 1.0525002045142657 +upward_step_magnitude_p95_ci_high = 1.0600000353000483 +upward_step_magnitude_p99 = 1.0930010755537773 +upward_step_magnitude_p99_ci_low = 1.0810007354460502 +upward_step_magnitude_p99_ci_high = 1.179999956580389 +upward_step_magnitude_mean = 1.008245278884511 +fire_decisiveness_mean = 3.2830564176836337 +fire_decisiveness_p50 = 2.0001183129287803 + +[cell.spm_20.step_minus_50_at_15min] +shares_per_minute = 20 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.198 +convergence_rate_ci_low = 0.17330120015871217 +convergence_rate_ci_high = 0.22269879984128785 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 360 +convergence_p50_secs_ci_low = 300 +convergence_p50_secs_ci_high = 360 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 660 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 512.1212121212121 +settled_accuracy_p10 = 0.1933668792653136 +settled_accuracy_p10_ci_low = 0.1834664426483279 +settled_accuracy_p10_ci_high = 0.20517683152339616 +settled_accuracy_p50 = 0.3803939169572088 +settled_accuracy_p50_ci_low = 0.36832841414169004 +settled_accuracy_p50_ci_high = 0.3943832967109073 +settled_accuracy_p90 = 0.6352990213312908 +settled_accuracy_p90_ci_low = 0.6181876029659703 +settled_accuracy_p90_ci_high = 0.6459226230761481 +settled_accuracy_p95 = 0.6857548213860651 +settled_accuracy_p95_ci_low = 0.6622092734921796 +settled_accuracy_p95_ci_high = 0.7036146378124497 +settled_accuracy_p99 = 0.9033346462064265 +settled_accuracy_p99_ci_low = 0.7358417911194974 +settled_accuracy_p99_ci_high = 0.9067867262154943 +settled_accuracy_mean = 0.3939574733807659 +jitter_p10_per_min = 0.13043478260869565 +jitter_p10_per_min_ci_low = 0.09090909090909091 +jitter_p10_per_min_ci_high = 0.13043478260869565 +jitter_p50_per_min = 0.17391304347826086 +jitter_p50_per_min_ci_low = 0.17391304347826086 +jitter_p50_per_min_ci_high = 0.17391304347826086 +jitter_p90_per_min = 0.2222222222222222 +jitter_p90_per_min_ci_low = 0.21739130434782608 +jitter_p90_per_min_ci_high = 0.2222222222222222 +jitter_p95_per_min = 0.22727272727272727 +jitter_p95_per_min_ci_low = 0.2222222222222222 +jitter_p95_per_min_ci_high = 0.23809523809523808 +jitter_p99_per_min = 0.2608695652173913 +jitter_p99_per_min_ci_low = 0.23529411764705882 +jitter_p99_per_min_ci_high = 0.2777777777777778 +jitter_mean_per_min = 0.17000737857733506 +reaction_rate = 0.408 +reaction_rate_ci_low = 0.3775388001286883 +reaction_rate_ci_high = 0.43846119987131166 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 228.52941176470588 +fire_decisiveness_mean = 5.595569594387176 +fire_decisiveness_p50 = 3.7499698355369944 +step_correction_mean = 0.10557300197508405 +step_correction_p50 = 0.09697850793600082 + +[cell.spm_20.step_minus_25_at_15min] +shares_per_minute = 20 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.818 +convergence_rate_ci_low = 0.7940851083715605 +convergence_rate_ci_high = 0.8419148916284394 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 480 +convergence_p90_secs_ci_low = 420 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 720 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 168.11735941320293 +settled_accuracy_p10 = 0.17272076601456843 +settled_accuracy_p10_ci_low = 0.1608148483460483 +settled_accuracy_p10_ci_high = 0.18649168373543334 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.33333330350717194 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.3441539366372428 +settled_accuracy_p99_ci_low = 0.3354546594175971 +settled_accuracy_p99_ci_high = 0.40125776326516305 +settled_accuracy_mean = 0.2883969878499868 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.08695652173913043 +jitter_p90_per_min_ci_low = 0.0625 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.13043478260869565 +jitter_p95_per_min_ci_low = 0.11538461538461539 +jitter_p95_per_min_ci_high = 0.13043478260869565 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.017406794704919775 +reaction_rate = 0.083 +reaction_rate_ci_low = 0.06590064277231451 +reaction_rate_ci_high = 0.1000993572276855 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 212.53012048192772 +fire_decisiveness_mean = 3.042814708934033 +fire_decisiveness_p50 = 1.3791062991668888 +step_correction_mean = 0.20619069470698576 +step_correction_p50 = 0.18813762068748474 + +[cell.spm_20.step_minus_10_at_15min] +shares_per_minute = 20 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.995 +convergence_rate_ci_low = 0.9906282772274537 +convergence_rate_ci_high = 0.9993717227725463 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 300 +convergence_p90_secs_ci_low = 300 +convergence_p90_secs_ci_high = 300 +convergence_p95_secs = 360 +convergence_p95_secs_ci_low = 360 +convergence_p95_secs_ci_high = 540 +convergence_p99_secs = 780 +convergence_p99_secs_ci_low = 600 +convergence_p99_secs_ci_high = 1080 +convergence_mean_secs = 68.74371859296483 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.10084486331974873 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.16296351253761365 +settled_accuracy_p95_ci_low = 0.12759281621976504 +settled_accuracy_p95_ci_high = 0.1644454253937706 +settled_accuracy_p99 = 0.1811125829493525 +settled_accuracy_p99_ci_low = 0.1722224479896981 +settled_accuracy_p99_ci_high = 0.18777850644748417 +settled_accuracy_mean = 0.10991182081635084 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.09090909090909091 +jitter_p99_per_min_ci_low = 0.05555555555555555 +jitter_p99_per_min_ci_high = 0.10526315789473684 +jitter_mean_per_min = 0.0025455643807353115 +reaction_rate = 0.02 +reaction_rate_ci_low = 0.011322710100497969 +reaction_rate_ci_high = 0.02867728989950203 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 168 +fire_decisiveness_mean = 3.0948426365034023 +fire_decisiveness_p50 = 1.9998230339233345 +step_correction_mean = 0.352275300770998 +step_correction_p50 = 0.46094897389411926 + +[cell.spm_20.step_minus_5_at_15min] +shares_per_minute = 20 +scenario = "step_minus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 300 +convergence_p90_secs_ci_low = 300 +convergence_p90_secs_ci_high = 300 +convergence_p95_secs = 480 +convergence_p95_secs_ci_low = 360 +convergence_p95_secs_ci_high = 540 +convergence_p99_secs = 840 +convergence_p99_secs_ci_low = 660 +convergence_p99_secs_ci_high = 960 +convergence_mean_secs = 73.8 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.051414149784019036 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.05263157522942574 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.05972731337148374 +settled_accuracy_p95 = 0.10263269488785154 +settled_accuracy_p95_ci_low = 0.10000075585773849 +settled_accuracy_p95_ci_high = 0.10394809927562698 +settled_accuracy_p99 = 0.12526385262949846 +settled_accuracy_p99_ci_low = 0.11578949376110081 +settled_accuracy_p99_ci_high = 0.1513165734948383 +settled_accuracy_mean = 0.05433254717064487 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.043478260869565216 +jitter_p99_per_min_ci_low = 0.043478260869565216 +jitter_p99_per_min_ci_high = 0.07407407407407407 +jitter_mean_per_min = 0.001410527645123882 +reaction_rate = 0.013 +reaction_rate_ci_low = 0.0059792044895183 +reaction_rate_ci_high = 0.0200207955104817 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 161.53846153846155 +fire_decisiveness_mean = 2.887402287418646 +fire_decisiveness_p50 = 1.9998230339233345 +step_correction_mean = 2.0122746297946343 +step_correction_p50 = 0.9290841817855835 + +[cell.spm_20.step_plus_5_at_15min] +shares_per_minute = 20 +scenario = "step_plus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 360 +convergence_p90_secs_ci_low = 300 +convergence_p90_secs_ci_high = 360 +convergence_p95_secs = 480 +convergence_p95_secs_ci_low = 420 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 840 +convergence_p99_secs_ci_low = 660 +convergence_p99_secs_ci_high = 960 +convergence_mean_secs = 88.56 +settled_accuracy_p10 = 0.04078915428635854 +settled_accuracy_p10_ci_low = 0.026667083380788936 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.04769178085081005 +settled_accuracy_p90_ci_low = 0.047618983705838724 +settled_accuracy_p90_ci_high = 0.06447545342906513 +settled_accuracy_p95 = 0.09333271465347093 +settled_accuracy_p95_ci_low = 0.09251679862826911 +settled_accuracy_p95_ci_high = 0.09618989074548234 +settled_accuracy_p99 = 0.11047589903195776 +settled_accuracy_p99_ci_low = 0.10476186641397944 +settled_accuracy_p99_ci_high = 0.11904755513441012 +settled_accuracy_mean = 0.04829854089978798 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.0625 +jitter_p99_per_min_ci_low = 0.047619047619047616 +jitter_p99_per_min_ci_high = 0.08695652173913043 +jitter_mean_per_min = 0.0021403475102863448 +reaction_rate = 0.019 +reaction_rate_ci_low = 0.010538109998351433 +reaction_rate_ci_high = 0.027461890001648566 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 60 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 135.78947368421052 +fire_decisiveness_mean = 3.3310733089655242 +fire_decisiveness_p50 = 2.0001183129287803 +step_correction_mean = 0.15838248635593213 +step_correction_p50 = 0.5968707203865051 + +[cell.spm_20.step_plus_10_at_15min] +shares_per_minute = 20 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.998 +convergence_rate_ci_low = 0.995230914663648 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 300 +convergence_p90_secs_ci_low = 300 +convergence_p90_secs_ci_high = 360 +convergence_p95_secs = 480 +convergence_p95_secs_ci_low = 420 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 720 +convergence_p99_secs_ci_low = 660 +convergence_p99_secs_ci_high = 1020 +convergence_mean_secs = 81.10220440881764 +settled_accuracy_p10 = 0.07110891970161937 +settled_accuracy_p10_ci_low = 0.049999338062556076 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.11464195254585718 +settled_accuracy_p95_ci_low = 0.09844882738544414 +settled_accuracy_p95_ci_high = 0.1345449167871423 +settled_accuracy_p99 = 0.1481813161964135 +settled_accuracy_p99_ci_low = 0.1399995863653576 +settled_accuracy_p99_ci_high = 0.15636316804358807 +settled_accuracy_mean = 0.08830323506826253 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.09090909090909091 +jitter_p99_per_min_ci_low = 0.047619047619047616 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.0026340814973235447 +reaction_rate = 0.015 +reaction_rate_ci_low = 0.007466100611237232 +reaction_rate_ci_high = 0.022533899388762768 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 192 +fire_decisiveness_mean = 3.4474874663337363 +fire_decisiveness_p50 = 2.142637409259585 +step_correction_mean = 0.08047142724196116 +step_correction_p50 = 0.3089042603969574 + +[cell.spm_20.step_plus_25_at_15min] +shares_per_minute = 20 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.805 +convergence_rate_ci_low = 0.7804432257818744 +convergence_rate_ci_high = 0.8295567742181257 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 720 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 203.70186335403727 +settled_accuracy_p10 = 0.09563657104423318 +settled_accuracy_p10_ci_low = 0.08420991823885726 +settled_accuracy_p10_ci_high = 0.10537320795178817 +settled_accuracy_p50 = 0.20000003221225382 +settled_accuracy_p50_ci_low = 0.20000003221225382 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20370905849380228 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.2113395508709871 +settled_accuracy_mean = 0.16873769540221598 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.08695652173913043 +jitter_p90_per_min_ci_low = 0.045454545454545456 +jitter_p90_per_min_ci_high = 0.08695652173913043 +jitter_p95_per_min = 0.125 +jitter_p95_per_min_ci_low = 0.09523809523809523 +jitter_p95_per_min_ci_high = 0.13043478260869565 +jitter_p99_per_min = 0.17391304347826086 +jitter_p99_per_min_ci_low = 0.14285714285714285 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.014572747300760497 +reaction_rate = 0.09 +reaction_rate_ci_low = 0.07226227072029792 +reaction_rate_ci_high = 0.10773772927970207 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 204 +fire_decisiveness_mean = 3.0800519879962867 +fire_decisiveness_p50 = 1.3160355407315336 +step_correction_mean = 0.19514788389205934 +step_correction_p50 = 0.18417543172836304 + +[cell.spm_20.step_plus_50_at_15min] +shares_per_minute = 20 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.367 +convergence_rate_ci_low = 0.3371261663390853 +convergence_rate_ci_high = 0.39687383366091467 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 1140 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 847.0299727520436 +settled_accuracy_p10 = 0.04220422730362583 +settled_accuracy_p10_ci_low = 0.03538372982293725 +settled_accuracy_p10_ci_high = 0.047980689827217926 +settled_accuracy_p50 = 0.13836872311786708 +settled_accuracy_p50_ci_low = 0.13301227260049797 +settled_accuracy_p50_ci_high = 0.1431849025458508 +settled_accuracy_p90 = 0.23409280583142023 +settled_accuracy_p90_ci_low = 0.23035528953403273 +settled_accuracy_p90_ci_high = 0.2396852111124046 +settled_accuracy_p95 = 0.2913324607988048 +settled_accuracy_p95_ci_low = 0.24899258411268343 +settled_accuracy_p95_ci_high = 0.3009193645846485 +settled_accuracy_p99 = 0.3029884650601282 +settled_accuracy_p99_ci_low = 0.30261824783052704 +settled_accuracy_p99_ci_high = 0.33333334824641403 +settled_accuracy_mean = 0.141600145304111 +jitter_p10_per_min = 0.08695652173913043 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.08695652173913043 +jitter_p50_per_min = 0.13043478260869565 +jitter_p50_per_min_ci_low = 0.13043478260869565 +jitter_p50_per_min_ci_high = 0.14285714285714285 +jitter_p90_per_min = 0.18181818181818182 +jitter_p90_per_min_ci_low = 0.17391304347826086 +jitter_p90_per_min_ci_high = 0.19047619047619047 +jitter_p95_per_min = 0.21739130434782608 +jitter_p95_per_min_ci_low = 0.18181818181818182 +jitter_p95_per_min_ci_high = 0.2222222222222222 +jitter_p99_per_min = 0.2222222222222222 +jitter_p99_per_min_ci_low = 0.21739130434782608 +jitter_p99_per_min_ci_high = 0.29411764705882354 +jitter_mean_per_min = 0.13307945321949635 +reaction_rate = 0.375 +reaction_rate_ci_low = 0.3449937506509061 +reaction_rate_ci_high = 0.4050062493490939 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 212.16 +fire_decisiveness_mean = 6.077988073173144 +fire_decisiveness_p50 = 2.9171143781801554 +step_correction_mean = 0.10620672460397085 +step_correction_p50 = 0.09613872319459915 + +[cell.spm_25.cold_start_10gh_to_1ph] +shares_per_minute = 25 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.988 +convergence_rate_ci_low = 0.9812512216216562 +convergence_rate_ci_high = 0.9947487783783437 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 688.8461538461538 +settled_accuracy_p10 = 0.015283439995044779 +settled_accuracy_p10_ci_low = 0.012869332798967847 +settled_accuracy_p10_ci_high = 0.017464545212282467 +settled_accuracy_p50 = 0.07351876810135805 +settled_accuracy_p50_ci_low = 0.07014064206138027 +settled_accuracy_p50_ci_high = 0.07750959807762625 +settled_accuracy_p90 = 0.12477276099493184 +settled_accuracy_p90_ci_low = 0.12040075266618488 +settled_accuracy_p90_ci_high = 0.13001476864789263 +settled_accuracy_p95 = 0.14104471456955603 +settled_accuracy_p95_ci_low = 0.1360484595797603 +settled_accuracy_p95_ci_high = 0.14728087294674552 +settled_accuracy_p99 = 0.16192409437090172 +settled_accuracy_p99_ci_low = 0.15521622778251976 +settled_accuracy_p99_ci_high = 0.1686210222143093 +settled_accuracy_mean = 0.0722004363284176 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.11764705882352941 +jitter_p90_per_min_ci_low = 0.10526315789473684 +jitter_p90_per_min_ci_high = 0.125 +jitter_p95_per_min = 0.13333333333333333 +jitter_p95_per_min_ci_low = 0.125 +jitter_p95_per_min_ci_high = 0.14285714285714285 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.15789473684210525 +jitter_p99_per_min_ci_high = 0.19047619047619047 +jitter_mean_per_min = 0.03910661801862852 +bias_mean = -0.02075261332427649 +bias_p10 = -0.08185021005374929 +bias_p10_ci_low = -0.08668062844230728 +bias_p10_ci_high = -0.07759429299714157 +bias_p50 = -0.022818116055026285 +bias_p50_ci_low = -0.02616886167813579 +bias_p50_ci_high = -0.019968369896603506 +bias_p90 = 0.03994478579290073 +bias_p90_ci_low = 0.03553091566065505 +bias_p90_ci_high = 0.04732870002192235 +bias_p99 = 0.10709649791011162 +bias_p99_ci_low = 0.09711331959478295 +bias_p99_ci_high = 0.11763185502970648 +variance_mean = 0.0058658253073178195 +variance_p10 = 0.0005510862642383814 +variance_p10_ci_low = 0.00044707929039301434 +variance_p10_ci_high = 0.0006787267119594481 +variance_p50 = 0.004219329731429016 +variance_p50_ci_low = 0.003905784245930265 +variance_p50_ci_high = 0.004613584027301051 +variance_p90 = 0.01370548837006267 +variance_p90_ci_low = 0.012110228371683504 +variance_p90_ci_high = 0.01451077622268308 +variance_p99 = 0.02609435077585817 +variance_p99_ci_low = 0.024502329477600553 +variance_p99_ci_high = 0.02859377555609408 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0 +ramp_target_overshoot_p90_ci_low = 0 +ramp_target_overshoot_p90_ci_high = 0.005441522308228253 +ramp_target_overshoot_p99 = 0.07742638308518379 +ramp_target_overshoot_p99_ci_low = 0.05070960578172401 +ramp_target_overshoot_p99_ci_high = 0.08841150028511202 +ramp_target_overshoot_mean = 0.003134004256446862 + +[cell.spm_25.stable_1ph] +shares_per_minute = 25 +scenario = "stable_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 300 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 300 +convergence_p95_secs = 360 +convergence_p95_secs_ci_low = 300 +convergence_p95_secs_ci_high = 420 +convergence_p99_secs = 900 +convergence_p99_secs_ci_low = 660 +convergence_p99_secs_ci_high = 960 +convergence_mean_secs = 51.54 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0.0073334554267281415 +settled_accuracy_p90_ci_low = 0 +settled_accuracy_p90_ci_high = 0.04559919861277928 +settled_accuracy_p95 = 0.04971404577133287 +settled_accuracy_p95_ci_low = 0.04628498410291659 +settled_accuracy_p95_ci_high = 0.050400770785578475 +settled_accuracy_p99 = 0.06479964883273193 +settled_accuracy_p99_ci_low = 0.057599404502776674 +settled_accuracy_p99_ci_high = 0.07440138389216777 +settled_accuracy_mean = 0.004983770794772301 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.043478260869565216 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.05555555555555555 +jitter_mean_per_min = 0.0009603186874130138 +bias_mean = -0.0017430883123098523 +bias_p10 = -0.04963666925013427 +bias_p10_ci_low = -0.05424068352088382 +bias_p10_ci_high = -0.04583445050461434 +bias_p50 = -0.002437906118788152 +bias_p50_ci_low = -0.0060641689526565665 +bias_p50_ci_high = 0.0007334681046523472 +bias_p90 = 0.04898088848668624 +bias_p90_ci_low = 0.04602203391011648 +bias_p90_ci_high = 0.05381782349922794 +bias_p99 = 0.09282273904344557 +bias_p99_ci_low = 0.07943336905444023 +bias_p99_ci_high = 0.10336013768535075 +variance_mean = 0.0006125621190862236 +variance_p10 = 0.00009094623986431021 +variance_p10_ci_low = 0.00008691268268859649 +variance_p10_ci_high = 0.00009968544635491705 +variance_p50 = 0.00024028299566436018 +variance_p50_ci_low = 0.00022480436730844847 +variance_p50_ci_high = 0.0002595718006151263 +variance_p90 = 0.0007412611524268615 +variance_p90_ci_low = 0.0006871870784508224 +variance_p90_ci_high = 0.0008267973152298378 +variance_p99 = 0.011237806671228473 +variance_p99_ci_low = 0.006278825802184213 +variance_p99_ci_high = 0.013016068140301557 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1 +upward_step_magnitude_p95 = 1.0480008906688545 +upward_step_magnitude_p95_ci_low = 1 +upward_step_magnitude_p95_ci_high = 1.0504007707855785 +upward_step_magnitude_p99 = 1.062400894520277 +upward_step_magnitude_p99_ci_low = 1.0552012625624325 +upward_step_magnitude_p99_ci_high = 1.0696004041757212 +upward_step_magnitude_mean = 1.0036891341406644 +fire_decisiveness_mean = 2.6496007907523995 +fire_decisiveness_p50 = 1.8002546915639641 + +[cell.spm_25.step_minus_50_at_15min] +shares_per_minute = 25 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.141 +convergence_rate_ci_low = 0.11942940078718256 +convergence_rate_ci_high = 0.1625705992128174 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 300 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 660 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 455.3191489361702 +settled_accuracy_p10 = 0.21834936217386014 +settled_accuracy_p10_ci_low = 0.20830652054561383 +settled_accuracy_p10_ci_high = 0.2327799156052337 +settled_accuracy_p50 = 0.399620606743327 +settled_accuracy_p50_ci_low = 0.38792943717606976 +settled_accuracy_p50_ci_high = 0.4087237900456213 +settled_accuracy_p90 = 0.6365805322149058 +settled_accuracy_p90_ci_low = 0.6205735915476653 +settled_accuracy_p90_ci_high = 0.6425683877920654 +settled_accuracy_p95 = 0.6600583001552698 +settled_accuracy_p95_ci_low = 0.6493404775641307 +settled_accuracy_p95_ci_high = 0.6832469631057607 +settled_accuracy_p99 = 0.9015184118875033 +settled_accuracy_p99_ci_low = 0.7142834709322314 +settled_accuracy_p99_ci_high = 0.9031428490706195 +settled_accuracy_mean = 0.4066834686907955 +jitter_p10_per_min = 0.13043478260869565 +jitter_p10_per_min_ci_low = 0.08695652173913043 +jitter_p10_per_min_ci_high = 0.13043478260869565 +jitter_p50_per_min = 0.17391304347826086 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.17391304347826086 +jitter_p90_per_min = 0.2222222222222222 +jitter_p90_per_min_ci_low = 0.21739130434782608 +jitter_p90_per_min_ci_high = 0.2222222222222222 +jitter_p95_per_min = 0.2222222222222222 +jitter_p95_per_min_ci_low = 0.2222222222222222 +jitter_p95_per_min_ci_high = 0.23809523809523808 +jitter_p99_per_min = 0.23809523809523808 +jitter_p99_per_min_ci_low = 0.2222222222222222 +jitter_p99_per_min_ci_high = 0.2727272727272727 +jitter_mean_per_min = 0.16558123011713122 +reaction_rate = 0.33 +reaction_rate_ci_low = 0.30085591380742915 +reaction_rate_ci_high = 0.3591440861925709 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 236.36363636363637 +fire_decisiveness_mean = 4.912370599315701 +fire_decisiveness_p50 = 2.99982064099909 +step_correction_mean = 0.09999829950657758 +step_correction_p50 = 0.09599950164556503 + +[cell.spm_25.step_minus_25_at_15min] +shares_per_minute = 25 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.805 +convergence_rate_ci_low = 0.7804432257818744 +convergence_rate_ci_high = 0.8295567742181257 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 300 +convergence_p90_secs_ci_low = 300 +convergence_p90_secs_ci_high = 360 +convergence_p95_secs = 540 +convergence_p95_secs_ci_low = 420 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1020 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 92.04968944099379 +settled_accuracy_p10 = 0.2065577707545121 +settled_accuracy_p10_ci_low = 0.19522532069312537 +settled_accuracy_p10_ci_high = 0.22653616885878525 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.33333330350717194 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.3341497946781955 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.3464767086162681 +settled_accuracy_mean = 0.30002749485923913 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.043478260869565216 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.05 +jitter_p95_per_min = 0.08695652173913043 +jitter_p95_per_min_ci_low = 0.08695652173913043 +jitter_p95_per_min_ci_high = 0.10526315789473684 +jitter_p99_per_min = 0.15789473684210525 +jitter_p99_per_min_ci_low = 0.13043478260869565 +jitter_p99_per_min_ci_high = 0.17391304347826086 +jitter_mean_per_min = 0.00970677942263381 +reaction_rate = 0.042 +reaction_rate_ci_low = 0.029567356773396898 +reaction_rate_ci_high = 0.05443264322660311 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 195.71428571428572 +fire_decisiveness_mean = 2.9348008430653736 +fire_decisiveness_p50 = 0.9999143690884189 +step_correction_mean = 0.19144910396564574 +step_correction_p50 = 0.1818932145833969 + +[cell.spm_25.step_minus_10_at_15min] +shares_per_minute = 25 +scenario = "step_minus_10_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 300 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 300 +convergence_p95_secs = 360 +convergence_p95_secs_ci_low = 300 +convergence_p95_secs_ci_high = 360 +convergence_p99_secs = 660 +convergence_p99_secs_ci_low = 600 +convergence_p99_secs_ci_high = 900 +convergence_mean_secs = 46.68 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.11111110282606607 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.11111110282606607 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.11528162048520452 +settled_accuracy_p99 = 0.17244584594265389 +settled_accuracy_p99_ci_low = 0.1644454253937706 +settled_accuracy_p99_ci_high = 0.1911119528716816 +settled_accuracy_mean = 0.10939182837728319 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.08695652173913043 +jitter_p99_per_min_ci_low = 0.05 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.0018614403595932439 +reaction_rate = 0.011 +reaction_rate_ci_low = 0.004535267491999379 +reaction_rate_ci_high = 0.01746473250800062 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 163.63636363636363 +fire_decisiveness_mean = 2.674754764723585 +fire_decisiveness_p50 = 1.7998445765654907 +step_correction_mean = 0.30982769619334827 +step_correction_p50 = 0.34838542342185974 + +[cell.spm_25.step_minus_5_at_15min] +shares_per_minute = 25 +scenario = "step_minus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 300 +convergence_p90_secs_ci_low = 300 +convergence_p90_secs_ci_high = 300 +convergence_p95_secs = 300 +convergence_p95_secs_ci_low = 300 +convergence_p95_secs_ci_high = 360 +convergence_p99_secs = 600 +convergence_p99_secs_ci_low = 600 +convergence_p99_secs_ci_high = 720 +convergence_mean_secs = 46.68 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.05263157522942574 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.05263157522942574 +settled_accuracy_p95 = 0.055941808278733296 +settled_accuracy_p95_ci_low = 0.05263157522942574 +settled_accuracy_p95_ci_high = 0.10105344670069161 +settled_accuracy_p99 = 0.12057520350056783 +settled_accuracy_p99_ci_low = 0.10821170204822605 +settled_accuracy_p99_ci_high = 0.12842185451744736 +settled_accuracy_mean = 0.052854109354813855 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.043478260869565216 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.045454545454545456 +jitter_mean_per_min = 0.0008344037520238893 +reaction_rate = 0.005 +reaction_rate_ci_low = 0.0006282772274536896 +reaction_rate_ci_high = 0.00937172277254631 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 120 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 120 +reaction_p99_secs_ci_high = 240 +reaction_mean_secs = 144 +fire_decisiveness_mean = 2.5317842409693463 +fire_decisiveness_p50 = 1.666667785147748 +step_correction_mean = 0.8081094145774841 +step_correction_p50 = 0.849700927734375 + +[cell.spm_25.step_plus_5_at_15min] +shares_per_minute = 25 +scenario = "step_plus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 300 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 300 +convergence_p95_secs = 300 +convergence_p95_secs_ci_low = 300 +convergence_p95_secs_ci_high = 360 +convergence_p99_secs = 600 +convergence_p99_secs_ci_low = 600 +convergence_p99_secs_ci_high = 780 +convergence_mean_secs = 46.56 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.047618983705838724 +settled_accuracy_p90_ci_low = 0.047618983705838724 +settled_accuracy_p90_ci_high = 0.047618983705838724 +settled_accuracy_p95 = 0.06230476911417182 +settled_accuracy_p95_ci_low = 0.04981216547027534 +settled_accuracy_p95_ci_high = 0.0910467948228767 +settled_accuracy_p99 = 0.10476186641397944 +settled_accuracy_p99_ci_low = 0.09790461822786822 +settled_accuracy_p99_ci_high = 0.11161873112083698 +settled_accuracy_mean = 0.048355881466051236 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.05 +jitter_p99_per_min_ci_low = 0.043478260869565216 +jitter_p99_per_min_ci_high = 0.05555555555555555 +jitter_mean_per_min = 0.0012619208849696975 +reaction_rate = 0.013 +reaction_rate_ci_low = 0.0059792044895183 +reaction_rate_ci_high = 0.0200207955104817 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 156.92307692307693 +fire_decisiveness_mean = 2.625667273190965 +fire_decisiveness_p50 = 1.7998453274882387 +step_correction_mean = 0.6335887198264782 +step_correction_p50 = 0.466296523809433 + +[cell.spm_25.step_plus_10_at_15min] +shares_per_minute = 25 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.994 +convergence_rate_ci_low = 0.9892134247733896 +convergence_rate_ci_high = 0.9987865752266104 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 300 +convergence_p90_secs_ci_low = 300 +convergence_p90_secs_ci_high = 300 +convergence_p95_secs = 300 +convergence_p95_secs_ci_low = 300 +convergence_p95_secs_ci_high = 360 +convergence_p99_secs = 660 +convergence_p99_secs_ci_low = 600 +convergence_p99_secs_ci_high = 900 +convergence_mean_secs = 53.29979879275654 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.10238476233425864 +settled_accuracy_p95_ci_low = 0.09090908536290365 +settled_accuracy_p95_ci_high = 0.13236290253651373 +settled_accuracy_p99 = 0.14109041046649384 +settled_accuracy_p99_ci_low = 0.1367268700297115 +settled_accuracy_p99_ci_high = 0.143272180684885 +settled_accuracy_mean = 0.09017118202565959 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.043478260869565216 +jitter_p99_per_min_ci_low = 0.043478260869565216 +jitter_p99_per_min_ci_high = 0.07692307692307693 +jitter_mean_per_min = 0.0012392515579749057 +reaction_rate = 0.009 +reaction_rate_ci_low = 0.0031465198044240373 +reaction_rate_ci_high = 0.01485348019557596 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 300 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 240 +fire_decisiveness_mean = 2.7646290372500553 +fire_decisiveness_p50 = 1.7998453274882387 +step_correction_mean = 0.18195732103453743 +step_correction_p50 = 0.3618432283401489 + +[cell.spm_25.step_plus_25_at_15min] +shares_per_minute = 25 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.809 +convergence_rate_ci_low = 0.7846360883600355 +convergence_rate_ci_high = 0.8333639116399646 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 540 +convergence_p90_secs_ci_low = 360 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 720 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 151.5945611866502 +settled_accuracy_p10 = 0.1170436001445686 +settled_accuracy_p10_ci_low = 0.10879447143234788 +settled_accuracy_p10_ci_high = 0.12227041414006279 +settled_accuracy_p50 = 0.20000003221225382 +settled_accuracy_p50_ci_low = 0.20000003221225382 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20385433575862977 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.21499580274332442 +settled_accuracy_mean = 0.17630881324043832 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.045454545454545456 +jitter_p95_per_min = 0.09523809523809523 +jitter_p95_per_min_ci_low = 0.08695652173913043 +jitter_p95_per_min_ci_high = 0.1111111111111111 +jitter_p99_per_min = 0.15 +jitter_p99_per_min_ci_low = 0.13043478260869565 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.009869706010627349 +reaction_rate = 0.05 +reaction_rate_ci_low = 0.036491632222951584 +reaction_rate_ci_high = 0.06350836777704842 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 228 +fire_decisiveness_mean = 2.632291482236716 +fire_decisiveness_p50 = 1.000303600504683 +step_correction_mean = 0.19723478570580483 +step_correction_p50 = 0.18720309436321259 + +[cell.spm_25.step_plus_50_at_15min] +shares_per_minute = 25 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.309 +convergence_rate_ci_low = 0.2803599128772275 +convergence_rate_ci_high = 0.3376400871227725 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 1200 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 1260 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 912.8155339805825 +settled_accuracy_p10 = 0.06769655805798047 +settled_accuracy_p10_ci_low = 0.06202872241456614 +settled_accuracy_p10_ci_high = 0.07224689690852726 +settled_accuracy_p50 = 0.14341289372434596 +settled_accuracy_p50_ci_low = 0.13674263061912584 +settled_accuracy_p50_ci_high = 0.14925038057436413 +settled_accuracy_p90 = 0.23122949432755624 +settled_accuracy_p90_ci_low = 0.2272941411009486 +settled_accuracy_p90_ci_high = 0.23672123631348285 +settled_accuracy_p95 = 0.255307528155971 +settled_accuracy_p95_ci_low = 0.23949891690768443 +settled_accuracy_p95_ci_high = 0.2997328351409926 +settled_accuracy_p99 = 0.30281460836475294 +settled_accuracy_p99_ci_low = 0.3019255501428032 +settled_accuracy_p99_ci_high = 0.33333334824641403 +settled_accuracy_mean = 0.14853532740311687 +jitter_p10_per_min = 0.08695652173913043 +jitter_p10_per_min_ci_low = 0.043478260869565216 +jitter_p10_per_min_ci_high = 0.08695652173913043 +jitter_p50_per_min = 0.13043478260869565 +jitter_p50_per_min_ci_low = 0.13043478260869565 +jitter_p50_per_min_ci_high = 0.14285714285714285 +jitter_p90_per_min = 0.18181818181818182 +jitter_p90_per_min_ci_low = 0.17391304347826086 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.18181818181818182 +jitter_p95_per_min_ci_high = 0.21739130434782608 +jitter_p99_per_min = 0.2222222222222222 +jitter_p99_per_min_ci_low = 0.21052631578947367 +jitter_p99_per_min_ci_high = 0.2222222222222222 +jitter_mean_per_min = 0.13411361581100836 +reaction_rate = 0.348 +reaction_rate_ci_low = 0.3184763878632712 +reaction_rate_ci_high = 0.37752361213672875 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 227.24137931034483 +fire_decisiveness_mean = 5.74066134086268 +fire_decisiveness_p50 = 2.882828056149446 +step_correction_mean = 0.10186610011191204 +step_correction_p50 = 0.0960017740726471 + +[cell.spm_30.cold_start_10gh_to_1ph] +shares_per_minute = 30 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.979 +convergence_rate_ci_low = 0.9701129614381392 +convergence_rate_ci_high = 0.9878870385618608 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 701.0623084780389 +settled_accuracy_p10 = 0.024389374760798832 +settled_accuracy_p10_ci_low = 0.02053215853449275 +settled_accuracy_p10_ci_high = 0.02623151310156302 +settled_accuracy_p50 = 0.07415932221657096 +settled_accuracy_p50_ci_low = 0.07021177745814566 +settled_accuracy_p50_ci_high = 0.07666677784368614 +settled_accuracy_p90 = 0.12070831259389792 +settled_accuracy_p90_ci_low = 0.11794738678415728 +settled_accuracy_p90_ci_high = 0.12451835128819833 +settled_accuracy_p95 = 0.13560299093473316 +settled_accuracy_p95_ci_low = 0.12890498934948758 +settled_accuracy_p95_ci_high = 0.1400392224471637 +settled_accuracy_p99 = 0.16552099531036546 +settled_accuracy_p99_ci_low = 0.15307693138809786 +settled_accuracy_p99_ci_high = 0.1749972367924889 +settled_accuracy_mean = 0.0738834033133391 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.11538461538461539 +jitter_p90_per_min_ci_low = 0.10526315789473684 +jitter_p90_per_min_ci_high = 0.125 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.13043478260869565 +jitter_p95_per_min_ci_high = 0.14285714285714285 +jitter_p99_per_min = 0.17647058823529413 +jitter_p99_per_min_ci_low = 0.17391304347826086 +jitter_p99_per_min_ci_high = 0.19230769230769232 +jitter_mean_per_min = 0.03836463135957105 +bias_mean = -0.018265113860308546 +bias_p10 = -0.07426061068593741 +bias_p10_ci_low = -0.07820453509770499 +bias_p10_ci_high = -0.06913818749813487 +bias_p50 = -0.019637823416648718 +bias_p50_ci_low = -0.022782929817559715 +bias_p50_ci_high = -0.015587051095866748 +bias_p90 = 0.0392238599818886 +bias_p90_ci_low = 0.03402872257297338 +bias_p90_ci_high = 0.044904300445201266 +bias_p99 = 0.09228487915171599 +bias_p99_ci_low = 0.07790953512385979 +bias_p99_ci_high = 0.11187139960719203 +variance_mean = 0.005222983965353717 +variance_p10 = 0.0005665048628415374 +variance_p10_ci_low = 0.0004571920535632108 +variance_p10_ci_high = 0.0006309909819286706 +variance_p50 = 0.003611306280646992 +variance_p50_ci_low = 0.00334533416572456 +variance_p50_ci_high = 0.003967091585368974 +variance_p90 = 0.011878367815172137 +variance_p90_ci_low = 0.010941431808608551 +variance_p90_ci_high = 0.01251462385406296 +variance_p99 = 0.023901010467200147 +variance_p99_ci_low = 0.021033630075506547 +variance_p99_ci_high = 0.027452608935453083 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0 +ramp_target_overshoot_p90_ci_low = 0 +ramp_target_overshoot_p90_ci_high = 0 +ramp_target_overshoot_p99 = 0.052450342627665014 +ramp_target_overshoot_p99_ci_low = 0.04154119266277312 +ramp_target_overshoot_p99_ci_high = 0.06775465347968535 +ramp_target_overshoot_mean = 0.0018770732696599954 + +[cell.spm_30.stable_1ph] +shares_per_minute = 30 +scenario = "stable_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 300 +convergence_p90_secs_ci_low = 300 +convergence_p90_secs_ci_high = 300 +convergence_p95_secs = 300 +convergence_p95_secs_ci_low = 300 +convergence_p95_secs_ci_high = 360 +convergence_p99_secs = 660 +convergence_p99_secs_ci_low = 600 +convergence_p99_secs_ci_high = 840 +convergence_mean_secs = 49.2 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0.040273304878727156 +settled_accuracy_p90_ci_low = 0.006702363661462374 +settled_accuracy_p90_ci_high = 0.04600077806017944 +settled_accuracy_p95 = 0.050001137495259584 +settled_accuracy_p95_ci_low = 0.048001561757503364 +settled_accuracy_p95_ci_high = 0.053999550773258576 +settled_accuracy_p99 = 0.06599975666325597 +settled_accuracy_p99_ci_low = 0.058001655038825595 +settled_accuracy_p99_ci_high = 0.07400188481957892 +settled_accuracy_mean = 0.005795126567654702 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.043478260869565216 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.045454545454545456 +jitter_mean_per_min = 0.0008452021124655396 +bias_mean = -0.00007712197374207467 +bias_p10 = -0.048940658488217624 +bias_p10_ci_low = -0.051996259323615616 +bias_p10_ci_high = -0.04632444058341636 +bias_p50 = 0.0002725926770686552 +bias_p50_ci_low = -0.0021677046365362845 +bias_p50_ci_high = 0.0028593462581451485 +bias_p90 = 0.0463489176588674 +bias_p90_ci_low = 0.0423976854449197 +bias_p90_ci_high = 0.049861717062463166 +bias_p99 = 0.084850439011536 +bias_p99_ci_low = 0.07810919812503907 +bias_p99_ci_high = 0.09414960845562374 +variance_mean = 0.0004391094474571029 +variance_p10 = 0.00007832691508210942 +variance_p10_ci_low = 0.00007190141031139779 +variance_p10_ci_high = 0.00008441725066742406 +variance_p50 = 0.00020058766178065952 +variance_p50_ci_low = 0.0001892619376494193 +variance_p50_ci_high = 0.00021521682378625095 +variance_p90 = 0.0006726860083837689 +variance_p90_ci_low = 0.000610450943932859 +variance_p90_ci_high = 0.0007675269190238979 +variance_p99 = 0.004286244680953093 +variance_p99_ci_low = 0.002301701876148258 +variance_p99_ci_high = 0.010803809206917975 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1.045000117776058 +upward_step_magnitude_p95 = 1.0480015617575034 +upward_step_magnitude_p95_ci_low = 1.046668493440603 +upward_step_magnitude_p95_ci_high = 1.0500011374952596 +upward_step_magnitude_p99 = 1.0640003822520943 +upward_step_magnitude_p99_ci_low = 1.0580016550388256 +upward_step_magnitude_p99_ci_high = 1.0740018663590194 +upward_step_magnitude_mean = 1.004415693827212 +fire_decisiveness_mean = 2.8007457993417604 +fire_decisiveness_p50 = 1.6670549288386667 + +[cell.spm_30.step_minus_50_at_15min] +shares_per_minute = 30 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.099 +convergence_rate_ci_low = 0.08048873644507215 +convergence_rate_ci_high = 0.11751126355492786 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 300 +convergence_p50_secs_ci_high = 360 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 450.90909090909093 +settled_accuracy_p10 = 0.24709276008762004 +settled_accuracy_p10_ci_low = 0.23771389356842731 +settled_accuracy_p10_ci_high = 0.2551456896546518 +settled_accuracy_p50 = 0.41452696202665007 +settled_accuracy_p50_ci_low = 0.4056883218696852 +settled_accuracy_p50_ci_high = 0.4216006390374549 +settled_accuracy_p90 = 0.6354345812383344 +settled_accuracy_p90_ci_low = 0.627252534215287 +settled_accuracy_p90_ci_high = 0.6497283668030966 +settled_accuracy_p95 = 0.6683336285004906 +settled_accuracy_p95_ci_low = 0.6590238841121172 +settled_accuracy_p95_ci_high = 0.6778672480620804 +settled_accuracy_p99 = 0.7107144872805549 +settled_accuracy_p99_ci_low = 0.7016551931758874 +settled_accuracy_p99_ci_high = 0.900742767627301 +settled_accuracy_mean = 0.42107386538538877 +jitter_p10_per_min = 0.13043478260869565 +jitter_p10_per_min_ci_low = 0.08695652173913043 +jitter_p10_per_min_ci_high = 0.13043478260869565 +jitter_p50_per_min = 0.17391304347826086 +jitter_p50_per_min_ci_low = 0.17391304347826086 +jitter_p50_per_min_ci_high = 0.17391304347826086 +jitter_p90_per_min = 0.2222222222222222 +jitter_p90_per_min_ci_low = 0.2 +jitter_p90_per_min_ci_high = 0.2222222222222222 +jitter_p95_per_min = 0.2222222222222222 +jitter_p95_per_min_ci_low = 0.2222222222222222 +jitter_p95_per_min_ci_high = 0.2631578947368421 +jitter_p99_per_min = 0.2631578947368421 +jitter_p99_per_min_ci_low = 0.2222222222222222 +jitter_p99_per_min_ci_high = 0.2777777777777778 +jitter_mean_per_min = 0.16786507255710942 +reaction_rate = 0.277 +reaction_rate_ci_low = 0.2492626411927884 +reaction_rate_ci_high = 0.30473735880721164 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 236.53429602888087 +fire_decisiveness_mean = 4.956780743020777 +fire_decisiveness_p50 = 2.777679912738833 +step_correction_mean = 0.09978460423675255 +step_correction_p50 = 0.09578770399093628 + +[cell.spm_30.step_minus_25_at_15min] +shares_per_minute = 30 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.823 +convergence_rate_ci_low = 0.7993439286101854 +convergence_rate_ci_high = 0.8466560713898145 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 300 +convergence_p90_secs_ci_low = 300 +convergence_p90_secs_ci_high = 300 +convergence_p95_secs = 480 +convergence_p95_secs_ci_low = 360 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 87.70352369380316 +settled_accuracy_p10 = 0.20909126456452487 +settled_accuracy_p10_ci_low = 0.19571342582604978 +settled_accuracy_p10_ci_high = 0.23793152229477244 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.33333330350717194 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.33408787556692454 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.3753424677145969 +settled_accuracy_mean = 0.3028225201418323 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.045454545454545456 +jitter_p95_per_min = 0.08695652173913043 +jitter_p95_per_min_ci_low = 0.08695652173913043 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.13043478260869565 +jitter_p99_per_min_ci_low = 0.13043478260869565 +jitter_p99_per_min_ci_high = 0.14285714285714285 +jitter_mean_per_min = 0.008727879522121534 +reaction_rate = 0.033 +reaction_rate_ci_low = 0.021927994869943387 +reaction_rate_ci_high = 0.044072005130056616 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 216.36363636363637 +fire_decisiveness_mean = 2.5385671734928557 +fire_decisiveness_p50 = 0.9999143690884189 +step_correction_mean = 0.20386546805049433 +step_correction_p50 = 0.18526101112365723 + +[cell.spm_30.step_minus_10_at_15min] +shares_per_minute = 30 +scenario = "step_minus_10_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 300 +convergence_p95_secs = 300 +convergence_p95_secs_ci_low = 300 +convergence_p95_secs_ci_high = 300 +convergence_p99_secs = 600 +convergence_p99_secs_ci_low = 540 +convergence_p99_secs_ci_high = 660 +convergence_mean_secs = 36.66 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.11111110282606607 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.11111110282606607 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.16111123331552468 +settled_accuracy_p99 = 0.17555738572199253 +settled_accuracy_p99_ci_low = 0.16889012004657356 +settled_accuracy_p99_ci_high = 0.18222263813148043 +settled_accuracy_mean = 0.11135269749672913 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.047619047619047616 +jitter_mean_per_min = 0.0005216323024910991 +reaction_rate = 0.007 +reaction_rate_ci_low = 0.001832509158208406 +reaction_rate_ci_high = 0.012167490841791594 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 180 +fire_decisiveness_mean = 2.508200032780809 +fire_decisiveness_p50 = 1.6670570165640122 +step_correction_mean = 0.4096589429037912 +step_correction_p50 = 0.3428695499897003 + +[cell.spm_30.step_minus_5_at_15min] +shares_per_minute = 30 +scenario = "step_minus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 300 +convergence_p95_secs = 300 +convergence_p95_secs_ci_low = 300 +convergence_p95_secs_ci_high = 300 +convergence_p99_secs = 600 +convergence_p99_secs_ci_low = 480 +convergence_p99_secs_ci_high = 780 +convergence_mean_secs = 36.36 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.05263157522942574 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.05263157522942574 +settled_accuracy_p95 = 0.05263157522942574 +settled_accuracy_p95_ci_low = 0.05263157522942574 +settled_accuracy_p95_ci_high = 0.09805700057424005 +settled_accuracy_p99 = 0.1115797193620307 +settled_accuracy_p99_ci_low = 0.1052643513543241 +settled_accuracy_p99_ci_high = 0.1115797193620307 +settled_accuracy_mean = 0.053070023579230075 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.043478260869565216 +jitter_mean_per_min = 0.000564817593803101 +reaction_rate = 0.005 +reaction_rate_ci_low = 0.0006282772274536896 +reaction_rate_ci_high = 0.00937172277254631 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 120 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 120 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 168 +fire_decisiveness_mean = 2.242860463337383 +fire_decisiveness_p50 = 1.6670523695464183 +step_correction_mean = 0.7284762024879455 +step_correction_p50 = 0.5042337775230408 + +[cell.spm_30.step_plus_5_at_15min] +shares_per_minute = 30 +scenario = "step_plus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 300 +convergence_p90_secs_ci_low = 300 +convergence_p90_secs_ci_high = 300 +convergence_p95_secs = 300 +convergence_p95_secs_ci_low = 300 +convergence_p95_secs_ci_high = 300 +convergence_p99_secs = 600 +convergence_p99_secs_ci_low = 360 +convergence_p99_secs_ci_high = 600 +convergence_mean_secs = 43.02 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.047618983705838724 +settled_accuracy_p90_ci_low = 0.047618983705838724 +settled_accuracy_p90_ci_high = 0.047618983705838724 +settled_accuracy_p95 = 0.05054218214267503 +settled_accuracy_p95_ci_low = 0.047618983705838724 +settled_accuracy_p95_ci_high = 0.09142803711414482 +settled_accuracy_p99 = 0.10285623017651935 +settled_accuracy_p99_ci_low = 0.09714232538495882 +settled_accuracy_p99_ci_high = 0.11238032091844818 +settled_accuracy_mean = 0.04710814121342282 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.043478260869565216 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.043478260869565216 +jitter_mean_per_min = 0.0006166007905138341 +reaction_rate = 0.004 +reaction_rate_ci_low = 0.00008784785571930992 +reaction_rate_ci_high = 0.00791215214428069 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 180 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 195 +fire_decisiveness_mean = 2.906477318401755 +fire_decisiveness_p50 = 2.0370952974737904 +step_correction_mean = 0.45046187937259674 +step_correction_p50 = 0.49358344078063965 + +[cell.spm_30.step_plus_10_at_15min] +shares_per_minute = 30 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.997 +convergence_rate_ci_low = 0.9936102764714508 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 300 +convergence_p95_secs = 300 +convergence_p95_secs_ci_low = 300 +convergence_p95_secs_ci_high = 360 +convergence_p99_secs = 600 +convergence_p99_secs_ci_low = 600 +convergence_p99_secs_ci_high = 660 +convergence_mean_secs = 39.418254764292875 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.09183897020348075 +settled_accuracy_p95_ci_low = 0.09090908536290365 +settled_accuracy_p95_ci_high = 0.10614475003991453 +settled_accuracy_p99 = 0.1381813631726192 +settled_accuracy_p99_ci_low = 0.13636362804435553 +settled_accuracy_p99_ci_high = 0.14363554468635975 +settled_accuracy_mean = 0.09035925858613762 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.043478260869565216 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.043478260869565216 +jitter_mean_per_min = 0.000680172222864732 +reaction_rate = 0.004 +reaction_rate_ci_low = 0.00008784785571930992 +reaction_rate_ci_high = 0.00791215214428069 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 120 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 180 +reaction_p99_secs_ci_low = 120 +reaction_p99_secs_ci_high = 180 +reaction_mean_secs = 120 +fire_decisiveness_mean = 2.414571072806927 +fire_decisiveness_p50 = 1.6664501866821482 +step_correction_mean = 0.13022351264953613 +step_correction_p50 = 0.2877761423587799 + +[cell.spm_30.step_plus_25_at_15min] +shares_per_minute = 30 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.823 +convergence_rate_ci_low = 0.7993439286101854 +convergence_rate_ci_high = 0.8466560713898145 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 300 +convergence_p90_secs_ci_low = 300 +convergence_p90_secs_ci_high = 300 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 360 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 108.8456865127582 +settled_accuracy_p10 = 0.12214398104373281 +settled_accuracy_p10_ci_low = 0.11793716806614596 +settled_accuracy_p10_ci_high = 0.13566448403592912 +settled_accuracy_p50 = 0.20000003221225382 +settled_accuracy_p50_ci_low = 0.20000003221225382 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.20605437900894918 +settled_accuracy_mean = 0.1797946445732113 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.043478260869565216 +jitter_p95_per_min = 0.08695652173913043 +jitter_p95_per_min_ci_low = 0.058823529411764705 +jitter_p95_per_min_ci_high = 0.08695652173913043 +jitter_p99_per_min = 0.13043478260869565 +jitter_p99_per_min_ci_low = 0.11764705882352941 +jitter_p99_per_min_ci_high = 0.13043478260869565 +jitter_mean_per_min = 0.008036505788367345 +reaction_rate = 0.046 +reaction_rate_ci_low = 0.03301598003698392 +reaction_rate_ci_high = 0.058984019963016075 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 224.34782608695653 +fire_decisiveness_mean = 2.4183381593026363 +fire_decisiveness_p50 = 1.0005297340484418 +step_correction_mean = 0.1774172394172005 +step_correction_p50 = 0.1818288266658783 + +[cell.spm_30.step_plus_50_at_15min] +shares_per_minute = 30 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.312 +convergence_rate_ci_low = 0.28328375913180837 +convergence_rate_ci_high = 0.34071624086819163 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 1260 +convergence_p50_secs_ci_low = 1140 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 942.3076923076923 +settled_accuracy_p10 = 0.07986858473939074 +settled_accuracy_p10_ci_low = 0.07357073108664192 +settled_accuracy_p10_ci_high = 0.08634870606505751 +settled_accuracy_p50 = 0.14887072336464868 +settled_accuracy_p50_ci_low = 0.14495183417918833 +settled_accuracy_p50_ci_high = 0.15332129370498282 +settled_accuracy_p90 = 0.23066667466007795 +settled_accuracy_p90_ci_low = 0.22612966810372093 +settled_accuracy_p90_ci_high = 0.23413262375702082 +settled_accuracy_p95 = 0.24614645247784261 +settled_accuracy_p95_ci_low = 0.23857639373253325 +settled_accuracy_p95_ci_high = 0.26333307712660603 +settled_accuracy_p99 = 0.3020686709787541 +settled_accuracy_p99_ci_low = 0.3012340156753778 +settled_accuracy_p99_ci_high = 0.302888070200524 +settled_accuracy_mean = 0.15343718127204584 +jitter_p10_per_min = 0.08695652173913043 +jitter_p10_per_min_ci_low = 0.043478260869565216 +jitter_p10_per_min_ci_high = 0.08695652173913043 +jitter_p50_per_min = 0.13043478260869565 +jitter_p50_per_min_ci_low = 0.13043478260869565 +jitter_p50_per_min_ci_high = 0.13043478260869565 +jitter_p90_per_min = 0.17391304347826086 +jitter_p90_per_min_ci_low = 0.17391304347826086 +jitter_p90_per_min_ci_high = 0.18181818181818182 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.17391304347826086 +jitter_p95_per_min_ci_high = 0.19047619047619047 +jitter_p99_per_min = 0.2222222222222222 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2222222222222222 +jitter_mean_per_min = 0.12403283987432549 +reaction_rate = 0.334 +reaction_rate_ci_low = 0.3047674689703406 +reaction_rate_ci_high = 0.3632325310296594 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 232.09580838323353 +fire_decisiveness_mean = 5.3122511244815565 +fire_decisiveness_p50 = 2.77814990868292 +step_correction_mean = 0.0985769880879782 +step_correction_p50 = 0.09579333662986755 + +[derived.operational_fitness.spm_6] +score = 0.5004830433991935 +reaction_10_component = 0.313 +reaction_50_component = 0.668 +jitter_component = 0.8521151460872256 +step_safety_component = 0.3999999666523437 +convergence_component = 0.09429999999999997 +overshoot_component = 0.5955926521430108 + +[derived.operational_fitness.spm_8] +score = 0.5339273622343195 +reaction_10_component = 0.206 +reaction_50_component = 0.584 +jitter_component = 0.9222743288480313 +step_safety_component = 0.5499989138688051 +convergence_component = 0.09619999999999998 +overshoot_component = 0.6212905155511037 + +[derived.operational_fitness.spm_10] +score = 0.5663285129683737 +reaction_10_component = 0.142 +reaction_50_component = 0.572 +jitter_component = 0.9599891369416295 +step_safety_component = 0.6399999114734101 +convergence_component = 0.09709999999999998 +overshoot_component = 0.7326625086461385 + +[derived.operational_fitness.spm_12] +score = 0.5891079857703633 +reaction_10_component = 0.077 +reaction_50_component = 0.503 +jitter_component = 0.9669629293276912 +step_safety_component = 0.7624977093097658 +convergence_component = 0.09749999999999998 +overshoot_component = 0.8026782611099901 + +[derived.operational_fitness.spm_15] +score = 0.5824795268248029 +reaction_10_component = 0.053 +reaction_50_component = 0.419 +jitter_component = 0.9844879825324235 +step_safety_component = 0.819999260460309 +convergence_component = 0 +overshoot_component = 0.815077160766198 + +[derived.operational_fitness.spm_20] +score = 0.6022323483197682 +reaction_10_component = 0.02 +reaction_50_component = 0.408 +jitter_component = 0.9946768743347549 +step_safety_component = 0.885997532155034 +convergence_component = 0 +overshoot_component = 0.8826374669732111 + +[derived.operational_fitness.spm_25] +score = 0.6021066507842103 +reaction_10_component = 0.011 +reaction_50_component = 0.33 +jitter_component = 0.9967989377086233 +step_safety_component = 0.903998218662291 +convergence_component = 0 +overshoot_component = 0.9225736169148162 + +[derived.operational_fitness.spm_30] +score = 0.5987998497647606 +reaction_10_component = 0.007 +reaction_50_component = 0.277 +jitter_component = 0.9971826596251149 +step_safety_component = 0.9039968764849933 +convergence_component = 0 +overshoot_component = 0.947549657372335 + +[derived.decoupling_score.spm_6] +score = 0.668 +score_ci_low = 0.638811394661615 +score_ci_high = 0.6971886053383851 + +[derived.decoupling_score.spm_8] +score = 0.584 +score_ci_low = 0.5534501445109801 +score_ci_high = 0.6145498554890199 + +[derived.decoupling_score.spm_10] +score = 0.572 +score_ci_low = 0.541332669734716 +score_ci_high = 0.6026673302652839 + +[derived.decoupling_score.spm_12] +score = 0.503 +score_ci_low = 0.47201023676114967 +score_ci_high = 0.5339897632388504 + +[derived.decoupling_score.spm_15] +score = 0.419 +score_ci_low = 0.38841903758218194 +score_ci_high = 0.44958096241781803 + +[derived.decoupling_score.spm_20] +score = 0.408 +score_ci_low = 0.3775388001286883 +score_ci_high = 0.43846119987131166 + +[derived.decoupling_score.spm_25] +score = 0.33 +score_ci_low = 0.30085591380742915 +score_ci_high = 0.3591440861925709 + +[derived.decoupling_score.spm_30] +score = 0.277 +score_ci_low = 0.2492626411927884 +score_ci_high = 0.30473735880721164 + +[derived.reaction_asymmetry.spm_6] +asymmetry_at_5 = 0.007000000000000006 +asymmetry_at_5_ci_low = -0.04950173966242888 +asymmetry_at_5_ci_high = 0.06350173966242889 +asymmetry_at_10 = 0.02400000000000002 +asymmetry_at_10_ci_low = -0.03403862595798052 +asymmetry_at_10_ci_high = 0.08203862595798056 +asymmetry_at_25 = 0.013000000000000012 +asymmetry_at_25_ci_low = -0.047632606587463655 +asymmetry_at_25_ci_high = 0.07363260658746368 +asymmetry_at_50 = -0.030000000000000027 +asymmetry_at_50_ci_low = -0.08897518905656265 +asymmetry_at_50_ci_high = 0.0289751890565626 +max_abs_asymmetry = 0.030000000000000027 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.08897518905656265 + +[derived.reaction_asymmetry.spm_8] +asymmetry_at_5 = 0.01899999999999999 +asymmetry_at_5_ci_low = -0.02802252789529236 +asymmetry_at_5_ci_high = 0.06602252789529234 +asymmetry_at_10 = 0.01100000000000001 +asymmetry_at_10_ci_low = -0.03961544292722627 +asymmetry_at_10_ci_high = 0.06161544292722629 +asymmetry_at_25 = 0.056999999999999995 +asymmetry_at_25_ci_low = -0.00012655196827143778 +asymmetry_at_25_ci_high = 0.11412655196827143 +asymmetry_at_50 = -0.02199999999999991 +asymmetry_at_50_ci_low = -0.08330100001406149 +asymmetry_at_50_ci_high = 0.03930100001406167 +max_abs_asymmetry = 0.056999999999999995 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.11412655196827143 + +[derived.reaction_asymmetry.spm_10] +asymmetry_at_5 = -0.0020000000000000018 +asymmetry_at_5_ci_low = -0.04299591292296234 +asymmetry_at_5_ci_high = 0.03899591292296234 +asymmetry_at_10 = -0.014999999999999986 +asymmetry_at_10_ci_low = -0.05727223040714692 +asymmetry_at_10_ci_high = 0.027272230407146922 +asymmetry_at_25 = 0.014000000000000012 +asymmetry_at_25_ci_low = -0.039377957946226116 +asymmetry_at_25_ci_high = 0.06737795794622611 +asymmetry_at_50 = -0.041999999999999926 +asymmetry_at_50_ci_low = -0.1036018184621168 +asymmetry_at_50_ci_high = 0.01960181846211695 +max_abs_asymmetry = 0.041999999999999926 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.1036018184621168 + +[derived.reaction_asymmetry.spm_12] +asymmetry_at_5 = 0.01100000000000001 +asymmetry_at_5_ci_low = -0.022509994550102913 +asymmetry_at_5_ci_high = 0.04450999455010293 +asymmetry_at_10 = 0.024000000000000007 +asymmetry_at_10_ci_low = -0.011200056936880698 +asymmetry_at_10_ci_high = 0.05920005693688071 +asymmetry_at_25 = 0.05299999999999999 +asymmetry_at_25_ci_low = 0.005103877040247451 +asymmetry_at_25_ci_high = 0.10089612295975253 +asymmetry_at_50 = -0.045999999999999985 +asymmetry_at_50_ci_low = -0.10786526941445823 +asymmetry_at_50_ci_high = 0.015865269414458205 +max_abs_asymmetry = 0.05299999999999999 +max_abs_asymmetry_ci_low = 0.005103877040247451 +max_abs_asymmetry_ci_high = 0.10089612295975253 + +[derived.reaction_asymmetry.spm_15] +asymmetry_at_5 = -0.009000000000000001 +asymmetry_at_5_ci_low = -0.034525313975092925 +asymmetry_at_5_ci_high = 0.016525313975092923 +asymmetry_at_10 = 0.0050000000000000044 +asymmetry_at_10_ci_low = -0.023373308000292303 +asymmetry_at_10_ci_high = 0.03337330800029231 +asymmetry_at_25 = 0.049000000000000016 +asymmetry_at_25_ci_low = 0.005504459912119314 +asymmetry_at_25_ci_high = 0.09249554008788072 +asymmetry_at_50 = 0.02300000000000002 +asymmetry_at_50_ci_low = -0.038362074444513894 +asymmetry_at_50_ci_high = 0.08436207444451393 +max_abs_asymmetry = 0.049000000000000016 +max_abs_asymmetry_ci_low = 0.005504459912119314 +max_abs_asymmetry_ci_high = 0.09249554008788072 + +[derived.reaction_asymmetry.spm_20] +asymmetry_at_5 = 0.006 +asymmetry_at_5_ci_low = -0.009482685512130266 +asymmetry_at_5_ci_high = 0.021482685512130267 +asymmetry_at_10 = -0.005000000000000001 +asymmetry_at_10_ci_low = -0.0212111892882648 +asymmetry_at_10_ci_high = 0.011211189288264799 +asymmetry_at_25 = 0.006999999999999992 +asymmetry_at_25_ci_low = -0.027837086507387573 +asymmetry_at_25_ci_high = 0.04183708650738756 +asymmetry_at_50 = -0.032999999999999974 +asymmetry_at_50_ci_low = -0.09346744922040556 +asymmetry_at_50_ci_high = 0.027467449220405615 +max_abs_asymmetry = 0.032999999999999974 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.09346744922040556 + +[derived.reaction_asymmetry.spm_25] +asymmetry_at_5 = 0.008 +asymmetry_at_5_ci_low = -0.0033925182830280105 +asymmetry_at_5_ci_high = 0.019392518283028008 +asymmetry_at_10 = -0.002 +asymmetry_at_10_ci_low = -0.014318212703576583 +asymmetry_at_10_ci_high = 0.010318212703576583 +asymmetry_at_25 = 0.008 +asymmetry_at_25_ci_low = -0.017941011003651523 +asymmetry_at_25_ci_high = 0.033941011003651524 +asymmetry_at_50 = 0.01799999999999996 +asymmetry_at_50_ci_low = -0.04066769832929967 +asymmetry_at_50_ci_high = 0.0766676983292996 +max_abs_asymmetry = 0.01799999999999996 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.0766676983292996 + +[derived.reaction_asymmetry.spm_30] +asymmetry_at_5 = -0.001 +asymmetry_at_5_ci_low = -0.009283874916827 +asymmetry_at_5_ci_high = 0.007283874916827001 +asymmetry_at_10 = -0.003 +asymmetry_at_10_ci_low = -0.012079642986072284 +asymmetry_at_10_ci_high = 0.006079642986072284 +asymmetry_at_25 = 0.012999999999999998 +asymmetry_at_25_ci_low = -0.011056025093072692 +asymmetry_at_25_ci_high = 0.03705602509307269 +asymmetry_at_50 = 0.056999999999999995 +asymmetry_at_50_ci_low = 0.000030110163128982403 +asymmetry_at_50_ci_high = 0.11396988983687101 +max_abs_asymmetry = 0.056999999999999995 +max_abs_asymmetry_ci_low = 0.000030110163128982403 +max_abs_asymmetry_ci_high = 0.11396988983687101 + diff --git a/sv2/channels-sv2/sim/baseline_EWMA-60s.md b/sv2/channels-sv2/sim/baseline_EWMA-60s.md new file mode 100644 index 0000000000..606a9295c3 --- /dev/null +++ b/sv2/channels-sv2/sim/baseline_EWMA-60s.md @@ -0,0 +1,227 @@ +# Vardiff baseline characterization — `EWMA-60s` + +*Generated by `cargo run --release --bin generate-baseline` from the vardiff_sim crate. 1000 trials per cell, base seed `0xdeadbeefcafef00d`.* + +## Summary + +Headline per-metric values at each share rate's best and worst cells. ↑ = higher is better; ↓ = lower is better; ↔ = near-zero is better. Where a `(floor: X.X%)` annotation appears, it's the Poisson-noise lower bound on that metric at that share rate — the algorithm cannot do better than this without exotic estimation techniques. + +| Metric | Dir | Best | Worst | +| --- | :-: | --- | --- | +| cold-start convergence rate | ↑ | 100.0% @ SPM=6 | 100.0% @ SPM=6 | +| cold-start p90 time | ↓ | 7m @ SPM=30 | 9m @ SPM=15 | +| settled accuracy p50 (stable) | ↓ | 5.3% @ SPM=30 (floor: 3.9%) | 13.3% @ SPM=6 (floor: 8.7%) | +| settled accuracy p99 (stable) | ↓ | 21.9% @ SPM=30 (floor: 14.9%) | 46.8% @ SPM=6 (floor: 33.3%) | +| stable-load jitter (mean) | ↓ | 0.076/min @ SPM=30 (floor: 0.020/min) | 0.089/min @ SPM=6 (floor: 0.020/min) | +| reaction rate at −50% step | ↑ | 100.0% @ SPM=25 | 85.3% @ SPM=6 | +| reaction rate at +50% step | ↑ | 98.9% @ SPM=30 | 78.9% @ SPM=6 | +| ramp target overshoot p99 (cold start) | ↓ | 25.7% @ SPM=25 (floor: 46.5%) | 63.8% @ SPM=6 (floor: 95.0%) | +| upward step magnitude p95 (stable) | ↓ | 1.215 @ SPM=30 | 1.522 @ SPM=6 | +| operational fitness | ↑ | 0.708 @ SPM=30 | 0.467 @ SPM=6 | +| decoupling score | ↑ | 0.856 @ SPM=30 | 0.705 @ SPM=6 | +| max |reaction asymmetry| | ↓ | 0.033 @ SPM=30 | 0.090 @ SPM=10 | + +## Convergence time (cold start: 10 GH/s → 1 PH/s) + +| share/min | rate | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 100.0% | 2m | 4m | 8m | 15m | 4m38s | +| 8 | 100.0% | 2m | 3m | 8m | 14m | 4m37s | +| 10 | 100.0% | 2m | 4m | 8m | 15m | 4m45s | +| 12 | 100.0% | 2m | 4m | 8m | 13m | 4m38s | +| 15 | 100.0% | 2m | 4m | 9m | 14m | 4m49s | +| 20 | 100.0% | 1m | 4m | 8m | 12m | 4m32s | +| 25 | 100.0% | 2m | 5m | 8m | 13m | 4m46s | +| 30 | 100.0% | 1m | 2m | 7m | 12m | 3m20s | + +## Settled accuracy (stable load, post-convergence) + +`|final_hashrate / true_hashrate - 1|` at trial end. Smaller is better. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 2.4% | 13.3% | 28.9% | 46.8% | 14.6% | +| 8 | 1.9% | 11.2% | 25.5% | 44.6% | 12.9% | +| 10 | 1.4% | 9.7% | 22.3% | 36.2% | 11.0% | +| 12 | 1.3% | 8.4% | 21.0% | 35.0% | 10.0% | +| 15 | 1.3% | 7.8% | 18.6% | 30.3% | 9.2% | +| 20 | 0.9% | 6.5% | 16.3% | 27.2% | 7.8% | +| 25 | 0.9% | 6.0% | 14.1% | 22.8% | 7.1% | +| 30 | 0.8% | 5.3% | 13.0% | 21.9% | 6.4% | + +## Steady-state jitter (fires per minute) + +Post-convergence rate of vardiff fires. Smaller is better — ideal is zero under stable load. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.050 | 0.087 | 0.143 | 0.190 | 0.089 | +| 8 | 0.048 | 0.083 | 0.143 | 0.188 | 0.087 | +| 10 | 0.048 | 0.087 | 0.143 | 0.200 | 0.087 | +| 12 | 0.045 | 0.083 | 0.143 | 0.182 | 0.085 | +| 15 | 0.050 | 0.083 | 0.143 | 0.188 | 0.086 | +| 20 | 0.045 | 0.083 | 0.136 | 0.176 | 0.083 | +| 25 | 0.048 | 0.077 | 0.133 | 0.188 | 0.081 | +| 30 | 0.000 | 0.071 | 0.125 | 0.182 | 0.076 | + +## Reaction time to a 50% drop (step at 15 min) + +| share/min | reacted | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 85.3% | 1m | 2m | 4m | 5m | 2m30s | +| 8 | 92.2% | 1m | 2m | 4m | 5m | 2m25s | +| 10 | 94.1% | 1m | 2m | 4m | 5m | 2m18s | +| 12 | 96.5% | 1m | 2m | 4m | 5m | 2m04s | +| 15 | 98.5% | 1m | 2m | 3m | 5m | 1m55s | +| 20 | 99.4% | 1m | 1m | 3m | 5m | 1m42s | +| 25 | 100.0% | 1m | 1m | 3m | 4m | 1m31s | +| 30 | 99.9% | 1m | 1m | 2m | 3m | 1m27s | + +## Reaction sensitivity (P[fire within 5 min of step change]) + +| Δ% | 6 | 8 | 10 | 12 | 15 | 20 | 25 | 30 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| -50% | 0.85 | 0.92 | 0.94 | 0.96 | 0.98 | 0.99 | 1.00 | 1.00 | +| -25% | 0.60 | 0.62 | 0.65 | 0.69 | 0.73 | 0.79 | 0.82 | 0.82 | +| -10% | 0.53 | 0.56 | 0.52 | 0.53 | 0.59 | 0.54 | 0.56 | 0.56 | +| -5% | 0.53 | 0.48 | 0.50 | 0.53 | 0.49 | 0.49 | 0.48 | 0.49 | +| +5% | 0.55 | 0.53 | 0.53 | 0.50 | 0.51 | 0.54 | 0.53 | 0.51 | +| +10% | 0.54 | 0.57 | 0.56 | 0.56 | 0.55 | 0.56 | 0.56 | 0.60 | +| +25% | 0.64 | 0.64 | 0.67 | 0.73 | 0.69 | 0.74 | 0.81 | 0.82 | +| +50% | 0.79 | 0.84 | 0.85 | 0.90 | 0.92 | 0.97 | 0.98 | 0.99 | + +## Estimator bias + +`E[H̃ − H_true] / H_true` averaged over post-settle ticks. Positive = systematic over-estimate. Populated only for algorithms that expose introspection (e.g. ClassicComposed, Parametric, EWMA-60s). + +### Bias — stable load + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | -11.4% | -1.1% | 11.1% | 20.5% | -0.5% | +| 8 | -10.4% | -0.3% | 11.4% | 21.8% | 0.2% | +| 10 | -8.6% | -0.1% | 9.0% | 17.1% | 0.1% | +| 12 | -8.1% | -0.3% | 8.5% | 15.8% | -0.0% | +| 15 | -7.4% | -0.2% | 7.5% | 14.8% | -0.1% | +| 20 | -5.6% | 0.3% | 6.7% | 10.9% | 0.3% | +| 25 | -5.8% | -0.0% | 5.7% | 11.0% | -0.0% | +| 30 | -5.2% | -0.3% | 5.0% | 9.6% | -0.1% | + +### Bias — cold start + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | -11.6% | -0.4% | 11.3% | 24.7% | -0.2% | +| 8 | -10.7% | -0.6% | 9.5% | 20.3% | -0.3% | +| 10 | -8.8% | -0.3% | 9.1% | 17.2% | 0.1% | +| 12 | -7.9% | 0.1% | 8.6% | 16.2% | 0.2% | +| 15 | -7.2% | 0.2% | 7.6% | 14.4% | 0.3% | +| 20 | -6.6% | -0.0% | 6.9% | 11.7% | -0.0% | +| 25 | -5.6% | -0.3% | 5.8% | 11.6% | -0.1% | +| 30 | -5.2% | -0.2% | 5.5% | 10.1% | -0.0% | + +## Estimator variance + +Population variance of `H̃ / H_true` over post-settle ticks (dimensionless). Populated only for algorithms that expose introspection. + +### Variance — stable load + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.038 | 0.065 | 0.109 | 0.172 | 0.070 | +| 8 | 0.027 | 0.049 | 0.083 | 0.132 | 0.053 | +| 10 | 0.023 | 0.039 | 0.063 | 0.090 | 0.042 | +| 12 | 0.019 | 0.033 | 0.054 | 0.077 | 0.035 | +| 15 | 0.016 | 0.026 | 0.042 | 0.059 | 0.028 | +| 20 | 0.012 | 0.020 | 0.032 | 0.046 | 0.021 | +| 25 | 0.010 | 0.016 | 0.025 | 0.034 | 0.017 | +| 30 | 0.008 | 0.013 | 0.021 | 0.030 | 0.014 | + +### Variance — cold start + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.038 | 0.065 | 0.109 | 0.166 | 0.070 | +| 8 | 0.028 | 0.048 | 0.081 | 0.115 | 0.052 | +| 10 | 0.024 | 0.039 | 0.064 | 0.102 | 0.042 | +| 12 | 0.019 | 0.032 | 0.052 | 0.076 | 0.034 | +| 15 | 0.015 | 0.026 | 0.044 | 0.061 | 0.028 | +| 20 | 0.012 | 0.019 | 0.030 | 0.044 | 0.020 | +| 25 | 0.009 | 0.016 | 0.026 | 0.035 | 0.017 | +| 30 | 0.008 | 0.013 | 0.020 | 0.030 | 0.014 | + +## Ramp target overshoot (cold start) + +`max(new_hashrate on fires) / H_true − 1`: how far the algorithm's actual *target* (not its belief) climbs past truth during the cold-start ramp. Reads `new_hashrate` (the actual target the algorithm set), so it's unaffected by estimator-belief noise. Works for any algorithm that fires, including those without introspection. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.8% | 18.0% | 41.1% | 63.8% | 20.0% | +| 8 | 0.2% | 13.9% | 33.6% | 51.7% | 15.9% | +| 10 | 0.0% | 13.7% | 29.7% | 46.0% | 14.7% | +| 12 | 0.0% | 11.6% | 25.9% | 41.0% | 12.9% | +| 15 | 0.0% | 10.7% | 24.1% | 34.3% | 11.6% | +| 20 | 0.0% | 8.2% | 18.9% | 29.2% | 9.2% | +| 25 | 0.0% | 7.5% | 16.8% | 25.7% | 8.0% | +| 30 | 0.0% | 7.9% | 15.7% | 26.0% | 7.9% | + +## Upward step magnitude (stable load) + +`new_hashrate / old_hashrate` for upward difficulty adjustments during steady-state. Per-trial p95 of ratios, then distribution across trials. Values near 1.0 indicate gentle retargeting; values >> 1.0 indicate aggressive jumps. + +| share/min | p50 | p90 | p95 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 1.314 | 1.474 | 1.522 | 1.645 | 1.323 | +| 8 | 1.274 | 1.402 | 1.445 | 1.526 | 1.279 | +| 10 | 1.242 | 1.353 | 1.394 | 1.478 | 1.248 | +| 12 | 1.223 | 1.321 | 1.353 | 1.433 | 1.225 | +| 15 | 1.195 | 1.278 | 1.312 | 1.369 | 1.198 | +| 20 | 1.170 | 1.243 | 1.273 | 1.320 | 1.170 | +| 25 | 1.150 | 1.213 | 1.239 | 1.286 | 1.151 | +| 30 | 1.136 | 1.197 | 1.215 | 1.239 | 1.134 | + +## Operational fitness (per share rate) + +`0.15×react(-10%) + 0.1×react(-50%) + 0.25×jitter + 0.25×step_safety + 0.15×convergence + 0.1×overshoot`. Higher is better. + +| share/min | fitness | react-10% | react-50% | jitter | step-safe | conv | overshoot | +| --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.467 | 0.530 | 0.853 | 0.705 | 0.000 | 0.600 | 0.362 | +| 8 | 0.535 | 0.560 | 0.922 | 0.711 | 0.110 | 0.700 | 0.483 | +| 10 | 0.547 | 0.521 | 0.941 | 0.711 | 0.212 | 0.600 | 0.540 | +| 12 | 0.578 | 0.530 | 0.965 | 0.718 | 0.294 | 0.600 | 0.590 | +| 15 | 0.615 | 0.586 | 0.985 | 0.715 | 0.376 | 0.600 | 0.657 | +| 20 | 0.636 | 0.541 | 0.994 | 0.723 | 0.454 | 0.600 | 0.708 | +| 25 | 0.647 | 0.565 | 1.000 | 0.729 | 0.522 | 0.500 | 0.743 | +| 30 | 0.708 | 0.564 | 0.999 | 0.747 | 0.570 | 0.800 | 0.740 | + +## Decoupling score (per share rate) + +`reaction_rate(Step−50) × clamp(1 − jitter_p50 / J_max, 0, 1)` where `J_max = 0.50` fires/min. Higher is better. Score of 1.0 = perfect decoupling between reactivity and jitter. + +| share/min | decoupling score | +| --- | --- | +| 6 | 0.705 | +| 8 | 0.768 | +| 10 | 0.777 | +| 12 | 0.804 | +| 15 | 0.821 | +| 20 | 0.828 | +| 25 | 0.846 | +| 30 | 0.856 | + +## Reaction asymmetry (per share rate) + +`reaction_rate(+δ%) − reaction_rate(−δ%)`. Positive = responds faster to up-steps; negative = responds faster to down-steps; near zero = symmetric. + +| share/min | δ=5% | δ=10% | δ=25% | δ=50% | +| --- | --- | --- | --- | --- | +| 6 | +0.02 | +0.01 | +0.04 | -0.06 | +| 8 | +0.04 | +0.01 | +0.02 | -0.08 | +| 10 | +0.03 | +0.04 | +0.02 | -0.09 | +| 12 | -0.03 | +0.03 | +0.04 | -0.06 | +| 15 | +0.02 | -0.03 | -0.04 | -0.06 | +| 20 | +0.04 | +0.02 | -0.05 | -0.03 | +| 25 | +0.05 | -0.01 | -0.02 | -0.02 | +| 30 | +0.01 | +0.03 | -0.00 | -0.01 | + diff --git a/sv2/channels-sv2/sim/baseline_EWMA-60s.toml b/sv2/channels-sv2/sim/baseline_EWMA-60s.toml new file mode 100644 index 0000000000..b335541da0 --- /dev/null +++ b/sv2/channels-sv2/sim/baseline_EWMA-60s.toml @@ -0,0 +1,6582 @@ +# Vardiff baseline characterization. Regenerate with +# `cargo run --release --bin generate-baseline` from the sim crate. + +[meta] +algorithm = "EWMA-60s" +trial_count = 1000 +base_seed = 16045690984503111693 +quiet_window_secs = 300 +settle_buffer_secs = 120 +min_settled_window_secs = 600 +react_window_secs = 300 +step_event_at_secs = 900 +trial_duration_secs = 1800 + +[cell.spm_6.cold_start_10gh_to_1ph] +shares_per_minute = 6 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 120 +convergence_p10_secs_ci_low = 120 +convergence_p10_secs_ci_high = 120 +convergence_p50_secs = 240 +convergence_p50_secs_ci_low = 240 +convergence_p50_secs_ci_high = 240 +convergence_p90_secs = 480 +convergence_p90_secs_ci_low = 480 +convergence_p90_secs_ci_high = 540 +convergence_p95_secs = 540 +convergence_p95_secs_ci_low = 540 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 900 +convergence_p99_secs_ci_low = 720 +convergence_p99_secs_ci_high = 960 +convergence_mean_secs = 277.92 +settled_accuracy_p10 = 0.024871216410587094 +settled_accuracy_p10_ci_low = 0.019272525140826224 +settled_accuracy_p10_ci_high = 0.030751966239409123 +settled_accuracy_p50 = 0.1364121225185071 +settled_accuracy_p50_ci_low = 0.12725874178528773 +settled_accuracy_p50_ci_high = 0.14343647451363017 +settled_accuracy_p90 = 0.3311245345245246 +settled_accuracy_p90_ci_low = 0.3116282684282117 +settled_accuracy_p90_ci_high = 0.34810072852712615 +settled_accuracy_p95 = 0.39201140099083553 +settled_accuracy_p95_ci_low = 0.3662583740958172 +settled_accuracy_p95_ci_high = 0.4135776400241564 +settled_accuracy_p99 = 0.570415889070657 +settled_accuracy_p99_ci_low = 0.47120254589558486 +settled_accuracy_p99_ci_high = 0.6340349587525429 +settled_accuracy_mean = 0.1600759438811514 +jitter_p10_per_min = 0.047619047619047616 +jitter_p10_per_min_ci_low = 0.045454545454545456 +jitter_p10_per_min_ci_high = 0.047619047619047616 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.08695652173913043 +jitter_p50_per_min_ci_high = 0.09523809523809523 +jitter_p90_per_min = 0.13636363636363635 +jitter_p90_per_min_ci_low = 0.13043478260869565 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15 +jitter_p95_per_min_ci_low = 0.14814814814814814 +jitter_p95_per_min_ci_high = 0.15789473684210525 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.19230769230769232 +jitter_mean_per_min = 0.09580598429269532 +bias_mean = -0.001893487657385256 +bias_p10 = -0.11591786813050832 +bias_p10_ci_low = -0.12521790822381665 +bias_p10_ci_high = -0.10986054604809159 +bias_p50 = -0.0041527671992524 +bias_p50_ci_low = -0.011394723220771721 +bias_p50_ci_high = 0.0001816248447105341 +bias_p90 = 0.11338522372076987 +bias_p90_ci_low = 0.10683017108179482 +bias_p90_ci_high = 0.12296398282410063 +bias_p99 = 0.2472676917060708 +bias_p99_ci_low = 0.21695755433878075 +bias_p99_ci_high = 0.26121444673443833 +variance_mean = 0.0704090311354781 +variance_p10 = 0.03803484081046558 +variance_p10_ci_low = 0.036384914585209704 +variance_p10_ci_high = 0.03935821737985349 +variance_p50 = 0.06540553383785404 +variance_p50_ci_low = 0.06264463466003854 +variance_p50_ci_high = 0.06685397158249944 +variance_p90 = 0.10927462940081047 +variance_p90_ci_low = 0.1035144501204342 +variance_p90_ci_high = 0.11353537631877764 +variance_p99 = 0.1661987469489855 +variance_p99_ci_low = 0.15609441567773638 +variance_p99_ci_high = 0.18568479111522546 +ramp_target_overshoot_p10 = 0.007725908068505483 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0.015330281982726124 +ramp_target_overshoot_p50 = 0.18037983751735864 +ramp_target_overshoot_p50_ci_low = 0.16582593799234835 +ramp_target_overshoot_p50_ci_high = 0.19049730420334354 +ramp_target_overshoot_p90 = 0.41074376687829894 +ramp_target_overshoot_p90_ci_low = 0.38722922327998477 +ramp_target_overshoot_p90_ci_high = 0.43171166327241206 +ramp_target_overshoot_p99 = 0.6382734204401925 +ramp_target_overshoot_p99_ci_low = 0.6102554693557098 +ramp_target_overshoot_p99_ci_high = 0.6587896741737103 +ramp_target_overshoot_mean = 0.19982395754263707 + +[cell.spm_6.stable_1ph] +shares_per_minute = 6 +scenario = "stable_1ph" +convergence_rate = 0.986 +convergence_rate_ci_low = 0.9787178680044921 +convergence_rate_ci_high = 0.9932821319955079 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 753.4685598377282 +settled_accuracy_p10 = 0.02380324593499794 +settled_accuracy_p10_ci_low = 0.018255154749351354 +settled_accuracy_p10_ci_high = 0.027229086377900336 +settled_accuracy_p50 = 0.13348174682496206 +settled_accuracy_p50_ci_low = 0.11832198846787845 +settled_accuracy_p50_ci_high = 0.1416126568929763 +settled_accuracy_p90 = 0.28856483061957383 +settled_accuracy_p90_ci_low = 0.274381774681852 +settled_accuracy_p90_ci_high = 0.30365439310400033 +settled_accuracy_p95 = 0.34463495830962443 +settled_accuracy_p95_ci_low = 0.3247032227891504 +settled_accuracy_p95_ci_high = 0.38693085726675935 +settled_accuracy_p99 = 0.4677095294789446 +settled_accuracy_p99_ci_low = 0.4412880982897909 +settled_accuracy_p99_ci_high = 0.5209174640821612 +settled_accuracy_mean = 0.14610629050984705 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0.047619047619047616 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.08695652173913043 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13636363636363635 +jitter_p90_per_min_ci_high = 0.15 +jitter_p95_per_min = 0.15384615384615385 +jitter_p95_per_min_ci_low = 0.15384615384615385 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.19047619047619047 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08854721817446691 +bias_mean = -0.005353077179337688 +bias_p10 = -0.11369768082959586 +bias_p10_ci_low = -0.12149000371602976 +bias_p10_ci_high = -0.10723394216343986 +bias_p50 = -0.010535618490963291 +bias_p50_ci_low = -0.017751827666667257 +bias_p50_ci_high = -0.003999794307797115 +bias_p90 = 0.11117371112365354 +bias_p90_ci_low = 0.10029164841585163 +bias_p90_ci_high = 0.12139288129435369 +bias_p99 = 0.20481614256697678 +bias_p99_ci_low = 0.19174517941747524 +bias_p99_ci_high = 0.2528349583668435 +variance_mean = 0.07048868632422246 +variance_p10 = 0.03836320345434384 +variance_p10_ci_low = 0.03638237485198758 +variance_p10_ci_high = 0.040288998900613784 +variance_p50 = 0.06461891470940313 +variance_p50_ci_low = 0.06265097872363 +variance_p50_ci_high = 0.06678898479433806 +variance_p90 = 0.10940650183831817 +variance_p90_ci_low = 0.10493406833884422 +variance_p90_ci_high = 0.11621266568147598 +variance_p99 = 0.17154268211225035 +variance_p99_ci_low = 0.15327265133196952 +variance_p99_ci_high = 0.18413679595395588 +upward_step_magnitude_p50 = 1.313692244647542 +upward_step_magnitude_p50_ci_low = 1.306825114027275 +upward_step_magnitude_p50_ci_high = 1.3234736205723818 +upward_step_magnitude_p90 = 1.4739810557120632 +upward_step_magnitude_p90_ci_low = 1.4581424946350465 +upward_step_magnitude_p90_ci_high = 1.4917191846260598 +upward_step_magnitude_p95 = 1.522160436824056 +upward_step_magnitude_p95_ci_low = 1.503363186843287 +upward_step_magnitude_p95_ci_high = 1.5362070728388622 +upward_step_magnitude_p99 = 1.6446649854182842 +upward_step_magnitude_p99_ci_low = 1.596957887407301 +upward_step_magnitude_p99_ci_high = 1.6666679864743426 +upward_step_magnitude_mean = 1.3229844017310384 +fire_decisiveness_mean = 12.926477394824207 +fire_decisiveness_p50 = 9.316442335923867 + +[cell.spm_6.step_minus_50_at_15min] +shares_per_minute = 6 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.989 +convergence_rate_ci_low = 0.9825352674919994 +convergence_rate_ci_high = 0.9954647325080006 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 760.7684529828109 +settled_accuracy_p10 = 0.03490774980553524 +settled_accuracy_p10_ci_low = 0.028905331604698548 +settled_accuracy_p10_ci_high = 0.03903380414452273 +settled_accuracy_p50 = 0.15753410086636865 +settled_accuracy_p50_ci_low = 0.1470241815386063 +settled_accuracy_p50_ci_high = 0.16593089625700985 +settled_accuracy_p90 = 0.3685834278282074 +settled_accuracy_p90_ci_low = 0.3560861465760956 +settled_accuracy_p90_ci_high = 0.39581701050005424 +settled_accuracy_p95 = 0.4657622986557892 +settled_accuracy_p95_ci_low = 0.4315605341087181 +settled_accuracy_p95_ci_high = 0.49790261309169126 +settled_accuracy_p99 = 0.5894435339635615 +settled_accuracy_p99_ci_low = 0.558582448709869 +settled_accuracy_p99_ci_high = 0.7114844943961078 +settled_accuracy_mean = 0.1829469597704501 +jitter_p10_per_min = 0.06666666666666667 +jitter_p10_per_min_ci_low = 0.0625 +jitter_p10_per_min_ci_high = 0.07142857142857142 +jitter_p50_per_min = 0.10526315789473684 +jitter_p50_per_min_ci_low = 0.10526315789473684 +jitter_p50_per_min_ci_high = 0.1111111111111111 +jitter_p90_per_min = 0.15789473684210525 +jitter_p90_per_min_ci_low = 0.15789473684210525 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.17647058823529413 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.19047619047619047 +jitter_p99_per_min_ci_high = 0.21052631578947367 +jitter_mean_per_min = 0.11097008534645925 +reaction_rate = 0.853 +reaction_rate_ci_low = 0.8310522879187829 +reaction_rate_ci_high = 0.874947712081217 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 150.10550996483002 +fire_decisiveness_mean = 12.05750187192655 +fire_decisiveness_p50 = 9.673436270271381 +step_correction_mean = 0.5711802188634593 +step_correction_p50 = 0.5497137904167175 + +[cell.spm_6.step_minus_25_at_15min] +shares_per_minute = 6 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.995 +convergence_rate_ci_low = 0.9906282772274537 +convergence_rate_ci_high = 0.9993717227725463 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 722.7738693467337 +settled_accuracy_p10 = 0.02339244968020826 +settled_accuracy_p10_ci_low = 0.01883978438906464 +settled_accuracy_p10_ci_high = 0.02881010348097246 +settled_accuracy_p50 = 0.13576194642905237 +settled_accuracy_p50_ci_low = 0.12165593178375089 +settled_accuracy_p50_ci_high = 0.1449699983115409 +settled_accuracy_p90 = 0.3235370200676082 +settled_accuracy_p90_ci_low = 0.3051099104490379 +settled_accuracy_p90_ci_high = 0.3481539828081408 +settled_accuracy_p95 = 0.4048383343007449 +settled_accuracy_p95_ci_low = 0.38269258834501585 +settled_accuracy_p95_ci_high = 0.4440912927502474 +settled_accuracy_p99 = 0.602186532038532 +settled_accuracy_p99_ci_low = 0.5512544838787061 +settled_accuracy_p99_ci_high = 0.6630438916125643 +settled_accuracy_mean = 0.16209024034905203 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0.043478260869565216 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09523809523809523 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.15384615384615385 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.09059791860539528 +reaction_rate = 0.6 +reaction_rate_ci_low = 0.5696358105657339 +reaction_rate_ci_high = 0.6303641894342661 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 169 +fire_decisiveness_mean = 12.047476696895426 +fire_decisiveness_p50 = 9.013980830230793 +step_correction_mean = 0.739067570567131 +step_correction_p50 = 0.7506456971168518 + +[cell.spm_6.step_minus_10_at_15min] +shares_per_minute = 6 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.983 +convergence_rate_ci_low = 0.9749876983581495 +convergence_rate_ci_high = 0.9910123016418505 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 731.2309257375382 +settled_accuracy_p10 = 0.026492268126756757 +settled_accuracy_p10_ci_low = 0.02190015766854858 +settled_accuracy_p10_ci_high = 0.03289035269063678 +settled_accuracy_p50 = 0.12242796888683927 +settled_accuracy_p50_ci_low = 0.11493861962285568 +settled_accuracy_p50_ci_high = 0.1316049569589841 +settled_accuracy_p90 = 0.3072609181461996 +settled_accuracy_p90_ci_low = 0.2965235744119865 +settled_accuracy_p90_ci_high = 0.3244712846761755 +settled_accuracy_p95 = 0.36928434734206017 +settled_accuracy_p95_ci_low = 0.3390283904050728 +settled_accuracy_p95_ci_high = 0.3869584361248508 +settled_accuracy_p99 = 0.5246489740359532 +settled_accuracy_p99_ci_low = 0.44924306793393054 +settled_accuracy_p99_ci_high = 0.6174551647541262 +settled_accuracy_mean = 0.1520786754499742 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0.045454545454545456 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13636363636363635 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.15 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.1875 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08820486273937134 +reaction_rate = 0.53 +reaction_rate_ci_low = 0.49906551180316705 +reaction_rate_ci_high = 0.560934488196833 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 169.0188679245283 +fire_decisiveness_mean = 12.337837604248701 +fire_decisiveness_p50 = 9.131202186919964 +step_correction_mean = 1.049783626929769 +step_correction_p50 = 1.1574395895004272 + +[cell.spm_6.step_minus_5_at_15min] +shares_per_minute = 6 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.993 +convergence_rate_ci_low = 0.9878325091582084 +convergence_rate_ci_high = 0.9981674908417916 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 735.4078549848942 +settled_accuracy_p10 = 0.020466437691220474 +settled_accuracy_p10_ci_low = 0.0162127246460414 +settled_accuracy_p10_ci_high = 0.024203906965073685 +settled_accuracy_p50 = 0.12862459392955805 +settled_accuracy_p50_ci_low = 0.1180373581627655 +settled_accuracy_p50_ci_high = 0.13752139271662545 +settled_accuracy_p90 = 0.3043959909022984 +settled_accuracy_p90_ci_low = 0.2913828049993702 +settled_accuracy_p90_ci_high = 0.31788783961235656 +settled_accuracy_p95 = 0.357763785697236 +settled_accuracy_p95_ci_low = 0.34070103897944226 +settled_accuracy_p95_ci_high = 0.3850379585398609 +settled_accuracy_p99 = 0.5438904336878589 +settled_accuracy_p99_ci_low = 0.480919148440782 +settled_accuracy_p99_ci_high = 0.6193719415576449 +settled_accuracy_mean = 0.15031879741197138 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0.047619047619047616 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.15384615384615385 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08873210678883948 +reaction_rate = 0.528 +reaction_rate_ci_low = 0.4970583099104138 +reaction_rate_ci_high = 0.5589416900895863 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 178.1818181818182 +fire_decisiveness_mean = 12.725482023043554 +fire_decisiveness_p50 = 9.272213574903667 +step_correction_mean = 0.938069073201129 +step_correction_p50 = 1.1489715576171875 + +[cell.spm_6.step_plus_5_at_15min] +shares_per_minute = 6 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.988 +convergence_rate_ci_low = 0.9812512216216562 +convergence_rate_ci_high = 0.9947487783783437 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 746.1133603238867 +settled_accuracy_p10 = 0.027150139413882668 +settled_accuracy_p10_ci_low = 0.023079315397497302 +settled_accuracy_p10_ci_high = 0.031783655321688586 +settled_accuracy_p50 = 0.12574463681894255 +settled_accuracy_p50_ci_low = 0.11957471128166564 +settled_accuracy_p50_ci_high = 0.13284737564055416 +settled_accuracy_p90 = 0.29791288859710385 +settled_accuracy_p90_ci_low = 0.2845055591069996 +settled_accuracy_p90_ci_high = 0.31231112847846043 +settled_accuracy_p95 = 0.35163935463509466 +settled_accuracy_p95_ci_low = 0.3306065401875393 +settled_accuracy_p95_ci_high = 0.3832904539614621 +settled_accuracy_p99 = 0.48494607450822946 +settled_accuracy_p99_ci_low = 0.45034001188018724 +settled_accuracy_p99_ci_high = 0.5008657044149583 +settled_accuracy_mean = 0.14803364602231683 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0.047619047619047616 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.08695652173913043 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.15789473684210525 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.09062242126661746 +reaction_rate = 0.548 +reaction_rate_ci_low = 0.5171528128737806 +reaction_rate_ci_high = 0.5788471871262195 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 173.1021897810219 +fire_decisiveness_mean = 13.794199523857275 +fire_decisiveness_p50 = 9.948023733819937 +step_correction_mean = 1.3203031214049263 +step_correction_p50 = 1.3021650314331055 + +[cell.spm_6.step_plus_10_at_15min] +shares_per_minute = 6 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.985 +convergence_rate_ci_low = 0.9774661006112372 +convergence_rate_ci_high = 0.9925338993887628 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 737.8477157360406 +settled_accuracy_p10 = 0.028414015576699758 +settled_accuracy_p10_ci_low = 0.022994547648728103 +settled_accuracy_p10_ci_high = 0.03394006458435184 +settled_accuracy_p50 = 0.12714152777724397 +settled_accuracy_p50_ci_low = 0.11909096527378549 +settled_accuracy_p50_ci_high = 0.13558156573157776 +settled_accuracy_p90 = 0.3211724748474447 +settled_accuracy_p90_ci_low = 0.30440209142948405 +settled_accuracy_p90_ci_high = 0.34090516559509054 +settled_accuracy_p95 = 0.39225333084176417 +settled_accuracy_p95_ci_low = 0.3626738172992867 +settled_accuracy_p95_ci_high = 0.41874071190426476 +settled_accuracy_p99 = 0.5384973361135925 +settled_accuracy_p99_ci_low = 0.4952328607466032 +settled_accuracy_p99_ci_high = 0.5964488916879387 +settled_accuracy_mean = 0.15402186839988127 +jitter_p10_per_min = 0.047619047619047616 +jitter_p10_per_min_ci_low = 0.045454545454545456 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.15 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15384615384615385 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.15789473684210525 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.21052631578947367 +jitter_mean_per_min = 0.0902421731149293 +reaction_rate = 0.543 +reaction_rate_ci_low = 0.5121244938243922 +reaction_rate_ci_high = 0.5738755061756079 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 164.41988950276243 +fire_decisiveness_mean = 13.715488215898128 +fire_decisiveness_p50 = 9.65718088643009 +step_correction_mean = 1.1673620332231398 +step_correction_p50 = 1.3237459659576416 + +[cell.spm_6.step_plus_25_at_15min] +shares_per_minute = 6 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.991 +convergence_rate_ci_low = 0.985146519804424 +convergence_rate_ci_high = 0.996853480195576 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 752.452068617558 +settled_accuracy_p10 = 0.023669778871467262 +settled_accuracy_p10_ci_low = 0.019935734406101524 +settled_accuracy_p10_ci_high = 0.029032152768546537 +settled_accuracy_p50 = 0.1308386589136783 +settled_accuracy_p50_ci_low = 0.12167631280503666 +settled_accuracy_p50_ci_high = 0.14191258753948421 +settled_accuracy_p90 = 0.29596747679053426 +settled_accuracy_p90_ci_low = 0.28233331822936547 +settled_accuracy_p90_ci_high = 0.3104443079122101 +settled_accuracy_p95 = 0.3551325824155884 +settled_accuracy_p95_ci_low = 0.33474802393928815 +settled_accuracy_p95_ci_high = 0.3851960641779766 +settled_accuracy_p99 = 0.5023406497383398 +settled_accuracy_p99_ci_low = 0.4447288726806372 +settled_accuracy_p99_ci_high = 0.6003728461008033 +settled_accuracy_mean = 0.1505227972026017 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0.043478260869565216 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09523809523809523 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.15789473684210525 +jitter_p95_per_min_ci_high = 0.17647058823529413 +jitter_p99_per_min = 0.19047619047619047 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.21052631578947367 +jitter_mean_per_min = 0.09280660388869745 +reaction_rate = 0.642 +reaction_rate_ci_low = 0.612285727712091 +reaction_rate_ci_high = 0.671714272287909 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 166.3551401869159 +fire_decisiveness_mean = 15.370505531696361 +fire_decisiveness_p50 = 10.742240803858856 +step_correction_mean = 7.26533369845319 +step_correction_p50 = 0.8273769617080688 + +[cell.spm_6.step_plus_50_at_15min] +shares_per_minute = 6 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.996 +convergence_rate_ci_low = 0.9920878478557194 +convergence_rate_ci_high = 0.9999121521442806 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 767.1686746987951 +settled_accuracy_p10 = 0.017424682156764293 +settled_accuracy_p10_ci_low = 0.013556258836559643 +settled_accuracy_p10_ci_high = 0.02192428670660207 +settled_accuracy_p50 = 0.11583723541547675 +settled_accuracy_p50_ci_low = 0.10434443990987363 +settled_accuracy_p50_ci_high = 0.12583851406302027 +settled_accuracy_p90 = 0.2946866512686125 +settled_accuracy_p90_ci_low = 0.27758122834452914 +settled_accuracy_p90_ci_high = 0.3080355437173532 +settled_accuracy_p95 = 0.3666112466759861 +settled_accuracy_p95_ci_low = 0.3365959574873404 +settled_accuracy_p95_ci_high = 0.3848030278803325 +settled_accuracy_p99 = 0.49739264170103614 +settled_accuracy_p99_ci_low = 0.4503151476963183 +settled_accuracy_p99_ci_high = 0.5708896425164536 +settled_accuracy_mean = 0.13839506464417847 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0.045454545454545456 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.09523809523809523 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.15789473684210525 +jitter_p90_per_min_ci_low = 0.15789473684210525 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.17647058823529413 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.19047619047619047 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.09812280400610097 +reaction_rate = 0.789 +reaction_rate_ci_low = 0.7637107586827916 +reaction_rate_ci_high = 0.8142892413172085 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 136.80608365019012 +fire_decisiveness_mean = 17.495266111329297 +fire_decisiveness_p50 = 12.062651951195171 +step_correction_mean = 0.7601496999745737 +step_correction_p50 = 0.6146348714828491 + +[cell.spm_8.cold_start_10gh_to_1ph] +shares_per_minute = 8 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 120 +convergence_p10_secs_ci_low = 120 +convergence_p10_secs_ci_high = 120 +convergence_p50_secs = 180 +convergence_p50_secs_ci_low = 180 +convergence_p50_secs_ci_high = 240 +convergence_p90_secs = 480 +convergence_p90_secs_ci_low = 480 +convergence_p90_secs_ci_high = 540 +convergence_p95_secs = 540 +convergence_p95_secs_ci_low = 540 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 840 +convergence_p99_secs_ci_low = 780 +convergence_p99_secs_ci_high = 900 +convergence_mean_secs = 276.78 +settled_accuracy_p10 = 0.022809967626012506 +settled_accuracy_p10_ci_low = 0.02071362090510931 +settled_accuracy_p10_ci_high = 0.0282067283213705 +settled_accuracy_p50 = 0.11495701576541584 +settled_accuracy_p50_ci_low = 0.10846570948397916 +settled_accuracy_p50_ci_high = 0.12284559572237352 +settled_accuracy_p90 = 0.2529735099164421 +settled_accuracy_p90_ci_low = 0.24023987124224755 +settled_accuracy_p90_ci_high = 0.2679065745279847 +settled_accuracy_p95 = 0.3100336275810993 +settled_accuracy_p95_ci_low = 0.2816157076619734 +settled_accuracy_p95_ci_high = 0.3268983537591468 +settled_accuracy_p99 = 0.4205929323225217 +settled_accuracy_p99_ci_low = 0.3788530974197246 +settled_accuracy_p99_ci_high = 0.4654886287048372 +settled_accuracy_mean = 0.12944433698823865 +jitter_p10_per_min = 0.045454545454545456 +jitter_p10_per_min_ci_low = 0.043478260869565216 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.08695652173913043 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.13636363636363635 +jitter_p90_per_min_ci_low = 0.13043478260869565 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15384615384615385 +jitter_p95_per_min_ci_low = 0.15384615384615385 +jitter_p95_per_min_ci_high = 0.15789473684210525 +jitter_p99_per_min = 0.17391304347826086 +jitter_p99_per_min_ci_low = 0.16 +jitter_p99_per_min_ci_high = 0.19047619047619047 +jitter_mean_per_min = 0.09341031508488386 +bias_mean = -0.0025782156919464893 +bias_p10 = -0.10697608164823354 +bias_p10_ci_low = -0.11109097295735619 +bias_p10_ci_high = -0.10222151393720968 +bias_p50 = -0.005609887854058012 +bias_p50_ci_low = -0.012181113729467478 +bias_p50_ci_high = 0.0009744383781837548 +bias_p90 = 0.09546344461983444 +bias_p90_ci_low = 0.08754290494899235 +bias_p90_ci_high = 0.10827226994700545 +bias_p99 = 0.20278410379884956 +bias_p99_ci_low = 0.17271387355938947 +bias_p99_ci_high = 0.23137642552959817 +variance_mean = 0.051737114583648505 +variance_p10 = 0.02804190790733486 +variance_p10_ci_low = 0.02702817746361384 +variance_p10_ci_high = 0.029371287350073796 +variance_p50 = 0.04825645037686275 +variance_p50_ci_low = 0.0467836477942016 +variance_p50_ci_high = 0.04985588311606302 +variance_p90 = 0.08130892078095678 +variance_p90_ci_low = 0.07856422042629323 +variance_p90_ci_high = 0.08346662344410317 +variance_p99 = 0.11548565293741489 +variance_p99_ci_low = 0.10599831184757676 +variance_p99_ci_high = 0.12613918514858471 +ramp_target_overshoot_p10 = 0.0015078019759668937 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0.011470918272743935 +ramp_target_overshoot_p50 = 0.13937189189486654 +ramp_target_overshoot_p50_ci_low = 0.12926731011093695 +ramp_target_overshoot_p50_ci_high = 0.14860634013685248 +ramp_target_overshoot_p90 = 0.3362097087602771 +ramp_target_overshoot_p90_ci_low = 0.32055589493999825 +ramp_target_overshoot_p90_ci_high = 0.351355642691197 +ramp_target_overshoot_p99 = 0.5166304155763433 +ramp_target_overshoot_p99_ci_low = 0.4654886287048372 +ramp_target_overshoot_p99_ci_high = 0.5564129533262543 +ramp_target_overshoot_mean = 0.1591310386485993 + +[cell.spm_8.stable_1ph] +shares_per_minute = 8 +scenario = "stable_1ph" +convergence_rate = 0.985 +convergence_rate_ci_low = 0.9774661006112372 +convergence_rate_ci_high = 0.9925338993887628 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 749.4822335025381 +settled_accuracy_p10 = 0.018956375278409432 +settled_accuracy_p10_ci_low = 0.016390333612260166 +settled_accuracy_p10_ci_high = 0.02321899615741352 +settled_accuracy_p50 = 0.112485262054413 +settled_accuracy_p50_ci_low = 0.10229692840712212 +settled_accuracy_p50_ci_high = 0.12220289412348473 +settled_accuracy_p90 = 0.2548896022262963 +settled_accuracy_p90_ci_low = 0.24376147603532372 +settled_accuracy_p90_ci_high = 0.2717513085054245 +settled_accuracy_p95 = 0.31465031483117323 +settled_accuracy_p95_ci_low = 0.28957924822099423 +settled_accuracy_p95_ci_high = 0.3443987351052713 +settled_accuracy_p99 = 0.4461453037115699 +settled_accuracy_p99_ci_low = 0.4093891073319724 +settled_accuracy_p99_ci_high = 0.47211750815926345 +settled_accuracy_mean = 0.12928886178734647 +jitter_p10_per_min = 0.047619047619047616 +jitter_p10_per_min_ci_low = 0.045454545454545456 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13333333333333333 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15384615384615385 +jitter_p95_per_min_ci_low = 0.15 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08670802834910175 +bias_mean = 0.0024967073247372804 +bias_p10 = -0.1035953048080934 +bias_p10_ci_low = -0.1099748077206517 +bias_p10_ci_high = -0.09417504624745612 +bias_p50 = -0.0028092371283581306 +bias_p50_ci_low = -0.007569381939257517 +bias_p50_ci_high = 0.003508889429205508 +bias_p90 = 0.11406545330330478 +bias_p90_ci_low = 0.10183503575042878 +bias_p90_ci_high = 0.12391470351662005 +bias_p99 = 0.21799777529874495 +bias_p99_ci_low = 0.17880157123327503 +bias_p99_ci_high = 0.23519499411382855 +variance_mean = 0.05255791277790649 +variance_p10 = 0.02725801357445746 +variance_p10_ci_low = 0.025778151532320978 +variance_p10_ci_high = 0.028738042519896378 +variance_p50 = 0.048596855145462366 +variance_p50_ci_low = 0.04716669798163862 +variance_p50_ci_high = 0.049917822813893946 +variance_p90 = 0.08263967542490212 +variance_p90_ci_low = 0.07783332002412548 +variance_p90_ci_high = 0.08602773135788103 +variance_p99 = 0.13198491555575625 +variance_p99_ci_low = 0.11527594943235552 +variance_p99_ci_high = 0.14275702302216114 +upward_step_magnitude_p50 = 1.2741615923169272 +upward_step_magnitude_p50_ci_low = 1.2675241517884284 +upward_step_magnitude_p50_ci_high = 1.2827306543429737 +upward_step_magnitude_p90 = 1.4020733869781774 +upward_step_magnitude_p90_ci_low = 1.3907299877698316 +upward_step_magnitude_p90_ci_high = 1.4143197924940407 +upward_step_magnitude_p95 = 1.4449032956054189 +upward_step_magnitude_p95_ci_low = 1.4265710421681912 +upward_step_magnitude_p95_ci_high = 1.4520738177295245 +upward_step_magnitude_p99 = 1.5258906993649433 +upward_step_magnitude_p99_ci_low = 1.5001759933384007 +upward_step_magnitude_p99_ci_high = 1.55722840378446 +upward_step_magnitude_mean = 1.2791274454424035 +fire_decisiveness_mean = 11.421915440111151 +fire_decisiveness_p50 = 8.287837631266722 + +[cell.spm_8.step_minus_50_at_15min] +shares_per_minute = 8 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.989 +convergence_rate_ci_low = 0.9825352674919994 +convergence_rate_ci_high = 0.9954647325080006 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 797.0475227502528 +settled_accuracy_p10 = 0.027382564351865035 +settled_accuracy_p10_ci_low = 0.021213581948413385 +settled_accuracy_p10_ci_high = 0.03213924069406404 +settled_accuracy_p50 = 0.12887150202591602 +settled_accuracy_p50_ci_low = 0.11879899827939577 +settled_accuracy_p50_ci_high = 0.13926465192879944 +settled_accuracy_p90 = 0.31352315433676603 +settled_accuracy_p90_ci_low = 0.30345924052494966 +settled_accuracy_p90_ci_high = 0.3327687688227783 +settled_accuracy_p95 = 0.37454001067433595 +settled_accuracy_p95_ci_low = 0.352631919083352 +settled_accuracy_p95_ci_high = 0.3988876437211839 +settled_accuracy_p99 = 0.4951787984842255 +settled_accuracy_p99_ci_low = 0.4502453869198515 +settled_accuracy_p99_ci_high = 0.5240600380064346 +settled_accuracy_mean = 0.1544162419961774 +jitter_p10_per_min = 0.07692307692307693 +jitter_p10_per_min_ci_low = 0.06666666666666667 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.11764705882352941 +jitter_p50_per_min_ci_low = 0.1111111111111111 +jitter_p50_per_min_ci_high = 0.11764705882352941 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.17647058823529413 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.18181818181818182 +jitter_p95_per_min_ci_high = 0.19047619047619047 +jitter_p99_per_min = 0.21739130434782608 +jitter_p99_per_min_ci_low = 0.21052631578947367 +jitter_p99_per_min_ci_high = 0.22727272727272727 +jitter_mean_per_min = 0.1188992688848683 +reaction_rate = 0.922 +reaction_rate_ci_low = 0.9053785528427878 +reaction_rate_ci_high = 0.9386214471572123 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 145.31453362255965 +fire_decisiveness_mean = 10.800088366949794 +fire_decisiveness_p50 = 8.53931055422781 +step_correction_mean = 0.5457023697988072 +step_correction_p50 = 0.5325771570205688 + +[cell.spm_8.step_minus_25_at_15min] +shares_per_minute = 8 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.993 +convergence_rate_ci_low = 0.9878325091582084 +convergence_rate_ci_high = 0.9981674908417916 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 746.1027190332326 +settled_accuracy_p10 = 0.027179537058006575 +settled_accuracy_p10_ci_low = 0.02271429224621513 +settled_accuracy_p10_ci_high = 0.032228628981132657 +settled_accuracy_p50 = 0.11657990683679142 +settled_accuracy_p50_ci_low = 0.11059415413796381 +settled_accuracy_p50_ci_high = 0.12160126042972397 +settled_accuracy_p90 = 0.27579156917612946 +settled_accuracy_p90_ci_low = 0.2583027309459818 +settled_accuracy_p90_ci_high = 0.29184400929466703 +settled_accuracy_p95 = 0.32795555711049285 +settled_accuracy_p95_ci_low = 0.3038496059949154 +settled_accuracy_p95_ci_high = 0.33828835354309295 +settled_accuracy_p99 = 0.4371812273065786 +settled_accuracy_p99_ci_low = 0.3965816176654151 +settled_accuracy_p99_ci_high = 0.5180933996106434 +settled_accuracy_mean = 0.13659152042825126 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.09523809523809523 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09523809523809523 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.15384615384615385 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.19047619047619047 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.09323157594288013 +reaction_rate = 0.621 +reaction_rate_ci_low = 0.5909308275072293 +reaction_rate_ci_high = 0.6510691724927707 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 162.70531400966183 +fire_decisiveness_mean = 10.5616609797367 +fire_decisiveness_p50 = 8.135165860727312 +step_correction_mean = 1.4570183304772861 +step_correction_p50 = 0.7207162380218506 + +[cell.spm_8.step_minus_10_at_15min] +shares_per_minute = 8 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.99 +convergence_rate_ci_low = 0.9838330039727595 +convergence_rate_ci_high = 0.9961669960272405 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 748.969696969697 +settled_accuracy_p10 = 0.02729160926683938 +settled_accuracy_p10_ci_low = 0.02283408936440079 +settled_accuracy_p10_ci_high = 0.030305990323647447 +settled_accuracy_p50 = 0.11479754187686342 +settled_accuracy_p50_ci_low = 0.10862494309727544 +settled_accuracy_p50_ci_high = 0.12084419968764548 +settled_accuracy_p90 = 0.2773024026091926 +settled_accuracy_p90_ci_low = 0.25882449876202784 +settled_accuracy_p90_ci_high = 0.28927522053650556 +settled_accuracy_p95 = 0.32529389022257393 +settled_accuracy_p95_ci_low = 0.3054290698450419 +settled_accuracy_p95_ci_high = 0.34544489262395284 +settled_accuracy_p99 = 0.421749759246949 +settled_accuracy_p99_ci_low = 0.3861960794255779 +settled_accuracy_p99_ci_high = 0.4490659005319868 +settled_accuracy_mean = 0.1349368961926532 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0.045454545454545456 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.08695652173913043 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15 +jitter_p95_per_min = 0.16 +jitter_p95_per_min_ci_low = 0.15384615384615385 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.17647058823529413 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08956294728953258 +reaction_rate = 0.56 +reaction_rate_ci_low = 0.5292336183472934 +reaction_rate_ci_high = 0.5907663816527067 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 170.14285714285714 +fire_decisiveness_mean = 10.924728035200863 +fire_decisiveness_p50 = 8.076502596285586 +step_correction_mean = 1.1877871524010386 +step_correction_p50 = 1.1597524881362915 + +[cell.spm_8.step_minus_5_at_15min] +shares_per_minute = 8 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.98 +convergence_rate_ci_low = 0.971322710100498 +convergence_rate_ci_high = 0.988677289899502 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 735.4285714285714 +settled_accuracy_p10 = 0.022308187500472476 +settled_accuracy_p10_ci_low = 0.018957547850563028 +settled_accuracy_p10_ci_high = 0.026367779324578233 +settled_accuracy_p50 = 0.10944375016203256 +settled_accuracy_p50_ci_low = 0.10260895954204341 +settled_accuracy_p50_ci_high = 0.11580157335673524 +settled_accuracy_p90 = 0.26875002251679014 +settled_accuracy_p90_ci_low = 0.25850581900965264 +settled_accuracy_p90_ci_high = 0.2864053051888644 +settled_accuracy_p95 = 0.3194991587727216 +settled_accuracy_p95_ci_low = 0.2947503984677138 +settled_accuracy_p95_ci_high = 0.3401626139623313 +settled_accuracy_p99 = 0.4640226904254652 +settled_accuracy_p99_ci_low = 0.39582532000508897 +settled_accuracy_p99_ci_high = 0.532989693561851 +settled_accuracy_mean = 0.13425825454929233 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0.047619047619047616 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.08695652173913043 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13636363636363635 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15384615384615385 +jitter_p95_per_min_ci_low = 0.15 +jitter_p95_per_min_ci_high = 0.15789473684210525 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.17647058823529413 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08908792773556408 +reaction_rate = 0.485 +reaction_rate_ci_low = 0.454023627714014 +reaction_rate_ci_high = 0.5159763722859859 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 175.91752577319588 +fire_decisiveness_mean = 11.27478550278593 +fire_decisiveness_p50 = 8.581176889221112 +step_correction_mean = 0.873895023225509 +step_correction_p50 = 1.2057539224624634 + +[cell.spm_8.step_plus_5_at_15min] +shares_per_minute = 8 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.983 +convergence_rate_ci_low = 0.9749876983581495 +convergence_rate_ci_high = 0.9910123016418505 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 746.6734486266531 +settled_accuracy_p10 = 0.024118608087909776 +settled_accuracy_p10_ci_low = 0.02067899092291825 +settled_accuracy_p10_ci_high = 0.02775699533267395 +settled_accuracy_p50 = 0.10773338323676684 +settled_accuracy_p50_ci_low = 0.10149532621877055 +settled_accuracy_p50_ci_high = 0.11329280980234335 +settled_accuracy_p90 = 0.2684031374227305 +settled_accuracy_p90_ci_low = 0.2478060832336606 +settled_accuracy_p90_ci_high = 0.28060122899987716 +settled_accuracy_p95 = 0.3155877030474712 +settled_accuracy_p95_ci_low = 0.293596573945218 +settled_accuracy_p95_ci_high = 0.3444183124637532 +settled_accuracy_p99 = 0.448010247588267 +settled_accuracy_p99_ci_low = 0.41676282408950205 +settled_accuracy_p99_ci_high = 0.4777794863908964 +settled_accuracy_mean = 0.1281698804145513 +jitter_p10_per_min = 0.047619047619047616 +jitter_p10_per_min_ci_low = 0.043478260869565216 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15 +jitter_p95_per_min = 0.16 +jitter_p95_per_min_ci_low = 0.15384615384615385 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08958990453065077 +reaction_rate = 0.527 +reaction_rate_ci_low = 0.4960548958056367 +reaction_rate_ci_high = 0.5579451041943633 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 182.04933586337762 +fire_decisiveness_mean = 11.42967361031265 +fire_decisiveness_p50 = 8.355972846398565 +step_correction_mean = 1.5739893256147628 +step_correction_p50 = 1.2126113176345825 + +[cell.spm_8.step_plus_10_at_15min] +shares_per_minute = 8 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.988 +convergence_rate_ci_low = 0.9812512216216562 +convergence_rate_ci_high = 0.9947487783783437 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 744.4129554655871 +settled_accuracy_p10 = 0.02230338734437831 +settled_accuracy_p10_ci_low = 0.01828838595064919 +settled_accuracy_p10_ci_high = 0.026174592742225 +settled_accuracy_p50 = 0.11181313085002464 +settled_accuracy_p50_ci_low = 0.10431615547708706 +settled_accuracy_p50_ci_high = 0.12090156245910544 +settled_accuracy_p90 = 0.2666739754321765 +settled_accuracy_p90_ci_low = 0.2555684343568838 +settled_accuracy_p90_ci_high = 0.27819278510149026 +settled_accuracy_p95 = 0.30973980855792993 +settled_accuracy_p95_ci_low = 0.293819755471157 +settled_accuracy_p95_ci_high = 0.33126784447605884 +settled_accuracy_p99 = 0.4213894378089029 +settled_accuracy_p99_ci_low = 0.37942052959022043 +settled_accuracy_p99_ci_high = 0.4943811882381097 +settled_accuracy_mean = 0.1307694917851734 +jitter_p10_per_min = 0.047619047619047616 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.08695652173913043 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13636363636363635 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.15 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08901651371395901 +reaction_rate = 0.566 +reaction_rate_ci_low = 0.5352808530326768 +reaction_rate_ci_high = 0.5967191469673231 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 167.59717314487634 +fire_decisiveness_mean = 12.152289555375663 +fire_decisiveness_p50 = 8.675767238390982 +step_correction_mean = 1.1644031827209695 +step_correction_p50 = 1.2915681600570679 + +[cell.spm_8.step_plus_25_at_15min] +shares_per_minute = 8 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.99 +convergence_rate_ci_low = 0.9838330039727595 +convergence_rate_ci_high = 0.9961669960272405 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 759.8181818181819 +settled_accuracy_p10 = 0.021544629111330593 +settled_accuracy_p10_ci_low = 0.016199757205505372 +settled_accuracy_p10_ci_high = 0.02386154915600669 +settled_accuracy_p50 = 0.10905050516330217 +settled_accuracy_p50_ci_low = 0.10216331054352157 +settled_accuracy_p50_ci_high = 0.11786581792388584 +settled_accuracy_p90 = 0.24698799320450293 +settled_accuracy_p90_ci_low = 0.2354941241627766 +settled_accuracy_p90_ci_high = 0.25774430900742673 +settled_accuracy_p95 = 0.29141846230296564 +settled_accuracy_p95_ci_low = 0.27784561439827615 +settled_accuracy_p95_ci_high = 0.3122785810201534 +settled_accuracy_p99 = 0.3878673190149149 +settled_accuracy_p99_ci_low = 0.36067588180508015 +settled_accuracy_p99_ci_high = 0.4101173964853855 +settled_accuracy_mean = 0.1267460902376899 +jitter_p10_per_min = 0.047619047619047616 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09523809523809523 +jitter_p90_per_min = 0.15789473684210525 +jitter_p90_per_min_ci_low = 0.15 +jitter_p90_per_min_ci_high = 0.15789473684210525 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.1875 +jitter_p99_per_min_ci_high = 0.21052631578947367 +jitter_mean_per_min = 0.09316345275011727 +reaction_rate = 0.636 +reaction_rate_ci_low = 0.6061780992155095 +reaction_rate_ci_high = 0.6658219007844906 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 151.41509433962264 +fire_decisiveness_mean = 13.156510480244483 +fire_decisiveness_p50 = 9.443133420462537 +step_correction_mean = 0.562702578685756 +step_correction_p50 = 0.7665297389030457 + +[cell.spm_8.step_plus_50_at_15min] +shares_per_minute = 8 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.993 +convergence_rate_ci_low = 0.9878325091582084 +convergence_rate_ci_high = 0.9981674908417916 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 786.7673716012084 +settled_accuracy_p10 = 0.01733404045197018 +settled_accuracy_p10_ci_low = 0.013525925630315516 +settled_accuracy_p10_ci_high = 0.021149492509353385 +settled_accuracy_p50 = 0.10928615765160488 +settled_accuracy_p50_ci_low = 0.09778325107725383 +settled_accuracy_p50_ci_high = 0.11640247100203649 +settled_accuracy_p90 = 0.2700066061965103 +settled_accuracy_p90_ci_low = 0.25163058879258715 +settled_accuracy_p90_ci_high = 0.2837426273084218 +settled_accuracy_p95 = 0.3143992087954488 +settled_accuracy_p95_ci_low = 0.29865045865328965 +settled_accuracy_p95_ci_high = 0.3257228452261126 +settled_accuracy_p99 = 0.4064047446503274 +settled_accuracy_p99_ci_low = 0.38823774898618635 +settled_accuracy_p99_ci_high = 0.4706859089551052 +settled_accuracy_mean = 0.12958943540060547 +jitter_p10_per_min = 0.05555555555555555 +jitter_p10_per_min_ci_low = 0.05 +jitter_p10_per_min_ci_high = 0.058823529411764705 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.09523809523809523 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.15789473684210525 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.17391304347826086 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.1875 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.10249734506182293 +reaction_rate = 0.839 +reaction_rate_ci_low = 0.816220195646143 +reaction_rate_ci_high = 0.8617798043538569 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 138.45053635280095 +fire_decisiveness_mean = 15.53086004050158 +fire_decisiveness_p50 = 10.891267312415366 +step_correction_mean = 0.718861882766893 +step_correction_p50 = 0.6117940545082092 + +[cell.spm_10.cold_start_10gh_to_1ph] +shares_per_minute = 10 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 120 +convergence_p10_secs_ci_low = 120 +convergence_p10_secs_ci_high = 120 +convergence_p50_secs = 240 +convergence_p50_secs_ci_low = 240 +convergence_p50_secs_ci_high = 240 +convergence_p90_secs = 480 +convergence_p90_secs_ci_low = 480 +convergence_p90_secs_ci_high = 540 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 540 +convergence_p95_secs_ci_high = 660 +convergence_p99_secs = 900 +convergence_p99_secs_ci_low = 780 +convergence_p99_secs_ci_high = 960 +convergence_mean_secs = 284.7 +settled_accuracy_p10 = 0.019293597324396394 +settled_accuracy_p10_ci_low = 0.01637073782371723 +settled_accuracy_p10_ci_high = 0.02287801601499373 +settled_accuracy_p50 = 0.10264965260089465 +settled_accuracy_p50_ci_low = 0.09448626184228193 +settled_accuracy_p50_ci_high = 0.10889285740889587 +settled_accuracy_p90 = 0.24628268897973793 +settled_accuracy_p90_ci_low = 0.23116608162276742 +settled_accuracy_p90_ci_high = 0.26012409368639133 +settled_accuracy_p95 = 0.2897436649399332 +settled_accuracy_p95_ci_low = 0.2698989025083347 +settled_accuracy_p95_ci_high = 0.31293715972869496 +settled_accuracy_p99 = 0.38071254984762604 +settled_accuracy_p99_ci_low = 0.3440402395491198 +settled_accuracy_p99_ci_high = 0.42786645953291824 +settled_accuracy_mean = 0.12114116296038942 +jitter_p10_per_min = 0.045454545454545456 +jitter_p10_per_min_ci_low = 0.043478260869565216 +jitter_p10_per_min_ci_high = 0.047619047619047616 +jitter_p50_per_min = 0.08695652173913043 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.08695652173913043 +jitter_p90_per_min = 0.13043478260869565 +jitter_p90_per_min_ci_low = 0.125 +jitter_p90_per_min_ci_high = 0.13636363636363635 +jitter_p95_per_min = 0.14814814814814814 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.15384615384615385 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.16 +jitter_p99_per_min_ci_high = 0.19230769230769232 +jitter_mean_per_min = 0.09129010932543057 +bias_mean = 0.001245434877965478 +bias_p10 = -0.08751436778721645 +bias_p10_ci_low = -0.09498712532321615 +bias_p10_ci_high = -0.08129018304433848 +bias_p50 = -0.003121794900481417 +bias_p50_ci_low = -0.006612360077531087 +bias_p50_ci_high = 0.0033193528025310197 +bias_p90 = 0.09117555195513746 +bias_p90_ci_low = 0.08380091994174144 +bias_p90_ci_high = 0.09876268948722221 +bias_p99 = 0.17225951298976672 +bias_p99_ci_low = 0.1589525350265978 +bias_p99_ci_high = 0.21069194400002586 +variance_mean = 0.04231408809218292 +variance_p10 = 0.02380887084512124 +variance_p10_ci_low = 0.022795149962043813 +variance_p10_ci_high = 0.024416358987613494 +variance_p50 = 0.03945701026487702 +variance_p50_ci_low = 0.038582238313783476 +variance_p50_ci_high = 0.040253718590255554 +variance_p90 = 0.06430643023817091 +variance_p90_ci_low = 0.06173203347738326 +variance_p90_ci_high = 0.06755547173224645 +variance_p99 = 0.10229356338289466 +variance_p99_ci_low = 0.09695363046630479 +variance_p99_ci_high = 0.10832007044528015 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0.007670610363850194 +ramp_target_overshoot_p50 = 0.1373155420574277 +ramp_target_overshoot_p50_ci_low = 0.12822135134302615 +ramp_target_overshoot_p50_ci_high = 0.14606277994043548 +ramp_target_overshoot_p90 = 0.2965977617448734 +ramp_target_overshoot_p90_ci_low = 0.28389754328538563 +ramp_target_overshoot_p90_ci_high = 0.31293715972869496 +ramp_target_overshoot_p99 = 0.4601745461310027 +ramp_target_overshoot_p99_ci_low = 0.4136573653556257 +ramp_target_overshoot_p99_ci_high = 0.5064525509119726 +ramp_target_overshoot_mean = 0.14727584743229064 + +[cell.spm_10.stable_1ph] +shares_per_minute = 10 +scenario = "stable_1ph" +convergence_rate = 0.972 +convergence_rate_ci_low = 0.9617748845678887 +convergence_rate_ci_high = 0.9822251154321112 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 752.4691358024692 +settled_accuracy_p10 = 0.014081318898574446 +settled_accuracy_p10_ci_low = 0.010636956408967002 +settled_accuracy_p10_ci_high = 0.01858331709858041 +settled_accuracy_p50 = 0.09683567609262123 +settled_accuracy_p50_ci_low = 0.08956020272514331 +settled_accuracy_p50_ci_high = 0.10795360173613311 +settled_accuracy_p90 = 0.22257097953642668 +settled_accuracy_p90_ci_low = 0.2122617828234994 +settled_accuracy_p90_ci_high = 0.23459024434404818 +settled_accuracy_p95 = 0.26038501295301764 +settled_accuracy_p95_ci_low = 0.24539020818579171 +settled_accuracy_p95_ci_high = 0.2768801035033446 +settled_accuracy_p99 = 0.3618961636613416 +settled_accuracy_p99_ci_low = 0.3235653248763637 +settled_accuracy_p99_ci_high = 0.40204417628935096 +settled_accuracy_mean = 0.10979095655700923 +jitter_p10_per_min = 0.047619047619047616 +jitter_p10_per_min_ci_low = 0.045454545454545456 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.08695652173913043 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13333333333333333 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15384615384615385 +jitter_p95_per_min_ci_low = 0.15 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.17647058823529413 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08656967337548863 +bias_mean = 0.0014831370945914137 +bias_p10 = -0.08623977794679712 +bias_p10_ci_low = -0.0923146931479472 +bias_p10_ci_high = -0.0787020095809631 +bias_p50 = -0.0012248392132525436 +bias_p50_ci_low = -0.007329231100286666 +bias_p50_ci_high = 0.0031770820090002263 +bias_p90 = 0.08960339610980295 +bias_p90_ci_low = 0.0831666881880087 +bias_p90_ci_high = 0.09585289855496563 +bias_p99 = 0.1714106988745798 +bias_p99_ci_low = 0.1470955323901484 +bias_p99_ci_high = 0.18433712012528136 +variance_mean = 0.04178818445156922 +variance_p10 = 0.02332693631877659 +variance_p10_ci_low = 0.022214912106161385 +variance_p10_ci_high = 0.024197868701711263 +variance_p50 = 0.039164467501232966 +variance_p50_ci_low = 0.038016815102421664 +variance_p50_ci_high = 0.04014821781589972 +variance_p90 = 0.06318056805753262 +variance_p90_ci_low = 0.06080470041654953 +variance_p90_ci_high = 0.06571085168365094 +variance_p99 = 0.09025417284810176 +variance_p99_ci_low = 0.08582706804610662 +variance_p99_ci_high = 0.10024376228286717 +upward_step_magnitude_p50 = 1.2423758503540907 +upward_step_magnitude_p50_ci_low = 1.2364981981955079 +upward_step_magnitude_p50_ci_high = 1.246023715870193 +upward_step_magnitude_p90 = 1.352849356276339 +upward_step_magnitude_p90_ci_low = 1.3443568820478105 +upward_step_magnitude_p90_ci_high = 1.3656160080412527 +upward_step_magnitude_p95 = 1.3938547472911675 +upward_step_magnitude_p95_ci_low = 1.376355011158808 +upward_step_magnitude_p95_ci_high = 1.406215797547587 +upward_step_magnitude_p99 = 1.478365024704297 +upward_step_magnitude_p99_ci_low = 1.4444802648687647 +upward_step_magnitude_p99_ci_high = 1.5000000335544323 +upward_step_magnitude_mean = 1.2484287335818178 +fire_decisiveness_mean = 10.454643557209813 +fire_decisiveness_p50 = 7.770208746710647 + +[cell.spm_10.step_minus_50_at_15min] +shares_per_minute = 10 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.978 +convergence_rate_ci_low = 0.9689084728675541 +convergence_rate_ci_high = 0.9870915271324459 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 818.8343558282209 +settled_accuracy_p10 = 0.018016515625862928 +settled_accuracy_p10_ci_low = 0.015738639425478373 +settled_accuracy_p10_ci_high = 0.023039614161608046 +settled_accuracy_p50 = 0.10798890099905634 +settled_accuracy_p50_ci_low = 0.09897960299871933 +settled_accuracy_p50_ci_high = 0.11906320588040087 +settled_accuracy_p90 = 0.29518605966340483 +settled_accuracy_p90_ci_low = 0.2837084305041735 +settled_accuracy_p90_ci_high = 0.31219735160233486 +settled_accuracy_p95 = 0.362903736158545 +settled_accuracy_p95_ci_low = 0.33882735714351386 +settled_accuracy_p95_ci_high = 0.37924756332744813 +settled_accuracy_p99 = 0.45619203765397875 +settled_accuracy_p99_ci_low = 0.4303361999779749 +settled_accuracy_p99_ci_high = 0.481227536565775 +settled_accuracy_mean = 0.13791321810428067 +jitter_p10_per_min = 0.08 +jitter_p10_per_min_ci_low = 0.07142857142857142 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.12 +jitter_p50_per_min_ci_low = 0.11764705882352941 +jitter_p50_per_min_ci_high = 0.125 +jitter_p90_per_min = 0.17647058823529413 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.18181818181818182 +jitter_p95_per_min = 0.1875 +jitter_p95_per_min_ci_low = 0.18181818181818182 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.21052631578947367 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.22727272727272727 +jitter_mean_per_min = 0.12304996574684823 +reaction_rate = 0.941 +reaction_rate_ci_low = 0.9263958296914887 +reaction_rate_ci_high = 0.9556041703085112 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 137.72582359192347 +fire_decisiveness_mean = 10.359274692647828 +fire_decisiveness_p50 = 8.111056730018078 +step_correction_mean = 0.5083627384413315 +step_correction_p50 = 0.5021840929985046 + +[cell.spm_10.step_minus_25_at_15min] +shares_per_minute = 10 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.988 +convergence_rate_ci_low = 0.9812512216216562 +convergence_rate_ci_high = 0.9947487783783437 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 759.2307692307693 +settled_accuracy_p10 = 0.0202666977813184 +settled_accuracy_p10_ci_low = 0.01770358659293758 +settled_accuracy_p10_ci_high = 0.0230426782843145 +settled_accuracy_p50 = 0.09764742273778926 +settled_accuracy_p50_ci_low = 0.0901688110036345 +settled_accuracy_p50_ci_high = 0.10503172414928552 +settled_accuracy_p90 = 0.2578276896717937 +settled_accuracy_p90_ci_low = 0.24735011705127952 +settled_accuracy_p90_ci_high = 0.27283931605867684 +settled_accuracy_p95 = 0.3220933741987537 +settled_accuracy_p95_ci_low = 0.2958349286601465 +settled_accuracy_p95_ci_high = 0.34071536795655577 +settled_accuracy_p99 = 0.4026782342065329 +settled_accuracy_p99_ci_low = 0.38501562875949435 +settled_accuracy_p99_ci_high = 0.45232062896932157 +settled_accuracy_mean = 0.12118715149808004 +jitter_p10_per_min = 0.041666666666666664 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09523809523809523 +jitter_p90_per_min = 0.15 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15384615384615385 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.17391304347826086 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.1875 +jitter_p99_per_min_ci_high = 0.21052631578947367 +jitter_mean_per_min = 0.09255483183796716 +reaction_rate = 0.652 +reaction_rate_ci_low = 0.6224763878632712 +reaction_rate_ci_high = 0.6815236121367289 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 165.46012269938652 +fire_decisiveness_mean = 9.672627164024716 +fire_decisiveness_p50 = 7.572150814164424 +step_correction_mean = -1.193310797260217 +step_correction_p50 = 0.6830509901046753 + +[cell.spm_10.step_minus_10_at_15min] +shares_per_minute = 10 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.983 +convergence_rate_ci_low = 0.9749876983581495 +convergence_rate_ci_high = 0.9910123016418505 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 735.1373346897253 +settled_accuracy_p10 = 0.02580388030910341 +settled_accuracy_p10_ci_low = 0.022613301200614888 +settled_accuracy_p10_ci_high = 0.02912591822635746 +settled_accuracy_p50 = 0.09585942035091222 +settled_accuracy_p50_ci_low = 0.0889160389813024 +settled_accuracy_p50_ci_high = 0.10447709332121402 +settled_accuracy_p90 = 0.2382935110574903 +settled_accuracy_p90_ci_low = 0.22440846332258224 +settled_accuracy_p90_ci_high = 0.2517293022281262 +settled_accuracy_p95 = 0.2779029523799227 +settled_accuracy_p95_ci_low = 0.2656153193132973 +settled_accuracy_p95_ci_high = 0.29760596582891186 +settled_accuracy_p99 = 0.3662280605277217 +settled_accuracy_p99_ci_low = 0.3488640146983326 +settled_accuracy_p99_ci_high = 0.44677480390230584 +settled_accuracy_mean = 0.11817793922844942 +jitter_p10_per_min = 0.045454545454545456 +jitter_p10_per_min_ci_low = 0.041666666666666664 +jitter_p10_per_min_ci_high = 0.047619047619047616 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.08 +jitter_p50_per_min_ci_high = 0.08695652173913043 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13333333333333333 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15384615384615385 +jitter_p95_per_min_ci_low = 0.15 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.19047619047619047 +jitter_mean_per_min = 0.08592947530639933 +reaction_rate = 0.521 +reaction_rate_ci_low = 0.490037024458234 +reaction_rate_ci_high = 0.551962975541766 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 173.66602687140116 +fire_decisiveness_mean = 9.192933276848008 +fire_decisiveness_p50 = 6.824206841157064 +step_correction_mean = 1.1387980260569852 +step_correction_p50 = 1.070557713508606 + +[cell.spm_10.step_minus_5_at_15min] +shares_per_minute = 10 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.983 +convergence_rate_ci_low = 0.9749876983581495 +convergence_rate_ci_high = 0.9910123016418505 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 751.5564598168871 +settled_accuracy_p10 = 0.0149480404317488 +settled_accuracy_p10_ci_low = 0.011064556396629732 +settled_accuracy_p10_ci_high = 0.018129424460955113 +settled_accuracy_p50 = 0.09644200808654757 +settled_accuracy_p50_ci_low = 0.09045264787915153 +settled_accuracy_p50_ci_high = 0.10460428268994648 +settled_accuracy_p90 = 0.23541952188395354 +settled_accuracy_p90_ci_low = 0.22000016529972966 +settled_accuracy_p90_ci_high = 0.25150262045988225 +settled_accuracy_p95 = 0.2770828242772747 +settled_accuracy_p95_ci_low = 0.2675520939625827 +settled_accuracy_p95_ci_high = 0.2919774601809553 +settled_accuracy_p99 = 0.3735722324145282 +settled_accuracy_p99_ci_low = 0.33751612290472877 +settled_accuracy_p99_ci_high = 0.4156240598136365 +settled_accuracy_mean = 0.1132863079620147 +jitter_p10_per_min = 0.047619047619047616 +jitter_p10_per_min_ci_low = 0.047619047619047616 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.07692307692307693 +jitter_p50_per_min_ci_high = 0.08333333333333333 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13636363636363635 +jitter_p90_per_min_ci_high = 0.15 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.15384615384615385 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08711724179038553 +reaction_rate = 0.499 +reaction_rate_ci_low = 0.468009740911054 +reaction_rate_ci_high = 0.529990259088946 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 173.86773547094188 +fire_decisiveness_mean = 9.588848305943122 +fire_decisiveness_p50 = 7.405975728331676 +step_correction_mean = 2.4371781475797207 +step_correction_p50 = 1.2040115594863892 + +[cell.spm_10.step_plus_5_at_15min] +shares_per_minute = 10 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.978 +convergence_rate_ci_low = 0.9689084728675541 +convergence_rate_ci_high = 0.9870915271324459 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 744.7852760736197 +settled_accuracy_p10 = 0.01857861113784809 +settled_accuracy_p10_ci_low = 0.015592522103424655 +settled_accuracy_p10_ci_high = 0.020718744938872713 +settled_accuracy_p50 = 0.09440620091066099 +settled_accuracy_p50_ci_low = 0.08986120479722315 +settled_accuracy_p50_ci_high = 0.10245990436794372 +settled_accuracy_p90 = 0.2538299670885322 +settled_accuracy_p90_ci_low = 0.2372464706806463 +settled_accuracy_p90_ci_high = 0.26854297952386963 +settled_accuracy_p95 = 0.2958760385417102 +settled_accuracy_p95_ci_low = 0.2788222687425166 +settled_accuracy_p95_ci_high = 0.31772189292006536 +settled_accuracy_p99 = 0.4190465708709925 +settled_accuracy_p99_ci_low = 0.37862466188314636 +settled_accuracy_p99_ci_high = 0.4448011653678863 +settled_accuracy_mean = 0.11849769720708234 +jitter_p10_per_min = 0.047619047619047616 +jitter_p10_per_min_ci_low = 0.045454545454545456 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13333333333333333 +jitter_p90_per_min_ci_high = 0.15 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.15384615384615385 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.1875 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08709175267605374 +reaction_rate = 0.529 +reaction_rate_ci_low = 0.4980618485620101 +reaction_rate_ci_high = 0.55993815143799 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 167.18336483931947 +fire_decisiveness_mean = 10.441314304449385 +fire_decisiveness_p50 = 7.569464207344829 +step_correction_mean = 1.3959091624600675 +step_correction_p50 = 1.3215560913085938 + +[cell.spm_10.step_plus_10_at_15min] +shares_per_minute = 10 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.988 +convergence_rate_ci_low = 0.9812512216216562 +convergence_rate_ci_high = 0.9947487783783437 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 772.0445344129555 +settled_accuracy_p10 = 0.01953008298255221 +settled_accuracy_p10_ci_low = 0.016334358817802874 +settled_accuracy_p10_ci_high = 0.023689490452757256 +settled_accuracy_p50 = 0.09748483903969163 +settled_accuracy_p50_ci_low = 0.09039789883362959 +settled_accuracy_p50_ci_high = 0.10447648465705273 +settled_accuracy_p90 = 0.25267323589248103 +settled_accuracy_p90_ci_low = 0.23599326641847362 +settled_accuracy_p90_ci_high = 0.2626442710961445 +settled_accuracy_p95 = 0.30094488672237074 +settled_accuracy_p95_ci_low = 0.2743968636488785 +settled_accuracy_p95_ci_high = 0.31853924498988095 +settled_accuracy_p99 = 0.38200836945162964 +settled_accuracy_p99_ci_low = 0.3629994783200845 +settled_accuracy_p99_ci_high = 0.4248529873541884 +settled_accuracy_mean = 0.11684643777296909 +jitter_p10_per_min = 0.047619047619047616 +jitter_p10_per_min_ci_low = 0.038461538461538464 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.08695652173913043 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15384615384615385 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.15789473684210525 +jitter_p95_per_min_ci_high = 0.17647058823529413 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.1875 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08989167842066799 +reaction_rate = 0.561 +reaction_rate_ci_low = 0.5302411735204349 +reaction_rate_ci_high = 0.5917588264795652 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 165.88235294117646 +fire_decisiveness_mean = 10.77978965210865 +fire_decisiveness_p50 = 7.70416035183348 +step_correction_mean = 1.0684454974962427 +step_correction_p50 = 1.2986226081848145 + +[cell.spm_10.step_plus_25_at_15min] +shares_per_minute = 10 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.992 +convergence_rate_ci_low = 0.9864785022321837 +convergence_rate_ci_high = 0.9975214977678163 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 762.883064516129 +settled_accuracy_p10 = 0.019066003552367317 +settled_accuracy_p10_ci_low = 0.014488105410520369 +settled_accuracy_p10_ci_high = 0.02244721646398362 +settled_accuracy_p50 = 0.10303551100338382 +settled_accuracy_p50_ci_low = 0.09620726480813413 +settled_accuracy_p50_ci_high = 0.11126155426701767 +settled_accuracy_p90 = 0.22214418505467382 +settled_accuracy_p90_ci_low = 0.21317479034654596 +settled_accuracy_p90_ci_high = 0.23955839791711275 +settled_accuracy_p95 = 0.2786693891031957 +settled_accuracy_p95_ci_low = 0.2639819972155728 +settled_accuracy_p95_ci_high = 0.30239102970334875 +settled_accuracy_p99 = 0.4000439804639122 +settled_accuracy_p99_ci_low = 0.35621276666109036 +settled_accuracy_p99_ci_high = 0.45436887282666616 +settled_accuracy_mean = 0.1171923233152508 +jitter_p10_per_min = 0.045454545454545456 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09523809523809523 +jitter_p90_per_min = 0.15384615384615385 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15789473684210525 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.17391304347826086 +jitter_p99_per_min = 0.19047619047619047 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.09138986928175072 +reaction_rate = 0.674 +reaction_rate_ci_low = 0.6449467434114522 +reaction_rate_ci_high = 0.7030532565885479 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 152.93768545994067 +fire_decisiveness_mean = 11.763716254623139 +fire_decisiveness_p50 = 8.373520674442801 +step_correction_mean = -0.06958823918588791 +step_correction_p50 = 0.7198135256767273 + +[cell.spm_10.step_plus_50_at_15min] +shares_per_minute = 10 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.98 +convergence_rate_ci_low = 0.971322710100498 +convergence_rate_ci_high = 0.988677289899502 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 769.8367346938776 +settled_accuracy_p10 = 0.013344731699211687 +settled_accuracy_p10_ci_low = 0.011119043875864376 +settled_accuracy_p10_ci_high = 0.016524170688799078 +settled_accuracy_p50 = 0.08360663790768519 +settled_accuracy_p50_ci_low = 0.07500229736008945 +settled_accuracy_p50_ci_high = 0.08943848761318018 +settled_accuracy_p90 = 0.22587724929895847 +settled_accuracy_p90_ci_low = 0.2144627474672891 +settled_accuracy_p90_ci_high = 0.237927316806001 +settled_accuracy_p95 = 0.2690081157880222 +settled_accuracy_p95_ci_low = 0.25129039159453437 +settled_accuracy_p95_ci_high = 0.28600732775100934 +settled_accuracy_p99 = 0.36151410480668567 +settled_accuracy_p99_ci_low = 0.3433438879171029 +settled_accuracy_p99_ci_high = 0.38290563661660015 +settled_accuracy_mean = 0.1054701527514053 +jitter_p10_per_min = 0.05263157894736842 +jitter_p10_per_min_ci_low = 0.05 +jitter_p10_per_min_ci_high = 0.05555555555555555 +jitter_p50_per_min = 0.09523809523809523 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.15789473684210525 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.17647058823529413 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.21428571428571427 +jitter_mean_per_min = 0.10119305889123997 +reaction_rate = 0.851 +reaction_rate_ci_low = 0.8289294078375772 +reaction_rate_ci_high = 0.8730705921624228 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 137.20329024676852 +fire_decisiveness_mean = 14.117198242154169 +fire_decisiveness_p50 = 9.624244432180568 +step_correction_mean = 0.639329825879264 +step_correction_p50 = 0.5749806761741638 + +[cell.spm_12.cold_start_10gh_to_1ph] +shares_per_minute = 12 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 120 +convergence_p10_secs_ci_low = 120 +convergence_p10_secs_ci_high = 120 +convergence_p50_secs = 240 +convergence_p50_secs_ci_low = 240 +convergence_p50_secs_ci_high = 240 +convergence_p90_secs = 480 +convergence_p90_secs_ci_low = 480 +convergence_p90_secs_ci_high = 480 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 540 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 780 +convergence_p99_secs_ci_low = 720 +convergence_p99_secs_ci_high = 960 +convergence_mean_secs = 278.16 +settled_accuracy_p10 = 0.019275008168826546 +settled_accuracy_p10_ci_low = 0.015098487963454588 +settled_accuracy_p10_ci_high = 0.024159526898608785 +settled_accuracy_p50 = 0.0913954959616905 +settled_accuracy_p50_ci_low = 0.0863068991738295 +settled_accuracy_p50_ci_high = 0.09934950706189949 +settled_accuracy_p90 = 0.21275805287923544 +settled_accuracy_p90_ci_low = 0.201971712137061 +settled_accuracy_p90_ci_high = 0.2236872012858595 +settled_accuracy_p95 = 0.25078763996979836 +settled_accuracy_p95_ci_low = 0.23119003948752714 +settled_accuracy_p95_ci_high = 0.2676318308351946 +settled_accuracy_p99 = 0.33588248593515635 +settled_accuracy_p99_ci_low = 0.303024643516032 +settled_accuracy_p99_ci_high = 0.36528100058780644 +settled_accuracy_mean = 0.10675120200365593 +jitter_p10_per_min = 0.043478260869565216 +jitter_p10_per_min_ci_low = 0.043478260869565216 +jitter_p10_per_min_ci_high = 0.045454545454545456 +jitter_p50_per_min = 0.08695652173913043 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.13043478260869565 +jitter_p90_per_min_ci_low = 0.125 +jitter_p90_per_min_ci_high = 0.13636363636363635 +jitter_p95_per_min = 0.14814814814814814 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.15384615384615385 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.16 +jitter_p99_per_min_ci_high = 0.19230769230769232 +jitter_mean_per_min = 0.0904979578631636 +bias_mean = 0.0018857495222581707 +bias_p10 = -0.07929458438983733 +bias_p10_ci_low = -0.08688855996204803 +bias_p10_ci_high = -0.07414429689493036 +bias_p50 = 0.0006921608323002494 +bias_p50_ci_low = -0.0034915400216130794 +bias_p50_ci_high = 0.005469199416920028 +bias_p90 = 0.08636862873337608 +bias_p90_ci_low = 0.07846980231236593 +bias_p90_ci_high = 0.09444688306678357 +bias_p99 = 0.16233711764578543 +bias_p99_ci_low = 0.14769862209853454 +bias_p99_ci_high = 0.17822673082495485 +variance_mean = 0.033948269548517686 +variance_p10 = 0.018720228277337308 +variance_p10_ci_low = 0.017984199471120395 +variance_p10_ci_high = 0.019693866173012928 +variance_p50 = 0.03184643495764991 +variance_p50_ci_low = 0.030578591797223734 +variance_p50_ci_high = 0.03301325367660531 +variance_p90 = 0.051820797870022625 +variance_p90_ci_low = 0.05037575193155344 +variance_p90_ci_high = 0.05425385348760132 +variance_p99 = 0.0756193297450915 +variance_p99_ci_low = 0.06928487395651857 +variance_p99_ci_high = 0.07926191605426271 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0.006442115483484834 +ramp_target_overshoot_p50 = 0.11551267716656444 +ramp_target_overshoot_p50_ci_low = 0.10513791509265613 +ramp_target_overshoot_p50_ci_high = 0.12426427712578914 +ramp_target_overshoot_p90 = 0.2586294450479396 +ramp_target_overshoot_p90_ci_low = 0.24937714584789727 +ramp_target_overshoot_p90_ci_high = 0.2757682438301283 +ramp_target_overshoot_p99 = 0.410134418385252 +ramp_target_overshoot_p99_ci_low = 0.36528100058780644 +ramp_target_overshoot_p99_ci_high = 0.45636947349270307 +ramp_target_overshoot_mean = 0.1289522245280082 + +[cell.spm_12.stable_1ph] +shares_per_minute = 12 +scenario = "stable_1ph" +convergence_rate = 0.976 +convergence_rate_ci_low = 0.9665139239724742 +convergence_rate_ci_high = 0.9854860760275258 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 743.422131147541 +settled_accuracy_p10 = 0.013207628586792697 +settled_accuracy_p10_ci_low = 0.010411403514128947 +settled_accuracy_p10_ci_high = 0.014613961959071498 +settled_accuracy_p50 = 0.08421377367844018 +settled_accuracy_p50_ci_low = 0.07482705542205736 +settled_accuracy_p50_ci_high = 0.09202041371138803 +settled_accuracy_p90 = 0.20950495065451613 +settled_accuracy_p90_ci_low = 0.20015943724116525 +settled_accuracy_p90_ci_high = 0.22453357828963805 +settled_accuracy_p95 = 0.25412093728804086 +settled_accuracy_p95_ci_low = 0.23718091496360594 +settled_accuracy_p95_ci_high = 0.27904986732241865 +settled_accuracy_p99 = 0.3496067856726064 +settled_accuracy_p99_ci_low = 0.31566956427086446 +settled_accuracy_p99_ci_high = 0.40122987732298165 +settled_accuracy_mean = 0.10037614002023064 +jitter_p10_per_min = 0.045454545454545456 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.047619047619047616 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.07692307692307693 +jitter_p50_per_min_ci_high = 0.08333333333333333 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13333333333333333 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.15384615384615385 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.17647058823529413 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08473361390428494 +bias_mean = -0.0003428832191418903 +bias_p10 = -0.08135305345458792 +bias_p10_ci_low = -0.0871097066301005 +bias_p10_ci_high = -0.0770724509318435 +bias_p50 = -0.002846380119042585 +bias_p50_ci_low = -0.007599665697542837 +bias_p50_ci_high = 0.0020934822319867382 +bias_p90 = 0.08464777730371054 +bias_p90_ci_low = 0.0755714940600937 +bias_p90_ci_high = 0.09357692965916162 +bias_p99 = 0.1583509005209658 +bias_p99_ci_low = 0.14255657839787042 +bias_p99_ci_high = 0.1758312516369486 +variance_mean = 0.03470472651526319 +variance_p10 = 0.018532652797800298 +variance_p10_ci_low = 0.017689275763534525 +variance_p10_ci_high = 0.01933351215555573 +variance_p50 = 0.03253333283488508 +variance_p50_ci_low = 0.03141007129211972 +variance_p50_ci_high = 0.0334557890181692 +variance_p90 = 0.053511597576466036 +variance_p90_ci_low = 0.05122003778246105 +variance_p90_ci_high = 0.05492973868767707 +variance_p99 = 0.0769969467348407 +variance_p99_ci_low = 0.07075339197222984 +variance_p99_ci_high = 0.09061052379527128 +upward_step_magnitude_p50 = 1.222998932767722 +upward_step_magnitude_p50_ci_low = 1.2185580707436152 +upward_step_magnitude_p50_ci_high = 1.2279143886842105 +upward_step_magnitude_p90 = 1.3208590397062017 +upward_step_magnitude_p90_ci_low = 1.314807352836498 +upward_step_magnitude_p90_ci_high = 1.3337501688626812 +upward_step_magnitude_p95 = 1.352892972567708 +upward_step_magnitude_p95_ci_low = 1.3411532161822828 +upward_step_magnitude_p95_ci_high = 1.3648364714668877 +upward_step_magnitude_p99 = 1.4327244377660715 +upward_step_magnitude_p99_ci_low = 1.4037146501537698 +upward_step_magnitude_p99_ci_high = 1.4431969210900766 +upward_step_magnitude_mean = 1.2252198826315597 +fire_decisiveness_mean = 9.233608429280237 +fire_decisiveness_p50 = 6.871385040325102 + +[cell.spm_12.step_minus_50_at_15min] +shares_per_minute = 12 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.973 +convergence_rate_ci_low = 0.9629539722476991 +convergence_rate_ci_high = 0.9830460277523009 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 900 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 853.0113052415211 +settled_accuracy_p10 = 0.02076529473106159 +settled_accuracy_p10_ci_low = 0.016552602847523135 +settled_accuracy_p10_ci_high = 0.023360394535701046 +settled_accuracy_p50 = 0.09176841992378981 +settled_accuracy_p50_ci_low = 0.0850102216867531 +settled_accuracy_p50_ci_high = 0.0986979470928473 +settled_accuracy_p90 = 0.26705066806539435 +settled_accuracy_p90_ci_low = 0.2523942261948582 +settled_accuracy_p90_ci_high = 0.27740395530254314 +settled_accuracy_p95 = 0.30894042417231793 +settled_accuracy_p95_ci_low = 0.29193101128160426 +settled_accuracy_p95_ci_high = 0.3305682691435923 +settled_accuracy_p99 = 0.40921234258189676 +settled_accuracy_p99_ci_low = 0.3835441412920779 +settled_accuracy_p99_ci_high = 0.46008542555845144 +settled_accuracy_mean = 0.12095716058634619 +jitter_p10_per_min = 0.08333333333333333 +jitter_p10_per_min_ci_low = 0.08333333333333333 +jitter_p10_per_min_ci_high = 0.09090909090909091 +jitter_p50_per_min = 0.13333333333333333 +jitter_p50_per_min_ci_low = 0.13043478260869565 +jitter_p50_per_min_ci_high = 0.13636363636363635 +jitter_p90_per_min = 0.18181818181818182 +jitter_p90_per_min_ci_low = 0.17647058823529413 +jitter_p90_per_min_ci_high = 0.18181818181818182 +jitter_p95_per_min = 0.19047619047619047 +jitter_p95_per_min_ci_low = 0.1875 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.2222222222222222 +jitter_p99_per_min_ci_low = 0.21052631578947367 +jitter_p99_per_min_ci_high = 0.23529411764705882 +jitter_mean_per_min = 0.13162981199217652 +reaction_rate = 0.965 +reaction_rate_ci_low = 0.9536092124943004 +reaction_rate_ci_high = 0.9763907875056995 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 124.29015544041451 +fire_decisiveness_mean = 9.790406720078836 +fire_decisiveness_p50 = 7.826880512621095 +step_correction_mean = 0.4769528401484761 +step_correction_p50 = 0.4724099040031433 + +[cell.spm_12.step_minus_25_at_15min] +shares_per_minute = 12 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.997 +convergence_rate_ci_low = 0.9936102764714508 +convergence_rate_ci_high = 1 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 755.3259779338014 +settled_accuracy_p10 = 0.01845287942210505 +settled_accuracy_p10_ci_low = 0.01519380458131625 +settled_accuracy_p10_ci_high = 0.022754468085753654 +settled_accuracy_p50 = 0.08687296050571813 +settled_accuracy_p50_ci_low = 0.0824049418609073 +settled_accuracy_p50_ci_high = 0.09463530851420887 +settled_accuracy_p90 = 0.2301051076913827 +settled_accuracy_p90_ci_low = 0.21063834756145638 +settled_accuracy_p90_ci_high = 0.24740702536741876 +settled_accuracy_p95 = 0.2788034149642564 +settled_accuracy_p95_ci_low = 0.26327487137244154 +settled_accuracy_p95_ci_high = 0.30053550188616174 +settled_accuracy_p99 = 0.35410868647284843 +settled_accuracy_p99_ci_low = 0.34195500288075986 +settled_accuracy_p99_ci_high = 0.4288613388611948 +settled_accuracy_mean = 0.10790898109865449 +jitter_p10_per_min = 0.045454545454545456 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09523809523809523 +jitter_p90_per_min = 0.15 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15384615384615385 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.15789473684210525 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.09110527153084128 +reaction_rate = 0.686 +reaction_rate_ci_low = 0.6572337696873575 +reaction_rate_ci_high = 0.7147662303126426 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 154.98542274052477 +fire_decisiveness_mean = 8.673938953252229 +fire_decisiveness_p50 = 6.686151500332635 +step_correction_mean = 0.878488075064153 +step_correction_p50 = 0.6665974259376526 + +[cell.spm_12.step_minus_10_at_15min] +shares_per_minute = 12 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.984 +convergence_rate_ci_low = 0.976222972907338 +convergence_rate_ci_high = 0.991777027092662 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 750.7926829268292 +settled_accuracy_p10 = 0.016852005194226027 +settled_accuracy_p10_ci_low = 0.014927173833209961 +settled_accuracy_p10_ci_high = 0.021496013174215678 +settled_accuracy_p50 = 0.09188627731843413 +settled_accuracy_p50_ci_low = 0.08700880505583264 +settled_accuracy_p50_ci_high = 0.0968374202010358 +settled_accuracy_p90 = 0.22796978162402715 +settled_accuracy_p90_ci_low = 0.21403156875545482 +settled_accuracy_p90_ci_high = 0.23600360747428706 +settled_accuracy_p95 = 0.26387958581900217 +settled_accuracy_p95_ci_low = 0.24858644497874693 +settled_accuracy_p95_ci_high = 0.2767926735015802 +settled_accuracy_p99 = 0.3495283924556214 +settled_accuracy_p99_ci_low = 0.3092999091420541 +settled_accuracy_p99_ci_high = 0.3953525620113869 +settled_accuracy_mean = 0.10893885278887656 +jitter_p10_per_min = 0.043478260869565216 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.047619047619047616 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.07692307692307693 +jitter_p50_per_min_ci_high = 0.08333333333333333 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13333333333333333 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.15 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08329740365249842 +reaction_rate = 0.53 +reaction_rate_ci_low = 0.49906551180316705 +reaction_rate_ci_high = 0.560934488196833 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 171.39622641509433 +fire_decisiveness_mean = 8.763165310956126 +fire_decisiveness_p50 = 6.5646526019918525 +step_correction_mean = 0.9669728140786009 +step_correction_p50 = 1.131807565689087 + +[cell.spm_12.step_minus_5_at_15min] +shares_per_minute = 12 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.984 +convergence_rate_ci_low = 0.976222972907338 +convergence_rate_ci_high = 0.991777027092662 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 775.9146341463414 +settled_accuracy_p10 = 0.016612340274721138 +settled_accuracy_p10_ci_low = 0.014777583915573267 +settled_accuracy_p10_ci_high = 0.020382516289970454 +settled_accuracy_p50 = 0.08784755239489284 +settled_accuracy_p50_ci_low = 0.08327814512228393 +settled_accuracy_p50_ci_high = 0.09307137705906765 +settled_accuracy_p90 = 0.21022643025414545 +settled_accuracy_p90_ci_low = 0.19896994250465672 +settled_accuracy_p90_ci_high = 0.2176685914195453 +settled_accuracy_p95 = 0.24314071464441867 +settled_accuracy_p95_ci_low = 0.22876359404844682 +settled_accuracy_p95_ci_high = 0.25698718072339544 +settled_accuracy_p99 = 0.3228945847596616 +settled_accuracy_p99_ci_low = 0.29366733203339934 +settled_accuracy_p99_ci_high = 0.33353155172719506 +settled_accuracy_mean = 0.10205523610558637 +jitter_p10_per_min = 0.045454545454545456 +jitter_p10_per_min_ci_low = 0.041666666666666664 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.08 +jitter_p50_per_min_ci_high = 0.08695652173913043 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13333333333333333 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15384615384615385 +jitter_p95_per_min_ci_low = 0.15 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.17647058823529413 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.0855684754332283 +reaction_rate = 0.529 +reaction_rate_ci_low = 0.4980618485620101 +reaction_rate_ci_high = 0.55993815143799 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 176.03024574669186 +fire_decisiveness_mean = 8.853289827115912 +fire_decisiveness_p50 = 6.624308093991196 +step_correction_mean = 1.004803812458745 +step_correction_p50 = 1.2400401830673218 + +[cell.spm_12.step_plus_5_at_15min] +shares_per_minute = 12 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.981 +convergence_rate_ci_low = 0.9725381099983514 +convergence_rate_ci_high = 0.9894618900016485 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 766.6666666666666 +settled_accuracy_p10 = 0.017939798614591718 +settled_accuracy_p10_ci_low = 0.014840199721108283 +settled_accuracy_p10_ci_high = 0.021027573564423085 +settled_accuracy_p50 = 0.08477639772116174 +settled_accuracy_p50_ci_low = 0.07953180762277512 +settled_accuracy_p50_ci_high = 0.09066612775048899 +settled_accuracy_p90 = 0.21410912208944044 +settled_accuracy_p90_ci_low = 0.20062842023548444 +settled_accuracy_p90_ci_high = 0.2264972276367362 +settled_accuracy_p95 = 0.2555824033641867 +settled_accuracy_p95_ci_low = 0.24231990120551816 +settled_accuracy_p95_ci_high = 0.27327818134708326 +settled_accuracy_p99 = 0.3283146125153056 +settled_accuracy_p99_ci_low = 0.3106052849321159 +settled_accuracy_p99_ci_high = 0.3547486044231265 +settled_accuracy_mean = 0.10377447789619185 +jitter_p10_per_min = 0.045454545454545456 +jitter_p10_per_min_ci_low = 0.038461538461538464 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.08 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13636363636363635 +jitter_p90_per_min_ci_high = 0.15 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.15384615384615385 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.17647058823529413 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08605331604299468 +reaction_rate = 0.5 +reaction_rate_ci_low = 0.4690096789303499 +reaction_rate_ci_high = 0.5309903210696502 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 176.76 +fire_decisiveness_mean = 9.351218549165791 +fire_decisiveness_p50 = 6.840320346775378 +step_correction_mean = 0.7506730103492737 +step_correction_p50 = 1.2626416683197021 + +[cell.spm_12.step_plus_10_at_15min] +shares_per_minute = 12 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.981 +convergence_rate_ci_low = 0.9725381099983514 +convergence_rate_ci_high = 0.9894618900016485 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 762.9357798165138 +settled_accuracy_p10 = 0.019307647598170607 +settled_accuracy_p10_ci_low = 0.016420136149245756 +settled_accuracy_p10_ci_high = 0.021646086512966622 +settled_accuracy_p50 = 0.08883664158686355 +settled_accuracy_p50_ci_low = 0.08391945301150117 +settled_accuracy_p50_ci_high = 0.09441479147719856 +settled_accuracy_p90 = 0.21166154412496363 +settled_accuracy_p90_ci_low = 0.20079247028770242 +settled_accuracy_p90_ci_high = 0.22326112846485358 +settled_accuracy_p95 = 0.252351723419719 +settled_accuracy_p95_ci_low = 0.23659907644779588 +settled_accuracy_p95_ci_high = 0.26990679249700933 +settled_accuracy_p99 = 0.3212719179841814 +settled_accuracy_p99_ci_low = 0.30013738404884505 +settled_accuracy_p99_ci_high = 0.3333782352650132 +settled_accuracy_mean = 0.1047098423753074 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.045454545454545456 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13333333333333333 +jitter_p90_per_min_ci_high = 0.15 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.15384615384615385 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08639218801968854 +reaction_rate = 0.565 +reaction_rate_ci_low = 0.5342726629855432 +reaction_rate_ci_high = 0.5957273370144567 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 169.4867256637168 +fire_decisiveness_mean = 9.949315125200203 +fire_decisiveness_p50 = 7.1438732080931615 +step_correction_mean = 1.1975721947387257 +step_correction_p50 = 1.1795438528060913 + +[cell.spm_12.step_plus_25_at_15min] +shares_per_minute = 12 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.99 +convergence_rate_ci_low = 0.9838330039727595 +convergence_rate_ci_high = 0.9961669960272405 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 786.4848484848485 +settled_accuracy_p10 = 0.017002164448709722 +settled_accuracy_p10_ci_low = 0.014775760837329677 +settled_accuracy_p10_ci_high = 0.019636589942088722 +settled_accuracy_p50 = 0.08891902762802073 +settled_accuracy_p50_ci_low = 0.08338077482496398 +settled_accuracy_p50_ci_high = 0.09282948787026113 +settled_accuracy_p90 = 0.202846253274644 +settled_accuracy_p90_ci_low = 0.19339410425560377 +settled_accuracy_p90_ci_high = 0.21562238476764117 +settled_accuracy_p95 = 0.2386826004222382 +settled_accuracy_p95_ci_low = 0.2265235483386745 +settled_accuracy_p95_ci_high = 0.25491779110696977 +settled_accuracy_p99 = 0.3119488349149908 +settled_accuracy_p99_ci_low = 0.28810414350516145 +settled_accuracy_p99_ci_high = 0.3354105226266386 +settled_accuracy_mean = 0.10044552623333738 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09523809523809523 +jitter_p90_per_min = 0.15 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15789473684210525 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.22727272727272727 +jitter_mean_per_min = 0.08901485161134069 +reaction_rate = 0.731 +reaction_rate_ci_low = 0.7035153063979239 +reaction_rate_ci_high = 0.758484693602076 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 155.7045143638851 +fire_decisiveness_mean = 11.2192257061464 +fire_decisiveness_p50 = 7.839741915736788 +step_correction_mean = 2.1228712985111162 +step_correction_p50 = 0.7097476720809937 + +[cell.spm_12.step_plus_50_at_15min] +shares_per_minute = 12 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.984 +convergence_rate_ci_low = 0.976222972907338 +convergence_rate_ci_high = 0.991777027092662 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 900 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 814.329268292683 +settled_accuracy_p10 = 0.016964136397064733 +settled_accuracy_p10_ci_low = 0.013228857061789667 +settled_accuracy_p10_ci_high = 0.019413878345589386 +settled_accuracy_p50 = 0.07931319178612561 +settled_accuracy_p50_ci_low = 0.07219097285571752 +settled_accuracy_p50_ci_high = 0.0856484474453938 +settled_accuracy_p90 = 0.20830358546550864 +settled_accuracy_p90_ci_low = 0.19948771778056495 +settled_accuracy_p90_ci_high = 0.2188846846925846 +settled_accuracy_p95 = 0.24725598568558993 +settled_accuracy_p95_ci_low = 0.23189288781160777 +settled_accuracy_p95_ci_high = 0.2604957591224881 +settled_accuracy_p99 = 0.31149446875326325 +settled_accuracy_p99_ci_low = 0.29660569632559297 +settled_accuracy_p99_ci_high = 0.3240231566738736 +settled_accuracy_mean = 0.09811320549422957 +jitter_p10_per_min = 0.05263157894736842 +jitter_p10_per_min_ci_low = 0.047619047619047616 +jitter_p10_per_min_ci_high = 0.05555555555555555 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.09523809523809523 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.15789473684210525 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.17647058823529413 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.19047619047619047 +jitter_p99_per_min_ci_high = 0.21052631578947367 +jitter_mean_per_min = 0.10168306548545891 +reaction_rate = 0.9 +reaction_rate_ci_low = 0.88140580735821 +reaction_rate_ci_high = 0.9185941926417901 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 129 +fire_decisiveness_mean = 13.501075929017802 +fire_decisiveness_p50 = 9.43012125417075 +step_correction_mean = 0.600463767680857 +step_correction_p50 = 0.544957160949707 + +[cell.spm_15.cold_start_10gh_to_1ph] +shares_per_minute = 15 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 120 +convergence_p10_secs_ci_low = 120 +convergence_p10_secs_ci_high = 120 +convergence_p50_secs = 240 +convergence_p50_secs_ci_low = 240 +convergence_p50_secs_ci_high = 240 +convergence_p90_secs = 540 +convergence_p90_secs_ci_low = 480 +convergence_p90_secs_ci_high = 540 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 660 +convergence_p99_secs = 840 +convergence_p99_secs_ci_low = 720 +convergence_p99_secs_ci_high = 900 +convergence_mean_secs = 289.44 +settled_accuracy_p10 = 0.01308468514634531 +settled_accuracy_p10_ci_low = 0.010509248239113811 +settled_accuracy_p10_ci_high = 0.016069553238167167 +settled_accuracy_p50 = 0.08226748237939319 +settled_accuracy_p50_ci_low = 0.07493543623882726 +settled_accuracy_p50_ci_high = 0.08685766162784225 +settled_accuracy_p90 = 0.19317917577026378 +settled_accuracy_p90_ci_low = 0.18516496801826388 +settled_accuracy_p90_ci_high = 0.2006014833340839 +settled_accuracy_p95 = 0.2257304648946481 +settled_accuracy_p95_ci_low = 0.21176115069154688 +settled_accuracy_p95_ci_high = 0.24120825216236508 +settled_accuracy_p99 = 0.30223101408004394 +settled_accuracy_p99_ci_low = 0.28219458873036807 +settled_accuracy_p99_ci_high = 0.32643422884968487 +settled_accuracy_mean = 0.09451260180330924 +jitter_p10_per_min = 0.043478260869565216 +jitter_p10_per_min_ci_low = 0.041666666666666664 +jitter_p10_per_min_ci_high = 0.045454545454545456 +jitter_p50_per_min = 0.08695652173913043 +jitter_p50_per_min_ci_low = 0.08695652173913043 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.13636363636363635 +jitter_p90_per_min_ci_low = 0.13043478260869565 +jitter_p90_per_min_ci_high = 0.13636363636363635 +jitter_p95_per_min = 0.15384615384615385 +jitter_p95_per_min_ci_low = 0.14814814814814814 +jitter_p95_per_min_ci_high = 0.15384615384615385 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.09145537346371953 +bias_mean = 0.003135870066556705 +bias_p10 = -0.071942748198225 +bias_p10_ci_low = -0.0749866226424978 +bias_p10_ci_high = -0.0666930477501225 +bias_p50 = 0.002368003405909112 +bias_p50_ci_low = -0.0033333326386977193 +bias_p50_ci_high = 0.006943069031579769 +bias_p90 = 0.07642208832622259 +bias_p90_ci_low = 0.0702057623846258 +bias_p90_ci_high = 0.08240357562531007 +bias_p99 = 0.14449469654358507 +bias_p99_ci_low = 0.12633397103120106 +bias_p99_ci_high = 0.15681785148362462 +variance_mean = 0.02802945327587309 +variance_p10 = 0.01539504152406095 +variance_p10_ci_low = 0.01494082235443978 +variance_p10_ci_high = 0.016146605945160108 +variance_p50 = 0.026187531710549578 +variance_p50_ci_low = 0.02543238400369181 +variance_p50_ci_high = 0.026976855648321002 +variance_p90 = 0.043504080099537 +variance_p90_ci_low = 0.04197945818749702 +variance_p90_ci_high = 0.045124977012939126 +variance_p99 = 0.06086238110807698 +variance_p99_ci_low = 0.055713551763019196 +variance_p99_ci_high = 0.06357638773984423 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0.002780588707148368 +ramp_target_overshoot_p50 = 0.10693280879254985 +ramp_target_overshoot_p50_ci_low = 0.10019937372665133 +ramp_target_overshoot_p50_ci_high = 0.11605874200003607 +ramp_target_overshoot_p90 = 0.24111564192884027 +ramp_target_overshoot_p90_ci_low = 0.23106340505951173 +ramp_target_overshoot_p90_ci_high = 0.25212699869493393 +ramp_target_overshoot_p99 = 0.343252113040051 +ramp_target_overshoot_p99_ci_low = 0.3221614074232202 +ramp_target_overshoot_p99_ci_high = 0.38481759911190805 +ramp_target_overshoot_mean = 0.11634631113642761 + +[cell.spm_15.stable_1ph] +shares_per_minute = 15 +scenario = "stable_1ph" +convergence_rate = 0.977 +convergence_rate_ci_low = 0.9677088970730058 +convergence_rate_ci_high = 0.9862911029269942 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 785.2200614124872 +settled_accuracy_p10 = 0.012988048380928152 +settled_accuracy_p10_ci_low = 0.01077909298476809 +settled_accuracy_p10_ci_high = 0.016071566504113344 +settled_accuracy_p50 = 0.07827322985101626 +settled_accuracy_p50_ci_low = 0.07167535469216113 +settled_accuracy_p50_ci_high = 0.08695101005888062 +settled_accuracy_p90 = 0.18560681278458768 +settled_accuracy_p90_ci_low = 0.1788376758025767 +settled_accuracy_p90_ci_high = 0.19648301229682708 +settled_accuracy_p95 = 0.22628659605785084 +settled_accuracy_p95_ci_low = 0.2080590230519621 +settled_accuracy_p95_ci_high = 0.24581688634865428 +settled_accuracy_p99 = 0.303438436776839 +settled_accuracy_p99_ci_low = 0.2877717380545046 +settled_accuracy_p99_ci_high = 0.3241336027441084 +settled_accuracy_mean = 0.09231819654857767 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0.047619047619047616 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.07692307692307693 +jitter_p50_per_min_ci_high = 0.08695652173913043 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13333333333333333 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15384615384615385 +jitter_p95_per_min_ci_low = 0.15 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.17647058823529413 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08554722579145878 +bias_mean = -0.0005647676696925965 +bias_p10 = -0.07444558390980052 +bias_p10_ci_low = -0.08011639954907222 +bias_p10_ci_high = -0.0679182931486098 +bias_p50 = -0.002131412868822072 +bias_p50_ci_low = -0.005945870152067522 +bias_p50_ci_high = 0.0023361302271399506 +bias_p90 = 0.07466594822977038 +bias_p90_ci_low = 0.06773261351564273 +bias_p90_ci_high = 0.08341994291585736 +bias_p99 = 0.14773728386879248 +bias_p99_ci_low = 0.13150502695376343 +bias_p99_ci_high = 0.1657391309096124 +variance_mean = 0.027906453505643043 +variance_p10 = 0.01615204834577997 +variance_p10_ci_low = 0.015360800606814957 +variance_p10_ci_high = 0.01674726873752026 +variance_p50 = 0.02626614815424859 +variance_p50_ci_low = 0.02543474062407574 +variance_p50_ci_high = 0.02693221279737484 +variance_p90 = 0.04240369216096148 +variance_p90_ci_low = 0.04119314088704344 +variance_p90_ci_high = 0.04332026953706273 +variance_p99 = 0.058813563224525967 +variance_p99_ci_low = 0.05328335970233093 +variance_p99_ci_high = 0.06536513743269019 +upward_step_magnitude_p50 = 1.194813612174246 +upward_step_magnitude_p50_ci_low = 1.1902049571494566 +upward_step_magnitude_p50_ci_high = 1.1989340744691714 +upward_step_magnitude_p90 = 1.2780799560437925 +upward_step_magnitude_p90_ci_low = 1.2732874975312327 +upward_step_magnitude_p90_ci_high = 1.2876961172406216 +upward_step_magnitude_p95 = 1.3121992597687235 +upward_step_magnitude_p95_ci_low = 1.300262444250723 +upward_step_magnitude_p95_ci_high = 1.3203210139129427 +upward_step_magnitude_p99 = 1.369455572003699 +upward_step_magnitude_p99_ci_low = 1.3513934981231976 +upward_step_magnitude_p99_ci_high = 1.3814922380862957 +upward_step_magnitude_mean = 1.1983687741274889 +fire_decisiveness_mean = 8.104445052452597 +fire_decisiveness_p50 = 6.072450504318056 + +[cell.spm_15.step_minus_50_at_15min] +shares_per_minute = 15 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.977 +convergence_rate_ci_low = 0.9677088970730058 +convergence_rate_ci_high = 0.9862911029269942 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 882.1903787103378 +settled_accuracy_p10 = 0.015927014009176954 +settled_accuracy_p10_ci_low = 0.013936296641583912 +settled_accuracy_p10_ci_high = 0.018729077553084617 +settled_accuracy_p50 = 0.08528429429089446 +settled_accuracy_p50_ci_low = 0.07672127024196307 +settled_accuracy_p50_ci_high = 0.09197357172370668 +settled_accuracy_p90 = 0.2272835653544043 +settled_accuracy_p90_ci_low = 0.21176182178019554 +settled_accuracy_p90_ci_high = 0.23698898361006915 +settled_accuracy_p95 = 0.2869387828237009 +settled_accuracy_p95_ci_low = 0.26306708584653227 +settled_accuracy_p95_ci_high = 0.2979721512974727 +settled_accuracy_p99 = 0.38871326871778655 +settled_accuracy_p99_ci_low = 0.3538482001503105 +settled_accuracy_p99_ci_high = 0.42613746673833 +settled_accuracy_mean = 0.10625434877188433 +jitter_p10_per_min = 0.09090909090909091 +jitter_p10_per_min_ci_low = 0.09090909090909091 +jitter_p10_per_min_ci_high = 0.09090909090909091 +jitter_p50_per_min = 0.13636363636363635 +jitter_p50_per_min_ci_low = 0.13043478260869565 +jitter_p50_per_min_ci_high = 0.14285714285714285 +jitter_p90_per_min = 0.18181818181818182 +jitter_p90_per_min_ci_low = 0.17647058823529413 +jitter_p90_per_min_ci_high = 0.19047619047619047 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.19047619047619047 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.21739130434782608 +jitter_p99_per_min_ci_low = 0.21052631578947367 +jitter_p99_per_min_ci_high = 0.23529411764705882 +jitter_mean_per_min = 0.13478392348323198 +reaction_rate = 0.985 +reaction_rate_ci_low = 0.9774661006112372 +reaction_rate_ci_high = 0.9925338993887628 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 114.76142131979695 +fire_decisiveness_mean = 9.232029861320509 +fire_decisiveness_p50 = 7.401493660833566 +step_correction_mean = 0.4554918495380334 +step_correction_p50 = 0.45078831911087036 + +[cell.spm_15.step_minus_25_at_15min] +shares_per_minute = 15 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.993 +convergence_rate_ci_low = 0.9878325091582084 +convergence_rate_ci_high = 0.9981674908417916 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 798.6706948640483 +settled_accuracy_p10 = 0.014348322381315892 +settled_accuracy_p10_ci_low = 0.012054720388236406 +settled_accuracy_p10_ci_high = 0.01710247013409516 +settled_accuracy_p50 = 0.07606136470258118 +settled_accuracy_p50_ci_low = 0.07124357466187647 +settled_accuracy_p50_ci_high = 0.08045789003827974 +settled_accuracy_p90 = 0.18879154922242747 +settled_accuracy_p90_ci_low = 0.18063871710759716 +settled_accuracy_p90_ci_high = 0.20252837564069948 +settled_accuracy_p95 = 0.24386385633835606 +settled_accuracy_p95_ci_low = 0.22648462925171564 +settled_accuracy_p95_ci_high = 0.25777042344171663 +settled_accuracy_p99 = 0.3277809845872415 +settled_accuracy_p99_ci_low = 0.30030992662674794 +settled_accuracy_p99_ci_high = 0.36845521928447456 +settled_accuracy_mean = 0.0931012712118813 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09523809523809523 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15384615384615385 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.19047619047619047 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.09332393596580699 +reaction_rate = 0.732 +reaction_rate_ci_low = 0.7045476827644732 +reaction_rate_ci_high = 0.7594523172355268 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 156.72131147540983 +fire_decisiveness_mean = 7.765165556396697 +fire_decisiveness_p50 = 6.130915075317446 +step_correction_mean = 0.6509909714098836 +step_correction_p50 = 0.6286012530326843 + +[cell.spm_15.step_minus_10_at_15min] +shares_per_minute = 15 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.983 +convergence_rate_ci_low = 0.9749876983581495 +convergence_rate_ci_high = 0.9910123016418505 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 760.7121057985757 +settled_accuracy_p10 = 0.015781767938292668 +settled_accuracy_p10_ci_low = 0.013495592625332398 +settled_accuracy_p10_ci_high = 0.017947818384026037 +settled_accuracy_p50 = 0.08352973239594674 +settled_accuracy_p50_ci_low = 0.07858149756413468 +settled_accuracy_p50_ci_high = 0.08720521033222983 +settled_accuracy_p90 = 0.1955338305105978 +settled_accuracy_p90_ci_low = 0.18554795692654824 +settled_accuracy_p90_ci_high = 0.20646422407798948 +settled_accuracy_p95 = 0.23446800752663188 +settled_accuracy_p95_ci_low = 0.2154160246274619 +settled_accuracy_p95_ci_high = 0.24487838196054068 +settled_accuracy_p99 = 0.3118748017026265 +settled_accuracy_p99_ci_low = 0.29504240720987807 +settled_accuracy_p99_ci_high = 0.32381093345074907 +settled_accuracy_mean = 0.09568147806528131 +jitter_p10_per_min = 0.043478260869565216 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.047619047619047616 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.08695652173913043 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13636363636363635 +jitter_p90_per_min_ci_high = 0.15 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.15384615384615385 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08514730907060934 +reaction_rate = 0.586 +reaction_rate_ci_low = 0.5554715292489125 +reaction_rate_ci_high = 0.6165284707510874 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 168.12286689419795 +fire_decisiveness_mean = 8.17005520844346 +fire_decisiveness_p50 = 6.4312928418551785 +step_correction_mean = 1.1625958765020956 +step_correction_p50 = 1.0697429180145264 + +[cell.spm_15.step_minus_5_at_15min] +shares_per_minute = 15 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.983 +convergence_rate_ci_low = 0.9749876983581495 +convergence_rate_ci_high = 0.9910123016418505 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 755.5849440488302 +settled_accuracy_p10 = 0.012541304623172045 +settled_accuracy_p10_ci_low = 0.010206763824761711 +settled_accuracy_p10_ci_high = 0.015329713269252143 +settled_accuracy_p50 = 0.07474867906796101 +settled_accuracy_p50_ci_low = 0.06899744936865748 +settled_accuracy_p50_ci_high = 0.07930544161765418 +settled_accuracy_p90 = 0.19142167869222204 +settled_accuracy_p90_ci_low = 0.18125970120449109 +settled_accuracy_p90_ci_high = 0.19985592079967196 +settled_accuracy_p95 = 0.22203886196646072 +settled_accuracy_p95_ci_low = 0.20958048977179655 +settled_accuracy_p95_ci_high = 0.23565108278740277 +settled_accuracy_p99 = 0.3035624281626095 +settled_accuracy_p99_ci_low = 0.26550845243214183 +settled_accuracy_p99_ci_high = 0.3315167316880925 +settled_accuracy_mean = 0.09013858425585067 +jitter_p10_per_min = 0.047619047619047616 +jitter_p10_per_min_ci_low = 0.043478260869565216 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.07692307692307693 +jitter_p50_per_min_ci_low = 0.07692307692307693 +jitter_p50_per_min_ci_high = 0.08333333333333333 +jitter_p90_per_min = 0.13333333333333333 +jitter_p90_per_min_ci_low = 0.13043478260869565 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.15789473684210525 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.17647058823529413 +jitter_p99_per_min_ci_high = 0.19047619047619047 +jitter_mean_per_min = 0.08255467791362486 +reaction_rate = 0.49 +reaction_rate_ci_low = 0.4590158776144942 +reaction_rate_ci_high = 0.5209841223855057 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 175.83673469387756 +fire_decisiveness_mean = 8.271327566937783 +fire_decisiveness_p50 = 6.170262333349335 +step_correction_mean = 1.6211857989734533 +step_correction_p50 = 1.2238578796386719 + +[cell.spm_15.step_plus_5_at_15min] +shares_per_minute = 15 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.978 +convergence_rate_ci_low = 0.9689084728675541 +convergence_rate_ci_high = 0.9870915271324459 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 782.2085889570552 +settled_accuracy_p10 = 0.016422115555337347 +settled_accuracy_p10_ci_low = 0.014006387997406167 +settled_accuracy_p10_ci_high = 0.019104361194507202 +settled_accuracy_p50 = 0.07847532227916032 +settled_accuracy_p50_ci_low = 0.07466826807602966 +settled_accuracy_p50_ci_high = 0.08372361934366501 +settled_accuracy_p90 = 0.184561981687843 +settled_accuracy_p90_ci_low = 0.17507400190895972 +settled_accuracy_p90_ci_high = 0.19822707314956245 +settled_accuracy_p95 = 0.22951009630570152 +settled_accuracy_p95_ci_low = 0.21253468410065612 +settled_accuracy_p95_ci_high = 0.2398479300237284 +settled_accuracy_p99 = 0.31237747038932984 +settled_accuracy_p99_ci_low = 0.2859352975907661 +settled_accuracy_p99_ci_high = 0.3407007367531245 +settled_accuracy_mean = 0.09260530353085974 +jitter_p10_per_min = 0.047619047619047616 +jitter_p10_per_min_ci_low = 0.043478260869565216 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13636363636363635 +jitter_p90_per_min_ci_high = 0.15 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.15384615384615385 +jitter_p95_per_min_ci_high = 0.15789473684210525 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.17647058823529413 +jitter_p99_per_min_ci_high = 0.1875 +jitter_mean_per_min = 0.0861758743934329 +reaction_rate = 0.509 +reaction_rate_ci_low = 0.47801469976908406 +reaction_rate_ci_high = 0.539985300230916 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 173.0451866404715 +fire_decisiveness_mean = 8.269058833087394 +fire_decisiveness_p50 = 6.013326005215653 +step_correction_mean = 1.674645109120427 +step_correction_p50 = 1.2634761333465576 + +[cell.spm_15.step_plus_10_at_15min] +shares_per_minute = 15 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.983 +convergence_rate_ci_low = 0.9749876983581495 +convergence_rate_ci_high = 0.9910123016418505 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 788.5452695829094 +settled_accuracy_p10 = 0.019099976164151267 +settled_accuracy_p10_ci_low = 0.016331979503488414 +settled_accuracy_p10_ci_high = 0.02272293976851225 +settled_accuracy_p50 = 0.07920206583050238 +settled_accuracy_p50_ci_low = 0.07593117973663677 +settled_accuracy_p50_ci_high = 0.08356999884755778 +settled_accuracy_p90 = 0.18936090214325585 +settled_accuracy_p90_ci_low = 0.17922197276026752 +settled_accuracy_p90_ci_high = 0.19649231722458227 +settled_accuracy_p95 = 0.22653335673602482 +settled_accuracy_p95_ci_low = 0.20966877687443142 +settled_accuracy_p95_ci_high = 0.23484167829022717 +settled_accuracy_p99 = 0.3205246912732913 +settled_accuracy_p99_ci_low = 0.2777042325622341 +settled_accuracy_p99_ci_high = 0.33769418941550433 +settled_accuracy_mean = 0.09433401217000963 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13333333333333333 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15384615384615385 +jitter_p95_per_min_ci_low = 0.15 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.19047619047619047 +jitter_p99_per_min_ci_low = 0.17647058823529413 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08302768176402923 +reaction_rate = 0.553 +reaction_rate_ci_low = 0.5221842743781686 +reaction_rate_ci_high = 0.5838157256218315 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 164.15913200723327 +fire_decisiveness_mean = 8.476121304988714 +fire_decisiveness_p50 = 6.16737375968134 +step_correction_mean = 0.6926219198738257 +step_correction_p50 = 1.091951847076416 + +[cell.spm_15.step_plus_25_at_15min] +shares_per_minute = 15 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.995 +convergence_rate_ci_low = 0.9906282772274537 +convergence_rate_ci_high = 0.9993717227725463 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 791.4572864321608 +settled_accuracy_p10 = 0.016531436045898573 +settled_accuracy_p10_ci_low = 0.014158574053716677 +settled_accuracy_p10_ci_high = 0.020380370883300802 +settled_accuracy_p50 = 0.07922281709903745 +settled_accuracy_p50_ci_low = 0.07392680044487276 +settled_accuracy_p50_ci_high = 0.08369301893887249 +settled_accuracy_p90 = 0.17485847546274513 +settled_accuracy_p90_ci_low = 0.1633665928433392 +settled_accuracy_p90_ci_high = 0.1851733223267641 +settled_accuracy_p95 = 0.2135860334539289 +settled_accuracy_p95_ci_low = 0.19731701990266315 +settled_accuracy_p95_ci_high = 0.22547332148924548 +settled_accuracy_p99 = 0.2915516062855126 +settled_accuracy_p99_ci_low = 0.2733626350310838 +settled_accuracy_p99_ci_high = 0.3387597380327718 +settled_accuracy_mean = 0.09019249693929902 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.045454545454545456 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.15789473684210525 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08843682935720949 +reaction_rate = 0.691 +reaction_rate_ci_low = 0.6623599128772274 +reaction_rate_ci_high = 0.7196400871227725 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 150.9985528219971 +fire_decisiveness_mean = 9.935224378930268 +fire_decisiveness_p50 = 6.950782564837173 +step_correction_mean = -0.4497222819307606 +step_correction_p50 = 0.6735008955001831 + +[cell.spm_15.step_plus_50_at_15min] +shares_per_minute = 15 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.986 +convergence_rate_ci_low = 0.9787178680044921 +convergence_rate_ci_high = 0.9932821319955079 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 835.0709939148073 +settled_accuracy_p10 = 0.011296748146072844 +settled_accuracy_p10_ci_low = 0.008569891331065005 +settled_accuracy_p10_ci_high = 0.013588918483400492 +settled_accuracy_p50 = 0.07299162633498546 +settled_accuracy_p50_ci_low = 0.06857604208208912 +settled_accuracy_p50_ci_high = 0.07659277742200143 +settled_accuracy_p90 = 0.17819872831388262 +settled_accuracy_p90_ci_low = 0.1674068177773348 +settled_accuracy_p90_ci_high = 0.18892639329856264 +settled_accuracy_p95 = 0.2212696442183344 +settled_accuracy_p95_ci_low = 0.19940146052151098 +settled_accuracy_p95_ci_high = 0.23052959362183056 +settled_accuracy_p99 = 0.2596262072101583 +settled_accuracy_p99_ci_low = 0.25200210346021357 +settled_accuracy_p99_ci_high = 0.26353373262808777 +settled_accuracy_mean = 0.08556895793625394 +jitter_p10_per_min = 0.05263157894736842 +jitter_p10_per_min_ci_low = 0.047619047619047616 +jitter_p10_per_min_ci_high = 0.05555555555555555 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.09523809523809523 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.15789473684210525 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.17391304347826086 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.21052631578947367 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.23529411764705882 +jitter_mean_per_min = 0.10312765200121116 +reaction_rate = 0.92 +reaction_rate_ci_low = 0.9031850732978107 +reaction_rate_ci_high = 0.9368149267021894 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 115.69565217391305 +fire_decisiveness_mean = 12.47827673329931 +fire_decisiveness_p50 = 8.722933070425288 +step_correction_mean = 0.5628602701036827 +step_correction_p50 = 0.5088602900505066 + +[cell.spm_20.cold_start_10gh_to_1ph] +shares_per_minute = 20 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 60 +convergence_p10_secs_ci_low = 60 +convergence_p10_secs_ci_high = 120 +convergence_p50_secs = 240 +convergence_p50_secs_ci_low = 240 +convergence_p50_secs_ci_high = 240 +convergence_p90_secs = 480 +convergence_p90_secs_ci_low = 420 +convergence_p90_secs_ci_high = 480 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 540 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 720 +convergence_p99_secs_ci_low = 660 +convergence_p99_secs_ci_high = 840 +convergence_mean_secs = 272.1 +settled_accuracy_p10 = 0.014229092619024719 +settled_accuracy_p10_ci_low = 0.011370053648839917 +settled_accuracy_p10_ci_high = 0.01591600815533767 +settled_accuracy_p50 = 0.06801584118177106 +settled_accuracy_p50_ci_low = 0.06397333737955058 +settled_accuracy_p50_ci_high = 0.07240872036749346 +settled_accuracy_p90 = 0.17038692488457774 +settled_accuracy_p90_ci_low = 0.1620648887694054 +settled_accuracy_p90_ci_high = 0.1818048271540721 +settled_accuracy_p95 = 0.199077843666007 +settled_accuracy_p95_ci_low = 0.18781482865663968 +settled_accuracy_p95_ci_high = 0.2128322081749201 +settled_accuracy_p99 = 0.25770065835809697 +settled_accuracy_p99_ci_low = 0.24878578253063632 +settled_accuracy_p99_ci_high = 0.29043099393396266 +settled_accuracy_mean = 0.08200748022251413 +jitter_p10_per_min = 0.043478260869565216 +jitter_p10_per_min_ci_low = 0.041666666666666664 +jitter_p10_per_min_ci_high = 0.043478260869565216 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.08695652173913043 +jitter_p90_per_min = 0.13043478260869565 +jitter_p90_per_min_ci_low = 0.125 +jitter_p90_per_min_ci_high = 0.13636363636363635 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.13636363636363635 +jitter_p95_per_min_ci_high = 0.14814814814814814 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.15384615384615385 +jitter_p99_per_min_ci_high = 0.17391304347826086 +jitter_mean_per_min = 0.0865265196413934 +bias_mean = -0.0002757084357033468 +bias_p10 = -0.06639416605825121 +bias_p10_ci_low = -0.07109884715835582 +bias_p10_ci_high = -0.0622842849556982 +bias_p50 = -0.0004061746386211548 +bias_p50_ci_low = -0.0040303676938150575 +bias_p50_ci_high = 0.0032048438867845392 +bias_p90 = 0.06861391185347376 +bias_p90_ci_low = 0.0632654589446879 +bias_p90_ci_high = 0.07427784000398217 +bias_p99 = 0.11653490412062877 +bias_p99_ci_low = 0.10768802723351206 +bias_p99_ci_high = 0.12952631854093716 +variance_mean = 0.02031067479467679 +variance_p10 = 0.0116579436060894 +variance_p10_ci_low = 0.01139637579118602 +variance_p10_ci_high = 0.012063143579537155 +variance_p50 = 0.019089091391410993 +variance_p50_ci_low = 0.018582989849257752 +variance_p50_ci_high = 0.019600038706875943 +variance_p90 = 0.030386255471936935 +variance_p90_ci_low = 0.0294290770422193 +variance_p90_ci_high = 0.03197227955815317 +variance_p99 = 0.043884063693180715 +variance_p99_ci_low = 0.04039965948837269 +variance_p99_ci_high = 0.04501959912101001 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0.001650408313822016 +ramp_target_overshoot_p50 = 0.0822630531943116 +ramp_target_overshoot_p50_ci_low = 0.07676160266975174 +ramp_target_overshoot_p50_ci_high = 0.08879475901240186 +ramp_target_overshoot_p90 = 0.1894136302533742 +ramp_target_overshoot_p90_ci_low = 0.1812278251338939 +ramp_target_overshoot_p90_ci_high = 0.19999991946936224 +ramp_target_overshoot_p99 = 0.2919798665352318 +ramp_target_overshoot_p99_ci_low = 0.26342692357998154 +ramp_target_overshoot_p99_ci_high = 0.31293823347053285 +ramp_target_overshoot_mean = 0.09237930420320946 + +[cell.spm_20.stable_1ph] +shares_per_minute = 20 +scenario = "stable_1ph" +convergence_rate = 0.968 +convergence_rate_ci_low = 0.9570914069834832 +convergence_rate_ci_high = 0.9789085930165168 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 770.0826446280992 +settled_accuracy_p10 = 0.009008090040769412 +settled_accuracy_p10_ci_low = 0.007544043044699578 +settled_accuracy_p10_ci_high = 0.011012900269985693 +settled_accuracy_p50 = 0.06509143817719976 +settled_accuracy_p50_ci_low = 0.0591133133854469 +settled_accuracy_p50_ci_high = 0.07073039476588439 +settled_accuracy_p90 = 0.16256015219216802 +settled_accuracy_p90_ci_low = 0.15541017240200272 +settled_accuracy_p90_ci_high = 0.16894824503943018 +settled_accuracy_p95 = 0.1913698536644225 +settled_accuracy_p95_ci_low = 0.1800507356440213 +settled_accuracy_p95_ci_high = 0.20457043582040346 +settled_accuracy_p99 = 0.2722957627261393 +settled_accuracy_p99_ci_low = 0.23727137771345463 +settled_accuracy_p99_ci_high = 0.3003930364889018 +settled_accuracy_mean = 0.07814387570203431 +jitter_p10_per_min = 0.045454545454545456 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.047619047619047616 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.07692307692307693 +jitter_p50_per_min_ci_high = 0.08333333333333333 +jitter_p90_per_min = 0.13636363636363635 +jitter_p90_per_min_ci_low = 0.13333333333333333 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15384615384615385 +jitter_p95_per_min_ci_low = 0.15 +jitter_p95_per_min_ci_high = 0.15789473684210525 +jitter_p99_per_min = 0.17647058823529413 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.08302203578405737 +bias_mean = 0.002902718217728134 +bias_p10 = -0.05585527336109124 +bias_p10_ci_low = -0.061290808852163654 +bias_p10_ci_high = -0.05233398292006628 +bias_p50 = 0.002780284951233712 +bias_p50_ci_low = -0.001476960154489411 +bias_p50_ci_high = 0.005792229704009046 +bias_p90 = 0.06682847697148177 +bias_p90_ci_low = 0.0626938503580182 +bias_p90_ci_high = 0.0725683158442981 +bias_p99 = 0.1085608839825511 +bias_p99_ci_low = 0.0976487918237413 +bias_p99_ci_high = 0.11932453486430741 +variance_mean = 0.021322772168851603 +variance_p10 = 0.012042838742047233 +variance_p10_ci_low = 0.011545103419755254 +variance_p10_ci_high = 0.012355065078813938 +variance_p50 = 0.020041709075925153 +variance_p50_ci_low = 0.01947030513840084 +variance_p50_ci_high = 0.02070417324610623 +variance_p90 = 0.03232665674900793 +variance_p90_ci_low = 0.031171603870097174 +variance_p90_ci_high = 0.033431965896609885 +variance_p99 = 0.046006299234909204 +variance_p99_ci_low = 0.042009804694068766 +variance_p99_ci_high = 0.051908519653179074 +upward_step_magnitude_p50 = 1.169825229191261 +upward_step_magnitude_p50_ci_low = 1.1653448411081426 +upward_step_magnitude_p50_ci_high = 1.1730350861407426 +upward_step_magnitude_p90 = 1.243214448843757 +upward_step_magnitude_p90_ci_low = 1.234725036855597 +upward_step_magnitude_p90_ci_high = 1.251318486814139 +upward_step_magnitude_p95 = 1.2731042659384633 +upward_step_magnitude_p95_ci_low = 1.2633355213060244 +upward_step_magnitude_p95_ci_high = 1.2793341718429174 +upward_step_magnitude_p99 = 1.3201247341726727 +upward_step_magnitude_p99_ci_low = 1.3003756819713534 +upward_step_magnitude_p99_ci_high = 1.329953592448488 +upward_step_magnitude_mean = 1.1696135906233496 +fire_decisiveness_mean = 6.951499235759935 +fire_decisiveness_p50 = 5.180254042838921 + +[cell.spm_20.step_minus_50_at_15min] +shares_per_minute = 20 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.954 +convergence_rate_ci_low = 0.9410159800369838 +convergence_rate_ci_high = 0.9669840199630161 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 1080 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 925.9748427672956 +settled_accuracy_p10 = 0.017700701307770572 +settled_accuracy_p10_ci_low = 0.014171647430693435 +settled_accuracy_p10_ci_high = 0.01950069528139453 +settled_accuracy_p50 = 0.07940280626455887 +settled_accuracy_p50_ci_low = 0.07275312306202175 +settled_accuracy_p50_ci_high = 0.0848859360690084 +settled_accuracy_p90 = 0.19623343442836438 +settled_accuracy_p90_ci_low = 0.1834574500604349 +settled_accuracy_p90_ci_high = 0.21091906865512033 +settled_accuracy_p95 = 0.23360347559495542 +settled_accuracy_p95_ci_low = 0.22114377530717233 +settled_accuracy_p95_ci_high = 0.24821320969553984 +settled_accuracy_p99 = 0.3237677252128206 +settled_accuracy_p99_ci_low = 0.28905405424449815 +settled_accuracy_p99_ci_high = 0.34546643714540104 +settled_accuracy_mean = 0.09579657128729775 +jitter_p10_per_min = 0.1 +jitter_p10_per_min_ci_low = 0.09523809523809523 +jitter_p10_per_min_ci_high = 0.1 +jitter_p50_per_min = 0.15 +jitter_p50_per_min_ci_low = 0.14285714285714285 +jitter_p50_per_min_ci_high = 0.15789473684210525 +jitter_p90_per_min = 0.19047619047619047 +jitter_p90_per_min_ci_low = 0.18181818181818182 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.2 +jitter_p95_per_min_ci_high = 0.21052631578947367 +jitter_p99_per_min = 0.22727272727272727 +jitter_p99_per_min_ci_low = 0.2222222222222222 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.1445924688007938 +reaction_rate = 0.994 +reaction_rate_ci_low = 0.9892134247733896 +reaction_rate_ci_high = 0.9987865752266104 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 60 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 60 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 101.58953722334005 +fire_decisiveness_mean = 8.697120625806164 +fire_decisiveness_p50 = 7.010317882511934 +step_correction_mean = 0.4180301306263302 +step_correction_p50 = 0.41350317001342773 + +[cell.spm_20.step_minus_25_at_15min] +shares_per_minute = 20 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.994 +convergence_rate_ci_low = 0.9892134247733896 +convergence_rate_ci_high = 0.9987865752266104 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 800.3420523138833 +settled_accuracy_p10 = 0.011736445418885078 +settled_accuracy_p10_ci_low = 0.00985909733567969 +settled_accuracy_p10_ci_high = 0.013380702049978876 +settled_accuracy_p50 = 0.0651008767012432 +settled_accuracy_p50_ci_low = 0.060257585292457394 +settled_accuracy_p50_ci_high = 0.0701675064073306 +settled_accuracy_p90 = 0.16898521824383983 +settled_accuracy_p90_ci_low = 0.16272646668881552 +settled_accuracy_p90_ci_high = 0.1766128116546799 +settled_accuracy_p95 = 0.20283510788555104 +settled_accuracy_p95_ci_low = 0.18659959478773502 +settled_accuracy_p95_ci_high = 0.21760773724034577 +settled_accuracy_p99 = 0.2784045198803744 +settled_accuracy_p99_ci_low = 0.24910711657283802 +settled_accuracy_p99_ci_high = 0.30537091918831205 +settled_accuracy_mean = 0.08029147670011581 +jitter_p10_per_min = 0.045454545454545456 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09523809523809523 +jitter_p90_per_min = 0.15384615384615385 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15789473684210525 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.16 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.09260392690326834 +reaction_rate = 0.787 +reaction_rate_ci_low = 0.761623411387659 +reaction_rate_ci_high = 0.8123765886123411 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 152.32528589580687 +fire_decisiveness_mean = 6.9810266436051265 +fire_decisiveness_p50 = 5.385749804097607 +step_correction_mean = 0.6664306119633449 +step_correction_p50 = 0.6040120720863342 + +[cell.spm_20.step_minus_10_at_15min] +shares_per_minute = 20 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.979 +convergence_rate_ci_low = 0.9701129614381392 +convergence_rate_ci_high = 0.9878870385618608 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 777.3033707865169 +settled_accuracy_p10 = 0.010095857556215782 +settled_accuracy_p10_ci_low = 0.008670838103965739 +settled_accuracy_p10_ci_high = 0.011906380151583962 +settled_accuracy_p50 = 0.07002116539016912 +settled_accuracy_p50_ci_low = 0.06565565919732574 +settled_accuracy_p50_ci_high = 0.0737656908913511 +settled_accuracy_p90 = 0.16281818456354435 +settled_accuracy_p90_ci_low = 0.1553430772918889 +settled_accuracy_p90_ci_high = 0.17052146197406692 +settled_accuracy_p95 = 0.18939232550483576 +settled_accuracy_p95_ci_low = 0.18000647973368222 +settled_accuracy_p95_ci_high = 0.20098247377441503 +settled_accuracy_p99 = 0.26581515459831806 +settled_accuracy_p99_ci_low = 0.23854002428595233 +settled_accuracy_p99_ci_high = 0.29358853094594783 +settled_accuracy_mean = 0.08035437782812595 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.043478260869565216 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.07692307692307693 +jitter_p50_per_min_ci_high = 0.08333333333333333 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13333333333333333 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15384615384615385 +jitter_p95_per_min_ci_low = 0.15 +jitter_p95_per_min_ci_high = 0.15789473684210525 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.08241568739257793 +reaction_rate = 0.541 +reaction_rate_ci_low = 0.5101140441235826 +reaction_rate_ci_high = 0.5718859558764174 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 173.3456561922366 +fire_decisiveness_mean = 6.8167180061253445 +fire_decisiveness_p50 = 5.082504419403545 +step_correction_mean = -1.104002727047573 +step_correction_p50 = 1.017459750175476 + +[cell.spm_20.step_minus_5_at_15min] +shares_per_minute = 20 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.968 +convergence_rate_ci_low = 0.9570914069834832 +convergence_rate_ci_high = 0.9789085930165168 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 782.0454545454545 +settled_accuracy_p10 = 0.013173611409863284 +settled_accuracy_p10_ci_low = 0.010312654549066269 +settled_accuracy_p10_ci_high = 0.01564787992853678 +settled_accuracy_p50 = 0.06413212732345897 +settled_accuracy_p50_ci_low = 0.060217349365146555 +settled_accuracy_p50_ci_high = 0.06890074196267149 +settled_accuracy_p90 = 0.16305349007421044 +settled_accuracy_p90_ci_low = 0.15369780793485321 +settled_accuracy_p90_ci_high = 0.1697101243188185 +settled_accuracy_p95 = 0.19508949602867398 +settled_accuracy_p95_ci_low = 0.18031918812684533 +settled_accuracy_p95_ci_high = 0.2056634513043596 +settled_accuracy_p99 = 0.25917337561050524 +settled_accuracy_p99_ci_low = 0.23167371698270345 +settled_accuracy_p99_ci_high = 0.30013125787513695 +settled_accuracy_mean = 0.07803817258181861 +jitter_p10_per_min = 0.047619047619047616 +jitter_p10_per_min_ci_low = 0.043478260869565216 +jitter_p10_per_min_ci_high = 0.047619047619047616 +jitter_p50_per_min = 0.07692307692307693 +jitter_p50_per_min_ci_low = 0.07142857142857142 +jitter_p50_per_min_ci_high = 0.08333333333333333 +jitter_p90_per_min = 0.13333333333333333 +jitter_p90_per_min_ci_low = 0.125 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.17647058823529413 +jitter_p99_per_min_ci_high = 0.1875 +jitter_mean_per_min = 0.0809242287508874 +reaction_rate = 0.494 +reaction_rate_ci_low = 0.46301191031379957 +reaction_rate_ci_high = 0.5249880896862004 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 177.69230769230768 +fire_decisiveness_mean = 6.768288166814178 +fire_decisiveness_p50 = 5.054497512143719 +step_correction_mean = 1.0549818979583772 +step_correction_p50 = 1.1691492795944214 + +[cell.spm_20.step_plus_5_at_15min] +shares_per_minute = 20 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.973 +convergence_rate_ci_low = 0.9629539722476991 +convergence_rate_ci_high = 0.9830460277523009 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 779.8150051387462 +settled_accuracy_p10 = 0.01654879153543687 +settled_accuracy_p10_ci_low = 0.012112511790389302 +settled_accuracy_p10_ci_high = 0.019940921186193394 +settled_accuracy_p50 = 0.07082580595515164 +settled_accuracy_p50_ci_low = 0.06562173683122652 +settled_accuracy_p50_ci_high = 0.07518781855142243 +settled_accuracy_p90 = 0.16646169700562785 +settled_accuracy_p90_ci_low = 0.15624044098068934 +settled_accuracy_p90_ci_high = 0.17675709235292514 +settled_accuracy_p95 = 0.19914397204487377 +settled_accuracy_p95_ci_low = 0.18857585903507157 +settled_accuracy_p95_ci_high = 0.21566796525524567 +settled_accuracy_p99 = 0.2594754847465375 +settled_accuracy_p99_ci_low = 0.23191495861811462 +settled_accuracy_p99_ci_high = 0.2828511017806348 +settled_accuracy_mean = 0.08187681348936848 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.07692307692307693 +jitter_p50_per_min_ci_high = 0.08695652173913043 +jitter_p90_per_min = 0.13636363636363635 +jitter_p90_per_min_ci_low = 0.13333333333333333 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15384615384615385 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.17647058823529413 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08125773131458393 +reaction_rate = 0.538 +reaction_rate_ci_low = 0.5070993085902598 +reaction_rate_ci_high = 0.5689006914097403 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 167.0631970260223 +fire_decisiveness_mean = 7.202361481496185 +fire_decisiveness_p50 = 5.492766399171206 +step_correction_mean = 1.1186940712113362 +step_correction_p50 = 1.432739019393921 + +[cell.spm_20.step_plus_10_at_15min] +shares_per_minute = 20 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.986 +convergence_rate_ci_low = 0.9787178680044921 +convergence_rate_ci_high = 0.9932821319955079 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 796.0649087221095 +settled_accuracy_p10 = 0.01057971261177526 +settled_accuracy_p10_ci_low = 0.00856290818586003 +settled_accuracy_p10_ci_high = 0.013422871201554387 +settled_accuracy_p50 = 0.07460901307445422 +settled_accuracy_p50_ci_low = 0.07002547757566413 +settled_accuracy_p50_ci_high = 0.08018771203732322 +settled_accuracy_p90 = 0.1750613451288756 +settled_accuracy_p90_ci_low = 0.16655267310777555 +settled_accuracy_p90_ci_high = 0.1851052239554002 +settled_accuracy_p95 = 0.199635635466352 +settled_accuracy_p95_ci_low = 0.1918095216132336 +settled_accuracy_p95_ci_high = 0.20883735904164147 +settled_accuracy_p99 = 0.2539064528041348 +settled_accuracy_p99_ci_low = 0.2273973528725065 +settled_accuracy_p99_ci_high = 0.26387931824957866 +settled_accuracy_mean = 0.08410472338427324 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.041666666666666664 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.13636363636363635 +jitter_p90_per_min_ci_low = 0.13333333333333333 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.15 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08302129025841307 +reaction_rate = 0.56 +reaction_rate_ci_low = 0.5292336183472934 +reaction_rate_ci_high = 0.5907663816527067 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 168.75 +fire_decisiveness_mean = 7.404287328860673 +fire_decisiveness_p50 = 5.375483145372023 +step_correction_mean = 1.1595423333346844 +step_correction_p50 = 1.033547043800354 + +[cell.spm_20.step_plus_25_at_15min] +shares_per_minute = 20 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.996 +convergence_rate_ci_low = 0.9920878478557194 +convergence_rate_ci_high = 0.9999121521442806 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 900 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 797.1686746987951 +settled_accuracy_p10 = 0.014556073266127179 +settled_accuracy_p10_ci_low = 0.012489979304700638 +settled_accuracy_p10_ci_high = 0.016491814973673025 +settled_accuracy_p50 = 0.0642032095001237 +settled_accuracy_p50_ci_low = 0.05995795656628533 +settled_accuracy_p50_ci_high = 0.06993129985248925 +settled_accuracy_p90 = 0.15000548682057113 +settled_accuracy_p90_ci_low = 0.14256654997956675 +settled_accuracy_p90_ci_high = 0.1569112571734006 +settled_accuracy_p95 = 0.1820872810345202 +settled_accuracy_p95_ci_low = 0.16898827538384653 +settled_accuracy_p95_ci_high = 0.19131576963771735 +settled_accuracy_p99 = 0.2460483617599316 +settled_accuracy_p99_ci_low = 0.21763844236143304 +settled_accuracy_p99_ci_high = 0.268334302206346 +settled_accuracy_mean = 0.07415943476513936 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.045454545454545456 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13636363636363635 +jitter_p90_per_min_ci_high = 0.15 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.15789473684210525 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.17647058823529413 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08575537903560392 +reaction_rate = 0.741 +reaction_rate_ci_low = 0.7138471726996984 +reaction_rate_ci_high = 0.7681528273003015 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 147.77327935222672 +fire_decisiveness_mean = 8.638799665399475 +fire_decisiveness_p50 = 6.183713890731241 +step_correction_mean = 0.7515462252855623 +step_correction_p50 = 0.6392421126365662 + +[cell.spm_20.step_plus_50_at_15min] +shares_per_minute = 20 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.99 +convergence_rate_ci_low = 0.9838330039727595 +convergence_rate_ci_high = 0.9961669960272405 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 868.5454545454545 +settled_accuracy_p10 = 0.011938129922938412 +settled_accuracy_p10_ci_low = 0.010007810576911691 +settled_accuracy_p10_ci_high = 0.013930994729627777 +settled_accuracy_p50 = 0.0626993636558617 +settled_accuracy_p50_ci_low = 0.057173261931888764 +settled_accuracy_p50_ci_high = 0.06900553880766869 +settled_accuracy_p90 = 0.14361592040566684 +settled_accuracy_p90_ci_low = 0.13920391529215048 +settled_accuracy_p90_ci_high = 0.15079835835614064 +settled_accuracy_p95 = 0.17431205138284078 +settled_accuracy_p95_ci_low = 0.16185575155618748 +settled_accuracy_p95_ci_high = 0.18269716964342209 +settled_accuracy_p99 = 0.2181788784068821 +settled_accuracy_p99_ci_low = 0.20294355580875978 +settled_accuracy_p99_ci_high = 0.23996107328010496 +settled_accuracy_mean = 0.07185155304673796 +jitter_p10_per_min = 0.05555555555555555 +jitter_p10_per_min_ci_low = 0.05263157894736842 +jitter_p10_per_min_ci_high = 0.06666666666666667 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.1 +jitter_p50_per_min_ci_high = 0.10526315789473684 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.17391304347826086 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.17647058823529413 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.19047619047619047 +jitter_p99_per_min_ci_high = 0.2222222222222222 +jitter_mean_per_min = 0.10727635446758228 +reaction_rate = 0.969 +reaction_rate_ci_low = 0.9582576621538884 +reaction_rate_ci_high = 0.9797423378461115 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 60 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 111.14551083591331 +fire_decisiveness_mean = 11.578756898009662 +fire_decisiveness_p50 = 8.245620806612465 +step_correction_mean = 0.49498295253459884 +step_correction_p50 = 0.47130510210990906 + +[cell.spm_25.cold_start_10gh_to_1ph] +shares_per_minute = 25 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 120 +convergence_p10_secs_ci_low = 120 +convergence_p10_secs_ci_high = 120 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 240 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 480 +convergence_p90_secs_ci_low = 420 +convergence_p90_secs_ci_high = 480 +convergence_p95_secs = 540 +convergence_p95_secs_ci_low = 480 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 780 +convergence_p99_secs_ci_low = 720 +convergence_p99_secs_ci_high = 840 +convergence_mean_secs = 285.54 +settled_accuracy_p10 = 0.011410184750033858 +settled_accuracy_p10_ci_low = 0.009514896188290267 +settled_accuracy_p10_ci_high = 0.013184207592952024 +settled_accuracy_p50 = 0.06411547395535155 +settled_accuracy_p50_ci_low = 0.05833834021389339 +settled_accuracy_p50_ci_high = 0.06750366632506022 +settled_accuracy_p90 = 0.1463567167685793 +settled_accuracy_p90_ci_low = 0.1386330232926145 +settled_accuracy_p90_ci_high = 0.15323940194995544 +settled_accuracy_p95 = 0.1751077650929347 +settled_accuracy_p95_ci_low = 0.16307514562120362 +settled_accuracy_p95_ci_high = 0.1908277482539784 +settled_accuracy_p99 = 0.24255982470090753 +settled_accuracy_p99_ci_low = 0.21150922401281358 +settled_accuracy_p99_ci_high = 0.25890767840170303 +settled_accuracy_mean = 0.0728268331574969 +jitter_p10_per_min = 0.043478260869565216 +jitter_p10_per_min_ci_low = 0.043478260869565216 +jitter_p10_per_min_ci_high = 0.045454545454545456 +jitter_p50_per_min = 0.08695652173913043 +jitter_p50_per_min_ci_low = 0.08695652173913043 +jitter_p50_per_min_ci_high = 0.08695652173913043 +jitter_p90_per_min = 0.13043478260869565 +jitter_p90_per_min_ci_low = 0.125 +jitter_p90_per_min_ci_high = 0.13636363636363635 +jitter_p95_per_min = 0.15 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.15384615384615385 +jitter_p99_per_min = 0.16 +jitter_p99_per_min_ci_low = 0.16 +jitter_p99_per_min_ci_high = 0.17391304347826086 +jitter_mean_per_min = 0.087629956862584 +bias_mean = -0.000983080512988216 +bias_p10 = -0.055765916141490054 +bias_p10_ci_low = -0.06127246340773468 +bias_p10_ci_high = -0.05151739872024596 +bias_p50 = -0.003042652356523019 +bias_p50_ci_low = -0.0064083738526357625 +bias_p50_ci_high = 0.0010029349214361353 +bias_p90 = 0.05810250553454755 +bias_p90_ci_low = 0.0540030686905961 +bias_p90_ci_high = 0.0634126604737641 +bias_p99 = 0.11630677636460673 +bias_p99_ci_low = 0.09834662865319159 +bias_p99_ci_high = 0.12766567934574113 +variance_mean = 0.016648733522453628 +variance_p10 = 0.009290214847123321 +variance_p10_ci_low = 0.008762734859555065 +variance_p10_ci_high = 0.00967927820277871 +variance_p50 = 0.015661563232201428 +variance_p50_ci_low = 0.015299610895300856 +variance_p50_ci_high = 0.016129921053767933 +variance_p90 = 0.025550209341356017 +variance_p90_ci_low = 0.024791344842003883 +variance_p90_ci_high = 0.026922264916674394 +variance_p99 = 0.03515613169713368 +variance_p99_ci_low = 0.03225955602432949 +variance_p99_ci_high = 0.03961402797458896 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.07494952910045072 +ramp_target_overshoot_p50_ci_low = 0.06861243899049208 +ramp_target_overshoot_p50_ci_high = 0.07884674221022103 +ramp_target_overshoot_p90 = 0.16752701349914956 +ramp_target_overshoot_p90_ci_low = 0.157311970523639 +ramp_target_overshoot_p90_ci_high = 0.1770360712161958 +ramp_target_overshoot_p99 = 0.2573227012311323 +ramp_target_overshoot_p99_ci_low = 0.24150460490964432 +ramp_target_overshoot_p99_ci_high = 0.2753520346501859 +ramp_target_overshoot_mean = 0.0797875464871495 + +[cell.spm_25.stable_1ph] +shares_per_minute = 25 +scenario = "stable_1ph" +convergence_rate = 0.967 +convergence_rate_ci_low = 0.9559279948699434 +convergence_rate_ci_high = 0.9780720051300565 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 803.3919338159255 +settled_accuracy_p10 = 0.008983326869631103 +settled_accuracy_p10_ci_low = 0.008000785979025427 +settled_accuracy_p10_ci_high = 0.01018511242177711 +settled_accuracy_p50 = 0.0598611745755917 +settled_accuracy_p50_ci_low = 0.054257114596641176 +settled_accuracy_p50_ci_high = 0.06738206506191036 +settled_accuracy_p90 = 0.14144730064992928 +settled_accuracy_p90_ci_low = 0.1352905320598845 +settled_accuracy_p90_ci_high = 0.152050635517595 +settled_accuracy_p95 = 0.1691403106106968 +settled_accuracy_p95_ci_low = 0.15981029934513158 +settled_accuracy_p95_ci_high = 0.1758149583109665 +settled_accuracy_p99 = 0.22767722595574935 +settled_accuracy_p99_ci_low = 0.216027865211308 +settled_accuracy_p99_ci_high = 0.27035135047530856 +settled_accuracy_mean = 0.07060950089727903 +jitter_p10_per_min = 0.047619047619047616 +jitter_p10_per_min_ci_low = 0.043478260869565216 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.07692307692307693 +jitter_p50_per_min_ci_low = 0.07142857142857142 +jitter_p50_per_min_ci_high = 0.07692307692307693 +jitter_p90_per_min = 0.13333333333333333 +jitter_p90_per_min_ci_low = 0.125 +jitter_p90_per_min_ci_high = 0.13333333333333333 +jitter_p95_per_min = 0.15384615384615385 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.17647058823529413 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08122414735851947 +bias_mean = -0.00004425122169657253 +bias_p10 = -0.057509136015431415 +bias_p10_ci_low = -0.061318132756303524 +bias_p10_ci_high = -0.05263949072933238 +bias_p50 = -0.0004937764315990677 +bias_p50_ci_low = -0.004066701846075513 +bias_p50_ci_high = 0.002552867136361145 +bias_p90 = 0.05716113769856414 +bias_p90_ci_low = 0.05293643332821339 +bias_p90_ci_high = 0.06129464112155245 +bias_p99 = 0.10951561707878085 +bias_p99_ci_low = 0.09963294665075886 +bias_p99_ci_high = 0.11768008157923152 +variance_mean = 0.016782405916551762 +variance_p10 = 0.009625723160110225 +variance_p10_ci_low = 0.009049389034598218 +variance_p10_ci_high = 0.009871131935773107 +variance_p50 = 0.015743774880085094 +variance_p50_ci_low = 0.015291440996809416 +variance_p50_ci_high = 0.016328292902558487 +variance_p90 = 0.02537972625927064 +variance_p90_ci_low = 0.024507202239188397 +variance_p90_ci_high = 0.02641542894511846 +variance_p99 = 0.034071919480614346 +variance_p99_ci_low = 0.032857221649228455 +variance_p99_ci_high = 0.03660288823177521 +upward_step_magnitude_p50 = 1.1501880160342424 +upward_step_magnitude_p50_ci_low = 1.1463184647156017 +upward_step_magnitude_p50_ci_high = 1.1532105331332534 +upward_step_magnitude_p90 = 1.2134618235451586 +upward_step_magnitude_p90_ci_low = 1.2072261045412933 +upward_step_magnitude_p90_ci_high = 1.2205432622990566 +upward_step_magnitude_p95 = 1.238943553114695 +upward_step_magnitude_p95_ci_low = 1.2306558538837626 +upward_step_magnitude_p95_ci_high = 1.2471840235988823 +upward_step_magnitude_p99 = 1.285957550205151 +upward_step_magnitude_p99_ci_low = 1.2707921003586968 +upward_step_magnitude_p99_ci_high = 1.3081515262285488 +upward_step_magnitude_mean = 1.1509164068622197 +fire_decisiveness_mean = 6.140338955386489 +fire_decisiveness_p50 = 4.725081859667657 + +[cell.spm_25.step_minus_50_at_15min] +shares_per_minute = 25 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.96 +convergence_rate_ci_low = 0.9478543242262935 +convergence_rate_ci_high = 0.9721456757737065 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 1140 +convergence_p50_secs_ci_low = 1080 +convergence_p50_secs_ci_high = 1140 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 981.25 +settled_accuracy_p10 = 0.013210111614792908 +settled_accuracy_p10_ci_low = 0.010709433983029815 +settled_accuracy_p10_ci_high = 0.016022308597296586 +settled_accuracy_p50 = 0.07936314492541885 +settled_accuracy_p50_ci_low = 0.07321798616899722 +settled_accuracy_p50_ci_high = 0.08502337502426827 +settled_accuracy_p90 = 0.18071417388215583 +settled_accuracy_p90_ci_low = 0.17114606036402136 +settled_accuracy_p90_ci_high = 0.19187867307788964 +settled_accuracy_p95 = 0.21061077052989363 +settled_accuracy_p95_ci_low = 0.20062456878360013 +settled_accuracy_p95_ci_high = 0.22026867570922826 +settled_accuracy_p99 = 0.2740826033622481 +settled_accuracy_p99_ci_low = 0.25125874420120686 +settled_accuracy_p99_ci_high = 0.3108954396237984 +settled_accuracy_mean = 0.08980651286164881 +jitter_p10_per_min = 0.1 +jitter_p10_per_min_ci_low = 0.1 +jitter_p10_per_min_ci_high = 0.1 +jitter_p50_per_min = 0.15789473684210525 +jitter_p50_per_min_ci_low = 0.15 +jitter_p50_per_min_ci_high = 0.15789473684210525 +jitter_p90_per_min = 0.2 +jitter_p90_per_min_ci_low = 0.2 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.21052631578947367 +jitter_p95_per_min_ci_low = 0.2 +jitter_p95_per_min_ci_high = 0.2222222222222222 +jitter_p99_per_min = 0.22727272727272727 +jitter_p99_per_min_ci_low = 0.2222222222222222 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.14898227457936727 +reaction_rate = 1 +reaction_rate_ci_low = 1 +reaction_rate_ci_high = 1 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 60 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 60 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 120 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 240 +reaction_mean_secs = 91.26 +fire_decisiveness_mean = 8.371321571055265 +fire_decisiveness_p50 = 6.687150764067958 +step_correction_mean = 0.396066826954484 +step_correction_p50 = 0.390637069940567 + +[cell.spm_25.step_minus_25_at_15min] +shares_per_minute = 25 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.997 +convergence_rate_ci_low = 0.9936102764714508 +convergence_rate_ci_high = 1 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 900 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 818.0341023069208 +settled_accuracy_p10 = 0.009061754560337976 +settled_accuracy_p10_ci_low = 0.007894060337668485 +settled_accuracy_p10_ci_high = 0.010565887884711578 +settled_accuracy_p50 = 0.0506679971520787 +settled_accuracy_p50_ci_low = 0.046408015983720685 +settled_accuracy_p50_ci_high = 0.054590197041465505 +settled_accuracy_p90 = 0.14959004090151007 +settled_accuracy_p90_ci_low = 0.1403145222417117 +settled_accuracy_p90_ci_high = 0.1595360218456352 +settled_accuracy_p95 = 0.18301284973672294 +settled_accuracy_p95_ci_low = 0.16985208580163458 +settled_accuracy_p95_ci_high = 0.19513458950984663 +settled_accuracy_p99 = 0.26107092682082667 +settled_accuracy_p99_ci_low = 0.2304037868726294 +settled_accuracy_p99_ci_high = 0.28632837655337995 +settled_accuracy_mean = 0.06809223835887152 +jitter_p10_per_min = 0.05555555555555555 +jitter_p10_per_min_ci_low = 0.05263157894736842 +jitter_p10_per_min_ci_high = 0.058823529411764705 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09523809523809523 +jitter_p90_per_min = 0.15384615384615385 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15789473684210525 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.17391304347826086 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.09706530614223913 +reaction_rate = 0.824 +reaction_rate_ci_low = 0.8003965214766975 +reaction_rate_ci_high = 0.8476034785233024 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 148.17961165048544 +fire_decisiveness_mean = 6.5790129924651515 +fire_decisiveness_p50 = 5.013377200129646 +step_correction_mean = 0.637844682861011 +step_correction_p50 = 0.5682539939880371 + +[cell.spm_25.step_minus_10_at_15min] +shares_per_minute = 25 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.985 +convergence_rate_ci_low = 0.9774661006112372 +convergence_rate_ci_high = 0.9925338993887628 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 802.4162436548223 +settled_accuracy_p10 = 0.010629000200953698 +settled_accuracy_p10_ci_low = 0.008065441581920019 +settled_accuracy_p10_ci_high = 0.01266023639470304 +settled_accuracy_p50 = 0.0678186524614599 +settled_accuracy_p50_ci_low = 0.06245307505865505 +settled_accuracy_p50_ci_high = 0.07249763161632816 +settled_accuracy_p90 = 0.14640618982338816 +settled_accuracy_p90_ci_low = 0.1400526208062085 +settled_accuracy_p90_ci_high = 0.15984145903618985 +settled_accuracy_p95 = 0.18278493584951805 +settled_accuracy_p95_ci_low = 0.1698069762647132 +settled_accuracy_p95_ci_high = 0.19414124700946123 +settled_accuracy_p99 = 0.2455470099459065 +settled_accuracy_p99_ci_low = 0.21863903968706389 +settled_accuracy_p99_ci_high = 0.26697405012062814 +settled_accuracy_mean = 0.07511411355341815 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.08 +jitter_p50_per_min_ci_low = 0.07692307692307693 +jitter_p50_per_min_ci_high = 0.08333333333333333 +jitter_p90_per_min = 0.13333333333333333 +jitter_p90_per_min_ci_low = 0.125 +jitter_p90_per_min_ci_high = 0.13333333333333333 +jitter_p95_per_min = 0.15 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.15384615384615385 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.1875 +jitter_mean_per_min = 0.07756220751405032 +reaction_rate = 0.565 +reaction_rate_ci_low = 0.5342726629855432 +reaction_rate_ci_high = 0.5957273370144567 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 170.76106194690266 +fire_decisiveness_mean = 6.244682470059268 +fire_decisiveness_p50 = 4.823444464958239 +step_correction_mean = 1.7762130802711555 +step_correction_p50 = 0.9720189571380615 + +[cell.spm_25.step_minus_5_at_15min] +shares_per_minute = 25 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.958 +convergence_rate_ci_low = 0.9455673567733969 +convergence_rate_ci_high = 0.970432643226603 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 785.7620041753653 +settled_accuracy_p10 = 0.013604662243556609 +settled_accuracy_p10_ci_low = 0.011514256430601 +settled_accuracy_p10_ci_high = 0.015652047742235276 +settled_accuracy_p50 = 0.060415426477187895 +settled_accuracy_p50_ci_low = 0.057226413229686135 +settled_accuracy_p50_ci_high = 0.06337619894401725 +settled_accuracy_p90 = 0.14754639747958875 +settled_accuracy_p90_ci_low = 0.13770604805573972 +settled_accuracy_p90_ci_high = 0.1546650939174432 +settled_accuracy_p95 = 0.1699098968127033 +settled_accuracy_p95_ci_low = 0.16226436046700132 +settled_accuracy_p95_ci_high = 0.17598487380319283 +settled_accuracy_p99 = 0.20938820521438695 +settled_accuracy_p99_ci_low = 0.19609782438005707 +settled_accuracy_p99_ci_high = 0.2250839090390908 +settled_accuracy_mean = 0.07119554336387636 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.045454545454545456 +jitter_p50_per_min = 0.07692307692307693 +jitter_p50_per_min_ci_low = 0.07142857142857142 +jitter_p50_per_min_ci_high = 0.07692307692307693 +jitter_p90_per_min = 0.13333333333333333 +jitter_p90_per_min_ci_low = 0.125 +jitter_p90_per_min_ci_high = 0.13636363636363635 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.15789473684210525 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.1875 +jitter_mean_per_min = 0.07849845712858448 +reaction_rate = 0.485 +reaction_rate_ci_low = 0.454023627714014 +reaction_rate_ci_high = 0.5159763722859859 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 175.79381443298968 +fire_decisiveness_mean = 6.098488993181224 +fire_decisiveness_p50 = 4.601547107527814 +step_correction_mean = 1.0922682657684248 +step_correction_p50 = 1.4170241355895996 + +[cell.spm_25.step_plus_5_at_15min] +shares_per_minute = 25 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.965 +convergence_rate_ci_low = 0.9536092124943004 +convergence_rate_ci_high = 0.9763907875056995 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 810.0310880829015 +settled_accuracy_p10 = 0.013369940262880187 +settled_accuracy_p10_ci_low = 0.011381025114184151 +settled_accuracy_p10_ci_high = 0.015298521342346105 +settled_accuracy_p50 = 0.0595338758542161 +settled_accuracy_p50_ci_low = 0.057118979168000905 +settled_accuracy_p50_ci_high = 0.06230553607267897 +settled_accuracy_p90 = 0.14148339234439922 +settled_accuracy_p90_ci_low = 0.13323999448301183 +settled_accuracy_p90_ci_high = 0.1499260715912305 +settled_accuracy_p95 = 0.17088027279180174 +settled_accuracy_p95_ci_low = 0.16003995342516641 +settled_accuracy_p95_ci_high = 0.18087898302324557 +settled_accuracy_p99 = 0.23486685408576058 +settled_accuracy_p99_ci_low = 0.2145540858500119 +settled_accuracy_p99_ci_high = 0.25280115616438437 +settled_accuracy_mean = 0.07016651877150122 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.07692307692307693 +jitter_p50_per_min_ci_low = 0.07142857142857142 +jitter_p50_per_min_ci_high = 0.08333333333333333 +jitter_p90_per_min = 0.13333333333333333 +jitter_p90_per_min_ci_low = 0.13043478260869565 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.15 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.0782106077506518 +reaction_rate = 0.532 +reaction_rate_ci_low = 0.5010732122327585 +reaction_rate_ci_high = 0.5629267877672416 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 171.09022556390977 +fire_decisiveness_mean = 6.28392323811853 +fire_decisiveness_p50 = 4.667105331584285 +step_correction_mean = 1.1235264192958523 +step_correction_p50 = 1.5276868343353271 + +[cell.spm_25.step_plus_10_at_15min] +shares_per_minute = 25 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.981 +convergence_rate_ci_low = 0.9725381099983514 +convergence_rate_ci_high = 0.9894618900016485 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 807.7675840978593 +settled_accuracy_p10 = 0.010020634755913194 +settled_accuracy_p10_ci_low = 0.008410388037490835 +settled_accuracy_p10_ci_high = 0.01163454195789626 +settled_accuracy_p50 = 0.06806132310496615 +settled_accuracy_p50_ci_low = 0.0635935198947587 +settled_accuracy_p50_ci_high = 0.07162675610936231 +settled_accuracy_p90 = 0.14785187267593614 +settled_accuracy_p90_ci_low = 0.13985871875632383 +settled_accuracy_p90_ci_high = 0.15505192182402872 +settled_accuracy_p95 = 0.16908871712679863 +settled_accuracy_p95_ci_low = 0.16266523956614232 +settled_accuracy_p95_ci_high = 0.17500497368203827 +settled_accuracy_p99 = 0.21022053376317174 +settled_accuracy_p99_ci_low = 0.19430816769187664 +settled_accuracy_p99_ci_high = 0.22766835067212887 +settled_accuracy_mean = 0.07284964435656843 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.07692307692307693 +jitter_p50_per_min_ci_high = 0.08333333333333333 +jitter_p90_per_min = 0.13333333333333333 +jitter_p90_per_min_ci_low = 0.13043478260869565 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15384615384615385 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.17647058823529413 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.07983413550808445 +reaction_rate = 0.559 +reaction_rate_ci_low = 0.5282261898621572 +reaction_rate_ci_high = 0.5897738101378429 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 167.54919499105546 +fire_decisiveness_mean = 6.842471905090714 +fire_decisiveness_p50 = 4.982254131600531 +step_correction_mean = -2.300850825574189 +step_correction_p50 = 1.0035722255706787 + +[cell.spm_25.step_plus_25_at_15min] +shares_per_minute = 25 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.988 +convergence_rate_ci_low = 0.9812512216216562 +convergence_rate_ci_high = 0.9947487783783437 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 900 +convergence_p50_secs_ci_low = 840 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 820.9919028340081 +settled_accuracy_p10 = 0.010415510157275154 +settled_accuracy_p10_ci_low = 0.008292830003266305 +settled_accuracy_p10_ci_high = 0.012416964862658753 +settled_accuracy_p50 = 0.055736540700290105 +settled_accuracy_p50_ci_low = 0.05217612028313279 +settled_accuracy_p50_ci_high = 0.059502260548600416 +settled_accuracy_p90 = 0.14783985699477276 +settled_accuracy_p90_ci_low = 0.13159672062076022 +settled_accuracy_p90_ci_high = 0.15534257409838437 +settled_accuracy_p95 = 0.1795592633529992 +settled_accuracy_p95_ci_low = 0.166697125142244 +settled_accuracy_p95_ci_high = 0.1881653038377893 +settled_accuracy_p99 = 0.22702316039576398 +settled_accuracy_p99_ci_low = 0.21101098588179856 +settled_accuracy_p99_ci_high = 0.25446177296674644 +settled_accuracy_mean = 0.06845847325083701 +jitter_p10_per_min = 0.043478260869565216 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.08695652173913043 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.15 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15789473684210525 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.17647058823529413 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.19047619047619047 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08969603740160083 +reaction_rate = 0.808 +reaction_rate_ci_low = 0.7835874938279578 +reaction_rate_ci_high = 0.8324125061720423 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 138.04455445544554 +fire_decisiveness_mean = 7.957437530859388 +fire_decisiveness_p50 = 5.834289996386445 +step_correction_mean = 0.670784958739682 +step_correction_p50 = 0.5863725543022156 + +[cell.spm_25.step_plus_50_at_15min] +shares_per_minute = 25 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.978 +convergence_rate_ci_low = 0.9689084728675541 +convergence_rate_ci_high = 0.9870915271324459 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 904.5398773006135 +settled_accuracy_p10 = 0.011155103705116187 +settled_accuracy_p10_ci_low = 0.009473176632049496 +settled_accuracy_p10_ci_high = 0.012863874323531421 +settled_accuracy_p50 = 0.058158062132249055 +settled_accuracy_p50_ci_low = 0.054988376297471664 +settled_accuracy_p50_ci_high = 0.06196188198664787 +settled_accuracy_p90 = 0.13441976916161602 +settled_accuracy_p90_ci_low = 0.12884928610933333 +settled_accuracy_p90_ci_high = 0.14586200932347915 +settled_accuracy_p95 = 0.1604578291929103 +settled_accuracy_p95_ci_low = 0.1531888655479292 +settled_accuracy_p95_ci_high = 0.17592973290403946 +settled_accuracy_p99 = 0.22740527337869232 +settled_accuracy_p99_ci_low = 0.2085619098502478 +settled_accuracy_p99_ci_high = 0.2434024157938115 +settled_accuracy_mean = 0.067826828530859 +jitter_p10_per_min = 0.07692307692307693 +jitter_p10_per_min_ci_low = 0.05555555555555555 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.10526315789473684 +jitter_p50_per_min_ci_low = 0.1 +jitter_p50_per_min_ci_high = 0.1111111111111111 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.17647058823529413 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.18181818181818182 +jitter_p95_per_min_ci_high = 0.19047619047619047 +jitter_p99_per_min = 0.21739130434782608 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.2222222222222222 +jitter_mean_per_min = 0.11259244325702873 +reaction_rate = 0.983 +reaction_rate_ci_low = 0.9749876983581495 +reaction_rate_ci_high = 0.9910123016418505 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 60 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 60 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 103.51983723296033 +fire_decisiveness_mean = 10.338410504803056 +fire_decisiveness_p50 = 7.256447383212766 +step_correction_mean = 0.45128454213406766 +step_correction_p50 = 0.4341546595096588 + +[cell.spm_30.cold_start_10gh_to_1ph] +shares_per_minute = 30 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 60 +convergence_p10_secs_ci_low = 60 +convergence_p10_secs_ci_high = 60 +convergence_p50_secs = 120 +convergence_p50_secs_ci_low = 60 +convergence_p50_secs_ci_high = 120 +convergence_p90_secs = 420 +convergence_p90_secs_ci_low = 420 +convergence_p90_secs_ci_high = 480 +convergence_p95_secs = 540 +convergence_p95_secs_ci_low = 540 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 720 +convergence_p99_secs_ci_low = 660 +convergence_p99_secs_ci_high = 720 +convergence_mean_secs = 199.5 +settled_accuracy_p10 = 0.009295181764696014 +settled_accuracy_p10_ci_low = 0.006955431190898587 +settled_accuracy_p10_ci_high = 0.011974704521345636 +settled_accuracy_p50 = 0.06275316399842934 +settled_accuracy_p50_ci_low = 0.05849537495769619 +settled_accuracy_p50_ci_high = 0.06588902703621557 +settled_accuracy_p90 = 0.1330844623449139 +settled_accuracy_p90_ci_low = 0.1247688686807692 +settled_accuracy_p90_ci_high = 0.13946906553120253 +settled_accuracy_p95 = 0.16263746160450188 +settled_accuracy_p95_ci_low = 0.14973215845396204 +settled_accuracy_p95_ci_high = 0.16881255091465697 +settled_accuracy_p99 = 0.22458699694607698 +settled_accuracy_p99_ci_low = 0.206720469633205 +settled_accuracy_p99_ci_high = 0.23680859498129037 +settled_accuracy_mean = 0.06820882520496223 +jitter_p10_per_min = 0.037037037037037035 +jitter_p10_per_min_ci_low = 0.037037037037037035 +jitter_p10_per_min_ci_high = 0.04 +jitter_p50_per_min = 0.07407407407407407 +jitter_p50_per_min_ci_low = 0.07407407407407407 +jitter_p50_per_min_ci_high = 0.07692307692307693 +jitter_p90_per_min = 0.125 +jitter_p90_per_min_ci_low = 0.12 +jitter_p90_per_min_ci_high = 0.125 +jitter_p95_per_min = 0.13636363636363635 +jitter_p95_per_min_ci_low = 0.13043478260869565 +jitter_p95_per_min_ci_high = 0.14814814814814814 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.15 +jitter_p99_per_min_ci_high = 0.17647058823529413 +jitter_mean_per_min = 0.08063076593785891 +bias_mean = -0.00009536061088055287 +bias_p10 = -0.05235858361711052 +bias_p10_ci_low = -0.057950041257647106 +bias_p10_ci_high = -0.04869828952466047 +bias_p50 = -0.0021361493418638956 +bias_p50_ci_low = -0.004843306822659131 +bias_p50_ci_high = 0.0010670203553443376 +bias_p90 = 0.05480290393056233 +bias_p90_ci_low = 0.050977525562570174 +bias_p90_ci_high = 0.05865623490679686 +bias_p99 = 0.10099137842170043 +bias_p99_ci_low = 0.0881837504579606 +bias_p99_ci_high = 0.11090154582409276 +variance_mean = 0.013707423550639796 +variance_p10 = 0.007821902328415068 +variance_p10_ci_low = 0.007510566522116221 +variance_p10_ci_high = 0.008165948819355435 +variance_p50 = 0.013069035527676616 +variance_p50_ci_low = 0.012690362645734098 +variance_p50_ci_high = 0.013444887531817273 +variance_p90 = 0.020081846110580823 +variance_p90_ci_low = 0.019537292593871183 +variance_p90_ci_high = 0.020779576806573656 +variance_p99 = 0.030012676148080383 +variance_p99_ci_low = 0.026648513228801966 +variance_p99_ci_high = 0.03150298015065994 +ramp_target_overshoot_p10 = 0.000004966056000643704 +ramp_target_overshoot_p10_ci_low = 0.000004966056000643704 +ramp_target_overshoot_p10_ci_high = 0.000004966056000643704 +ramp_target_overshoot_p50 = 0.0793986455149367 +ramp_target_overshoot_p50_ci_low = 0.07224665245882522 +ramp_target_overshoot_p50_ci_high = 0.08492043002555305 +ramp_target_overshoot_p90 = 0.15740739932948844 +ramp_target_overshoot_p90_ci_low = 0.15317363526237981 +ramp_target_overshoot_p90_ci_high = 0.16435611963389962 +ramp_target_overshoot_p99 = 0.2597621084692663 +ramp_target_overshoot_p99_ci_low = 0.23059941436777986 +ramp_target_overshoot_p99_ci_high = 0.27058394980095857 +ramp_target_overshoot_mean = 0.07913391439767678 + +[cell.spm_30.stable_1ph] +shares_per_minute = 30 +scenario = "stable_1ph" +convergence_rate = 0.952 +convergence_rate_ci_low = 0.938750631954693 +convergence_rate_ci_high = 0.9652493680453069 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 800.609243697479 +settled_accuracy_p10 = 0.007611286127302441 +settled_accuracy_p10_ci_low = 0.006129992152960506 +settled_accuracy_p10_ci_high = 0.008776564456957403 +settled_accuracy_p50 = 0.05328913632971288 +settled_accuracy_p50_ci_low = 0.048522729202107096 +settled_accuracy_p50_ci_high = 0.059251960300274575 +settled_accuracy_p90 = 0.1303049473796034 +settled_accuracy_p90_ci_low = 0.12423776912416418 +settled_accuracy_p90_ci_high = 0.1356927154870684 +settled_accuracy_p95 = 0.14870015832994488 +settled_accuracy_p95_ci_low = 0.14237622155750151 +settled_accuracy_p95_ci_high = 0.16567709053005997 +settled_accuracy_p99 = 0.2188132186478624 +settled_accuracy_p99_ci_low = 0.19594278593459924 +settled_accuracy_p99_ci_high = 0.23718091496360594 +settled_accuracy_mean = 0.0635740816437055 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.043478260869565216 +jitter_p50_per_min = 0.07142857142857142 +jitter_p50_per_min_ci_low = 0.07142857142857142 +jitter_p50_per_min_ci_high = 0.07692307692307693 +jitter_p90_per_min = 0.125 +jitter_p90_per_min_ci_low = 0.125 +jitter_p90_per_min_ci_high = 0.13333333333333333 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.15384615384615385 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.21428571428571427 +jitter_mean_per_min = 0.0760279898064592 +bias_mean = -0.001382631646162194 +bias_p10 = -0.05245160356791555 +bias_p10_ci_low = -0.056444093605578095 +bias_p10_ci_high = -0.04996620909711596 +bias_p50 = -0.0028319552451403977 +bias_p50_ci_low = -0.006418683893507571 +bias_p50_ci_high = 0.0006588041944128379 +bias_p90 = 0.050428045241081 +bias_p90_ci_low = 0.04670871300777026 +bias_p90_ci_high = 0.055203875866133054 +bias_p99 = 0.09585859221234333 +bias_p99_ci_low = 0.0883579544750344 +bias_p99_ci_high = 0.10254893632290234 +variance_mean = 0.01368091781461145 +variance_p10 = 0.007683146302619623 +variance_p10_ci_low = 0.007320946848172538 +variance_p10_ci_high = 0.007879827464968563 +variance_p50 = 0.013009184739684588 +variance_p50_ci_low = 0.012535378076162059 +variance_p50_ci_high = 0.013412136950682685 +variance_p90 = 0.020680022565416106 +variance_p90_ci_low = 0.020014070752438926 +variance_p90_ci_high = 0.021437761062178165 +variance_p99 = 0.0298106143451124 +variance_p99_ci_low = 0.028568408534639923 +variance_p99_ci_high = 0.031180755180515756 +upward_step_magnitude_p50 = 1.1359098068330515 +upward_step_magnitude_p50_ci_low = 1.1325750676325328 +upward_step_magnitude_p50_ci_high = 1.1388796498808775 +upward_step_magnitude_p90 = 1.1973355237316798 +upward_step_magnitude_p90_ci_low = 1.1922619177289588 +upward_step_magnitude_p90_ci_high = 1.2024543591017895 +upward_step_magnitude_p95 = 1.2149444557723537 +upward_step_magnitude_p95_ci_low = 1.2081901670280695 +upward_step_magnitude_p95_ci_high = 1.218395925635355 +upward_step_magnitude_p99 = 1.2389945318640263 +upward_step_magnitude_p99_ci_low = 1.2305455847848181 +upward_step_magnitude_p99_ci_high = 1.2543469433231544 +upward_step_magnitude_mean = 1.1344334093298791 +fire_decisiveness_mean = 5.570752425347125 +fire_decisiveness_p50 = 4.072111452969947 + +[cell.spm_30.step_minus_50_at_15min] +shares_per_minute = 30 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.937 +convergence_rate_ci_low = 0.9219409997144565 +convergence_rate_ci_high = 0.9520590002855436 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 1140 +convergence_p50_secs_ci_low = 1140 +convergence_p50_secs_ci_high = 1200 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1010.7790821771612 +settled_accuracy_p10 = 0.010767818695469389 +settled_accuracy_p10_ci_low = 0.008806763446150168 +settled_accuracy_p10_ci_high = 0.012707264890299497 +settled_accuracy_p50 = 0.07014319219824539 +settled_accuracy_p50_ci_low = 0.0638392538675343 +settled_accuracy_p50_ci_high = 0.07588341606402349 +settled_accuracy_p90 = 0.17211309910684136 +settled_accuracy_p90_ci_low = 0.16549858094949776 +settled_accuracy_p90_ci_high = 0.18071632136583182 +settled_accuracy_p95 = 0.20099648611272647 +settled_accuracy_p95_ci_low = 0.18714977980574798 +settled_accuracy_p95_ci_high = 0.2081018385077511 +settled_accuracy_p99 = 0.24123254557144902 +settled_accuracy_p99_ci_low = 0.22964673692204252 +settled_accuracy_p99_ci_high = 0.27112478014297003 +settled_accuracy_mean = 0.08226906695391052 +jitter_p10_per_min = 0.1 +jitter_p10_per_min_ci_low = 0.1 +jitter_p10_per_min_ci_high = 0.1 +jitter_p50_per_min = 0.16 +jitter_p50_per_min_ci_low = 0.15789473684210525 +jitter_p50_per_min_ci_high = 0.16666666666666666 +jitter_p90_per_min = 0.21052631578947367 +jitter_p90_per_min_ci_low = 0.2 +jitter_p90_per_min_ci_high = 0.21052631578947367 +jitter_p95_per_min = 0.2222222222222222 +jitter_p95_per_min_ci_low = 0.21052631578947367 +jitter_p95_per_min_ci_high = 0.2222222222222222 +jitter_p99_per_min = 0.25 +jitter_p99_per_min_ci_low = 0.23529411764705882 +jitter_p99_per_min_ci_high = 0.2727272727272727 +jitter_mean_per_min = 0.1546959077384922 +reaction_rate = 0.999 +reaction_rate_ci_low = 0.9970409802451226 +reaction_rate_ci_high = 1 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 60 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 60 +reaction_p90_secs = 120 +reaction_p90_secs_ci_low = 120 +reaction_p90_secs_ci_high = 120 +reaction_p99_secs = 180 +reaction_p99_secs_ci_low = 180 +reaction_p99_secs_ci_high = 240 +reaction_mean_secs = 86.78678678678679 +fire_decisiveness_mean = 8.10643389325307 +fire_decisiveness_p50 = 6.354238701184613 +step_correction_mean = 0.38038895584202864 +step_correction_p50 = 0.38174858689308167 + +[cell.spm_30.step_minus_25_at_15min] +shares_per_minute = 30 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.997 +convergence_rate_ci_low = 0.9936102764714508 +convergence_rate_ci_high = 1 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 900 +convergence_p50_secs_ci_low = 840 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 832.9588766298897 +settled_accuracy_p10 = 0.007737025597378544 +settled_accuracy_p10_ci_low = 0.006744977639774108 +settled_accuracy_p10_ci_high = 0.009288135126112373 +settled_accuracy_p50 = 0.049010855619217475 +settled_accuracy_p50_ci_low = 0.045485761244022926 +settled_accuracy_p50_ci_high = 0.05201804852615066 +settled_accuracy_p90 = 0.13738750205688666 +settled_accuracy_p90_ci_low = 0.12856053903986542 +settled_accuracy_p90_ci_high = 0.14957536643005276 +settled_accuracy_p95 = 0.1680585790584017 +settled_accuracy_p95_ci_low = 0.1586493795427668 +settled_accuracy_p95_ci_high = 0.18552477923197208 +settled_accuracy_p99 = 0.23540098127474818 +settled_accuracy_p99_ci_low = 0.20304574023805388 +settled_accuracy_p99_ci_high = 0.2519520849873804 +settled_accuracy_mean = 0.06327217672788094 +jitter_p10_per_min = 0.05263157894736842 +jitter_p10_per_min_ci_low = 0.05 +jitter_p10_per_min_ci_high = 0.05555555555555555 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.15 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15789473684210525 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.15789473684210525 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.17647058823529413 +jitter_p99_per_min_ci_high = 0.19047619047619047 +jitter_mean_per_min = 0.09379375761400054 +reaction_rate = 0.825 +reaction_rate_ci_low = 0.801449394912232 +reaction_rate_ci_high = 0.8485506050877679 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 137.16363636363636 +fire_decisiveness_mean = 6.1436298056407175 +fire_decisiveness_p50 = 4.741444263045942 +step_correction_mean = 0.5887233780369614 +step_correction_p50 = 0.5450048446655273 + +[cell.spm_30.step_minus_10_at_15min] +shares_per_minute = 30 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.984 +convergence_rate_ci_low = 0.976222972907338 +convergence_rate_ci_high = 0.991777027092662 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 819.6951219512196 +settled_accuracy_p10 = 0.007879624593012613 +settled_accuracy_p10_ci_low = 0.006711706656714611 +settled_accuracy_p10_ci_high = 0.00942939196759085 +settled_accuracy_p50 = 0.052735114974261865 +settled_accuracy_p50_ci_low = 0.0470500993770433 +settled_accuracy_p50_ci_high = 0.058232896839880866 +settled_accuracy_p90 = 0.13008680531606598 +settled_accuracy_p90_ci_low = 0.1256224999617852 +settled_accuracy_p90_ci_high = 0.13928944388748232 +settled_accuracy_p95 = 0.15786040535991042 +settled_accuracy_p95_ci_low = 0.14756471251867387 +settled_accuracy_p95_ci_high = 0.16734363354980908 +settled_accuracy_p99 = 0.22360845109385585 +settled_accuracy_p99_ci_low = 0.19879323348777067 +settled_accuracy_p99_ci_high = 0.25984679046263737 +settled_accuracy_mean = 0.06474694641618169 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.07692307692307693 +jitter_p50_per_min_ci_low = 0.07142857142857142 +jitter_p50_per_min_ci_high = 0.08333333333333333 +jitter_p90_per_min = 0.13333333333333333 +jitter_p90_per_min_ci_low = 0.125 +jitter_p90_per_min_ci_high = 0.13636363636363635 +jitter_p95_per_min = 0.15 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.15384615384615385 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.17391304347826086 +jitter_p99_per_min_ci_high = 0.1875 +jitter_mean_per_min = 0.07449543242241784 +reaction_rate = 0.564 +reaction_rate_ci_low = 0.5332646001099709 +reaction_rate_ci_high = 0.594735399890029 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 170.74468085106383 +fire_decisiveness_mean = 5.528968744387372 +fire_decisiveness_p50 = 4.1243557209619155 +step_correction_mean = 1.0811537384775514 +step_correction_p50 = 0.9465927481651306 + +[cell.spm_30.step_minus_5_at_15min] +shares_per_minute = 30 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.965 +convergence_rate_ci_low = 0.9536092124943004 +convergence_rate_ci_high = 0.9763907875056995 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 804.4352331606218 +settled_accuracy_p10 = 0.011869085722249872 +settled_accuracy_p10_ci_low = 0.010258826175537195 +settled_accuracy_p10_ci_high = 0.013382284658426169 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.04997752559443791 +settled_accuracy_p50_ci_high = 0.05586812980945388 +settled_accuracy_p90 = 0.13829201440537697 +settled_accuracy_p90_ci_low = 0.13189993036925485 +settled_accuracy_p90_ci_high = 0.14572576930246983 +settled_accuracy_p95 = 0.16515314984639495 +settled_accuracy_p95_ci_low = 0.15199331341400946 +settled_accuracy_p95_ci_high = 0.17064314945998915 +settled_accuracy_p99 = 0.20751607981377362 +settled_accuracy_p99_ci_low = 0.196866680046055 +settled_accuracy_p99_ci_high = 0.21686936016218583 +settled_accuracy_mean = 0.0646417743640322 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.07692307692307693 +jitter_p50_per_min_ci_low = 0.07142857142857142 +jitter_p50_per_min_ci_high = 0.07692307692307693 +jitter_p90_per_min = 0.13333333333333333 +jitter_p90_per_min_ci_low = 0.125 +jitter_p90_per_min_ci_high = 0.13636363636363635 +jitter_p95_per_min = 0.15384615384615385 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.07676048115685177 +reaction_rate = 0.494 +reaction_rate_ci_low = 0.46301191031379957 +reaction_rate_ci_high = 0.5249880896862004 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 169.79757085020242 +fire_decisiveness_mean = 5.541683413822718 +fire_decisiveness_p50 = 4.144332989564582 +step_correction_mean = 0.8289637353256164 +step_correction_p50 = 1.362821340560913 + +[cell.spm_30.step_plus_5_at_15min] +shares_per_minute = 30 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.962 +convergence_rate_ci_low = 0.9501495346251718 +convergence_rate_ci_high = 0.9738504653748281 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 809.9376299376299 +settled_accuracy_p10 = 0.015308619629357034 +settled_accuracy_p10_ci_low = 0.011755045212843096 +settled_accuracy_p10_ci_high = 0.017172073148923328 +settled_accuracy_p50 = 0.05725300516712728 +settled_accuracy_p50_ci_low = 0.054401069958248005 +settled_accuracy_p50_ci_high = 0.060741579850159266 +settled_accuracy_p90 = 0.13751802512274847 +settled_accuracy_p90_ci_low = 0.12916776437603006 +settled_accuracy_p90_ci_high = 0.14940671285546447 +settled_accuracy_p95 = 0.17075500290229884 +settled_accuracy_p95_ci_low = 0.15714417375496104 +settled_accuracy_p95_ci_high = 0.18141713224243716 +settled_accuracy_p99 = 0.20848143621672666 +settled_accuracy_p99_ci_low = 0.19889049225825683 +settled_accuracy_p99_ci_high = 0.22343150274398582 +settled_accuracy_mean = 0.06808509519680729 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.07692307692307693 +jitter_p50_per_min_ci_low = 0.07142857142857142 +jitter_p50_per_min_ci_high = 0.08333333333333333 +jitter_p90_per_min = 0.13043478260869565 +jitter_p90_per_min_ci_low = 0.125 +jitter_p90_per_min_ci_high = 0.13333333333333333 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.15789473684210525 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.17647058823529413 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.07614977932432909 +reaction_rate = 0.508 +reaction_rate_ci_low = 0.477013645945352 +reaction_rate_ci_high = 0.538986354054648 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 171.49606299212599 +fire_decisiveness_mean = 5.739886835266717 +fire_decisiveness_p50 = 4.313968722415506 +step_correction_mean = 1.0504826863450327 +step_correction_p50 = 1.2744752168655396 + +[cell.spm_30.step_plus_10_at_15min] +shares_per_minute = 30 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.982 +convergence_rate_ci_low = 0.9737596042813467 +convergence_rate_ci_high = 0.9902403957186533 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 840 +convergence_p50_secs_ci_high = 900 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 840.8553971486762 +settled_accuracy_p10 = 0.008069169961559486 +settled_accuracy_p10_ci_low = 0.007053324765361468 +settled_accuracy_p10_ci_high = 0.009737191312183868 +settled_accuracy_p50 = 0.05383881926954204 +settled_accuracy_p50_ci_low = 0.048233642808916066 +settled_accuracy_p50_ci_high = 0.05867016950540216 +settled_accuracy_p90 = 0.13574775168524078 +settled_accuracy_p90_ci_low = 0.13059964760524756 +settled_accuracy_p90_ci_high = 0.14002581983087714 +settled_accuracy_p95 = 0.1574629603294484 +settled_accuracy_p95_ci_low = 0.14963611437961788 +settled_accuracy_p95_ci_high = 0.1649636571940063 +settled_accuracy_p99 = 0.2020093370394509 +settled_accuracy_p99_ci_low = 0.1902467391649839 +settled_accuracy_p99_ci_high = 0.2149133346962534 +settled_accuracy_mean = 0.06443671478433319 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.07692307692307693 +jitter_p50_per_min_ci_high = 0.08333333333333333 +jitter_p90_per_min = 0.13333333333333333 +jitter_p90_per_min_ci_low = 0.125 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.15384615384615385 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.07688182203533982 +reaction_rate = 0.597 +reaction_rate_ci_low = 0.5665984476448981 +reaction_rate_ci_high = 0.6274015523551019 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 161.80904522613065 +fire_decisiveness_mean = 6.093593501974112 +fire_decisiveness_p50 = 4.517035418999775 +step_correction_mean = 1.2479671542368942 +step_correction_p50 = 0.9512125253677368 + +[cell.spm_30.step_plus_25_at_15min] +shares_per_minute = 30 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.994 +convergence_rate_ci_low = 0.9892134247733896 +convergence_rate_ci_high = 0.9987865752266104 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 841.8108651911468 +settled_accuracy_p10 = 0.006492916632754309 +settled_accuracy_p10_ci_low = 0.005591080899357559 +settled_accuracy_p10_ci_high = 0.0073985104624327835 +settled_accuracy_p50 = 0.04556852802670086 +settled_accuracy_p50_ci_low = 0.03964791577053961 +settled_accuracy_p50_ci_high = 0.04993779813783106 +settled_accuracy_p90 = 0.12715250333235772 +settled_accuracy_p90_ci_low = 0.12177144632804993 +settled_accuracy_p90_ci_high = 0.1332494239912143 +settled_accuracy_p95 = 0.15606992679013698 +settled_accuracy_p95_ci_low = 0.14106862648882346 +settled_accuracy_p95_ci_high = 0.16346988680399255 +settled_accuracy_p99 = 0.1935189804263313 +settled_accuracy_p99_ci_low = 0.1773750577941522 +settled_accuracy_p99_ci_high = 0.21179884392368442 +settled_accuracy_mean = 0.05724537974274439 +jitter_p10_per_min = 0.045454545454545456 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.15384615384615385 +jitter_p90_per_min_ci_low = 0.15 +jitter_p90_per_min_ci_high = 0.15789473684210525 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.19047619047619047 +jitter_p99_per_min_ci_low = 0.19047619047619047 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.09181773371702392 +reaction_rate = 0.821 +reaction_rate_ci_low = 0.7972395771418099 +reaction_rate_ci_high = 0.84476042285819 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 136.1510353227771 +fire_decisiveness_mean = 7.305912990308405 +fire_decisiveness_p50 = 5.419223047619095 +step_correction_mean = 0.6469635618952683 +step_correction_p50 = 0.551231861114502 + +[cell.spm_30.step_plus_50_at_15min] +shares_per_minute = 30 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.973 +convergence_rate_ci_low = 0.9629539722476991 +convergence_rate_ci_high = 0.9830460277523009 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 904.7482014388489 +settled_accuracy_p10 = 0.009323389649003588 +settled_accuracy_p10_ci_low = 0.007992934063036361 +settled_accuracy_p10_ci_high = 0.010032596117116932 +settled_accuracy_p50 = 0.04772701832367243 +settled_accuracy_p50_ci_low = 0.04507111794686969 +settled_accuracy_p50_ci_high = 0.052130970373584384 +settled_accuracy_p90 = 0.12302835277894675 +settled_accuracy_p90_ci_low = 0.11685684274630592 +settled_accuracy_p90_ci_high = 0.12935161832129238 +settled_accuracy_p95 = 0.14764943152976628 +settled_accuracy_p95_ci_low = 0.13779659768800123 +settled_accuracy_p95_ci_high = 0.1596470646448943 +settled_accuracy_p99 = 0.1894431315465256 +settled_accuracy_p99_ci_low = 0.1784446151892769 +settled_accuracy_p99_ci_high = 0.20209708934543003 +settled_accuracy_mean = 0.058384907807185644 +jitter_p10_per_min = 0.08 +jitter_p10_per_min_ci_low = 0.05555555555555555 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.10526315789473684 +jitter_p50_per_min_ci_low = 0.1 +jitter_p50_per_min_ci_high = 0.1111111111111111 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.18181818181818182 +jitter_p95_per_min = 0.19047619047619047 +jitter_p95_per_min_ci_low = 0.18181818181818182 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.2222222222222222 +jitter_p99_per_min_ci_low = 0.21052631578947367 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.1146182799980886 +reaction_rate = 0.989 +reaction_rate_ci_low = 0.9825352674919994 +reaction_rate_ci_high = 0.9954647325080006 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 60 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 60 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 94.27704752275025 +fire_decisiveness_mean = 9.905696764285842 +fire_decisiveness_p50 = 6.931498756198941 +step_correction_mean = 0.42635169320930966 +step_correction_p50 = 0.4081234633922577 + +[derived.operational_fitness.spm_6] +score = 0.46718330947725834 +reaction_10_component = 0.53 +reaction_50_component = 0.853 +jitter_component = 0.7048426060851103 +step_safety_component = 0 +convergence_component = 0.6 +overshoot_component = 0.36172657955980747 + +[derived.operational_fitness.spm_8] +score = 0.5348286203487381 +reaction_10_component = 0.56 +reaction_50_component = 0.922 +jitter_component = 0.7109732388363275 +step_safety_component = 0.11019340878916228 +convergence_component = 0.7 +overshoot_component = 0.48336958442365674 + +[derived.operational_fitness.spm_10] +score = 0.5471637772617421 +reaction_10_component = 0.521 +reaction_50_component = 0.941 +jitter_component = 0.7114344220817046 +step_safety_component = 0.21229050541766492 +convergence_component = 0.6 +overshoot_component = 0.5398254538689973 + +[derived.operational_fitness.spm_12] +score = 0.5779287269573834 +reaction_10_component = 0.53 +reaction_50_component = 0.965 +jitter_component = 0.7175546203190502 +step_safety_component = 0.2942140548645842 +convergence_component = 0.6 +overshoot_component = 0.589865581614748 + +[derived.operational_fitness.spm_15] +score = 0.6146858039854174 +reaction_10_component = 0.586 +reaction_50_component = 0.985 +jitter_component = 0.7148425806951374 +step_safety_component = 0.37560148046255293 +convergence_component = 0.6 +overshoot_component = 0.656747886959949 + +[derived.operational_fitness.spm_20] +score = 0.6356148505571974 +reaction_10_component = 0.541 +reaction_50_component = 0.994 +jitter_component = 0.7232598807198087 +step_safety_component = 0.45379146812307347 +convergence_component = 0.6 +overshoot_component = 0.7080201334647682 + +[derived.operational_fitness.spm_25] +score = 0.6468591638541064 +reaction_10_component = 0.565 +reaction_50_component = 1 +jitter_component = 0.7292528421382685 +step_safety_component = 0.5221128937706099 +convergence_component = 0.5 +overshoot_component = 0.7426772987688677 + +[derived.operational_fitness.spm_30] +score = 0.7076949030948472 +reaction_10_component = 0.564 +reaction_50_component = 0.999 +jitter_component = 0.7465733673118027 +step_safety_component = 0.5701110884552927 +convergence_component = 0.8 +overshoot_component = 0.7402378915307337 + +[derived.decoupling_score.spm_6] +score = 0.7046521739130435 +score_ci_low = 0.6799518719335497 +score_ci_high = 0.7291230934010142 + +[derived.decoupling_score.spm_8] +score = 0.7683333333333334 +score_ci_low = 0.7407642705077354 +score_ci_high = 0.782184539297677 + +[derived.decoupling_score.spm_10] +score = 0.7773478260869565 +score_ci_low = 0.7579602242930361 +score_ci_high = 0.796336808590426 + +[derived.decoupling_score.spm_12] +score = 0.8041666666666667 +score_ci_low = 0.7946743437452504 +score_ci_high = 0.8261768201971303 + +[derived.decoupling_score.spm_15] +score = 0.8208333333333333 +score_ci_low = 0.807471996157109 +score_ci_high = 0.8398363764058762 + +[derived.decoupling_score.spm_20] +score = 0.8283333333333334 +score_ci_low = 0.8243445206444914 +score_ci_high = 0.8451271021148242 + +[derived.decoupling_score.spm_25] +score = 0.8461538461538461 +score_ci_low = 0.8461538461538461 +score_ci_high = 0.8571428571428572 + +[derived.decoupling_score.spm_30] +score = 0.8562857142857143 +score_ci_low = 0.8436500602074114 +score_ci_high = 0.8571428571428572 + +[derived.reaction_asymmetry.spm_6] +asymmetry_at_5 = 0.020000000000000018 +asymmetry_at_5_ci_low = -0.04178887721580571 +asymmetry_at_5_ci_high = 0.08178887721580574 +asymmetry_at_10 = 0.013000000000000012 +asymmetry_at_10_ci_low = -0.048809994372440824 +asymmetry_at_10_ci_high = 0.07480999437244085 +asymmetry_at_25 = 0.04200000000000004 +asymmetry_at_25_ci_low = -0.018078461722175088 +asymmetry_at_25_ci_high = 0.10207846172217516 +asymmetry_at_50 = -0.06399999999999995 +asymmetry_at_50_ci_low = -0.11123695339842543 +asymmetry_at_50_ci_high = -0.01676304660157446 +max_abs_asymmetry = 0.06399999999999995 +max_abs_asymmetry_ci_low = 0.01676304660157446 +max_abs_asymmetry_ci_high = 0.11123695339842543 + +[derived.reaction_asymmetry.spm_8] +asymmetry_at_5 = 0.04200000000000004 +asymmetry_at_5_ci_low = -0.0199214764803492 +asymmetry_at_5_ci_high = 0.10392147648034927 +asymmetry_at_10 = 0.005999999999999894 +asymmetry_at_10_ci_low = -0.05548552862002987 +asymmetry_at_10_ci_high = 0.06748552862002966 +asymmetry_at_25 = 0.015000000000000013 +asymmetry_at_25_ci_low = -0.04489107327726127 +asymmetry_at_25_ci_high = 0.0748910732772613 +asymmetry_at_50 = -0.08300000000000007 +asymmetry_at_50_ci_low = -0.12240125151106929 +asymmetry_at_50_ci_high = -0.04359874848893086 +max_abs_asymmetry = 0.08300000000000007 +max_abs_asymmetry_ci_low = 0.04359874848893086 +max_abs_asymmetry_ci_high = 0.12240125151106929 + +[derived.reaction_asymmetry.spm_10] +asymmetry_at_5 = 0.030000000000000027 +asymmetry_at_5_ci_low = -0.03192841052693596 +asymmetry_at_5_ci_high = 0.09192841052693596 +asymmetry_at_10 = 0.040000000000000036 +asymmetry_at_10_ci_low = -0.021721802021331116 +asymmetry_at_10_ci_high = 0.10172180202133124 +asymmetry_at_25 = 0.02200000000000002 +asymmetry_at_25_ci_low = -0.03657686872527666 +asymmetry_at_25_ci_high = 0.0805768687252767 +asymmetry_at_50 = -0.08999999999999997 +asymmetry_at_50_ci_low = -0.126674762470934 +asymmetry_at_50_ci_high = -0.05332523752906593 +max_abs_asymmetry = 0.08999999999999997 +max_abs_asymmetry_ci_low = 0.05332523752906593 +max_abs_asymmetry_ci_high = 0.126674762470934 + +[derived.reaction_asymmetry.spm_12] +asymmetry_at_5 = -0.029000000000000026 +asymmetry_at_5_ci_low = -0.09092847250764008 +asymmetry_at_5_ci_high = 0.03292847250764008 +asymmetry_at_10 = 0.03499999999999992 +asymmetry_at_10_ci_low = -0.02666182521128979 +asymmetry_at_10_ci_high = 0.09666182521128963 +asymmetry_at_25 = 0.04499999999999993 +asymmetry_at_25_ci_low = -0.011250923914718713 +asymmetry_at_25_ci_high = 0.10125092391471857 +asymmetry_at_50 = -0.06499999999999995 +asymmetry_at_50_ci_low = -0.09498498014748957 +asymmetry_at_50_ci_high = -0.03501501985251032 +max_abs_asymmetry = 0.06499999999999995 +max_abs_asymmetry_ci_low = 0.03501501985251032 +max_abs_asymmetry_ci_high = 0.09498498014748957 + +[derived.reaction_asymmetry.spm_15] +asymmetry_at_5 = 0.019000000000000017 +asymmetry_at_5_ci_low = -0.04296942261642167 +asymmetry_at_5_ci_high = 0.08096942261642176 +asymmetry_at_10 = -0.03299999999999992 +asymmetry_at_10_ci_low = -0.0943441963729188 +asymmetry_at_10_ci_high = 0.02834419637291896 +asymmetry_at_25 = -0.041000000000000036 +asymmetry_at_25_ci_low = -0.09709240435829936 +asymmetry_at_25_ci_high = 0.015092404358299283 +asymmetry_at_50 = -0.06499999999999995 +asymmetry_at_50_ci_low = -0.08934882609095207 +asymmetry_at_50_ci_high = -0.04065117390904782 +max_abs_asymmetry = 0.06499999999999995 +max_abs_asymmetry_ci_low = 0.04065117390904782 +max_abs_asymmetry_ci_high = 0.08934882609095207 + +[derived.reaction_asymmetry.spm_20] +asymmetry_at_5 = 0.04400000000000004 +asymmetry_at_5_ci_low = -0.01788878109594061 +asymmetry_at_5_ci_high = 0.10588878109594074 +asymmetry_at_10 = 0.019000000000000017 +asymmetry_at_10_ci_low = -0.04265233752912401 +asymmetry_at_10_ci_high = 0.08065233752912404 +asymmetry_at_25 = -0.04600000000000004 +asymmetry_at_25_ci_low = -0.09852941591264264 +asymmetry_at_25_ci_high = 0.0065294159126425555 +asymmetry_at_50 = -0.025000000000000022 +asymmetry_at_50_ci_low = -0.040528913072721995 +asymmetry_at_50_ci_high = -0.00947108692727805 +max_abs_asymmetry = 0.04600000000000004 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.09852941591264264 + +[derived.reaction_asymmetry.spm_25] +asymmetry_at_5 = 0.04700000000000004 +asymmetry_at_5_ci_low = -0.014903160053227449 +asymmetry_at_5_ci_high = 0.10890316005322759 +asymmetry_at_10 = -0.005999999999999894 +asymmetry_at_10_ci_low = -0.06750114715229949 +asymmetry_at_10_ci_high = 0.0555011471522997 +asymmetry_at_25 = -0.015999999999999903 +asymmetry_at_25_ci_low = -0.06401598469534464 +asymmetry_at_25_ci_high = 0.032015984695344835 +asymmetry_at_50 = -0.017000000000000015 +asymmetry_at_50_ci_low = -0.02501230164185053 +asymmetry_at_50_ci_high = -0.008987698358149498 +max_abs_asymmetry = 0.04700000000000004 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.10890316005322756 + +[derived.reaction_asymmetry.spm_30] +asymmetry_at_5 = 0.014000000000000012 +asymmetry_at_5_ci_low = -0.04797444374084836 +asymmetry_at_5_ci_high = 0.07597444374084844 +asymmetry_at_10 = 0.03300000000000003 +asymmetry_at_10_ci_low = -0.02813695224513091 +asymmetry_at_10_ci_high = 0.09413695224513097 +asymmetry_at_25 = -0.0040000000000000036 +asymmetry_at_25_ci_low = -0.05131102794595799 +asymmetry_at_25_ci_high = 0.04331102794595798 +asymmetry_at_50 = -0.010000000000000009 +asymmetry_at_50_ci_low = -0.017464732508000624 +asymmetry_at_50_ci_high = -0.0015762477371219497 +max_abs_asymmetry = 0.03300000000000003 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.09413695224513097 + diff --git a/sv2/channels-sv2/sim/baseline_EWMA-AdaCUSUM-tau120-s15-f5-eta20.md b/sv2/channels-sv2/sim/baseline_EWMA-AdaCUSUM-tau120-s15-f5-eta20.md new file mode 100644 index 0000000000..984d21b139 --- /dev/null +++ b/sv2/channels-sv2/sim/baseline_EWMA-AdaCUSUM-tau120-s15-f5-eta20.md @@ -0,0 +1,227 @@ +# Vardiff baseline characterization — `EWMA-AdaCUSUM-tau120-s15-f5-eta20` + +*Generated by `cargo run --release --bin generate-baseline` from the vardiff_sim crate. 1000 trials per cell, base seed `0xdeadbeefcafef00d`.* + +## Summary + +Headline per-metric values at each share rate's best and worst cells. ↑ = higher is better; ↓ = lower is better; ↔ = near-zero is better. Where a `(floor: X.X%)` annotation appears, it's the Poisson-noise lower bound on that metric at that share rate — the algorithm cannot do better than this without exotic estimation techniques. + +| Metric | Dir | Best | Worst | +| --- | :-: | --- | --- | +| cold-start convergence rate | ↑ | 99.8% @ SPM=30 | 85.7% @ SPM=6 | +| cold-start p90 time | ↓ | 18m @ SPM=30 | 22m @ SPM=6 | +| settled accuracy p50 (stable) | ↓ | 2.7% @ SPM=20 (floor: 4.8%) | 5.7% @ SPM=6 (floor: 8.7%) | +| settled accuracy p99 (stable) | ↓ | 8.2% @ SPM=30 (floor: 14.9%) | 23.2% @ SPM=6 (floor: 33.3%) | +| stable-load jitter (mean) | ↓ | 0.024/min @ SPM=30 (floor: 0.020/min) | 0.169/min @ SPM=6 (floor: 0.020/min) | +| reaction rate at −50% step | ↑ | 100.0% @ SPM=15 | 99.4% @ SPM=8 | +| reaction rate at +50% step | ↑ | 98.8% @ SPM=30 | 97.3% @ SPM=8 | +| ramp target overshoot p99 (cold start) | ↓ | 0.0% @ SPM=20 (floor: 52.0%) | 19.8% @ SPM=6 (floor: 95.0%) | +| upward step magnitude p95 (stable) | ↓ | 1.048 @ SPM=30 | 1.126 @ SPM=6 | +| operational fitness | ↑ | 0.723 @ SPM=30 | 0.601 @ SPM=6 | +| decoupling score | ↑ | 0.995 @ SPM=30 | 0.665 @ SPM=6 | +| max |reaction asymmetry| | ↓ | 0.020 @ SPM=12 | 0.051 @ SPM=10 | + +## Convergence time (cold start: 10 GH/s → 1 PH/s) + +| share/min | rate | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 85.7% | 8m | 14m | 22m | 25m | 14m27s | +| 8 | 93.8% | 8m | 14m | 21m | 25m | 14m10s | +| 10 | 96.3% | 8m | 14m | 21m | 25m | 14m27s | +| 12 | 97.6% | 9m | 14m | 21m | 25m | 14m23s | +| 15 | 97.3% | 9m | 14m | 21m | 24m | 14m23s | +| 20 | 98.5% | 9m | 14m | 20m | 24m | 14m29s | +| 25 | 99.6% | 8m | 13m | 20m | 23m | 14m07s | +| 30 | 99.8% | 8m | 13m | 18m | 23m | 13m33s | + +## Settled accuracy (stable load, post-convergence) + +`|final_hashrate / true_hashrate - 1|` at trial end. Smaller is better. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 1.0% | 5.7% | 14.1% | 23.2% | 6.8% | +| 8 | 0.9% | 4.8% | 11.8% | 18.0% | 5.6% | +| 10 | 0.8% | 4.1% | 9.7% | 15.8% | 4.8% | +| 12 | 0.6% | 3.7% | 9.2% | 14.2% | 4.4% | +| 15 | 0.5% | 3.1% | 7.9% | 12.3% | 3.9% | +| 20 | 0.4% | 2.7% | 7.3% | 10.3% | 3.2% | +| 25 | 0.4% | 2.8% | 4.8% | 8.5% | 2.8% | +| 30 | 0.4% | 3.0% | 4.4% | 8.2% | 2.9% | + +## Steady-state jitter (fires per minute) + +Post-convergence rate of vardiff fires. Smaller is better — ideal is zero under stable load. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.118 | 0.167 | 0.222 | 0.278 | 0.169 | +| 8 | 0.091 | 0.136 | 0.182 | 0.217 | 0.138 | +| 10 | 0.067 | 0.111 | 0.167 | 0.200 | 0.115 | +| 12 | 0.053 | 0.100 | 0.143 | 0.176 | 0.098 | +| 15 | 0.048 | 0.077 | 0.118 | 0.167 | 0.078 | +| 20 | 0.000 | 0.059 | 0.091 | 0.125 | 0.055 | +| 25 | 0.000 | 0.053 | 0.083 | 0.105 | 0.041 | +| 30 | 0.000 | 0.000 | 0.077 | 0.100 | 0.024 | + +## Reaction time to a 50% drop (step at 15 min) + +| share/min | reacted | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 99.7% | 1m | 2m | 3m | 5m | 1m59s | +| 8 | 99.4% | 1m | 2m | 3m | 5m | 2m03s | +| 10 | 99.6% | 1m | 2m | 3m | 5m | 2m01s | +| 12 | 99.8% | 1m | 2m | 3m | 4m | 1m58s | +| 15 | 100.0% | 1m | 2m | 4m | 5m | 2m04s | +| 20 | 99.7% | 1m | 2m | 4m | 4m | 2m01s | +| 25 | 99.9% | 1m | 2m | 4m | 5m | 1m55s | +| 30 | 99.5% | 1m | 1m | 4m | 5m | 1m44s | + +## Reaction sensitivity (P[fire within 5 min of step change]) + +| Δ% | 6 | 8 | 10 | 12 | 15 | 20 | 25 | 30 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| -50% | 1.00 | 0.99 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 0.99 | +| -25% | 0.89 | 0.88 | 0.87 | 0.83 | 0.82 | 0.80 | 0.77 | 0.83 | +| -10% | 0.83 | 0.75 | 0.67 | 0.61 | 0.53 | 0.47 | 0.45 | 0.45 | +| -5% | 0.82 | 0.71 | 0.62 | 0.57 | 0.48 | 0.39 | 0.39 | 0.36 | +| +5% | 0.83 | 0.72 | 0.64 | 0.55 | 0.44 | 0.40 | 0.40 | 0.35 | +| +10% | 0.81 | 0.75 | 0.67 | 0.61 | 0.55 | 0.48 | 0.48 | 0.50 | +| +25% | 0.91 | 0.86 | 0.82 | 0.81 | 0.81 | 0.77 | 0.80 | 0.82 | +| +50% | 0.98 | 0.97 | 0.98 | 0.98 | 0.98 | 0.99 | 0.98 | 0.99 | + +## Estimator bias + +`E[H̃ − H_true] / H_true` averaged over post-settle ticks. Positive = systematic over-estimate. Populated only for algorithms that expose introspection (e.g. ClassicComposed, Parametric, EWMA-60s). + +### Bias — stable load + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | -11.4% | -0.4% | 11.6% | 23.3% | -0.1% | +| 8 | -8.9% | -0.3% | 10.5% | 20.6% | 0.4% | +| 10 | -8.3% | -0.1% | 8.6% | 14.5% | -0.1% | +| 12 | -7.7% | -0.3% | 8.4% | 16.5% | 0.0% | +| 15 | -7.4% | -0.0% | 7.5% | 13.3% | -0.1% | +| 20 | -6.2% | -0.2% | 6.3% | 11.5% | -0.1% | +| 25 | -6.0% | -0.3% | 5.4% | 10.0% | -0.3% | +| 30 | -5.0% | -0.1% | 5.2% | 9.9% | 0.0% | + +### Bias — cold start + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | -9.8% | 0.3% | 10.6% | 21.3% | 0.4% | +| 8 | -9.0% | -0.6% | 8.8% | 15.6% | -0.3% | +| 10 | -7.8% | -0.2% | 8.3% | 17.0% | 0.2% | +| 12 | -7.6% | -0.0% | 7.1% | 13.6% | -0.1% | +| 15 | -6.2% | 0.1% | 6.9% | 13.0% | 0.2% | +| 20 | -5.0% | 0.5% | 5.8% | 10.4% | 0.3% | +| 25 | -5.1% | -0.3% | 4.9% | 9.4% | -0.2% | +| 30 | -4.7% | -0.0% | 4.7% | 9.0% | 0.0% | + +## Estimator variance + +Population variance of `H̃ / H_true` over post-settle ticks (dimensionless). Populated only for algorithms that expose introspection. + +### Variance — stable load + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.016 | 0.030 | 0.052 | 0.091 | 0.033 | +| 8 | 0.013 | 0.022 | 0.040 | 0.065 | 0.025 | +| 10 | 0.010 | 0.018 | 0.032 | 0.050 | 0.020 | +| 12 | 0.008 | 0.015 | 0.026 | 0.041 | 0.016 | +| 15 | 0.006 | 0.012 | 0.021 | 0.033 | 0.013 | +| 20 | 0.005 | 0.009 | 0.016 | 0.024 | 0.010 | +| 25 | 0.004 | 0.007 | 0.012 | 0.019 | 0.008 | +| 30 | 0.003 | 0.006 | 0.011 | 0.017 | 0.007 | + +### Variance — cold start + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.015 | 0.027 | 0.049 | 0.080 | 0.030 | +| 8 | 0.011 | 0.021 | 0.037 | 0.058 | 0.023 | +| 10 | 0.008 | 0.015 | 0.027 | 0.047 | 0.017 | +| 12 | 0.007 | 0.012 | 0.023 | 0.036 | 0.014 | +| 15 | 0.005 | 0.010 | 0.019 | 0.027 | 0.011 | +| 20 | 0.004 | 0.007 | 0.013 | 0.020 | 0.008 | +| 25 | 0.003 | 0.006 | 0.011 | 0.016 | 0.007 | +| 30 | 0.003 | 0.005 | 0.008 | 0.013 | 0.005 | + +## Ramp target overshoot (cold start) + +`max(new_hashrate on fires) / H_true − 1`: how far the algorithm's actual *target* (not its belief) climbs past truth during the cold-start ramp. Reads `new_hashrate` (the actual target the algorithm set), so it's unaffected by estimator-belief noise. Works for any algorithm that fires, including those without introspection. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.0% | 0.0% | 10.0% | 19.8% | 3.3% | +| 8 | 0.0% | 0.0% | 5.0% | 12.9% | 1.4% | +| 10 | 0.0% | 0.0% | 2.5% | 10.7% | 0.7% | +| 12 | 0.0% | 0.0% | 0.0% | 5.7% | 0.2% | +| 15 | 0.0% | 0.0% | 0.0% | 2.9% | 0.1% | +| 20 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | +| 25 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | +| 30 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | + +## Upward step magnitude (stable load) + +`new_hashrate / old_hashrate` for upward difficulty adjustments during steady-state. Per-trial p95 of ratios, then distribution across trials. Values near 1.0 indicate gentle retargeting; values >> 1.0 indicate aggressive jumps. + +| share/min | p50 | p90 | p95 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 1.079 | 1.116 | 1.126 | 1.167 | 1.082 | +| 8 | 1.066 | 1.097 | 1.109 | 1.128 | 1.068 | +| 10 | 1.056 | 1.082 | 1.092 | 1.107 | 1.057 | +| 12 | 1.050 | 1.076 | 1.085 | 1.105 | 1.051 | +| 15 | 1.043 | 1.066 | 1.072 | 1.088 | 1.042 | +| 20 | 1.037 | 1.058 | 1.064 | 1.075 | 1.033 | +| 25 | 1.031 | 1.049 | 1.055 | 1.064 | 1.026 | +| 30 | 1.026 | 1.044 | 1.048 | 1.057 | 1.020 | + +## Operational fitness (per share rate) + +`0.15×react(-10%) + 0.1×react(-50%) + 0.25×jitter + 0.25×step_safety + 0.15×convergence + 0.1×overshoot`. Higher is better. + +| share/min | fitness | react-10% | react-50% | jitter | step-safe | conv | overshoot | +| --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.601 | 0.834 | 0.997 | 0.438 | 0.747 | 0.000 | 0.802 | +| 8 | 0.630 | 0.748 | 0.994 | 0.541 | 0.783 | 0.000 | 0.871 | +| 10 | 0.648 | 0.669 | 0.996 | 0.618 | 0.815 | 0.000 | 0.893 | +| 12 | 0.663 | 0.615 | 0.998 | 0.674 | 0.831 | 0.000 | 0.943 | +| 15 | 0.675 | 0.529 | 1.000 | 0.739 | 0.856 | 0.000 | 0.971 | +| 20 | 0.692 | 0.466 | 0.997 | 0.816 | 0.871 | 0.000 | 1.000 | +| 25 | 0.705 | 0.446 | 0.999 | 0.863 | 0.890 | 0.000 | 1.000 | +| 30 | 0.723 | 0.452 | 0.995 | 0.919 | 0.905 | 0.000 | 1.000 | + +## Decoupling score (per share rate) + +`reaction_rate(Step−50) × clamp(1 − jitter_p50 / J_max, 0, 1)` where `J_max = 0.50` fires/min. Higher is better. Score of 1.0 = perfect decoupling between reactivity and jitter. + +| share/min | decoupling score | +| --- | --- | +| 6 | 0.665 | +| 8 | 0.723 | +| 10 | 0.775 | +| 12 | 0.798 | +| 15 | 0.846 | +| 20 | 0.880 | +| 25 | 0.894 | +| 30 | 0.995 | + +## Reaction asymmetry (per share rate) + +`reaction_rate(+δ%) − reaction_rate(−δ%)`. Positive = responds faster to up-steps; negative = responds faster to down-steps; near zero = symmetric. + +| share/min | δ=5% | δ=10% | δ=25% | δ=50% | +| --- | --- | --- | --- | --- | +| 6 | +0.01 | -0.03 | +0.02 | -0.02 | +| 8 | +0.01 | -0.00 | -0.01 | -0.02 | +| 10 | +0.02 | -0.00 | -0.05 | -0.02 | +| 12 | -0.02 | -0.00 | -0.02 | -0.01 | +| 15 | -0.04 | +0.02 | -0.01 | -0.02 | +| 20 | +0.01 | +0.01 | -0.03 | -0.01 | +| 25 | +0.01 | +0.03 | +0.03 | -0.02 | +| 30 | -0.01 | +0.05 | -0.01 | -0.01 | + diff --git a/sv2/channels-sv2/sim/baseline_EWMA-AdaCUSUM-tau120-s15-f5-eta20.toml b/sv2/channels-sv2/sim/baseline_EWMA-AdaCUSUM-tau120-s15-f5-eta20.toml new file mode 100644 index 0000000000..93e36e034a --- /dev/null +++ b/sv2/channels-sv2/sim/baseline_EWMA-AdaCUSUM-tau120-s15-f5-eta20.toml @@ -0,0 +1,6582 @@ +# Vardiff baseline characterization. Regenerate with +# `cargo run --release --bin generate-baseline` from the sim crate. + +[meta] +algorithm = "EWMA-AdaCUSUM-tau120-s15-f5-eta20" +trial_count = 1000 +base_seed = 16045690984503111693 +quiet_window_secs = 300 +settle_buffer_secs = 120 +min_settled_window_secs = 600 +react_window_secs = 300 +step_event_at_secs = 900 +trial_duration_secs = 1800 + +[cell.spm_6.cold_start_10gh_to_1ph] +shares_per_minute = 6 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.857 +convergence_rate_ci_low = 0.8353022599886532 +convergence_rate_ci_high = 0.8786977400113468 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 867.2345390898483 +settled_accuracy_p10 = 0.010737284161952187 +settled_accuracy_p10_ci_low = 0.009177674142303416 +settled_accuracy_p10_ci_high = 0.013086564194561667 +settled_accuracy_p50 = 0.0571557477971012 +settled_accuracy_p50_ci_low = 0.05355669937396157 +settled_accuracy_p50_ci_high = 0.06224494856474605 +settled_accuracy_p90 = 0.1443515709950386 +settled_accuracy_p90_ci_low = 0.13735896149300042 +settled_accuracy_p90_ci_high = 0.15017292947844796 +settled_accuracy_p95 = 0.1696444995124876 +settled_accuracy_p95_ci_low = 0.15961373747991847 +settled_accuracy_p95_ci_high = 0.17563705271018815 +settled_accuracy_p99 = 0.2099755180150057 +settled_accuracy_p99_ci_low = 0.20116888878658512 +settled_accuracy_p99_ci_high = 0.22695647674701325 +settled_accuracy_mean = 0.06963236159920697 +jitter_p10_per_min = 0.1 +jitter_p10_per_min_ci_low = 0.1 +jitter_p10_per_min_ci_high = 0.1111111111111111 +jitter_p50_per_min = 0.18181818181818182 +jitter_p50_per_min_ci_low = 0.17647058823529413 +jitter_p50_per_min_ci_high = 0.1875 +jitter_p90_per_min = 0.25 +jitter_p90_per_min_ci_low = 0.23809523809523808 +jitter_p90_per_min_ci_high = 0.25 +jitter_p95_per_min = 0.26666666666666666 +jitter_p95_per_min_ci_low = 0.25 +jitter_p95_per_min_ci_high = 0.2727272727272727 +jitter_p99_per_min = 0.3076923076923077 +jitter_p99_per_min_ci_low = 0.29411764705882354 +jitter_p99_per_min_ci_high = 0.3333333333333333 +jitter_mean_per_min = 0.17849070170678585 +bias_mean = 0.00406816428599087 +bias_p10 = -0.09766622953247173 +bias_p10_ci_low = -0.10470542318286828 +bias_p10_ci_high = -0.09166570450803337 +bias_p50 = 0.003065822575131815 +bias_p50_ci_low = -0.0012079207152135081 +bias_p50_ci_high = 0.00978991891267646 +bias_p90 = 0.10593305977617232 +bias_p90_ci_low = 0.0953671610589693 +bias_p90_ci_high = 0.11796747352702745 +bias_p99 = 0.21302873825172344 +bias_p99_ci_low = 0.18568244800734512 +bias_p99_ci_high = 0.2282958036837391 +variance_mean = 0.03042756736397754 +variance_p10 = 0.014859533130723135 +variance_p10_ci_low = 0.013952574280055021 +variance_p10_ci_high = 0.015584622858265612 +variance_p50 = 0.027430164320757178 +variance_p50_ci_low = 0.02653210462497917 +variance_p50_ci_high = 0.02821740061281386 +variance_p90 = 0.0491202231674643 +variance_p90_ci_low = 0.04732855210067906 +variance_p90_ci_high = 0.051683586412454276 +variance_p99 = 0.08005505649575866 +variance_p99_ci_low = 0.07300700639390445 +variance_p99_ci_high = 0.09211096537198438 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0.005590638205976051 +ramp_target_overshoot_p90 = 0.09963874626950209 +ramp_target_overshoot_p90_ci_low = 0.09299100922404646 +ramp_target_overshoot_p90_ci_high = 0.11466502509435328 +ramp_target_overshoot_p99 = 0.19832850608083485 +ramp_target_overshoot_p99_ci_low = 0.18320713399445854 +ramp_target_overshoot_p99_ci_high = 0.22598272711770573 +ramp_target_overshoot_mean = 0.032731572325136266 + +[cell.spm_6.stable_1ph] +shares_per_minute = 6 +scenario = "stable_1ph" +convergence_rate = 0.961 +convergence_rate_ci_low = 0.9490008614309192 +convergence_rate_ci_high = 0.9729991385690807 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 180 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 420 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 538.4391259105099 +settled_accuracy_p10 = 0.010488377382138259 +settled_accuracy_p10_ci_low = 0.008434510572699727 +settled_accuracy_p10_ci_high = 0.012681226650728794 +settled_accuracy_p50 = 0.05699864594443338 +settled_accuracy_p50_ci_low = 0.053252025127438096 +settled_accuracy_p50_ci_high = 0.05948180816246462 +settled_accuracy_p90 = 0.14140891437922187 +settled_accuracy_p90_ci_low = 0.13324069178233833 +settled_accuracy_p90_ci_high = 0.14880712986055245 +settled_accuracy_p95 = 0.16926647527665795 +settled_accuracy_p95_ci_low = 0.15838893358712114 +settled_accuracy_p95_ci_high = 0.17812659027038236 +settled_accuracy_p99 = 0.23234035254031538 +settled_accuracy_p99_ci_low = 0.20421576546954967 +settled_accuracy_p99_ci_high = 0.2698842727757924 +settled_accuracy_mean = 0.06790097073644127 +jitter_p10_per_min = 0.11764705882352941 +jitter_p10_per_min_ci_low = 0.1111111111111111 +jitter_p10_per_min_ci_high = 0.12 +jitter_p50_per_min = 0.16666666666666666 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.16666666666666666 +jitter_p90_per_min = 0.2222222222222222 +jitter_p90_per_min_ci_low = 0.21739130434782608 +jitter_p90_per_min_ci_high = 0.23076923076923078 +jitter_p95_per_min = 0.25 +jitter_p95_per_min_ci_low = 0.23529411764705882 +jitter_p95_per_min_ci_high = 0.25 +jitter_p99_per_min = 0.2777777777777778 +jitter_p99_per_min_ci_low = 0.2631578947368421 +jitter_p99_per_min_ci_high = 0.3 +jitter_mean_per_min = 0.1687257142868948 +bias_mean = -0.0010367799140652625 +bias_p10 = -0.11437550332310914 +bias_p10_ci_low = -0.11943232229743005 +bias_p10_ci_high = -0.10722591205795097 +bias_p50 = -0.0041200604577405955 +bias_p50_ci_low = -0.010116315239145664 +bias_p50_ci_high = 0.0015266701631327139 +bias_p90 = 0.1164697626051102 +bias_p90_ci_low = 0.1065625162043626 +bias_p90_ci_high = 0.12879613877066357 +bias_p99 = 0.23290362196751335 +bias_p99_ci_low = 0.20435622785577437 +bias_p99_ci_high = 0.24600906141333204 +variance_mean = 0.03291115374517673 +variance_p10 = 0.016174498988163973 +variance_p10_ci_low = 0.015305809594062072 +variance_p10_ci_high = 0.01762225214413027 +variance_p50 = 0.029799353757576835 +variance_p50_ci_low = 0.028977332293346536 +variance_p50_ci_high = 0.03070754569079266 +variance_p90 = 0.052188874570660106 +variance_p90_ci_low = 0.05011653516280071 +variance_p90_ci_high = 0.05473577275416921 +variance_p99 = 0.09077363482490063 +variance_p99_ci_low = 0.07380750510972303 +variance_p99_ci_high = 0.10179794941546005 +upward_step_magnitude_p50 = 1.0788198388054078 +upward_step_magnitude_p50_ci_low = 1.0769879608709685 +upward_step_magnitude_p50_ci_high = 1.0806599910447081 +upward_step_magnitude_p90 = 1.116340065235953 +upward_step_magnitude_p90_ci_low = 1.1124502217574619 +upward_step_magnitude_p90_ci_high = 1.119287358753811 +upward_step_magnitude_p95 = 1.1263648834750233 +upward_step_magnitude_p95_ci_low = 1.1225260066978704 +upward_step_magnitude_p95_ci_high = 1.132620408541471 +upward_step_magnitude_p99 = 1.1666670805046666 +upward_step_magnitude_p99_ci_low = 1.1519175397121124 +upward_step_magnitude_p99_ci_high = 1.167260178880288 +upward_step_magnitude_mean = 1.0818383991398597 +fire_decisiveness_mean = 9.370516195765365 +fire_decisiveness_p50 = 7.057674892631624 + +[cell.spm_6.step_minus_50_at_15min] +shares_per_minute = 6 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.734 +convergence_rate_ci_low = 0.7066129711286528 +convergence_rate_ci_high = 0.7613870288713471 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 120 +convergence_p10_secs_ci_high = 180 +convergence_p50_secs = 360 +convergence_p50_secs_ci_low = 360 +convergence_p50_secs_ci_high = 420 +convergence_p90_secs = 660 +convergence_p90_secs_ci_low = 660 +convergence_p90_secs_ci_high = 720 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 840 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 440.02724795640324 +settled_accuracy_p10 = 0.1325874540916645 +settled_accuracy_p10_ci_low = 0.12107714291523997 +settled_accuracy_p10_ci_high = 0.14115309538632603 +settled_accuracy_p50 = 0.28509624182974735 +settled_accuracy_p50_ci_low = 0.27425373096767425 +settled_accuracy_p50_ci_high = 0.29634972738030285 +settled_accuracy_p90 = 0.45814155017853975 +settled_accuracy_p90_ci_low = 0.4469299405596652 +settled_accuracy_p90_ci_high = 0.4796452437497991 +settled_accuracy_p95 = 0.517819718879623 +settled_accuracy_p95_ci_low = 0.49258168541364 +settled_accuracy_p95_ci_high = 0.5305729533423604 +settled_accuracy_p99 = 0.6149956369171503 +settled_accuracy_p99_ci_low = 0.5802026432705478 +settled_accuracy_p99_ci_high = 0.6498821803213857 +settled_accuracy_mean = 0.2909797587583947 +jitter_p10_per_min = 0.2222222222222222 +jitter_p10_per_min_ci_low = 0.21739130434782608 +jitter_p10_per_min_ci_high = 0.22727272727272727 +jitter_p50_per_min = 0.2777777777777778 +jitter_p50_per_min_ci_low = 0.2727272727272727 +jitter_p50_per_min_ci_high = 0.28 +jitter_p90_per_min = 0.3333333333333333 +jitter_p90_per_min_ci_low = 0.3333333333333333 +jitter_p90_per_min_ci_high = 0.3333333333333333 +jitter_p95_per_min = 0.35 +jitter_p95_per_min_ci_low = 0.3333333333333333 +jitter_p95_per_min_ci_high = 0.35294117647058826 +jitter_p99_per_min = 0.375 +jitter_p99_per_min_ci_low = 0.3684210526315789 +jitter_p99_per_min_ci_high = 0.38095238095238093 +jitter_mean_per_min = 0.27763182885200505 +reaction_rate = 0.997 +reaction_rate_ci_low = 0.9936102764714508 +reaction_rate_ci_high = 1 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 119.21765295887663 +fire_decisiveness_mean = 10.863016520857762 +fire_decisiveness_p50 = 9.105894210382658 +step_correction_mean = 0.1384260949931867 +step_correction_p50 = 0.13626006245613098 + +[cell.spm_6.step_minus_25_at_15min] +shares_per_minute = 6 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.882 +convergence_rate_ci_low = 0.862004541475625 +convergence_rate_ci_high = 0.901995458524375 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 180 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 420 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 560.204081632653 +settled_accuracy_p10 = 0.02360102402756792 +settled_accuracy_p10_ci_low = 0.020612174209956535 +settled_accuracy_p10_ci_high = 0.0277652632175156 +settled_accuracy_p50 = 0.1140973262844569 +settled_accuracy_p50_ci_low = 0.1072561592738499 +settled_accuracy_p50_ci_high = 0.12321885247243825 +settled_accuracy_p90 = 0.23667264949640177 +settled_accuracy_p90_ci_low = 0.22858594198161386 +settled_accuracy_p90_ci_high = 0.24647054354868625 +settled_accuracy_p95 = 0.27483549156929254 +settled_accuracy_p95_ci_low = 0.25896845087063003 +settled_accuracy_p95_ci_high = 0.28395576505849074 +settled_accuracy_p99 = 0.3521415019912095 +settled_accuracy_p99_ci_low = 0.31045607094069005 +settled_accuracy_p99_ci_high = 0.36410128570739597 +settled_accuracy_mean = 0.12356725753187374 +jitter_p10_per_min = 0.13636363636363635 +jitter_p10_per_min_ci_low = 0.13043478260869565 +jitter_p10_per_min_ci_high = 0.14285714285714285 +jitter_p50_per_min = 0.19047619047619047 +jitter_p50_per_min_ci_low = 0.19047619047619047 +jitter_p50_per_min_ci_high = 0.2 +jitter_p90_per_min = 0.25 +jitter_p90_per_min_ci_low = 0.25 +jitter_p90_per_min_ci_high = 0.2608695652173913 +jitter_p95_per_min = 0.2692307692307692 +jitter_p95_per_min_ci_low = 0.2631578947368421 +jitter_p95_per_min_ci_high = 0.2727272727272727 +jitter_p99_per_min = 0.3 +jitter_p99_per_min_ci_low = 0.2916666666666667 +jitter_p99_per_min_ci_high = 0.30434782608695654 +jitter_mean_per_min = 0.19348596704066856 +reaction_rate = 0.891 +reaction_rate_ci_low = 0.8716844013709127 +reaction_rate_ci_high = 0.9103155986290873 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 153.8047138047138 +fire_decisiveness_mean = 9.21868621097668 +fire_decisiveness_p50 = 7.586185276898249 +step_correction_mean = 0.19837617450189912 +step_correction_p50 = 0.2147422581911087 + +[cell.spm_6.step_minus_10_at_15min] +shares_per_minute = 6 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.944 +convergence_rate_ci_low = 0.9297493037924457 +convergence_rate_ci_high = 0.9582506962075542 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 180 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 420 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 544.7033898305085 +settled_accuracy_p10 = 0.01285112383114062 +settled_accuracy_p10_ci_low = 0.010718329555974293 +settled_accuracy_p10_ci_high = 0.014747322076691272 +settled_accuracy_p50 = 0.0637965945233947 +settled_accuracy_p50_ci_low = 0.060056020988670245 +settled_accuracy_p50_ci_high = 0.06770039172935438 +settled_accuracy_p90 = 0.1691711570574851 +settled_accuracy_p90_ci_low = 0.16042262180165667 +settled_accuracy_p90_ci_high = 0.1807371461358902 +settled_accuracy_p95 = 0.21628314572056095 +settled_accuracy_p95_ci_low = 0.19886459258022016 +settled_accuracy_p95_ci_high = 0.2284471493459308 +settled_accuracy_p99 = 0.29432747410809523 +settled_accuracy_p99_ci_low = 0.26710275000941386 +settled_accuracy_p99_ci_high = 0.30325369872370134 +settled_accuracy_mean = 0.08021677714152764 +jitter_p10_per_min = 0.125 +jitter_p10_per_min_ci_low = 0.11764705882352941 +jitter_p10_per_min_ci_high = 0.125 +jitter_p50_per_min = 0.16666666666666666 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.17391304347826086 +jitter_p90_per_min = 0.22727272727272727 +jitter_p90_per_min_ci_low = 0.2222222222222222 +jitter_p90_per_min_ci_high = 0.23076923076923078 +jitter_p95_per_min = 0.24 +jitter_p95_per_min_ci_low = 0.23809523809523808 +jitter_p95_per_min_ci_high = 0.25 +jitter_p99_per_min = 0.2727272727272727 +jitter_p99_per_min_ci_low = 0.26666666666666666 +jitter_p99_per_min_ci_high = 0.28 +jitter_mean_per_min = 0.17275354914422436 +reaction_rate = 0.834 +reaction_rate_ci_low = 0.8109382032269816 +reaction_rate_ci_high = 0.8570617967730183 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 165.3956834532374 +fire_decisiveness_mean = 9.025836115944754 +fire_decisiveness_p50 = 7.069223757933198 +step_correction_mean = 0.8374643386732474 +step_correction_p50 = 0.3500650227069855 + +[cell.spm_6.step_minus_5_at_15min] +shares_per_minute = 6 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.948 +convergence_rate_ci_low = 0.934238622394542 +convergence_rate_ci_high = 0.9617613776054579 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 180 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 573.2278481012659 +settled_accuracy_p10 = 0.009455144540838623 +settled_accuracy_p10_ci_low = 0.008127448634698498 +settled_accuracy_p10_ci_high = 0.011414723388209258 +settled_accuracy_p50 = 0.057335835999497875 +settled_accuracy_p50_ci_low = 0.05366957276306894 +settled_accuracy_p50_ci_high = 0.06136406325950017 +settled_accuracy_p90 = 0.15020503877373592 +settled_accuracy_p90_ci_low = 0.13710454070587086 +settled_accuracy_p90_ci_high = 0.1618564092109247 +settled_accuracy_p95 = 0.1830406998310199 +settled_accuracy_p95_ci_low = 0.1726450422125354 +settled_accuracy_p95_ci_high = 0.19625704899151986 +settled_accuracy_p99 = 0.2496810739509312 +settled_accuracy_p99_ci_low = 0.22127622270055536 +settled_accuracy_p99_ci_high = 0.2788143742667033 +settled_accuracy_mean = 0.07060179810785491 +jitter_p10_per_min = 0.11764705882352941 +jitter_p10_per_min_ci_low = 0.11538461538461539 +jitter_p10_per_min_ci_high = 0.12 +jitter_p50_per_min = 0.17391304347826086 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.17647058823529413 +jitter_p90_per_min = 0.2222222222222222 +jitter_p90_per_min_ci_low = 0.21739130434782608 +jitter_p90_per_min_ci_high = 0.22727272727272727 +jitter_p95_per_min = 0.23809523809523808 +jitter_p95_per_min_ci_low = 0.23529411764705882 +jitter_p95_per_min_ci_high = 0.25 +jitter_p99_per_min = 0.26666666666666666 +jitter_p99_per_min_ci_low = 0.25 +jitter_p99_per_min_ci_high = 0.28 +jitter_mean_per_min = 0.1711279890285936 +reaction_rate = 0.824 +reaction_rate_ci_low = 0.8003965214766975 +reaction_rate_ci_high = 0.8476034785233024 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 163.54368932038835 +fire_decisiveness_mean = 9.200973245650173 +fire_decisiveness_p50 = 7.171121084047925 +step_correction_mean = -1.469293800924082 +step_correction_p50 = 0.43142011761665344 + +[cell.spm_6.step_plus_5_at_15min] +shares_per_minute = 6 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.95 +convergence_rate_ci_low = 0.9364916322229515 +convergence_rate_ci_high = 0.9635083677770484 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 558.9473684210526 +settled_accuracy_p10 = 0.01274467733991691 +settled_accuracy_p10_ci_low = 0.010571692149502265 +settled_accuracy_p10_ci_high = 0.01455591376778731 +settled_accuracy_p50 = 0.06389882845809769 +settled_accuracy_p50_ci_low = 0.059521029299220984 +settled_accuracy_p50_ci_high = 0.06735608566875384 +settled_accuracy_p90 = 0.14002719379213557 +settled_accuracy_p90_ci_low = 0.13418220300905936 +settled_accuracy_p90_ci_high = 0.14815081829998789 +settled_accuracy_p95 = 0.16325772784196158 +settled_accuracy_p95_ci_low = 0.15580071810325025 +settled_accuracy_p95_ci_high = 0.17176994466010886 +settled_accuracy_p99 = 0.20572562647407833 +settled_accuracy_p99_ci_low = 0.19831016032117144 +settled_accuracy_p99_ci_high = 0.22389378698417728 +settled_accuracy_mean = 0.07151514327615789 +jitter_p10_per_min = 0.11538461538461539 +jitter_p10_per_min_ci_low = 0.10526315789473684 +jitter_p10_per_min_ci_high = 0.12 +jitter_p50_per_min = 0.16666666666666666 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.17391304347826086 +jitter_p90_per_min = 0.2222222222222222 +jitter_p90_per_min_ci_low = 0.21739130434782608 +jitter_p90_per_min_ci_high = 0.23076923076923078 +jitter_p95_per_min = 0.25 +jitter_p95_per_min_ci_low = 0.23529411764705882 +jitter_p95_per_min_ci_high = 0.25 +jitter_p99_per_min = 0.2777777777777778 +jitter_p99_per_min_ci_low = 0.26666666666666666 +jitter_p99_per_min_ci_high = 0.3 +jitter_mean_per_min = 0.17042864599366733 +reaction_rate = 0.829 +reaction_rate_ci_low = 0.8056637326378017 +reaction_rate_ci_high = 0.8523362673621983 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 166.3932448733414 +fire_decisiveness_mean = 9.465635245494338 +fire_decisiveness_p50 = 7.281737692058165 +step_correction_mean = 0.6281222146008932 +step_correction_p50 = 0.40884676575660706 + +[cell.spm_6.step_plus_10_at_15min] +shares_per_minute = 6 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.939 +convergence_rate_ci_low = 0.9241661533512038 +convergence_rate_ci_high = 0.9538338466487961 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 180 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 568.3067092651758 +settled_accuracy_p10 = 0.010380277265767623 +settled_accuracy_p10_ci_low = 0.0089218796070617 +settled_accuracy_p10_ci_high = 0.011943425762373505 +settled_accuracy_p50 = 0.061690434491467605 +settled_accuracy_p50_ci_low = 0.057402971104691836 +settled_accuracy_p50_ci_high = 0.06656082988531042 +settled_accuracy_p90 = 0.14088334911306788 +settled_accuracy_p90_ci_low = 0.1314597392259309 +settled_accuracy_p90_ci_high = 0.14566522181279717 +settled_accuracy_p95 = 0.15883576368088947 +settled_accuracy_p95_ci_low = 0.15157129002212577 +settled_accuracy_p95_ci_high = 0.17071140948932773 +settled_accuracy_p99 = 0.2063339543343694 +settled_accuracy_p99_ci_low = 0.18947675644795703 +settled_accuracy_p99_ci_high = 0.22239993869910202 +settled_accuracy_mean = 0.06899132349480766 +jitter_p10_per_min = 0.12 +jitter_p10_per_min_ci_low = 0.11538461538461539 +jitter_p10_per_min_ci_high = 0.125 +jitter_p50_per_min = 0.17391304347826086 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.18181818181818182 +jitter_p90_per_min = 0.23076923076923078 +jitter_p90_per_min_ci_low = 0.23076923076923078 +jitter_p90_per_min_ci_high = 0.23809523809523808 +jitter_p95_per_min = 0.25 +jitter_p95_per_min_ci_low = 0.24 +jitter_p95_per_min_ci_high = 0.25 +jitter_p99_per_min = 0.2857142857142857 +jitter_p99_per_min_ci_low = 0.2727272727272727 +jitter_p99_per_min_ci_high = 0.3 +jitter_mean_per_min = 0.17597053838434898 +reaction_rate = 0.806 +reaction_rate_ci_low = 0.7814910640296239 +reaction_rate_ci_high = 0.8305089359703762 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 156.10421836228286 +fire_decisiveness_mean = 9.674882302332813 +fire_decisiveness_p50 = 7.353713695896719 +step_correction_mean = -176.94896771181976 +step_correction_p50 = 0.33291876316070557 + +[cell.spm_6.step_plus_25_at_15min] +shares_per_minute = 6 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.909 +convergence_rate_ci_low = 0.891173802693788 +convergence_rate_ci_high = 0.9268261973062121 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 120 +convergence_p10_secs_ci_high = 180 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 420 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 559.6039603960396 +settled_accuracy_p10 = 0.014303743944364733 +settled_accuracy_p10_ci_low = 0.010772314555665297 +settled_accuracy_p10_ci_high = 0.01684002943770513 +settled_accuracy_p50 = 0.07321641287347691 +settled_accuracy_p50_ci_low = 0.06691977624079992 +settled_accuracy_p50_ci_high = 0.0794495913660852 +settled_accuracy_p90 = 0.16231625861973065 +settled_accuracy_p90_ci_low = 0.1541669878944203 +settled_accuracy_p90_ci_high = 0.17331089141399558 +settled_accuracy_p95 = 0.18525879217362495 +settled_accuracy_p95_ci_low = 0.1796038773245705 +settled_accuracy_p95_ci_high = 0.19198954261391277 +settled_accuracy_p99 = 0.23728292430571318 +settled_accuracy_p99_ci_low = 0.2145170749641424 +settled_accuracy_p99_ci_high = 0.2573413337118631 +settled_accuracy_mean = 0.08131021409767131 +jitter_p10_per_min = 0.13043478260869565 +jitter_p10_per_min_ci_low = 0.125 +jitter_p10_per_min_ci_high = 0.13636363636363635 +jitter_p50_per_min = 0.19047619047619047 +jitter_p50_per_min_ci_low = 0.19047619047619047 +jitter_p50_per_min_ci_high = 0.19230769230769232 +jitter_p90_per_min = 0.25 +jitter_p90_per_min_ci_low = 0.23809523809523808 +jitter_p90_per_min_ci_high = 0.25 +jitter_p95_per_min = 0.2631578947368421 +jitter_p95_per_min_ci_low = 0.25 +jitter_p95_per_min_ci_high = 0.2727272727272727 +jitter_p99_per_min = 0.3076923076923077 +jitter_p99_per_min_ci_low = 0.28 +jitter_p99_per_min_ci_high = 0.3181818181818182 +jitter_mean_per_min = 0.19072995764639997 +reaction_rate = 0.909 +reaction_rate_ci_low = 0.891173802693788 +reaction_rate_ci_high = 0.9268261973062121 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 151.15511551155114 +fire_decisiveness_mean = 10.774850544815976 +fire_decisiveness_p50 = 7.907931529963932 +step_correction_mean = 0.2549327329719158 +step_correction_p50 = 0.22488237917423248 + +[cell.spm_6.step_plus_50_at_15min] +shares_per_minute = 6 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.862 +convergence_rate_ci_low = 0.840622877424686 +convergence_rate_ci_high = 0.883377122575314 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 180 +convergence_p50_secs = 420 +convergence_p50_secs_ci_low = 420 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 556.2877030162413 +settled_accuracy_p10 = 0.020618706139324594 +settled_accuracy_p10_ci_low = 0.017183895554986228 +settled_accuracy_p10_ci_high = 0.025183987896782223 +settled_accuracy_p50 = 0.10533621943202454 +settled_accuracy_p50_ci_low = 0.10125779010870828 +settled_accuracy_p50_ci_high = 0.11050977592708433 +settled_accuracy_p90 = 0.19107951407098378 +settled_accuracy_p90_ci_low = 0.18704716616718287 +settled_accuracy_p90_ci_high = 0.19896748987170665 +settled_accuracy_p95 = 0.21252947533127398 +settled_accuracy_p95_ci_low = 0.2076507504426277 +settled_accuracy_p95_ci_high = 0.2232981214618529 +settled_accuracy_p99 = 0.2569546480985688 +settled_accuracy_p99_ci_low = 0.2375382643554136 +settled_accuracy_p99_ci_high = 0.27586740219173966 +settled_accuracy_mean = 0.10720903534051175 +jitter_p10_per_min = 0.16666666666666666 +jitter_p10_per_min_ci_low = 0.16666666666666666 +jitter_p10_per_min_ci_high = 0.17391304347826086 +jitter_p50_per_min = 0.23076923076923078 +jitter_p50_per_min_ci_low = 0.22727272727272727 +jitter_p50_per_min_ci_high = 0.23076923076923078 +jitter_p90_per_min = 0.2857142857142857 +jitter_p90_per_min_ci_low = 0.2857142857142857 +jitter_p90_per_min_ci_high = 0.29411764705882354 +jitter_p95_per_min = 0.30434782608695654 +jitter_p95_per_min_ci_low = 0.3 +jitter_p95_per_min_ci_high = 0.3125 +jitter_p99_per_min = 0.3333333333333333 +jitter_p99_per_min_ci_low = 0.3181818181818182 +jitter_p99_per_min_ci_high = 0.35 +jitter_mean_per_min = 0.227942214090063 +reaction_rate = 0.982 +reaction_rate_ci_low = 0.9737596042813467 +reaction_rate_ci_high = 0.9902403957186533 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 127.27087576374745 +fire_decisiveness_mean = 13.13617251212756 +fire_decisiveness_p50 = 9.794964754632606 +step_correction_mean = 0.1575781950791596 +step_correction_p50 = 0.15013431012630463 + +[cell.spm_8.cold_start_10gh_to_1ph] +shares_per_minute = 8 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.938 +convergence_rate_ci_low = 0.9230530240650491 +convergence_rate_ci_high = 0.9529469759349508 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 850.2985074626865 +settled_accuracy_p10 = 0.01244238620064575 +settled_accuracy_p10_ci_low = 0.010664538152429959 +settled_accuracy_p10_ci_high = 0.014770459831955352 +settled_accuracy_p50 = 0.05697730532540379 +settled_accuracy_p50_ci_low = 0.052829776149657004 +settled_accuracy_p50_ci_high = 0.06212032740267692 +settled_accuracy_p90 = 0.13431295722527925 +settled_accuracy_p90_ci_low = 0.12497912075441642 +settled_accuracy_p90_ci_high = 0.1412351024192008 +settled_accuracy_p95 = 0.16183980563662115 +settled_accuracy_p95_ci_low = 0.1496967249733091 +settled_accuracy_p95_ci_high = 0.16721207159630047 +settled_accuracy_p99 = 0.20041022306919576 +settled_accuracy_p99_ci_low = 0.18436825157449133 +settled_accuracy_p99_ci_high = 0.20717989692212568 +settled_accuracy_mean = 0.06717399395926264 +jitter_p10_per_min = 0.09090909090909091 +jitter_p10_per_min_ci_low = 0.08333333333333333 +jitter_p10_per_min_ci_high = 0.09090909090909091 +jitter_p50_per_min = 0.15384615384615385 +jitter_p50_per_min_ci_low = 0.15 +jitter_p50_per_min_ci_high = 0.15789473684210525 +jitter_p90_per_min = 0.21428571428571427 +jitter_p90_per_min_ci_low = 0.20833333333333334 +jitter_p90_per_min_ci_high = 0.21428571428571427 +jitter_p95_per_min = 0.23076923076923078 +jitter_p95_per_min_ci_low = 0.2222222222222222 +jitter_p95_per_min_ci_high = 0.23809523809523808 +jitter_p99_per_min = 0.26666666666666666 +jitter_p99_per_min_ci_low = 0.25 +jitter_p99_per_min_ci_high = 0.2727272727272727 +jitter_mean_per_min = 0.15188907530510745 +bias_mean = -0.0033302007315509103 +bias_p10 = -0.0899087167206565 +bias_p10_ci_low = -0.09429890801973856 +bias_p10_ci_high = -0.08425469419180792 +bias_p50 = -0.005673789621599204 +bias_p50_ci_low = -0.010360987096381634 +bias_p50_ci_high = -0.0010777118571322645 +bias_p90 = 0.08842738389381379 +bias_p90_ci_low = 0.08227000779193967 +bias_p90_ci_high = 0.09626076151134517 +bias_p99 = 0.15602303528034178 +bias_p99_ci_low = 0.1409755571182816 +bias_p99_ci_high = 0.1718295994732081 +variance_mean = 0.022876571017711067 +variance_p10 = 0.011208179115669311 +variance_p10_ci_low = 0.010810003425077076 +variance_p10_ci_high = 0.011712035543044867 +variance_p50 = 0.020787122591207702 +variance_p50_ci_low = 0.01997029530816215 +variance_p50_ci_high = 0.02164549151577225 +variance_p90 = 0.036858212964207854 +variance_p90_ci_low = 0.035286097266670126 +variance_p90_ci_high = 0.03877947305826666 +variance_p99 = 0.057618507006432985 +variance_p99_ci_low = 0.050154855843321626 +variance_p99_ci_high = 0.06455942355208372 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0.04954419323433923 +ramp_target_overshoot_p90_ci_low = 0.045381363237401384 +ramp_target_overshoot_p90_ci_high = 0.058373102605897564 +ramp_target_overshoot_p99 = 0.128705072041031 +ramp_target_overshoot_p99_ci_low = 0.1136102079562793 +ramp_target_overshoot_p99_ci_high = 0.16284965983523025 +ramp_target_overshoot_mean = 0.013560761003790243 + +[cell.spm_8.stable_1ph] +shares_per_minute = 8 +scenario = "stable_1ph" +convergence_rate = 0.993 +convergence_rate_ci_low = 0.9878325091582084 +convergence_rate_ci_high = 0.9981674908417916 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 1020 +convergence_p95_secs_ci_high = 1080 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 523.0815709969788 +settled_accuracy_p10 = 0.009334440450646797 +settled_accuracy_p10_ci_low = 0.00804608446281474 +settled_accuracy_p10_ci_high = 0.010868079339589665 +settled_accuracy_p50 = 0.04787210875716319 +settled_accuracy_p50_ci_low = 0.04450472013556528 +settled_accuracy_p50_ci_high = 0.05171805069417079 +settled_accuracy_p90 = 0.11750500514691442 +settled_accuracy_p90_ci_low = 0.10864395062908183 +settled_accuracy_p90_ci_high = 0.1236178845393322 +settled_accuracy_p95 = 0.13900252470260543 +settled_accuracy_p95_ci_low = 0.1299037705853927 +settled_accuracy_p95_ci_high = 0.1467340028068953 +settled_accuracy_p99 = 0.17974042425284842 +settled_accuracy_p99_ci_low = 0.1726997648035613 +settled_accuracy_p99_ci_high = 0.19055810483491853 +settled_accuracy_mean = 0.05613368535512106 +jitter_p10_per_min = 0.09090909090909091 +jitter_p10_per_min_ci_low = 0.08695652173913043 +jitter_p10_per_min_ci_high = 0.09523809523809523 +jitter_p50_per_min = 0.13636363636363635 +jitter_p50_per_min_ci_low = 0.13333333333333333 +jitter_p50_per_min_ci_high = 0.14285714285714285 +jitter_p90_per_min = 0.18181818181818182 +jitter_p90_per_min_ci_low = 0.18181818181818182 +jitter_p90_per_min_ci_high = 0.1875 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.19047619047619047 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.21739130434782608 +jitter_p99_per_min_ci_low = 0.21052631578947367 +jitter_p99_per_min_ci_high = 0.23529411764705882 +jitter_mean_per_min = 0.13761430083371343 +bias_mean = 0.004373260816812582 +bias_p10 = -0.0891124488466651 +bias_p10_ci_low = -0.09732392487298208 +bias_p10_ci_high = -0.08505656918806175 +bias_p50 = -0.0026877171022551723 +bias_p50_ci_low = -0.00973884200241706 +bias_p50_ci_high = 0.003065921472406359 +bias_p90 = 0.1046548548871637 +bias_p90_ci_low = 0.09763010377089694 +bias_p90_ci_high = 0.11732137056830319 +bias_p99 = 0.20557344491479557 +bias_p99_ci_low = 0.1885938283600855 +bias_p99_ci_high = 0.22248593141235945 +variance_mean = 0.02502278624793336 +variance_p10 = 0.01295829238105604 +variance_p10_ci_low = 0.012306424980827863 +variance_p10_ci_high = 0.01328851700408226 +variance_p50 = 0.02248583374808969 +variance_p50_ci_low = 0.02185477145959827 +variance_p50_ci_high = 0.02330009800706755 +variance_p90 = 0.04000864771352448 +variance_p90_ci_low = 0.03841567001571685 +variance_p90_ci_high = 0.04186697244019636 +variance_p99 = 0.0650552853984748 +variance_p99_ci_low = 0.05998968107690401 +variance_p99_ci_high = 0.07359586490906261 +upward_step_magnitude_p50 = 1.0662856176972824 +upward_step_magnitude_p50_ci_low = 1.064702437037553 +upward_step_magnitude_p50_ci_high = 1.0678159909821792 +upward_step_magnitude_p90 = 1.0967517171133079 +upward_step_magnitude_p90_ci_low = 1.095061320460412 +upward_step_magnitude_p90_ci_high = 1.1000150132672408 +upward_step_magnitude_p95 = 1.1086159384723324 +upward_step_magnitude_p95_ci_low = 1.1032355300289485 +upward_step_magnitude_p95_ci_high = 1.1127697816375735 +upward_step_magnitude_p99 = 1.1284014854002329 +upward_step_magnitude_p99_ci_low = 1.1228639164424838 +upward_step_magnitude_p99_ci_high = 1.1356095150217325 +upward_step_magnitude_mean = 1.068300469577408 +fire_decisiveness_mean = 7.900478458653853 +fire_decisiveness_p50 = 6.0998970184214585 + +[cell.spm_8.step_minus_50_at_15min] +shares_per_minute = 8 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.8 +convergence_rate_ci_low = 0.77520774314428 +convergence_rate_ci_high = 0.8247922568557201 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 420 +convergence_p50_secs_ci_low = 420 +convergence_p50_secs_ci_high = 420 +convergence_p90_secs = 660 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 660 +convergence_p95_secs = 780 +convergence_p95_secs_ci_low = 660 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 449.925 +settled_accuracy_p10 = 0.17887458567825698 +settled_accuracy_p10_ci_low = 0.167672102865005 +settled_accuracy_p10_ci_high = 0.18971588858076216 +settled_accuracy_p50 = 0.32967357375710526 +settled_accuracy_p50_ci_low = 0.31950107780192427 +settled_accuracy_p50_ci_high = 0.33933443172649436 +settled_accuracy_p90 = 0.48683099256494167 +settled_accuracy_p90_ci_low = 0.4738588489849884 +settled_accuracy_p90_ci_high = 0.5008288280356141 +settled_accuracy_p95 = 0.5316018664585933 +settled_accuracy_p95_ci_low = 0.515173079466761 +settled_accuracy_p95_ci_high = 0.5474988828051721 +settled_accuracy_p99 = 0.6077599591065421 +settled_accuracy_p99_ci_low = 0.5877807105097381 +settled_accuracy_p99_ci_high = 0.6435907242395409 +settled_accuracy_mean = 0.33076617137416336 +jitter_p10_per_min = 0.2 +jitter_p10_per_min_ci_low = 0.2 +jitter_p10_per_min_ci_high = 0.20833333333333334 +jitter_p50_per_min = 0.2608695652173913 +jitter_p50_per_min_ci_low = 0.25 +jitter_p50_per_min_ci_high = 0.2608695652173913 +jitter_p90_per_min = 0.3125 +jitter_p90_per_min_ci_low = 0.3 +jitter_p90_per_min_ci_high = 0.3157894736842105 +jitter_p95_per_min = 0.3181818181818182 +jitter_p95_per_min_ci_low = 0.3157894736842105 +jitter_p95_per_min_ci_high = 0.3333333333333333 +jitter_p99_per_min = 0.35294117647058826 +jitter_p99_per_min_ci_low = 0.3333333333333333 +jitter_p99_per_min_ci_high = 0.36363636363636365 +jitter_mean_per_min = 0.2563554523358828 +reaction_rate = 0.994 +reaction_rate_ci_low = 0.9892134247733896 +reaction_rate_ci_high = 0.9987865752266104 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 123.44064386317908 +fire_decisiveness_mean = 9.37499139601485 +fire_decisiveness_p50 = 8.049374691066191 +step_correction_mean = 0.1359428341015124 +step_correction_p50 = 0.13027498126029968 + +[cell.spm_8.step_minus_25_at_15min] +shares_per_minute = 8 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.951 +convergence_rate_ci_low = 0.9376203617986135 +convergence_rate_ci_high = 0.9643796382013864 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 420 +convergence_p50_secs_ci_low = 420 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 960 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 510.5993690851735 +settled_accuracy_p10 = 0.03541665790523174 +settled_accuracy_p10_ci_low = 0.02894906356739435 +settled_accuracy_p10_ci_high = 0.041522759165706136 +settled_accuracy_p50 = 0.1257379402464469 +settled_accuracy_p50_ci_low = 0.11679966599471303 +settled_accuracy_p50_ci_high = 0.1322005237891526 +settled_accuracy_p90 = 0.2387031847450638 +settled_accuracy_p90_ci_low = 0.2258734912026097 +settled_accuracy_p90_ci_high = 0.2500434194346015 +settled_accuracy_p95 = 0.27384496474592446 +settled_accuracy_p95_ci_low = 0.26092677698230404 +settled_accuracy_p95_ci_high = 0.2820798486310374 +settled_accuracy_p99 = 0.3294399156897927 +settled_accuracy_p99_ci_low = 0.31283566175737 +settled_accuracy_p99_ci_high = 0.35169929932083144 +settled_accuracy_mean = 0.13259693772413805 +jitter_p10_per_min = 0.11764705882352941 +jitter_p10_per_min_ci_low = 0.1111111111111111 +jitter_p10_per_min_ci_high = 0.12 +jitter_p50_per_min = 0.16666666666666666 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.16666666666666666 +jitter_p90_per_min = 0.21739130434782608 +jitter_p90_per_min_ci_low = 0.21428571428571427 +jitter_p90_per_min_ci_high = 0.2222222222222222 +jitter_p95_per_min = 0.23529411764705882 +jitter_p95_per_min_ci_low = 0.23076923076923078 +jitter_p95_per_min_ci_high = 0.25 +jitter_p99_per_min = 0.26666666666666666 +jitter_p99_per_min_ci_low = 0.25 +jitter_p99_per_min_ci_high = 0.2916666666666667 +jitter_mean_per_min = 0.1674699582030458 +reaction_rate = 0.875 +reaction_rate_ci_low = 0.8545018293499151 +reaction_rate_ci_high = 0.8954981706500849 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 166.83428571428573 +fire_decisiveness_mean = 7.879049563503427 +fire_decisiveness_p50 = 6.391890521824177 +step_correction_mean = 0.20488411840370724 +step_correction_p50 = 0.21353046596050262 + +[cell.spm_8.step_minus_10_at_15min] +shares_per_minute = 8 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.99 +convergence_rate_ci_low = 0.9838330039727595 +convergence_rate_ci_high = 0.9961669960272405 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 420 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 511.75757575757575 +settled_accuracy_p10 = 0.009849791720182965 +settled_accuracy_p10_ci_low = 0.008604325762832099 +settled_accuracy_p10_ci_high = 0.011504845446421275 +settled_accuracy_p50 = 0.056506036628763745 +settled_accuracy_p50_ci_low = 0.052442594891002114 +settled_accuracy_p50_ci_high = 0.05999771084207084 +settled_accuracy_p90 = 0.14595805174018883 +settled_accuracy_p90_ci_low = 0.1379363800509208 +settled_accuracy_p90_ci_high = 0.15671224725589994 +settled_accuracy_p95 = 0.18220608461160182 +settled_accuracy_p95_ci_low = 0.16980459017175775 +settled_accuracy_p95_ci_high = 0.19376573563059396 +settled_accuracy_p99 = 0.23718218826347992 +settled_accuracy_p99_ci_low = 0.2235155425994022 +settled_accuracy_p99_ci_high = 0.24671627005949204 +settled_accuracy_mean = 0.06866050072906323 +jitter_p10_per_min = 0.09090909090909091 +jitter_p10_per_min_ci_low = 0.08695652173913043 +jitter_p10_per_min_ci_high = 0.09523809523809523 +jitter_p50_per_min = 0.14285714285714285 +jitter_p50_per_min_ci_low = 0.13636363636363635 +jitter_p50_per_min_ci_high = 0.14285714285714285 +jitter_p90_per_min = 0.1875 +jitter_p90_per_min_ci_low = 0.18181818181818182 +jitter_p90_per_min_ci_high = 0.19047619047619047 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.2 +jitter_p95_per_min_ci_high = 0.21052631578947367 +jitter_p99_per_min = 0.22727272727272727 +jitter_p99_per_min_ci_low = 0.21739130434782608 +jitter_p99_per_min_ci_high = 0.23809523809523808 +jitter_mean_per_min = 0.13984215715736065 +reaction_rate = 0.748 +reaction_rate_ci_low = 0.7210904062906925 +reaction_rate_ci_high = 0.7749095937093075 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 172.86096256684493 +fire_decisiveness_mean = 7.5822304530661 +fire_decisiveness_p50 = 6.016890235375627 +step_correction_mean = 1.04680374918137 +step_correction_p50 = 0.35171613097190857 + +[cell.spm_8.step_minus_5_at_15min] +shares_per_minute = 8 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.991 +convergence_rate_ci_low = 0.985146519804424 +convergence_rate_ci_high = 0.996853480195576 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 420 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 1020 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 518.5065590312815 +settled_accuracy_p10 = 0.009060897621329778 +settled_accuracy_p10_ci_low = 0.007595663863140922 +settled_accuracy_p10_ci_high = 0.010496320915438284 +settled_accuracy_p50 = 0.0511163983477656 +settled_accuracy_p50_ci_low = 0.0471465204795416 +settled_accuracy_p50_ci_high = 0.053702632709015985 +settled_accuracy_p90 = 0.13294202507568653 +settled_accuracy_p90_ci_low = 0.12486515533265052 +settled_accuracy_p90_ci_high = 0.14396243090347682 +settled_accuracy_p95 = 0.1597361222929785 +settled_accuracy_p95_ci_low = 0.14943046119401648 +settled_accuracy_p95_ci_high = 0.1738554742078382 +settled_accuracy_p99 = 0.21098341824723943 +settled_accuracy_p99_ci_low = 0.19573359984735905 +settled_accuracy_p99_ci_high = 0.23494453240415103 +settled_accuracy_mean = 0.062451518330998296 +jitter_p10_per_min = 0.09090909090909091 +jitter_p10_per_min_ci_low = 0.08695652173913043 +jitter_p10_per_min_ci_high = 0.09523809523809523 +jitter_p50_per_min = 0.13636363636363635 +jitter_p50_per_min_ci_low = 0.13043478260869565 +jitter_p50_per_min_ci_high = 0.13636363636363635 +jitter_p90_per_min = 0.18181818181818182 +jitter_p90_per_min_ci_low = 0.18181818181818182 +jitter_p90_per_min_ci_high = 0.1875 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.19047619047619047 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.22727272727272727 +jitter_p99_per_min_ci_low = 0.21428571428571427 +jitter_p99_per_min_ci_high = 0.23809523809523808 +jitter_mean_per_min = 0.13660088274006643 +reaction_rate = 0.715 +reaction_rate_ci_low = 0.6870210429072132 +reaction_rate_ci_high = 0.7429789570927867 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 175.8041958041958 +fire_decisiveness_mean = 7.6227080668614775 +fire_decisiveness_p50 = 5.971525233316186 +step_correction_mean = -1.93944898889615 +step_correction_p50 = 0.470562219619751 + +[cell.spm_8.step_plus_5_at_15min] +shares_per_minute = 8 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.986 +convergence_rate_ci_low = 0.9787178680044921 +convergence_rate_ci_high = 0.9932821319955079 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 420 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 960 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 525.8823529411765 +settled_accuracy_p10 = 0.00947072321247222 +settled_accuracy_p10_ci_low = 0.008238284804672924 +settled_accuracy_p10_ci_high = 0.011396044718282705 +settled_accuracy_p50 = 0.049945871903357086 +settled_accuracy_p50_ci_low = 0.04506807971102034 +settled_accuracy_p50_ci_high = 0.054144777990438264 +settled_accuracy_p90 = 0.11830769582783529 +settled_accuracy_p90_ci_low = 0.11436067169714748 +settled_accuracy_p90_ci_high = 0.12561048299339816 +settled_accuracy_p95 = 0.1409411526798361 +settled_accuracy_p95_ci_low = 0.1310892510893048 +settled_accuracy_p95_ci_high = 0.15031178780712373 +settled_accuracy_p99 = 0.18491420738225695 +settled_accuracy_p99_ci_low = 0.16464809578902706 +settled_accuracy_p99_ci_high = 0.20360204619416655 +settled_accuracy_mean = 0.059061876167135055 +jitter_p10_per_min = 0.09090909090909091 +jitter_p10_per_min_ci_low = 0.08695652173913043 +jitter_p10_per_min_ci_high = 0.09090909090909091 +jitter_p50_per_min = 0.13636363636363635 +jitter_p50_per_min_ci_low = 0.13333333333333333 +jitter_p50_per_min_ci_high = 0.14285714285714285 +jitter_p90_per_min = 0.18181818181818182 +jitter_p90_per_min_ci_low = 0.18181818181818182 +jitter_p90_per_min_ci_high = 0.19047619047619047 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.19230769230769232 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.22727272727272727 +jitter_p99_per_min_ci_low = 0.21428571428571427 +jitter_p99_per_min_ci_high = 0.23076923076923078 +jitter_mean_per_min = 0.13760277821284228 +reaction_rate = 0.72 +reaction_rate_ci_low = 0.6921707607002994 +reaction_rate_ci_high = 0.7478292392997006 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 165.25 +fire_decisiveness_mean = 7.945786053260725 +fire_decisiveness_p50 = 6.035842943541763 +step_correction_mean = -0.12397311365024911 +step_correction_p50 = 0.44339001178741455 + +[cell.spm_8.step_plus_10_at_15min] +shares_per_minute = 8 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.986 +convergence_rate_ci_low = 0.9787178680044921 +convergence_rate_ci_high = 0.9932821319955079 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 529.8985801217038 +settled_accuracy_p10 = 0.010413831698408815 +settled_accuracy_p10_ci_low = 0.009044932862765975 +settled_accuracy_p10_ci_high = 0.0120537893417334 +settled_accuracy_p50 = 0.05107649635839839 +settled_accuracy_p50_ci_low = 0.04793641154377415 +settled_accuracy_p50_ci_high = 0.0558305493830652 +settled_accuracy_p90 = 0.12246885950374697 +settled_accuracy_p90_ci_low = 0.11644809614284468 +settled_accuracy_p90_ci_high = 0.1298118505348912 +settled_accuracy_p95 = 0.14596855388387375 +settled_accuracy_p95_ci_low = 0.1377783439325685 +settled_accuracy_p95_ci_high = 0.15573252773411128 +settled_accuracy_p99 = 0.19055763623541966 +settled_accuracy_p99_ci_low = 0.17872573320553364 +settled_accuracy_p99_ci_high = 0.1977279744586099 +settled_accuracy_mean = 0.06041244522925209 +jitter_p10_per_min = 0.09090909090909091 +jitter_p10_per_min_ci_low = 0.08695652173913043 +jitter_p10_per_min_ci_high = 0.09090909090909091 +jitter_p50_per_min = 0.14285714285714285 +jitter_p50_per_min_ci_low = 0.13636363636363635 +jitter_p50_per_min_ci_high = 0.14285714285714285 +jitter_p90_per_min = 0.19230769230769232 +jitter_p90_per_min_ci_low = 0.19047619047619047 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.20833333333333334 +jitter_p95_per_min_ci_low = 0.2 +jitter_p95_per_min_ci_high = 0.21052631578947367 +jitter_p99_per_min = 0.23076923076923078 +jitter_p99_per_min_ci_low = 0.2222222222222222 +jitter_p99_per_min_ci_high = 0.23529411764705882 +jitter_mean_per_min = 0.1412325182094443 +reaction_rate = 0.747 +reaction_rate_ci_low = 0.7200550964818948 +reaction_rate_ci_high = 0.7739449035181052 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 168.27309236947792 +fire_decisiveness_mean = 8.284328458173338 +fire_decisiveness_p50 = 6.388446089135883 +step_correction_mean = -0.02585402715557231 +step_correction_p50 = 0.36141690611839294 + +[cell.spm_8.step_plus_25_at_15min] +shares_per_minute = 8 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.969 +convergence_rate_ci_low = 0.9582576621538884 +convergence_rate_ci_high = 0.9797423378461115 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 420 +convergence_p50_secs_ci_low = 420 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 532.0123839009287 +settled_accuracy_p10 = 0.01710416991920949 +settled_accuracy_p10_ci_low = 0.013115004403415176 +settled_accuracy_p10_ci_high = 0.01960448506242629 +settled_accuracy_p50 = 0.07628022771056986 +settled_accuracy_p50_ci_low = 0.07200856072858108 +settled_accuracy_p50_ci_high = 0.08086392405810838 +settled_accuracy_p90 = 0.1468140040840843 +settled_accuracy_p90_ci_low = 0.14186115530751642 +settled_accuracy_p90_ci_high = 0.15440353321180011 +settled_accuracy_p95 = 0.1670384676587897 +settled_accuracy_p95_ci_low = 0.15747754859594298 +settled_accuracy_p95_ci_high = 0.1741698311626927 +settled_accuracy_p99 = 0.20799173132918714 +settled_accuracy_p99_ci_low = 0.19528233288873265 +settled_accuracy_p99_ci_high = 0.22529626146729398 +settled_accuracy_mean = 0.07975460323844824 +jitter_p10_per_min = 0.1111111111111111 +jitter_p10_per_min_ci_low = 0.1 +jitter_p10_per_min_ci_high = 0.11764705882352941 +jitter_p50_per_min = 0.16666666666666666 +jitter_p50_per_min_ci_low = 0.16 +jitter_p50_per_min_ci_high = 0.16666666666666666 +jitter_p90_per_min = 0.21739130434782608 +jitter_p90_per_min_ci_low = 0.21052631578947367 +jitter_p90_per_min_ci_high = 0.2222222222222222 +jitter_p95_per_min = 0.23076923076923078 +jitter_p95_per_min_ci_low = 0.22727272727272727 +jitter_p95_per_min_ci_high = 0.23809523809523808 +jitter_p99_per_min = 0.2631578947368421 +jitter_p99_per_min_ci_low = 0.25 +jitter_p99_per_min_ci_high = 0.2857142857142857 +jitter_mean_per_min = 0.16509995168307653 +reaction_rate = 0.865 +reaction_rate_ci_low = 0.8438197535425104 +reaction_rate_ci_high = 0.8861802464574896 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 161.6878612716763 +fire_decisiveness_mean = 9.521022760714649 +fire_decisiveness_p50 = 7.130062619482995 +step_correction_mean = 0.21497484418870397 +step_correction_p50 = 0.21677154302597046 + +[cell.spm_8.step_plus_50_at_15min] +shares_per_minute = 8 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.909 +convergence_rate_ci_low = 0.891173802693788 +convergence_rate_ci_high = 0.9268261973062121 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 420 +convergence_p50_secs_ci_low = 420 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 540.3960396039604 +settled_accuracy_p10 = 0.02734534068977712 +settled_accuracy_p10_ci_low = 0.024170465102898886 +settled_accuracy_p10_ci_high = 0.03063886474709665 +settled_accuracy_p50 = 0.11087994841744331 +settled_accuracy_p50_ci_low = 0.10677530189816975 +settled_accuracy_p50_ci_high = 0.11525016707870017 +settled_accuracy_p90 = 0.19123198540856456 +settled_accuracy_p90_ci_low = 0.18675269247470738 +settled_accuracy_p90_ci_high = 0.19697883055378862 +settled_accuracy_p95 = 0.20764833452354636 +settled_accuracy_p95_ci_low = 0.20177326671003992 +settled_accuracy_p95_ci_high = 0.21382163412587707 +settled_accuracy_p99 = 0.24515127277328097 +settled_accuracy_p99_ci_low = 0.2351203767473694 +settled_accuracy_p99_ci_high = 0.2657313689465456 +settled_accuracy_mean = 0.11182993258422551 +jitter_p10_per_min = 0.16 +jitter_p10_per_min_ci_low = 0.15384615384615385 +jitter_p10_per_min_ci_high = 0.16666666666666666 +jitter_p50_per_min = 0.20833333333333334 +jitter_p50_per_min_ci_low = 0.2 +jitter_p50_per_min_ci_high = 0.21052631578947367 +jitter_p90_per_min = 0.2608695652173913 +jitter_p90_per_min_ci_low = 0.25 +jitter_p90_per_min_ci_high = 0.2631578947368421 +jitter_p95_per_min = 0.2777777777777778 +jitter_p95_per_min_ci_low = 0.2727272727272727 +jitter_p95_per_min_ci_high = 0.2857142857142857 +jitter_p99_per_min = 0.3 +jitter_p99_per_min_ci_low = 0.29411764705882354 +jitter_p99_per_min_ci_high = 0.3125 +jitter_mean_per_min = 0.2075292492428153 +reaction_rate = 0.973 +reaction_rate_ci_low = 0.9629539722476991 +reaction_rate_ci_high = 0.9830460277523009 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 127.2764645426516 +fire_decisiveness_mean = 11.572009891515254 +fire_decisiveness_p50 = 8.516260828631268 +step_correction_mean = 0.1507395104737713 +step_correction_p50 = 0.14284919202327728 + +[cell.spm_10.cold_start_10gh_to_1ph] +shares_per_minute = 10 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.963 +convergence_rate_ci_low = 0.9513004252384969 +convergence_rate_ci_high = 0.974699574761503 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 866.791277258567 +settled_accuracy_p10 = 0.012556806815254173 +settled_accuracy_p10_ci_low = 0.011077727433453033 +settled_accuracy_p10_ci_high = 0.014853272171208687 +settled_accuracy_p50 = 0.0678683358967801 +settled_accuracy_p50_ci_low = 0.06368289021238005 +settled_accuracy_p50_ci_high = 0.07118371514810151 +settled_accuracy_p90 = 0.13600356374916023 +settled_accuracy_p90_ci_low = 0.13067619362008098 +settled_accuracy_p90_ci_high = 0.1419311555656637 +settled_accuracy_p95 = 0.15456701662373828 +settled_accuracy_p95_ci_low = 0.14915730391745985 +settled_accuracy_p95_ci_high = 0.16064265059615157 +settled_accuracy_p99 = 0.18848236053553147 +settled_accuracy_p99_ci_low = 0.17235569765335734 +settled_accuracy_p99_ci_high = 0.19291449840720465 +settled_accuracy_mean = 0.07150126664627018 +jitter_p10_per_min = 0.07692307692307693 +jitter_p10_per_min_ci_low = 0.07142857142857142 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.13333333333333333 +jitter_p50_per_min_ci_low = 0.13333333333333333 +jitter_p50_per_min_ci_high = 0.14285714285714285 +jitter_p90_per_min = 0.2 +jitter_p90_per_min_ci_low = 0.2 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.21428571428571427 +jitter_p95_per_min_ci_low = 0.21052631578947367 +jitter_p95_per_min_ci_high = 0.2222222222222222 +jitter_p99_per_min = 0.25 +jitter_p99_per_min_ci_low = 0.23529411764705882 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.13697121239451052 +bias_mean = 0.0017756427361246383 +bias_p10 = -0.07815627322772473 +bias_p10_ci_low = -0.08582094269101086 +bias_p10_ci_high = -0.07166412278740882 +bias_p50 = -0.0022414219585765297 +bias_p50_ci_low = -0.006710688692752126 +bias_p50_ci_high = 0.004344702084834727 +bias_p90 = 0.08285131537560626 +bias_p90_ci_low = 0.07883545732478585 +bias_p90_ci_high = 0.08988723128776059 +bias_p99 = 0.16956641305013964 +bias_p99_ci_low = 0.15357609772115993 +bias_p99_ci_high = 0.1943172820737363 +variance_mean = 0.01692672991544134 +variance_p10 = 0.008407510860279972 +variance_p10_ci_low = 0.008061937736539909 +variance_p10_ci_high = 0.008745738037712655 +variance_p50 = 0.01528315157286069 +variance_p50_ci_low = 0.014767176230516382 +variance_p50_ci_high = 0.015979154968311288 +variance_p90 = 0.02710428047098857 +variance_p90_ci_low = 0.025446511819538706 +variance_p90_ci_high = 0.02833298237444654 +variance_p99 = 0.04660030443558197 +variance_p99_ci_low = 0.040016711938284655 +variance_p99_ci_high = 0.053406513551083515 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0.02498899246843922 +ramp_target_overshoot_p90_ci_low = 0.017171145255057585 +ramp_target_overshoot_p90_ci_high = 0.031234747413305675 +ramp_target_overshoot_p99 = 0.10701991609915495 +ramp_target_overshoot_p99_ci_low = 0.09092211002887618 +ramp_target_overshoot_p99_ci_high = 0.11959370145722192 +ramp_target_overshoot_mean = 0.006932487810849098 + +[cell.spm_10.stable_1ph] +shares_per_minute = 10 +scenario = "stable_1ph" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1020 +convergence_p95_secs_ci_low = 960 +convergence_p95_secs_ci_high = 1020 +convergence_p99_secs = 1260 +convergence_p99_secs_ci_low = 1200 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 553.6336336336336 +settled_accuracy_p10 = 0.008076149234277796 +settled_accuracy_p10_ci_low = 0.006808932538880708 +settled_accuracy_p10_ci_high = 0.00938403390178788 +settled_accuracy_p50 = 0.041154914036563905 +settled_accuracy_p50_ci_low = 0.03826728668994317 +settled_accuracy_p50_ci_high = 0.04319730523010934 +settled_accuracy_p90 = 0.09721712288055939 +settled_accuracy_p90_ci_low = 0.09261956165697427 +settled_accuracy_p90_ci_high = 0.1031484727934957 +settled_accuracy_p95 = 0.12188197953166202 +settled_accuracy_p95_ci_low = 0.11335123484673437 +settled_accuracy_p95_ci_high = 0.1284500583545134 +settled_accuracy_p99 = 0.1577320720177442 +settled_accuracy_p99_ci_low = 0.14388643945260382 +settled_accuracy_p99_ci_high = 0.17232274720070473 +settled_accuracy_mean = 0.047615772757572415 +jitter_p10_per_min = 0.06666666666666667 +jitter_p10_per_min_ci_low = 0.0625 +jitter_p10_per_min_ci_high = 0.07142857142857142 +jitter_p50_per_min = 0.1111111111111111 +jitter_p50_per_min_ci_low = 0.1111111111111111 +jitter_p50_per_min_ci_high = 0.11764705882352941 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.15789473684210525 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.17647058823529413 +jitter_p95_per_min_ci_low = 0.17391304347826086 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.21428571428571427 +jitter_mean_per_min = 0.11451571127521429 +bias_mean = -0.0014253963535211496 +bias_p10 = -0.08267286583981788 +bias_p10_ci_low = -0.08765452994957204 +bias_p10_ci_high = -0.07827017109959629 +bias_p50 = -0.0005784748831598449 +bias_p50_ci_low = -0.007130200335255399 +bias_p50_ci_high = 0.0026065966128057893 +bias_p90 = 0.0857368906037802 +bias_p90_ci_low = 0.0789334115431818 +bias_p90_ci_high = 0.09359053509850321 +bias_p99 = 0.1452123198920364 +bias_p99_ci_low = 0.12829002843610995 +bias_p99_ci_high = 0.14875227012954156 +variance_mean = 0.01985323222528958 +variance_p10 = 0.009977411929665026 +variance_p10_ci_low = 0.009454316094424832 +variance_p10_ci_high = 0.010372474784603876 +variance_p50 = 0.017833475677385528 +variance_p50_ci_low = 0.017222760192856443 +variance_p50_ci_high = 0.018611362240651654 +variance_p90 = 0.031967581518896886 +variance_p90_ci_low = 0.03069929285787962 +variance_p90_ci_high = 0.03459711518168363 +variance_p99 = 0.050376343671732 +variance_p99_ci_low = 0.045002802180404776 +variance_p99_ci_high = 0.054027164697347634 +upward_step_magnitude_p50 = 1.0559989512641392 +upward_step_magnitude_p50_ci_low = 1.0547067439912903 +upward_step_magnitude_p50_ci_high = 1.0573997340878727 +upward_step_magnitude_p90 = 1.0824333754933593 +upward_step_magnitude_p90_ci_low = 1.0801244496429703 +upward_step_magnitude_p90_ci_high = 1.086167398974608 +upward_step_magnitude_p95 = 1.0924909995100796 +upward_step_magnitude_p95_ci_low = 1.0887773778163996 +upward_step_magnitude_p95_ci_high = 1.0964822241549317 +upward_step_magnitude_p99 = 1.1068324253356598 +upward_step_magnitude_p99_ci_low = 1.1037328707677356 +upward_step_magnitude_p99_ci_high = 1.1157387669323215 +upward_step_magnitude_mean = 1.0566735071314854 +fire_decisiveness_mean = 6.611377923298242 +fire_decisiveness_p50 = 5.073354826097159 + +[cell.spm_10.step_minus_50_at_15min] +shares_per_minute = 10 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.802 +convergence_rate_ci_low = 0.7773012001587122 +convergence_rate_ci_high = 0.8266987998412879 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 420 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 660 +convergence_p90_secs_ci_low = 660 +convergence_p90_secs_ci_high = 660 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 720 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 481.4214463840399 +settled_accuracy_p10 = 0.23105682839075414 +settled_accuracy_p10_ci_low = 0.22378491179311455 +settled_accuracy_p10_ci_high = 0.24245594017808414 +settled_accuracy_p50 = 0.3673847292838457 +settled_accuracy_p50_ci_low = 0.35987605261093414 +settled_accuracy_p50_ci_high = 0.37716383307314105 +settled_accuracy_p90 = 0.5008132587789635 +settled_accuracy_p90_ci_low = 0.4868390456287266 +settled_accuracy_p90_ci_high = 0.5108742198007257 +settled_accuracy_p95 = 0.5407681320938684 +settled_accuracy_p95_ci_low = 0.5223148048665469 +settled_accuracy_p95_ci_high = 0.558894236496069 +settled_accuracy_p99 = 0.6129442531357121 +settled_accuracy_p99_ci_low = 0.5875023429382449 +settled_accuracy_p99_ci_high = 0.648917020626782 +settled_accuracy_mean = 0.3679001306005617 +jitter_p10_per_min = 0.19047619047619047 +jitter_p10_per_min_ci_low = 0.19047619047619047 +jitter_p10_per_min_ci_high = 0.2 +jitter_p50_per_min = 0.23809523809523808 +jitter_p50_per_min_ci_low = 0.23809523809523808 +jitter_p50_per_min_ci_high = 0.24 +jitter_p90_per_min = 0.28 +jitter_p90_per_min_ci_low = 0.2777777777777778 +jitter_p90_per_min_ci_high = 0.2857142857142857 +jitter_p95_per_min = 0.29411764705882354 +jitter_p95_per_min_ci_low = 0.2857142857142857 +jitter_p95_per_min_ci_high = 0.29411764705882354 +jitter_p99_per_min = 0.3125 +jitter_p99_per_min_ci_low = 0.3 +jitter_p99_per_min_ci_high = 0.3157894736842105 +jitter_mean_per_min = 0.23830167610686406 +reaction_rate = 0.996 +reaction_rate_ci_low = 0.9920878478557194 +reaction_rate_ci_high = 0.9999121521442806 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 121.08433734939759 +fire_decisiveness_mean = 8.64198834332612 +fire_decisiveness_p50 = 7.2343630632234515 +step_correction_mean = 0.13067044410106526 +step_correction_p50 = 0.1275932341814041 + +[cell.spm_10.step_minus_25_at_15min] +shares_per_minute = 10 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.972 +convergence_rate_ci_low = 0.9617748845678887 +convergence_rate_ci_high = 0.9822251154321112 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 960 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 543.0864197530864 +settled_accuracy_p10 = 0.05923824639708175 +settled_accuracy_p10_ci_low = 0.05311979710574688 +settled_accuracy_p10_ci_high = 0.06389085915540726 +settled_accuracy_p50 = 0.14369850904685633 +settled_accuracy_p50_ci_low = 0.13949248340464915 +settled_accuracy_p50_ci_high = 0.14898838757176058 +settled_accuracy_p90 = 0.23675496970213783 +settled_accuracy_p90_ci_low = 0.2326233901590311 +settled_accuracy_p90_ci_high = 0.24578057495473948 +settled_accuracy_p95 = 0.272424941196977 +settled_accuracy_p95_ci_low = 0.26043464531757743 +settled_accuracy_p95_ci_high = 0.2803143486534516 +settled_accuracy_p99 = 0.3144449323010261 +settled_accuracy_p99_ci_low = 0.2993314793987869 +settled_accuracy_p99_ci_high = 0.3285746587447189 +settled_accuracy_mean = 0.146731820723414 +jitter_p10_per_min = 0.1 +jitter_p10_per_min_ci_low = 0.1 +jitter_p10_per_min_ci_high = 0.10526315789473684 +jitter_p50_per_min = 0.15 +jitter_p50_per_min_ci_low = 0.15 +jitter_p50_per_min_ci_high = 0.15789473684210525 +jitter_p90_per_min = 0.2 +jitter_p90_per_min_ci_low = 0.2 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.21428571428571427 +jitter_p95_per_min_ci_low = 0.20833333333333334 +jitter_p95_per_min_ci_high = 0.2222222222222222 +jitter_p99_per_min = 0.25 +jitter_p99_per_min_ci_low = 0.22727272727272727 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.15145009774680412 +reaction_rate = 0.872 +reaction_rate_ci_low = 0.8512928991502915 +reaction_rate_ci_high = 0.8927071008497085 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 165.3440366972477 +fire_decisiveness_mean = 7.037793830486498 +fire_decisiveness_p50 = 5.594951057832908 +step_correction_mean = 0.20915785216546934 +step_correction_p50 = 0.21045295894145966 + +[cell.spm_10.step_minus_10_at_15min] +shares_per_minute = 10 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.998 +convergence_rate_ci_low = 0.995230914663648 +convergence_rate_ci_high = 1 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1020 +convergence_p95_secs_ci_low = 960 +convergence_p95_secs_ci_high = 1080 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 551.062124248497 +settled_accuracy_p10 = 0.01061967952534637 +settled_accuracy_p10_ci_low = 0.008933159198257767 +settled_accuracy_p10_ci_high = 0.013376884500797659 +settled_accuracy_p50 = 0.05832133141004303 +settled_accuracy_p50_ci_low = 0.05512262467242479 +settled_accuracy_p50_ci_high = 0.06188332080013148 +settled_accuracy_p90 = 0.14126900625566474 +settled_accuracy_p90_ci_low = 0.13320930620991867 +settled_accuracy_p90_ci_high = 0.1484412288527852 +settled_accuracy_p95 = 0.16261782732068975 +settled_accuracy_p95_ci_low = 0.15739623571466654 +settled_accuracy_p95_ci_high = 0.1707013137305855 +settled_accuracy_p99 = 0.22347609750023212 +settled_accuracy_p99_ci_low = 0.20473400842365375 +settled_accuracy_p99_ci_high = 0.24490216832469058 +settled_accuracy_mean = 0.06804499701551969 +jitter_p10_per_min = 0.07142857142857142 +jitter_p10_per_min_ci_low = 0.0625 +jitter_p10_per_min_ci_high = 0.08 +jitter_p50_per_min = 0.12 +jitter_p50_per_min_ci_low = 0.11764705882352941 +jitter_p50_per_min_ci_high = 0.125 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.17647058823529413 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.21052631578947367 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.21739130434782608 +jitter_mean_per_min = 0.12086791109259733 +reaction_rate = 0.669 +reaction_rate_ci_low = 0.6398335798837088 +reaction_rate_ci_high = 0.6981664201162913 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 176.9506726457399 +fire_decisiveness_mean = 6.4906910515038225 +fire_decisiveness_p50 = 5.0955435625620975 +step_correction_mean = 1.2441342199953505 +step_correction_p50 = 0.3753228485584259 + +[cell.spm_10.step_minus_5_at_15min] +shares_per_minute = 10 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.995 +convergence_rate_ci_low = 0.9906282772274537 +convergence_rate_ci_high = 0.9993717227725463 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1020 +convergence_p95_secs_ci_low = 960 +convergence_p95_secs_ci_high = 1080 +convergence_p99_secs = 1260 +convergence_p99_secs_ci_low = 1200 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 542.2311557788945 +settled_accuracy_p10 = 0.008020639578562028 +settled_accuracy_p10_ci_low = 0.00681529372878964 +settled_accuracy_p10_ci_high = 0.009586324710974425 +settled_accuracy_p50 = 0.04617089886955472 +settled_accuracy_p50_ci_low = 0.04198323507535928 +settled_accuracy_p50_ci_high = 0.048961214820208654 +settled_accuracy_p90 = 0.11093427336605277 +settled_accuracy_p90_ci_low = 0.10504988555112948 +settled_accuracy_p90_ci_high = 0.11991937329079905 +settled_accuracy_p95 = 0.13663039891699014 +settled_accuracy_p95_ci_low = 0.12369703724252368 +settled_accuracy_p95_ci_high = 0.15219442808518702 +settled_accuracy_p99 = 0.18377854413746486 +settled_accuracy_p99_ci_low = 0.16738469619781648 +settled_accuracy_p99_ci_high = 0.19166793290498108 +settled_accuracy_mean = 0.053981009533485336 +jitter_p10_per_min = 0.07142857142857142 +jitter_p10_per_min_ci_low = 0.06666666666666667 +jitter_p10_per_min_ci_high = 0.07692307692307693 +jitter_p50_per_min = 0.1111111111111111 +jitter_p50_per_min_ci_low = 0.1111111111111111 +jitter_p50_per_min_ci_high = 0.11764705882352941 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.15789473684210525 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.17647058823529413 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.1875 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.11550863484547667 +reaction_rate = 0.624 +reaction_rate_ci_low = 0.5939778155624877 +reaction_rate_ci_high = 0.6540221844375123 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 170.96153846153845 +fire_decisiveness_mean = 6.54059285085807 +fire_decisiveness_p50 = 4.989552646806182 +step_correction_mean = 0.22902515829087067 +step_correction_p50 = 0.4804590940475464 + +[cell.spm_10.step_plus_5_at_15min] +shares_per_minute = 10 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.994 +convergence_rate_ci_low = 0.9892134247733896 +convergence_rate_ci_high = 0.9987865752266104 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 840 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 900 +convergence_p95_secs = 960 +convergence_p95_secs_ci_low = 960 +convergence_p95_secs_ci_high = 1020 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1140 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 530.6438631790744 +settled_accuracy_p10 = 0.00790120654077553 +settled_accuracy_p10_ci_low = 0.0064305636032937485 +settled_accuracy_p10_ci_high = 0.008748440038353067 +settled_accuracy_p50 = 0.04364562733307187 +settled_accuracy_p50_ci_low = 0.04056584153435672 +settled_accuracy_p50_ci_high = 0.04676708454400924 +settled_accuracy_p90 = 0.10179303394596695 +settled_accuracy_p90_ci_low = 0.09820443509095933 +settled_accuracy_p90_ci_high = 0.10885582701199747 +settled_accuracy_p95 = 0.12101211935050382 +settled_accuracy_p95_ci_low = 0.11544157188657356 +settled_accuracy_p95_ci_high = 0.12842598767318725 +settled_accuracy_p99 = 0.14944365469022614 +settled_accuracy_p99_ci_low = 0.14353289721516083 +settled_accuracy_p99_ci_high = 0.16205718212541842 +settled_accuracy_mean = 0.05031530296970171 +jitter_p10_per_min = 0.06666666666666667 +jitter_p10_per_min_ci_low = 0.0625 +jitter_p10_per_min_ci_high = 0.07692307692307693 +jitter_p50_per_min = 0.12 +jitter_p50_per_min_ci_low = 0.11764705882352941 +jitter_p50_per_min_ci_high = 0.125 +jitter_p90_per_min = 0.16 +jitter_p90_per_min_ci_low = 0.15789473684210525 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.17391304347826086 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.17647058823529413 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.19047619047619047 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.11783759787792986 +reaction_rate = 0.64 +reaction_rate_ci_low = 0.6102492917731359 +reaction_rate_ci_high = 0.6697507082268641 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 172.59375 +fire_decisiveness_mean = 6.858614772756505 +fire_decisiveness_p50 = 5.273528398421558 +step_correction_mean = -0.6455146809574217 +step_correction_p50 = 0.48650994896888733 + +[cell.spm_10.step_plus_10_at_15min] +shares_per_minute = 10 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.992 +convergence_rate_ci_low = 0.9864785022321837 +convergence_rate_ci_high = 0.9975214977678163 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 840 +convergence_p90_secs_ci_low = 780 +convergence_p90_secs_ci_high = 900 +convergence_p95_secs = 1020 +convergence_p95_secs_ci_low = 960 +convergence_p95_secs_ci_high = 1080 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1200 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 536.733870967742 +settled_accuracy_p10 = 0.00891681593813587 +settled_accuracy_p10_ci_low = 0.00696699836138448 +settled_accuracy_p10_ci_high = 0.010861386821783281 +settled_accuracy_p50 = 0.04801822335135941 +settled_accuracy_p50_ci_low = 0.04503901678923494 +settled_accuracy_p50_ci_high = 0.05189735979692123 +settled_accuracy_p90 = 0.11490520232194235 +settled_accuracy_p90_ci_low = 0.10797401569139486 +settled_accuracy_p90_ci_high = 0.12113754163266233 +settled_accuracy_p95 = 0.13335214821883612 +settled_accuracy_p95_ci_low = 0.12609969314776392 +settled_accuracy_p95_ci_high = 0.14164381457283648 +settled_accuracy_p99 = 0.16828670517861422 +settled_accuracy_p99_ci_low = 0.1595434571693224 +settled_accuracy_p99_ci_high = 0.17834528694744167 +settled_accuracy_mean = 0.05628052603833125 +jitter_p10_per_min = 0.07692307692307693 +jitter_p10_per_min_ci_low = 0.06666666666666667 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.12 +jitter_p50_per_min_ci_low = 0.11764705882352941 +jitter_p50_per_min_ci_high = 0.125 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.17647058823529413 +jitter_p95_per_min_ci_high = 0.1875 +jitter_p99_per_min = 0.20833333333333334 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.21428571428571427 +jitter_mean_per_min = 0.1215494325452795 +reaction_rate = 0.668 +reaction_rate_ci_low = 0.638811394661615 +reaction_rate_ci_high = 0.6971886053383851 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 169.76047904191617 +fire_decisiveness_mean = 7.18663685417016 +fire_decisiveness_p50 = 5.508692989932216 +step_correction_mean = 10.079625652801848 +step_correction_p50 = 0.377105176448822 + +[cell.spm_10.step_plus_25_at_15min] +shares_per_minute = 10 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.986 +convergence_rate_ci_low = 0.9787178680044921 +convergence_rate_ci_high = 0.9932821319955079 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 558.5598377281947 +settled_accuracy_p10 = 0.019526853530666965 +settled_accuracy_p10_ci_low = 0.0170058151708119 +settled_accuracy_p10_ci_high = 0.022076346048082618 +settled_accuracy_p50 = 0.08417169303096483 +settled_accuracy_p50_ci_low = 0.08062834510834371 +settled_accuracy_p50_ci_high = 0.08756149587693884 +settled_accuracy_p90 = 0.15110940075973678 +settled_accuracy_p90_ci_low = 0.14619193177530532 +settled_accuracy_p90_ci_high = 0.15663772145119215 +settled_accuracy_p95 = 0.16769967785598672 +settled_accuracy_p95_ci_low = 0.1614083025581039 +settled_accuracy_p95_ci_high = 0.17390010722385563 +settled_accuracy_p99 = 0.2010068262060858 +settled_accuracy_p99_ci_low = 0.19476291029553028 +settled_accuracy_p99_ci_high = 0.21520432339986162 +settled_accuracy_mean = 0.08499998206851209 +jitter_p10_per_min = 0.09090909090909091 +jitter_p10_per_min_ci_low = 0.09090909090909091 +jitter_p10_per_min_ci_high = 0.09523809523809523 +jitter_p50_per_min = 0.14285714285714285 +jitter_p50_per_min_ci_low = 0.14285714285714285 +jitter_p50_per_min_ci_high = 0.15 +jitter_p90_per_min = 0.19047619047619047 +jitter_p90_per_min_ci_low = 0.1875 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.20833333333333334 +jitter_p95_per_min_ci_low = 0.2 +jitter_p95_per_min_ci_high = 0.21052631578947367 +jitter_p99_per_min = 0.23076923076923078 +jitter_p99_per_min_ci_low = 0.2222222222222222 +jitter_p99_per_min_ci_high = 0.23809523809523808 +jitter_mean_per_min = 0.14344528038781496 +reaction_rate = 0.821 +reaction_rate_ci_low = 0.7972395771418099 +reaction_rate_ci_high = 0.84476042285819 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 163.77588306942752 +fire_decisiveness_mean = 8.34686980656059 +fire_decisiveness_p50 = 6.179064722462211 +step_correction_mean = 0.22000934680907938 +step_correction_p50 = 0.21614691615104675 + +[cell.spm_10.step_plus_50_at_15min] +shares_per_minute = 10 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.917 +convergence_rate_ci_low = 0.8999006427723145 +convergence_rate_ci_high = 0.9340993572276856 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 569.1821155943294 +settled_accuracy_p10 = 0.05101553158586025 +settled_accuracy_p10_ci_low = 0.04495381165369572 +settled_accuracy_p10_ci_high = 0.056146317365331044 +settled_accuracy_p50 = 0.1281870558455802 +settled_accuracy_p50_ci_low = 0.12245882222513127 +settled_accuracy_p50_ci_high = 0.1316504100664727 +settled_accuracy_p90 = 0.19304553533232438 +settled_accuracy_p90_ci_low = 0.1882540519660615 +settled_accuracy_p90_ci_high = 0.20010324027541115 +settled_accuracy_p95 = 0.21230193154520127 +settled_accuracy_p95_ci_low = 0.20511850933139797 +settled_accuracy_p95_ci_high = 0.21774347610132583 +settled_accuracy_p99 = 0.24537255306543893 +settled_accuracy_p99_ci_low = 0.23733156905622832 +settled_accuracy_p99_ci_high = 0.25777932655092384 +settled_accuracy_mean = 0.12480922766556615 +jitter_p10_per_min = 0.15 +jitter_p10_per_min_ci_low = 0.14285714285714285 +jitter_p10_per_min_ci_high = 0.15 +jitter_p50_per_min = 0.19047619047619047 +jitter_p50_per_min_ci_low = 0.19047619047619047 +jitter_p50_per_min_ci_high = 0.19047619047619047 +jitter_p90_per_min = 0.24 +jitter_p90_per_min_ci_low = 0.23809523809523808 +jitter_p90_per_min_ci_high = 0.25 +jitter_p95_per_min = 0.25 +jitter_p95_per_min_ci_low = 0.25 +jitter_p95_per_min_ci_high = 0.2631578947368421 +jitter_p99_per_min = 0.2857142857142857 +jitter_p99_per_min_ci_low = 0.2777777777777778 +jitter_p99_per_min_ci_high = 0.3 +jitter_mean_per_min = 0.19317443741910129 +reaction_rate = 0.979 +reaction_rate_ci_low = 0.9701129614381392 +reaction_rate_ci_high = 0.9878870385618608 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 127.90602655771195 +fire_decisiveness_mean = 10.693353210950374 +fire_decisiveness_p50 = 7.997585366842124 +step_correction_mean = 0.15030393173368276 +step_correction_p50 = 0.142548069357872 + +[cell.spm_12.cold_start_10gh_to_1ph] +shares_per_minute = 12 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.976 +convergence_rate_ci_low = 0.9665139239724742 +convergence_rate_ci_high = 0.9854860760275258 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 840 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 862.8688524590164 +settled_accuracy_p10 = 0.017313013395399146 +settled_accuracy_p10_ci_low = 0.01480663151012196 +settled_accuracy_p10_ci_high = 0.020288956008192915 +settled_accuracy_p50 = 0.07612655148145842 +settled_accuracy_p50_ci_low = 0.07200901996830988 +settled_accuracy_p50_ci_high = 0.0792891909563288 +settled_accuracy_p90 = 0.13752774028815606 +settled_accuracy_p90_ci_low = 0.13289447714845848 +settled_accuracy_p90_ci_high = 0.14274391102814066 +settled_accuracy_p95 = 0.15634338827692684 +settled_accuracy_p95_ci_low = 0.14903053527171473 +settled_accuracy_p95_ci_high = 0.16116301273437683 +settled_accuracy_p99 = 0.1867513544749969 +settled_accuracy_p99_ci_low = 0.177932779868629 +settled_accuracy_p99_ci_high = 0.19332339272087595 +settled_accuracy_mean = 0.07747374348884628 +jitter_p10_per_min = 0.07142857142857142 +jitter_p10_per_min_ci_low = 0.06666666666666667 +jitter_p10_per_min_ci_high = 0.07142857142857142 +jitter_p50_per_min = 0.125 +jitter_p50_per_min_ci_low = 0.125 +jitter_p50_per_min_ci_high = 0.13333333333333333 +jitter_p90_per_min = 0.1875 +jitter_p90_per_min_ci_low = 0.18181818181818182 +jitter_p90_per_min_ci_high = 0.1875 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.19047619047619047 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.2222222222222222 +jitter_p99_per_min_ci_low = 0.21428571428571427 +jitter_p99_per_min_ci_high = 0.23076923076923078 +jitter_mean_per_min = 0.12580562453571958 +bias_mean = -0.0005979527261067287 +bias_p10 = -0.0755515062144981 +bias_p10_ci_low = -0.08219881588244594 +bias_p10_ci_high = -0.07101970461439744 +bias_p50 = -0.00031070698027100597 +bias_p50_ci_low = -0.005981844035684976 +bias_p50_ci_high = 0.004773630160693344 +bias_p90 = 0.07144123305489242 +bias_p90_ci_low = 0.06654471949852554 +bias_p90_ci_high = 0.07572254198674078 +bias_p99 = 0.13555969512075353 +bias_p99_ci_low = 0.1205636859260055 +bias_p99_ci_high = 0.1599499564249778 +variance_mean = 0.0137369456107027 +variance_p10 = 0.006905589738734939 +variance_p10_ci_low = 0.006596059363231659 +variance_p10_ci_high = 0.0072106278697227095 +variance_p50 = 0.012216217560505553 +variance_p50_ci_low = 0.01184275133380397 +variance_p50_ci_high = 0.012602476089347607 +variance_p90 = 0.023202265994487416 +variance_p90_ci_low = 0.021603034229991557 +variance_p90_ci_high = 0.025196371190271325 +variance_p99 = 0.03585299290522308 +variance_p99_ci_low = 0.033363226597968705 +variance_p99_ci_high = 0.03755928905705625 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0 +ramp_target_overshoot_p90_ci_low = 0 +ramp_target_overshoot_p90_ci_high = 0.0006714913019194579 +ramp_target_overshoot_p99 = 0.056849261611226165 +ramp_target_overshoot_p99_ci_low = 0.04344406452624727 +ramp_target_overshoot_p99_ci_high = 0.07139906749547897 +ramp_target_overshoot_mean = 0.002341243880258726 + +[cell.spm_12.stable_1ph] +shares_per_minute = 12 +scenario = "stable_1ph" +convergence_rate = 0.998 +convergence_rate_ci_low = 0.995230914663648 +convergence_rate_ci_high = 1 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1020 +convergence_p95_secs_ci_low = 960 +convergence_p95_secs_ci_high = 1080 +convergence_p99_secs = 1260 +convergence_p99_secs_ci_low = 1200 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 574.629258517034 +settled_accuracy_p10 = 0.005785656567296904 +settled_accuracy_p10_ci_low = 0.004925455137354762 +settled_accuracy_p10_ci_high = 0.007061731632857393 +settled_accuracy_p50 = 0.037076037229582415 +settled_accuracy_p50_ci_low = 0.03451918947792065 +settled_accuracy_p50_ci_high = 0.03993044568809101 +settled_accuracy_p90 = 0.09220717768232967 +settled_accuracy_p90_ci_low = 0.0857558682843571 +settled_accuracy_p90_ci_high = 0.09940332837152765 +settled_accuracy_p95 = 0.11140890297071482 +settled_accuracy_p95_ci_low = 0.10546903023193965 +settled_accuracy_p95_ci_high = 0.11498560414185177 +settled_accuracy_p99 = 0.14222120007964478 +settled_accuracy_p99_ci_low = 0.13409646402719888 +settled_accuracy_p99_ci_high = 0.14715095018435143 +settled_accuracy_mean = 0.044058793539644335 +jitter_p10_per_min = 0.05263157894736842 +jitter_p10_per_min_ci_low = 0.05263157894736842 +jitter_p10_per_min_ci_high = 0.05555555555555555 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.09523809523809523 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13636363636363635 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15384615384615385 +jitter_p95_per_min_ci_low = 0.15 +jitter_p95_per_min_ci_high = 0.15789473684210525 +jitter_p99_per_min = 0.17647058823529413 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.09773388038706218 +bias_mean = 0.0002594682829005573 +bias_p10 = -0.07723533827507238 +bias_p10_ci_low = -0.08322521771431453 +bias_p10_ci_high = -0.07343124754542704 +bias_p50 = -0.003479191990476448 +bias_p50_ci_low = -0.007852984002210866 +bias_p50_ci_high = 0.0009631287684298756 +bias_p90 = 0.08408068973530601 +bias_p90_ci_low = 0.07806519236990997 +bias_p90_ci_high = 0.09361476139872238 +bias_p99 = 0.1645602506726613 +bias_p99_ci_low = 0.15104303476402736 +bias_p99_ci_high = 0.18727255017596492 +variance_mean = 0.016306748458431698 +variance_p10 = 0.007908254068378404 +variance_p10_ci_low = 0.007570308954753883 +variance_p10_ci_high = 0.008435988313108113 +variance_p50 = 0.014979790374450729 +variance_p50_ci_low = 0.014358621971167261 +variance_p50_ci_high = 0.015571179116115287 +variance_p90 = 0.026359993666704745 +variance_p90_ci_low = 0.02509487473900588 +variance_p90_ci_high = 0.027486661017433127 +variance_p99 = 0.04142430960245704 +variance_p99_ci_low = 0.037076623575194464 +variance_p99_ci_high = 0.04592802536806055 +upward_step_magnitude_p50 = 1.0504658663845052 +upward_step_magnitude_p50_ci_low = 1.04867452945445 +upward_step_magnitude_p50_ci_high = 1.0515400779845274 +upward_step_magnitude_p90 = 1.0764431551026443 +upward_step_magnitude_p90_ci_low = 1.0742821737762716 +upward_step_magnitude_p90_ci_high = 1.0786726671550098 +upward_step_magnitude_p95 = 1.0845168373122067 +upward_step_magnitude_p95_ci_low = 1.080488407915366 +upward_step_magnitude_p95_ci_high = 1.0885886005795118 +upward_step_magnitude_p99 = 1.1048352959131218 +upward_step_magnitude_p99_ci_low = 1.0955633353734449 +upward_step_magnitude_p99_ci_high = 1.1116924987806205 +upward_step_magnitude_mean = 1.0510736305908033 +fire_decisiveness_mean = 5.835459136280031 +fire_decisiveness_p50 = 4.329777318144963 + +[cell.spm_12.step_minus_50_at_15min] +shares_per_minute = 12 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.758 +convergence_rate_ci_low = 0.7314540447977474 +convergence_rate_ci_high = 0.7845459552022526 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 660 +convergence_p90_secs_ci_low = 660 +convergence_p90_secs_ci_high = 720 +convergence_p95_secs = 1020 +convergence_p95_secs_ci_low = 720 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 507.2295514511873 +settled_accuracy_p10 = 0.2587596362457931 +settled_accuracy_p10_ci_low = 0.24811590184147403 +settled_accuracy_p10_ci_high = 0.27172802172931365 +settled_accuracy_p50 = 0.3868401260814509 +settled_accuracy_p50_ci_low = 0.3796414923642526 +settled_accuracy_p50_ci_high = 0.39473145750186855 +settled_accuracy_p90 = 0.517819718879623 +settled_accuracy_p90_ci_low = 0.5073754320217063 +settled_accuracy_p90_ci_high = 0.533036922425038 +settled_accuracy_p95 = 0.5524299079783113 +settled_accuracy_p95_ci_low = 0.5409871754288138 +settled_accuracy_p95_ci_high = 0.5657708818796066 +settled_accuracy_p99 = 0.6130998114844877 +settled_accuracy_p99_ci_low = 0.5974446554869113 +settled_accuracy_p99_ci_high = 0.6274722486388813 +settled_accuracy_mean = 0.3867048072965587 +jitter_p10_per_min = 0.19047619047619047 +jitter_p10_per_min_ci_low = 0.18181818181818182 +jitter_p10_per_min_ci_high = 0.19047619047619047 +jitter_p50_per_min = 0.22727272727272727 +jitter_p50_per_min_ci_low = 0.22727272727272727 +jitter_p50_per_min_ci_high = 0.23529411764705882 +jitter_p90_per_min = 0.2777777777777778 +jitter_p90_per_min_ci_low = 0.2777777777777778 +jitter_p90_per_min_ci_high = 0.2777777777777778 +jitter_p95_per_min = 0.2857142857142857 +jitter_p95_per_min_ci_low = 0.2777777777777778 +jitter_p95_per_min_ci_high = 0.29411764705882354 +jitter_p99_per_min = 0.3125 +jitter_p99_per_min_ci_low = 0.3 +jitter_p99_per_min_ci_high = 0.3333333333333333 +jitter_mean_per_min = 0.2308702357905066 +reaction_rate = 0.998 +reaction_rate_ci_low = 0.995230914663648 +reaction_rate_ci_high = 1 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 118.19639278557115 +fire_decisiveness_mean = 8.024548035289927 +fire_decisiveness_p50 = 6.7648411898562415 +step_correction_mean = 0.1294725391237375 +step_correction_p50 = 0.12568794190883636 + +[cell.spm_12.step_minus_25_at_15min] +shares_per_minute = 12 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.975 +convergence_rate_ci_low = 0.9653232753475155 +convergence_rate_ci_high = 0.9846767246524845 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 600.5538461538462 +settled_accuracy_p10 = 0.07684689631796937 +settled_accuracy_p10_ci_low = 0.06919362258207884 +settled_accuracy_p10_ci_high = 0.08331914353700043 +settled_accuracy_p50 = 0.162653452245467 +settled_accuracy_p50_ci_low = 0.1587641804383748 +settled_accuracy_p50_ci_high = 0.1666494718845628 +settled_accuracy_p90 = 0.2479139209820873 +settled_accuracy_p90_ci_low = 0.23748412987229361 +settled_accuracy_p90_ci_high = 0.2567724699041354 +settled_accuracy_p95 = 0.27441655330488346 +settled_accuracy_p95_ci_low = 0.2683167155383235 +settled_accuracy_p95_ci_high = 0.28615219341740783 +settled_accuracy_p99 = 0.3272202229249066 +settled_accuracy_p99_ci_low = 0.3095992249731587 +settled_accuracy_p99_ci_high = 0.342508785221304 +settled_accuracy_mean = 0.16301089033686939 +jitter_p10_per_min = 0.09523809523809523 +jitter_p10_per_min_ci_low = 0.09090909090909091 +jitter_p10_per_min_ci_high = 0.1 +jitter_p50_per_min = 0.13636363636363635 +jitter_p50_per_min_ci_low = 0.13636363636363635 +jitter_p50_per_min_ci_high = 0.14285714285714285 +jitter_p90_per_min = 0.1875 +jitter_p90_per_min_ci_low = 0.18181818181818182 +jitter_p90_per_min_ci_high = 0.19047619047619047 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.19047619047619047 +jitter_p95_per_min_ci_high = 0.20833333333333334 +jitter_p99_per_min = 0.22727272727272727 +jitter_p99_per_min_ci_low = 0.21739130434782608 +jitter_p99_per_min_ci_high = 0.23529411764705882 +jitter_mean_per_min = 0.1390866147484808 +reaction_rate = 0.834 +reaction_rate_ci_low = 0.8109382032269816 +reaction_rate_ci_high = 0.8570617967730183 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 169.92805755395685 +fire_decisiveness_mean = 6.359589236655422 +fire_decisiveness_p50 = 5.159609333620583 +step_correction_mean = 0.19999161280459352 +step_correction_p50 = 0.19589322805404663 + +[cell.spm_12.step_minus_10_at_15min] +shares_per_minute = 12 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.998 +convergence_rate_ci_low = 0.995230914663648 +convergence_rate_ci_high = 1 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1020 +convergence_p95_secs_ci_low = 960 +convergence_p95_secs_ci_high = 1020 +convergence_p99_secs = 1260 +convergence_p99_secs_ci_low = 1200 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 585.2104208416833 +settled_accuracy_p10 = 0.011386361018101088 +settled_accuracy_p10_ci_low = 0.00933178585263117 +settled_accuracy_p10_ci_high = 0.013118217111343755 +settled_accuracy_p50 = 0.05499399934904403 +settled_accuracy_p50_ci_low = 0.05174764531772136 +settled_accuracy_p50_ci_high = 0.059180921397251396 +settled_accuracy_p90 = 0.13131996798161505 +settled_accuracy_p90_ci_low = 0.12580347019937665 +settled_accuracy_p90_ci_high = 0.13887769372185388 +settled_accuracy_p95 = 0.1551784368779614 +settled_accuracy_p95_ci_low = 0.14322634813319923 +settled_accuracy_p95_ci_high = 0.1627938762415606 +settled_accuracy_p99 = 0.19307973390589628 +settled_accuracy_p99_ci_low = 0.18255751136469978 +settled_accuracy_p99_ci_high = 0.2177012305901591 +settled_accuracy_mean = 0.06461906458445263 +jitter_p10_per_min = 0.05555555555555555 +jitter_p10_per_min_ci_low = 0.05555555555555555 +jitter_p10_per_min_ci_high = 0.058823529411764705 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.1 +jitter_p50_per_min_ci_high = 0.10526315789473684 +jitter_p90_per_min = 0.15 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15384615384615385 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.15789473684210525 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.10443252006176587 +reaction_rate = 0.615 +reaction_rate_ci_low = 0.5848405099512608 +reaction_rate_ci_high = 0.6451594900487392 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 182.73170731707316 +fire_decisiveness_mean = 5.866533300930267 +fire_decisiveness_p50 = 4.624669454316166 +step_correction_mean = -0.44563349286715187 +step_correction_p50 = 0.36029312014579773 + +[cell.spm_12.step_minus_5_at_15min] +shares_per_minute = 12 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.998 +convergence_rate_ci_low = 0.995230914663648 +convergence_rate_ci_high = 1 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 900 +convergence_p95_secs = 960 +convergence_p95_secs_ci_low = 960 +convergence_p95_secs_ci_high = 1020 +convergence_p99_secs = 1200 +convergence_p99_secs_ci_low = 1140 +convergence_p99_secs_ci_high = 1260 +convergence_mean_secs = 570.5410821643287 +settled_accuracy_p10 = 0.008111836993556665 +settled_accuracy_p10_ci_low = 0.006516835883434879 +settled_accuracy_p10_ci_high = 0.009433669704155268 +settled_accuracy_p50 = 0.0426115859710825 +settled_accuracy_p50_ci_low = 0.039257484916576324 +settled_accuracy_p50_ci_high = 0.04719603975755193 +settled_accuracy_p90 = 0.10803276862283351 +settled_accuracy_p90_ci_low = 0.10255675590944757 +settled_accuracy_p90_ci_high = 0.11355067139593422 +settled_accuracy_p95 = 0.1291344093780611 +settled_accuracy_p95_ci_low = 0.12072107698001355 +settled_accuracy_p95_ci_high = 0.13402862355550815 +settled_accuracy_p99 = 0.17083232581735253 +settled_accuracy_p99_ci_low = 0.14992982178781822 +settled_accuracy_p99_ci_high = 0.18750647688844868 +settled_accuracy_mean = 0.05116269590578704 +jitter_p10_per_min = 0.05555555555555555 +jitter_p10_per_min_ci_low = 0.05263157894736842 +jitter_p10_per_min_ci_high = 0.05555555555555555 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.09523809523809523 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13636363636363635 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15384615384615385 +jitter_p95_per_min_ci_low = 0.15 +jitter_p95_per_min_ci_high = 0.15789473684210525 +jitter_p99_per_min = 0.17647058823529413 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.1875 +jitter_mean_per_min = 0.09854425745773562 +reaction_rate = 0.573 +reaction_rate_ci_low = 0.5423417529268224 +reaction_rate_ci_high = 0.6036582470731775 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 177.59162303664922 +fire_decisiveness_mean = 5.754222554344384 +fire_decisiveness_p50 = 4.311880862401093 +step_correction_mean = 7.308778170619751 +step_correction_p50 = 0.45416727662086487 + +[cell.spm_12.step_plus_5_at_15min] +shares_per_minute = 12 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.998 +convergence_rate_ci_low = 0.995230914663648 +convergence_rate_ci_high = 1 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 900 +convergence_p95_secs = 1020 +convergence_p95_secs_ci_low = 960 +convergence_p95_secs_ci_high = 1080 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 573.186372745491 +settled_accuracy_p10 = 0.008499114610316605 +settled_accuracy_p10_ci_low = 0.006399310044126971 +settled_accuracy_p10_ci_high = 0.009485231510899306 +settled_accuracy_p50 = 0.03775020902814985 +settled_accuracy_p50_ci_low = 0.03538529247131805 +settled_accuracy_p50_ci_high = 0.04122338062782971 +settled_accuracy_p90 = 0.09210321625328244 +settled_accuracy_p90_ci_low = 0.08901377956001888 +settled_accuracy_p90_ci_high = 0.09666872850678676 +settled_accuracy_p95 = 0.10758063066742396 +settled_accuracy_p95_ci_low = 0.10181086573125853 +settled_accuracy_p95_ci_high = 0.11159687280338293 +settled_accuracy_p99 = 0.1370114490287685 +settled_accuracy_p99_ci_low = 0.12671976064758905 +settled_accuracy_p99_ci_high = 0.15504679789071074 +settled_accuracy_mean = 0.045565980929065365 +jitter_p10_per_min = 0.05555555555555555 +jitter_p10_per_min_ci_low = 0.05555555555555555 +jitter_p10_per_min_ci_high = 0.058823529411764705 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.1 +jitter_p50_per_min_ci_high = 0.10526315789473684 +jitter_p90_per_min = 0.15 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.15384615384615385 +jitter_p95_per_min_ci_high = 0.15789473684210525 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.17391304347826086 +jitter_p99_per_min_ci_high = 0.19047619047619047 +jitter_mean_per_min = 0.10217410646095842 +reaction_rate = 0.553 +reaction_rate_ci_low = 0.5221842743781686 +reaction_rate_ci_high = 0.5838157256218315 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 175.44303797468353 +fire_decisiveness_mean = 6.058179168038425 +fire_decisiveness_p50 = 4.58338680075118 +step_correction_mean = 3.9497675166800486 +step_correction_p50 = 0.4519708454608917 + +[cell.spm_12.step_plus_10_at_15min] +shares_per_minute = 12 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 960 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 591.3513513513514 +settled_accuracy_p10 = 0.010254173607096018 +settled_accuracy_p10_ci_low = 0.00870420285130935 +settled_accuracy_p10_ci_high = 0.012252492591028785 +settled_accuracy_p50 = 0.04629791809387396 +settled_accuracy_p50_ci_low = 0.04293869233007286 +settled_accuracy_p50_ci_high = 0.04904407386929033 +settled_accuracy_p90 = 0.10411946549375017 +settled_accuracy_p90_ci_low = 0.0995212880607167 +settled_accuracy_p90_ci_high = 0.11325212794585804 +settled_accuracy_p95 = 0.12590989707513334 +settled_accuracy_p95_ci_low = 0.11796347532898144 +settled_accuracy_p95_ci_high = 0.1296363913562073 +settled_accuracy_p99 = 0.14196819442438802 +settled_accuracy_p99_ci_low = 0.13745975984665504 +settled_accuracy_p99_ci_high = 0.15451523392594735 +settled_accuracy_mean = 0.0523368716177513 +jitter_p10_per_min = 0.05555555555555555 +jitter_p10_per_min_ci_low = 0.05263157894736842 +jitter_p10_per_min_ci_high = 0.058823529411764705 +jitter_p50_per_min = 0.10526315789473684 +jitter_p50_per_min_ci_low = 0.1 +jitter_p50_per_min_ci_high = 0.10526315789473684 +jitter_p90_per_min = 0.15 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15384615384615385 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.15789473684210525 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.10377352666474837 +reaction_rate = 0.614 +reaction_rate_ci_low = 0.5838259289057641 +reaction_rate_ci_high = 0.6441740710942359 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 176.1889250814332 +fire_decisiveness_mean = 6.634663965327226 +fire_decisiveness_p50 = 4.833483589718773 +step_correction_mean = 0.36755035152652754 +step_correction_p50 = 0.3962858021259308 + +[cell.spm_12.step_plus_25_at_15min] +shares_per_minute = 12 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.987 +convergence_rate_ci_low = 0.9799792044895183 +convergence_rate_ci_high = 0.9940207955104817 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 603.8905775075988 +settled_accuracy_p10 = 0.026927940973407116 +settled_accuracy_p10_ci_low = 0.02174273447245889 +settled_accuracy_p10_ci_high = 0.030436714410237653 +settled_accuracy_p50 = 0.08779202824026822 +settled_accuracy_p50_ci_low = 0.0834405822429306 +settled_accuracy_p50_ci_high = 0.09121554657859698 +settled_accuracy_p90 = 0.14764771090060524 +settled_accuracy_p90_ci_low = 0.14323769228836492 +settled_accuracy_p90_ci_high = 0.15113044609891357 +settled_accuracy_p95 = 0.16337094149760778 +settled_accuracy_p95_ci_low = 0.15591197937213164 +settled_accuracy_p95_ci_high = 0.16845859855650447 +settled_accuracy_p99 = 0.1889174599650003 +settled_accuracy_p99_ci_low = 0.1824790357283287 +settled_accuracy_p99_ci_high = 0.2011700349588853 +settled_accuracy_mean = 0.08763624226449579 +jitter_p10_per_min = 0.08695652173913043 +jitter_p10_per_min_ci_low = 0.08333333333333333 +jitter_p10_per_min_ci_high = 0.09090909090909091 +jitter_p50_per_min = 0.13333333333333333 +jitter_p50_per_min_ci_low = 0.13043478260869565 +jitter_p50_per_min_ci_high = 0.13636363636363635 +jitter_p90_per_min = 0.18181818181818182 +jitter_p90_per_min_ci_low = 0.18181818181818182 +jitter_p90_per_min_ci_high = 0.1875 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.19047619047619047 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.23076923076923078 +jitter_p99_per_min_ci_low = 0.21428571428571427 +jitter_p99_per_min_ci_high = 0.23809523809523808 +jitter_mean_per_min = 0.13408348939820408 +reaction_rate = 0.814 +reaction_rate_ci_low = 0.7898829187835674 +reaction_rate_ci_high = 0.8381170812164325 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 157.8132678132678 +fire_decisiveness_mean = 7.772338292171737 +fire_decisiveness_p50 = 5.74758936689463 +step_correction_mean = 0.22387452678942563 +step_correction_p50 = 0.21883097290992737 + +[cell.spm_12.step_plus_50_at_15min] +shares_per_minute = 12 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.899 +convergence_rate_ci_low = 0.8803234521819475 +convergence_rate_ci_high = 0.9176765478180525 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 629.1657397107898 +settled_accuracy_p10 = 0.06418658554666568 +settled_accuracy_p10_ci_low = 0.05747784669311229 +settled_accuracy_p10_ci_high = 0.06839627980673724 +settled_accuracy_p50 = 0.13687917478646627 +settled_accuracy_p50_ci_low = 0.13390822066575392 +settled_accuracy_p50_ci_high = 0.14070214303654727 +settled_accuracy_p90 = 0.19694133906878486 +settled_accuracy_p90_ci_low = 0.19203586011327445 +settled_accuracy_p90_ci_high = 0.20105412813014756 +settled_accuracy_p95 = 0.21093487925907517 +settled_accuracy_p95_ci_low = 0.20585241186123215 +settled_accuracy_p95_ci_high = 0.21668798789821397 +settled_accuracy_p99 = 0.2351378250518461 +settled_accuracy_p99_ci_low = 0.228350076696483 +settled_accuracy_p99_ci_high = 0.2460841754526336 +settled_accuracy_mean = 0.13371501961681553 +jitter_p10_per_min = 0.13636363636363635 +jitter_p10_per_min_ci_low = 0.13043478260869565 +jitter_p10_per_min_ci_high = 0.14285714285714285 +jitter_p50_per_min = 0.18181818181818182 +jitter_p50_per_min_ci_low = 0.18181818181818182 +jitter_p50_per_min_ci_high = 0.1875 +jitter_p90_per_min = 0.22727272727272727 +jitter_p90_per_min_ci_low = 0.2222222222222222 +jitter_p90_per_min_ci_high = 0.22727272727272727 +jitter_p95_per_min = 0.23529411764705882 +jitter_p95_per_min_ci_low = 0.23529411764705882 +jitter_p95_per_min_ci_high = 0.23809523809523808 +jitter_p99_per_min = 0.25 +jitter_p99_per_min_ci_low = 0.25 +jitter_p99_per_min_ci_high = 0.2631578947368421 +jitter_mean_per_min = 0.1823058343077721 +reaction_rate = 0.985 +reaction_rate_ci_low = 0.9774661006112372 +reaction_rate_ci_high = 0.9925338993887628 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 128.2233502538071 +fire_decisiveness_mean = 10.056717843128592 +fire_decisiveness_p50 = 7.65445897071973 +step_correction_mean = 0.14292771408173638 +step_correction_p50 = 0.1359371691942215 + +[cell.spm_15.cold_start_10gh_to_1ph] +shares_per_minute = 15 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.973 +convergence_rate_ci_low = 0.9629539722476991 +convergence_rate_ci_high = 0.9830460277523009 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 840 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 863.1243576567317 +settled_accuracy_p10 = 0.030996041180952227 +settled_accuracy_p10_ci_low = 0.02803137285745716 +settled_accuracy_p10_ci_high = 0.035655543886815244 +settled_accuracy_p50 = 0.08626535878647312 +settled_accuracy_p50_ci_low = 0.08303956986975713 +settled_accuracy_p50_ci_high = 0.08937444538717487 +settled_accuracy_p90 = 0.14447391045570213 +settled_accuracy_p90_ci_low = 0.1416012483859479 +settled_accuracy_p90_ci_high = 0.1496073359652983 +settled_accuracy_p95 = 0.1590469360072011 +settled_accuracy_p95_ci_low = 0.15466472713099333 +settled_accuracy_p95_ci_high = 0.16487466983277344 +settled_accuracy_p99 = 0.18176134060963434 +settled_accuracy_p99_ci_low = 0.17541136559762016 +settled_accuracy_p99_ci_high = 0.19949754250692275 +settled_accuracy_mean = 0.08787087777925487 +jitter_p10_per_min = 0.07142857142857142 +jitter_p10_per_min_ci_low = 0.06666666666666667 +jitter_p10_per_min_ci_high = 0.07142857142857142 +jitter_p50_per_min = 0.125 +jitter_p50_per_min_ci_low = 0.11764705882352941 +jitter_p50_per_min_ci_high = 0.13333333333333333 +jitter_p90_per_min = 0.18181818181818182 +jitter_p90_per_min_ci_low = 0.17647058823529413 +jitter_p90_per_min_ci_high = 0.1875 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.19047619047619047 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.2222222222222222 +jitter_p99_per_min_ci_low = 0.21428571428571427 +jitter_p99_per_min_ci_high = 0.2222222222222222 +jitter_mean_per_min = 0.12379882129276572 +bias_mean = 0.0017537935007741652 +bias_p10 = -0.06235253820331957 +bias_p10_ci_low = -0.06934835480268951 +bias_p10_ci_high = -0.05862877325288171 +bias_p50 = 0.0009406967473346864 +bias_p50_ci_low = -0.002597586364685188 +bias_p50_ci_high = 0.004476850035906245 +bias_p90 = 0.06852180670245833 +bias_p90_ci_low = 0.0625093680884823 +bias_p90_ci_high = 0.07449261309589444 +bias_p99 = 0.12980124590009426 +bias_p99_ci_low = 0.11353809065085954 +bias_p99_ci_high = 0.1415467277313068 +variance_mean = 0.011065663020649737 +variance_p10 = 0.005498993986332599 +variance_p10_ci_low = 0.005290592725806815 +variance_p10_ci_high = 0.005745281745146637 +variance_p50 = 0.009988973810201626 +variance_p50_ci_low = 0.009604358982221917 +variance_p50_ci_high = 0.010272549243815229 +variance_p90 = 0.01861308933306519 +variance_p90_ci_low = 0.01754397661259526 +variance_p90_ci_high = 0.019314734537756607 +variance_p99 = 0.027081741253162327 +variance_p99_ci_low = 0.02517011797266613 +variance_p99_ci_high = 0.0308552219415235 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0 +ramp_target_overshoot_p90_ci_low = 0 +ramp_target_overshoot_p90_ci_high = 0 +ramp_target_overshoot_p99 = 0.029304092479773836 +ramp_target_overshoot_p99_ci_low = 0.0179349112461773 +ramp_target_overshoot_p99_ci_high = 0.043460640415871055 +ramp_target_overshoot_mean = 0.00082436153800365 + +[cell.spm_15.stable_1ph] +shares_per_minute = 15 +scenario = "stable_1ph" +convergence_rate = 0.996 +convergence_rate_ci_low = 0.9920878478557194 +convergence_rate_ci_high = 0.9999121521442806 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 690 +settled_accuracy_p10 = 0.00522348560625574 +settled_accuracy_p10_ci_low = 0.0038149376414360336 +settled_accuracy_p10_ci_high = 0.006770948921362541 +settled_accuracy_p50 = 0.03129266236369099 +settled_accuracy_p50_ci_low = 0.02909618921639734 +settled_accuracy_p50_ci_high = 0.03333968406891252 +settled_accuracy_p90 = 0.0787978198477286 +settled_accuracy_p90_ci_low = 0.07641914613230472 +settled_accuracy_p90_ci_high = 0.08396003506035532 +settled_accuracy_p95 = 0.09267660419211632 +settled_accuracy_p95_ci_low = 0.08744707878802194 +settled_accuracy_p95_ci_high = 0.09916603142533664 +settled_accuracy_p99 = 0.1234822575234239 +settled_accuracy_p99_ci_low = 0.11811744064774554 +settled_accuracy_p99_ci_high = 0.1379392518475574 +settled_accuracy_mean = 0.03911255169983065 +jitter_p10_per_min = 0.047619047619047616 +jitter_p10_per_min_ci_low = 0.045454545454545456 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.07692307692307693 +jitter_p50_per_min_ci_low = 0.07142857142857142 +jitter_p50_per_min_ci_high = 0.07692307692307693 +jitter_p90_per_min = 0.11764705882352941 +jitter_p90_per_min_ci_low = 0.11764705882352941 +jitter_p90_per_min_ci_high = 0.125 +jitter_p95_per_min = 0.13333333333333333 +jitter_p95_per_min_ci_low = 0.125 +jitter_p95_per_min_ci_high = 0.13636363636363635 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.15384615384615385 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.07823989175060972 +bias_mean = -0.0010066801629893484 +bias_p10 = -0.07416372667733388 +bias_p10_ci_low = -0.07930347454841022 +bias_p10_ci_high = -0.06859470812198352 +bias_p50 = -0.0004429573606626003 +bias_p50_ci_low = -0.005560665267696438 +bias_p50_ci_high = 0.003275318791037756 +bias_p90 = 0.0751168986094439 +bias_p90_ci_low = 0.06729239349025785 +bias_p90_ci_high = 0.08134735273311926 +bias_p99 = 0.13320855016810965 +bias_p99_ci_low = 0.12546761324591812 +bias_p99_ci_high = 0.1407535080125989 +variance_mean = 0.01283102003772308 +variance_p10 = 0.006271819630211189 +variance_p10_ci_low = 0.005840225392188627 +variance_p10_ci_high = 0.006602527115784112 +variance_p50 = 0.01160966823757917 +variance_p50_ci_low = 0.011259591061246228 +variance_p50_ci_high = 0.012070572472592056 +variance_p90 = 0.02096863866974103 +variance_p90_ci_low = 0.019936753192107044 +variance_p90_ci_high = 0.02217144494883265 +variance_p99 = 0.03278596064814528 +variance_p99_ci_low = 0.02929850411961948 +variance_p99_ci_high = 0.03596516834405036 +upward_step_magnitude_p50 = 1.0431019435331248 +upward_step_magnitude_p50_ci_low = 1.0421944974623119 +upward_step_magnitude_p50_ci_high = 1.0443666100916567 +upward_step_magnitude_p90 = 1.066152966201761 +upward_step_magnitude_p90_ci_low = 1.0644593004935914 +upward_step_magnitude_p90_ci_high = 1.06820620956527 +upward_step_magnitude_p95 = 1.0718776336963398 +upward_step_magnitude_p95_ci_low = 1.0698444973248422 +upward_step_magnitude_p95_ci_high = 1.0760295834737117 +upward_step_magnitude_p99 = 1.0876311584043685 +upward_step_magnitude_p99_ci_low = 1.0839446921797413 +upward_step_magnitude_p99_ci_high = 1.090053696313589 +upward_step_magnitude_mean = 1.0417820867240863 +fire_decisiveness_mean = 5.275732351532301 +fire_decisiveness_p50 = 4.102990758796574 + +[cell.spm_15.step_minus_50_at_15min] +shares_per_minute = 15 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.629 +convergence_rate_ci_low = 0.5990588588327032 +convergence_rate_ci_high = 0.6589411411672969 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 780 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 601.6216216216217 +settled_accuracy_p10 = 0.30920604105948524 +settled_accuracy_p10_ci_low = 0.3027967418109234 +settled_accuracy_p10_ci_high = 0.32096015874199324 +settled_accuracy_p50 = 0.41825861756677885 +settled_accuracy_p50_ci_low = 0.409847460879055 +settled_accuracy_p50_ci_high = 0.4240652792087811 +settled_accuracy_p90 = 0.5409026182590739 +settled_accuracy_p90_ci_low = 0.5342268968169661 +settled_accuracy_p90_ci_high = 0.5503433591516795 +settled_accuracy_p95 = 0.5678538068275352 +settled_accuracy_p95_ci_low = 0.5564741566110185 +settled_accuracy_p95_ci_high = 0.5792266119398348 +settled_accuracy_p99 = 0.6274900995969375 +settled_accuracy_p99_ci_low = 0.6043727062609416 +settled_accuracy_p99_ci_high = 0.6577604926220177 +settled_accuracy_mean = 0.423010241148324 +jitter_p10_per_min = 0.18181818181818182 +jitter_p10_per_min_ci_low = 0.17391304347826086 +jitter_p10_per_min_ci_high = 0.18181818181818182 +jitter_p50_per_min = 0.21739130434782608 +jitter_p50_per_min_ci_low = 0.21052631578947367 +jitter_p50_per_min_ci_high = 0.2222222222222222 +jitter_p90_per_min = 0.2631578947368421 +jitter_p90_per_min_ci_low = 0.25 +jitter_p90_per_min_ci_high = 0.2631578947368421 +jitter_p95_per_min = 0.26666666666666666 +jitter_p95_per_min_ci_low = 0.2631578947368421 +jitter_p95_per_min_ci_high = 0.2777777777777778 +jitter_p99_per_min = 0.2857142857142857 +jitter_p99_per_min_ci_low = 0.2777777777777778 +jitter_p99_per_min_ci_high = 0.29411764705882354 +jitter_mean_per_min = 0.21804545274705928 +reaction_rate = 1 +reaction_rate_ci_low = 1 +reaction_rate_ci_high = 1 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 123.9 +fire_decisiveness_mean = 7.507502653854716 +fire_decisiveness_p50 = 6.398978928643324 +step_correction_mean = 0.1273615152053535 +step_correction_p50 = 0.1246548742055893 + +[cell.spm_15.step_minus_25_at_15min] +shares_per_minute = 15 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.99 +convergence_rate_ci_low = 0.9838330039727595 +convergence_rate_ci_high = 0.9961669960272405 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 702.6060606060606 +settled_accuracy_p10 = 0.1047514775358449 +settled_accuracy_p10_ci_low = 0.09791344227219523 +settled_accuracy_p10_ci_high = 0.11176220627457134 +settled_accuracy_p50 = 0.16538576724802923 +settled_accuracy_p50_ci_low = 0.1623432303397203 +settled_accuracy_p50_ci_high = 0.16932291004432676 +settled_accuracy_p90 = 0.2452381563817263 +settled_accuracy_p90_ci_low = 0.24020311258066607 +settled_accuracy_p90_ci_high = 0.2508880963282414 +settled_accuracy_p95 = 0.2646501556791412 +settled_accuracy_p95_ci_low = 0.25521142826362264 +settled_accuracy_p95_ci_high = 0.2748932946702767 +settled_accuracy_p99 = 0.30338458631099097 +settled_accuracy_p99_ci_low = 0.2966830952146817 +settled_accuracy_p99_ci_high = 0.32894930515930265 +settled_accuracy_mean = 0.17181638066509533 +jitter_p10_per_min = 0.08695652173913043 +jitter_p10_per_min_ci_low = 0.08333333333333333 +jitter_p10_per_min_ci_high = 0.09090909090909091 +jitter_p50_per_min = 0.13043478260869565 +jitter_p50_per_min_ci_low = 0.125 +jitter_p50_per_min_ci_high = 0.13333333333333333 +jitter_p90_per_min = 0.17391304347826086 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.17647058823529413 +jitter_p95_per_min = 0.1875 +jitter_p95_per_min_ci_low = 0.18181818181818182 +jitter_p95_per_min_ci_high = 0.1875 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.2222222222222222 +jitter_mean_per_min = 0.12943455123394348 +reaction_rate = 0.824 +reaction_rate_ci_low = 0.8003965214766975 +reaction_rate_ci_high = 0.8476034785233024 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 167.76699029126215 +fire_decisiveness_mean = 5.641194850294605 +fire_decisiveness_p50 = 4.463337242459406 +step_correction_mean = 0.19946927572736173 +step_correction_p50 = 0.1999063342809677 + +[cell.spm_15.step_minus_10_at_15min] +shares_per_minute = 15 +scenario = "step_minus_10_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 673.98 +settled_accuracy_p10 = 0.016926868860704047 +settled_accuracy_p10_ci_low = 0.015025301906003596 +settled_accuracy_p10_ci_high = 0.018507058920464337 +settled_accuracy_p50 = 0.0636207692987385 +settled_accuracy_p50_ci_low = 0.058708624122877806 +settled_accuracy_p50_ci_high = 0.06733188949854396 +settled_accuracy_p90 = 0.12695147917257743 +settled_accuracy_p90_ci_low = 0.12203008788651437 +settled_accuracy_p90_ci_high = 0.13722465326154665 +settled_accuracy_p95 = 0.15047768462487454 +settled_accuracy_p95_ci_low = 0.14413000627467887 +settled_accuracy_p95_ci_high = 0.1581194455763888 +settled_accuracy_p99 = 0.18621673404272365 +settled_accuracy_p99_ci_low = 0.1796218713754223 +settled_accuracy_p99_ci_high = 0.20197926410656297 +settled_accuracy_mean = 0.06908179027063137 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0.05 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.08695652173913043 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.125 +jitter_p90_per_min_ci_low = 0.125 +jitter_p90_per_min_ci_high = 0.125 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.13333333333333333 +jitter_p95_per_min_ci_high = 0.14285714285714285 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.15384615384615385 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.08613562346572048 +reaction_rate = 0.529 +reaction_rate_ci_low = 0.4980618485620101 +reaction_rate_ci_high = 0.55993815143799 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 178.97920604914933 +fire_decisiveness_mean = 5.130838816772082 +fire_decisiveness_p50 = 3.9959917795083335 +step_correction_mean = 0.2121957764452031 +step_correction_p50 = 0.33664795756340027 + +[cell.spm_15.step_minus_5_at_15min] +shares_per_minute = 15 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.997 +convergence_rate_ci_low = 0.9936102764714508 +convergence_rate_ci_high = 1 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 660.7823470411233 +settled_accuracy_p10 = 0.008069593729291169 +settled_accuracy_p10_ci_low = 0.0062541223386125555 +settled_accuracy_p10_ci_high = 0.009177172559425406 +settled_accuracy_p50 = 0.0374944290812238 +settled_accuracy_p50_ci_low = 0.03513021910055336 +settled_accuracy_p50_ci_high = 0.03988286889407355 +settled_accuracy_p90 = 0.09778453858381786 +settled_accuracy_p90_ci_low = 0.09160444791903533 +settled_accuracy_p90_ci_high = 0.10296117512001723 +settled_accuracy_p95 = 0.1188911242027555 +settled_accuracy_p95_ci_low = 0.1138114069952727 +settled_accuracy_p95_ci_high = 0.12445769856294486 +settled_accuracy_p99 = 0.15225362516788699 +settled_accuracy_p99_ci_low = 0.14073710822816143 +settled_accuracy_p99_ci_high = 0.1686218304571534 +settled_accuracy_mean = 0.04611799695156216 +jitter_p10_per_min = 0.047619047619047616 +jitter_p10_per_min_ci_low = 0.047619047619047616 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.07692307692307693 +jitter_p50_per_min_ci_high = 0.08695652173913043 +jitter_p90_per_min = 0.125 +jitter_p90_per_min_ci_low = 0.11764705882352941 +jitter_p90_per_min_ci_high = 0.125 +jitter_p95_per_min = 0.13636363636363635 +jitter_p95_per_min_ci_low = 0.13333333333333333 +jitter_p95_per_min_ci_high = 0.14285714285714285 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.15384615384615385 +jitter_p99_per_min_ci_high = 0.17647058823529413 +jitter_mean_per_min = 0.08151202916492166 +reaction_rate = 0.485 +reaction_rate_ci_low = 0.454023627714014 +reaction_rate_ci_high = 0.5159763722859859 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 178.02061855670104 +fire_decisiveness_mean = 5.111069416509254 +fire_decisiveness_p50 = 3.957107443966521 +step_correction_mean = -1.285529906018493 +step_correction_p50 = 0.5018991827964783 + +[cell.spm_15.step_plus_5_at_15min] +shares_per_minute = 15 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.995 +convergence_rate_ci_low = 0.9906282772274537 +convergence_rate_ci_high = 0.9993717227725463 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 960 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 668.8643216080402 +settled_accuracy_p10 = 0.008167405055969468 +settled_accuracy_p10_ci_low = 0.0069508171239848204 +settled_accuracy_p10_ci_high = 0.00903438773510623 +settled_accuracy_p50 = 0.03467023148980797 +settled_accuracy_p50_ci_low = 0.031672318511732356 +settled_accuracy_p50_ci_high = 0.03683759231783679 +settled_accuracy_p90 = 0.0838832106263635 +settled_accuracy_p90_ci_low = 0.07968072539958215 +settled_accuracy_p90_ci_high = 0.08965955862304875 +settled_accuracy_p95 = 0.10394454429818123 +settled_accuracy_p95_ci_low = 0.09540727350213318 +settled_accuracy_p95_ci_high = 0.10790153888946197 +settled_accuracy_p99 = 0.1272814299276669 +settled_accuracy_p99_ci_low = 0.11803580903704658 +settled_accuracy_p99_ci_high = 0.1412937618535035 +settled_accuracy_mean = 0.04084369040492722 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0.047619047619047616 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.07692307692307693 +jitter_p50_per_min_ci_high = 0.08695652173913043 +jitter_p90_per_min = 0.125 +jitter_p90_per_min_ci_low = 0.11764705882352941 +jitter_p90_per_min_ci_high = 0.125 +jitter_p95_per_min = 0.13636363636363635 +jitter_p95_per_min_ci_low = 0.13333333333333333 +jitter_p95_per_min_ci_high = 0.14285714285714285 +jitter_p99_per_min = 0.15789473684210525 +jitter_p99_per_min_ci_low = 0.15384615384615385 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.08198740988150988 +reaction_rate = 0.444 +reaction_rate_ci_low = 0.41320466362580205 +reaction_rate_ci_high = 0.47479533637419796 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 177.02702702702703 +fire_decisiveness_mean = 5.378249381807895 +fire_decisiveness_p50 = 4.096622758483356 +step_correction_mean = -21.60841626965919 +step_correction_p50 = 0.5204004645347595 + +[cell.spm_15.step_plus_10_at_15min] +shares_per_minute = 15 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.993 +convergence_rate_ci_low = 0.9878325091582084 +convergence_rate_ci_high = 0.9981674908417916 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 688.5800604229607 +settled_accuracy_p10 = 0.00874940982328587 +settled_accuracy_p10_ci_low = 0.007119640525872439 +settled_accuracy_p10_ci_high = 0.00994217839159206 +settled_accuracy_p50 = 0.046505467511774756 +settled_accuracy_p50_ci_low = 0.04273181400082493 +settled_accuracy_p50_ci_high = 0.04979788945059016 +settled_accuracy_p90 = 0.09700476662068491 +settled_accuracy_p90_ci_low = 0.09323666484313575 +settled_accuracy_p90_ci_high = 0.10129607351519954 +settled_accuracy_p95 = 0.11429512172846568 +settled_accuracy_p95_ci_low = 0.10712350233602908 +settled_accuracy_p95_ci_high = 0.12146460583882512 +settled_accuracy_p99 = 0.14387256099692536 +settled_accuracy_p99_ci_low = 0.13518141387031646 +settled_accuracy_p99_ci_high = 0.14882214485180134 +settled_accuracy_mean = 0.05126131484447488 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0.047619047619047616 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.13333333333333333 +jitter_p90_per_min_ci_low = 0.13043478260869565 +jitter_p90_per_min_ci_high = 0.13333333333333333 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.15 +jitter_p99_per_min = 0.17647058823529413 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.1875 +jitter_mean_per_min = 0.0877733578511483 +reaction_rate = 0.549 +reaction_rate_ci_low = 0.5181588534843466 +reaction_rate_ci_high = 0.5798411465156534 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 186.01092896174865 +fire_decisiveness_mean = 5.893319676161703 +fire_decisiveness_p50 = 4.229193633548888 +step_correction_mean = 0.34817077170629973 +step_correction_p50 = 0.368954062461853 + +[cell.spm_15.step_plus_25_at_15min] +shares_per_minute = 15 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.982 +convergence_rate_ci_low = 0.9737596042813467 +convergence_rate_ci_high = 0.9902403957186533 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 715.112016293279 +settled_accuracy_p10 = 0.038851628855565146 +settled_accuracy_p10_ci_low = 0.03304150463008204 +settled_accuracy_p10_ci_high = 0.04305715334299842 +settled_accuracy_p50 = 0.09332255010240276 +settled_accuracy_p50_ci_low = 0.08914494290163255 +settled_accuracy_p50_ci_high = 0.09819164701898142 +settled_accuracy_p90 = 0.14811382221369906 +settled_accuracy_p90_ci_low = 0.1454334942585952 +settled_accuracy_p90_ci_high = 0.15090635618635262 +settled_accuracy_p95 = 0.1608057186628994 +settled_accuracy_p95_ci_low = 0.15479190561895528 +settled_accuracy_p95_ci_high = 0.16577875378520823 +settled_accuracy_p99 = 0.19008230875101706 +settled_accuracy_p99_ci_low = 0.17985384441438446 +settled_accuracy_p99_ci_high = 0.19895560356851638 +settled_accuracy_mean = 0.09514399634455346 +jitter_p10_per_min = 0.07692307692307693 +jitter_p10_per_min_ci_low = 0.06666666666666667 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.11764705882352941 +jitter_p50_per_min_ci_low = 0.1111111111111111 +jitter_p50_per_min_ci_high = 0.11764705882352941 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.17647058823529413 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.18181818181818182 +jitter_p95_per_min_ci_high = 0.1875 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.21052631578947367 +jitter_mean_per_min = 0.11926508401058686 +reaction_rate = 0.812 +reaction_rate_ci_low = 0.7877834087947954 +reaction_rate_ci_high = 0.8362165912052048 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 168.32512315270935 +fire_decisiveness_mean = 7.077240727062474 +fire_decisiveness_p50 = 5.289893347198685 +step_correction_mean = 0.2149878541750861 +step_correction_p50 = 0.21062245965003967 + +[cell.spm_15.step_plus_50_at_15min] +shares_per_minute = 15 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.869 +convergence_rate_ci_low = 0.8480877092981185 +convergence_rate_ci_high = 0.8899122907018815 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 747.7560414269275 +settled_accuracy_p10 = 0.08404669309443535 +settled_accuracy_p10_ci_low = 0.07941054437725703 +settled_accuracy_p10_ci_high = 0.09187883432083277 +settled_accuracy_p50 = 0.14912206842759723 +settled_accuracy_p50_ci_low = 0.1455688778082711 +settled_accuracy_p50_ci_high = 0.1515194654626919 +settled_accuracy_p90 = 0.20795578259627368 +settled_accuracy_p90_ci_low = 0.2030700783858368 +settled_accuracy_p90_ci_high = 0.21066018031167322 +settled_accuracy_p95 = 0.2189546568674603 +settled_accuracy_p95_ci_low = 0.21574658476283415 +settled_accuracy_p95_ci_high = 0.2235217281946078 +settled_accuracy_p99 = 0.24927184646279477 +settled_accuracy_p99_ci_low = 0.23993664565383765 +settled_accuracy_p99_ci_high = 0.2553035016241687 +settled_accuracy_mean = 0.14747584626737348 +jitter_p10_per_min = 0.13043478260869565 +jitter_p10_per_min_ci_low = 0.125 +jitter_p10_per_min_ci_high = 0.13636363636363635 +jitter_p50_per_min = 0.16666666666666666 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.17647058823529413 +jitter_p90_per_min = 0.21739130434782608 +jitter_p90_per_min_ci_low = 0.21052631578947367 +jitter_p90_per_min_ci_high = 0.2222222222222222 +jitter_p95_per_min = 0.23076923076923078 +jitter_p95_per_min_ci_low = 0.2222222222222222 +jitter_p95_per_min_ci_high = 0.23529411764705882 +jitter_p99_per_min = 0.25 +jitter_p99_per_min_ci_low = 0.23809523809523808 +jitter_p99_per_min_ci_high = 0.26666666666666666 +jitter_mean_per_min = 0.17126979429642272 +reaction_rate = 0.98 +reaction_rate_ci_low = 0.971322710100498 +reaction_rate_ci_high = 0.988677289899502 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 126.6734693877551 +fire_decisiveness_mean = 9.109486946891737 +fire_decisiveness_p50 = 6.973153280799803 +step_correction_mean = 0.1396487661542333 +step_correction_p50 = 0.13550406694412231 + +[cell.spm_20.cold_start_10gh_to_1ph] +shares_per_minute = 20 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.985 +convergence_rate_ci_low = 0.9774661006112372 +convergence_rate_ci_high = 0.9925338993887628 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 840 +convergence_p50_secs_ci_high = 900 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 869.4213197969543 +settled_accuracy_p10 = 0.055205295748431915 +settled_accuracy_p10_ci_low = 0.05259737815060184 +settled_accuracy_p10_ci_high = 0.05939510350904875 +settled_accuracy_p50 = 0.10801923420597903 +settled_accuracy_p50_ci_low = 0.10429992669698684 +settled_accuracy_p50_ci_high = 0.1104530714083285 +settled_accuracy_p90 = 0.15759530415113288 +settled_accuracy_p90_ci_low = 0.15508254692369272 +settled_accuracy_p90_ci_high = 0.16245754273777724 +settled_accuracy_p95 = 0.16839305340033572 +settled_accuracy_p95_ci_low = 0.16543496174559824 +settled_accuracy_p95_ci_high = 0.17376015197741979 +settled_accuracy_p99 = 0.19293711409466685 +settled_accuracy_p99_ci_low = 0.1834440953963251 +settled_accuracy_p99_ci_high = 0.2048826933686576 +settled_accuracy_mean = 0.10712621285012633 +jitter_p10_per_min = 0.07142857142857142 +jitter_p10_per_min_ci_low = 0.07142857142857142 +jitter_p10_per_min_ci_high = 0.07142857142857142 +jitter_p50_per_min = 0.11764705882352941 +jitter_p50_per_min_ci_low = 0.11764705882352941 +jitter_p50_per_min_ci_high = 0.125 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.17391304347826086 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.17647058823529413 +jitter_p95_per_min_ci_high = 0.1875 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.21428571428571427 +jitter_mean_per_min = 0.11848055153544135 +bias_mean = 0.0033647042952594476 +bias_p10 = -0.0502145118971461 +bias_p10_ci_low = -0.05473493677862804 +bias_p10_ci_high = -0.04595076076357583 +bias_p50 = 0.005175446255143261 +bias_p50_ci_low = 0.0010242366879650306 +bias_p50_ci_high = 0.007788435870339582 +bias_p90 = 0.05798983328247128 +bias_p90_ci_low = 0.053903058821707706 +bias_p90_ci_high = 0.06198615205747708 +bias_p99 = 0.10356634203483239 +bias_p99_ci_low = 0.09187524664053111 +bias_p99_ci_high = 0.10863389842753297 +variance_mean = 0.008109948498527376 +variance_p10 = 0.004072985018101917 +variance_p10_ci_low = 0.003840257698883339 +variance_p10_ci_high = 0.004387574640581596 +variance_p50 = 0.007427767659511221 +variance_p50_ci_low = 0.007155538018353331 +variance_p50_ci_high = 0.007666869862689876 +variance_p90 = 0.012963300150911478 +variance_p90_ci_low = 0.01227526726498051 +variance_p90_ci_high = 0.01364879201400338 +variance_p99 = 0.020005531209471118 +variance_p99_ci_low = 0.01860997685106633 +variance_p99_ci_high = 0.0213704324037863 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0 +ramp_target_overshoot_p90_ci_low = 0 +ramp_target_overshoot_p90_ci_high = 0 +ramp_target_overshoot_p99 = 0 +ramp_target_overshoot_p99_ci_low = 0 +ramp_target_overshoot_p99_ci_high = 0.0031381447391918282 +ramp_target_overshoot_mean = 0.00005842732656871519 + +[cell.spm_20.stable_1ph] +shares_per_minute = 20 +scenario = "stable_1ph" +convergence_rate = 0.984 +convergence_rate_ci_low = 0.976222972907338 +convergence_rate_ci_high = 0.991777027092662 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 825.2439024390244 +settled_accuracy_p10 = 0.004123906855311388 +settled_accuracy_p10_ci_low = 0.0030626472662096393 +settled_accuracy_p10_ci_high = 0.0048347910609112255 +settled_accuracy_p50 = 0.026661949360858528 +settled_accuracy_p50_ci_low = 0.02524313373971321 +settled_accuracy_p50_ci_high = 0.028407853589394794 +settled_accuracy_p90 = 0.0733647532564744 +settled_accuracy_p90_ci_low = 0.07041337248822421 +settled_accuracy_p90_ci_high = 0.07561202781447696 +settled_accuracy_p95 = 0.08023347979395701 +settled_accuracy_p95_ci_low = 0.07776514863506279 +settled_accuracy_p95_ci_high = 0.08477024038596714 +settled_accuracy_p99 = 0.10253140678098838 +settled_accuracy_p99_ci_low = 0.09447042415017193 +settled_accuracy_p99_ci_high = 0.10977292306284059 +settled_accuracy_mean = 0.03202466948716279 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.058823529411764705 +jitter_p50_per_min_ci_low = 0.058823529411764705 +jitter_p50_per_min_ci_high = 0.0625 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.09090909090909091 +jitter_p90_per_min_ci_high = 0.09523809523809523 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.1111111111111111 +jitter_p99_per_min = 0.125 +jitter_p99_per_min_ci_low = 0.11764705882352941 +jitter_p99_per_min_ci_high = 0.13333333333333333 +jitter_mean_per_min = 0.0550994236581338 +bias_mean = -0.0007394207951843105 +bias_p10 = -0.06216387399188842 +bias_p10_ci_low = -0.06400452534148886 +bias_p10_ci_high = -0.05715014244086153 +bias_p50 = -0.00166266804382063 +bias_p50_ci_low = -0.005849311091651816 +bias_p50_ci_high = 0.0015986179303676216 +bias_p90 = 0.06259413364890794 +bias_p90_ci_low = 0.057863280091502864 +bias_p90_ci_high = 0.06683720818800629 +bias_p99 = 0.11532827966612097 +bias_p99_ci_low = 0.10335628775573436 +bias_p99_ci_high = 0.13257721822374852 +variance_mean = 0.010013406545931901 +variance_p10 = 0.005203568157861293 +variance_p10_ci_low = 0.00483059032911441 +variance_p10_ci_high = 0.0054112810728537755 +variance_p50 = 0.009173148880866164 +variance_p50_ci_low = 0.008858898315877382 +variance_p50_ci_high = 0.009533528029617086 +variance_p90 = 0.015953354531392284 +variance_p90_ci_low = 0.015311200907699394 +variance_p90_ci_high = 0.01662370779065675 +variance_p99 = 0.023678028127060758 +variance_p99_ci_low = 0.021635425603719435 +variance_p99_ci_high = 0.024720204547176654 +upward_step_magnitude_p50 = 1.0365333278393543 +upward_step_magnitude_p50_ci_low = 1.0356378942553537 +upward_step_magnitude_p50_ci_high = 1.0377508655767993 +upward_step_magnitude_p90 = 1.0576069166703344 +upward_step_magnitude_p90_ci_low = 1.0556869203919594 +upward_step_magnitude_p90_ci_high = 1.0601738442237552 +upward_step_magnitude_p95 = 1.0643183193919046 +upward_step_magnitude_p95_ci_low = 1.0613354354027773 +upward_step_magnitude_p95_ci_high = 1.0659468750130263 +upward_step_magnitude_p99 = 1.0749317507693235 +upward_step_magnitude_p99_ci_low = 1.0731394687970957 +upward_step_magnitude_p99_ci_high = 1.0798481720660846 +upward_step_magnitude_mean = 1.0326593931637866 +fire_decisiveness_mean = 4.354279010315578 +fire_decisiveness_p50 = 3.2933177083034195 + +[cell.spm_20.step_minus_50_at_15min] +shares_per_minute = 20 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.484 +convergence_rate_ci_low = 0.453025550038782 +convergence_rate_ci_high = 0.514974449961218 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 731.5289256198347 +settled_accuracy_p10 = 0.3610049579358279 +settled_accuracy_p10_ci_low = 0.35437862861826663 +settled_accuracy_p10_ci_high = 0.3680548784084676 +settled_accuracy_p50 = 0.4611817159750169 +settled_accuracy_p50_ci_low = 0.4560625175447739 +settled_accuracy_p50_ci_high = 0.4656741176073462 +settled_accuracy_p90 = 0.5594804995395997 +settled_accuracy_p90_ci_low = 0.5496713309788412 +settled_accuracy_p90_ci_high = 0.5703844821218964 +settled_accuracy_p95 = 0.6004770366550634 +settled_accuracy_p95_ci_low = 0.5789530762066124 +settled_accuracy_p95_ci_high = 0.6170389676348038 +settled_accuracy_p99 = 0.669621313399674 +settled_accuracy_p99_ci_low = 0.650069548272111 +settled_accuracy_p99_ci_high = 0.6816414506225388 +settled_accuracy_mean = 0.4620036397163948 +jitter_p10_per_min = 0.15789473684210525 +jitter_p10_per_min_ci_low = 0.15789473684210525 +jitter_p10_per_min_ci_high = 0.16666666666666666 +jitter_p50_per_min = 0.21052631578947367 +jitter_p50_per_min_ci_low = 0.2 +jitter_p50_per_min_ci_high = 0.21052631578947367 +jitter_p90_per_min = 0.23529411764705882 +jitter_p90_per_min_ci_low = 0.23529411764705882 +jitter_p90_per_min_ci_high = 0.25 +jitter_p95_per_min = 0.25 +jitter_p95_per_min_ci_low = 0.25 +jitter_p95_per_min_ci_high = 0.25 +jitter_p99_per_min = 0.2631578947368421 +jitter_p99_per_min_ci_low = 0.25 +jitter_p99_per_min_ci_high = 0.26666666666666666 +jitter_mean_per_min = 0.2038661446452347 +reaction_rate = 0.997 +reaction_rate_ci_low = 0.9936102764714508 +reaction_rate_ci_high = 1 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 121.14343029087262 +fire_decisiveness_mean = 6.848923339768269 +fire_decisiveness_p50 = 5.891796244691328 +step_correction_mean = 0.12358120055037851 +step_correction_p50 = 0.12300384044647217 + +[cell.spm_20.step_minus_25_at_15min] +shares_per_minute = 20 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.989 +convergence_rate_ci_low = 0.9825352674919994 +convergence_rate_ci_high = 0.9954647325080006 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 820.2224469160768 +settled_accuracy_p10 = 0.12811744158464244 +settled_accuracy_p10_ci_low = 0.12554967751506796 +settled_accuracy_p10_ci_high = 0.13178382248685594 +settled_accuracy_p50 = 0.19826168358600427 +settled_accuracy_p50_ci_low = 0.19121623719529324 +settled_accuracy_p50_ci_high = 0.2027423186971289 +settled_accuracy_p90 = 0.24976048846662602 +settled_accuracy_p90_ci_low = 0.24588240147009577 +settled_accuracy_p90_ci_high = 0.25325328110891765 +settled_accuracy_p95 = 0.26346411836715 +settled_accuracy_p95_ci_low = 0.25766662839970156 +settled_accuracy_p95_ci_high = 0.2705492932049771 +settled_accuracy_p99 = 0.31274206726258735 +settled_accuracy_p99_ci_low = 0.29624375585580753 +settled_accuracy_p99_ci_high = 0.3235148294034531 +settled_accuracy_mean = 0.19033710517954266 +jitter_p10_per_min = 0.07142857142857142 +jitter_p10_per_min_ci_low = 0.06666666666666667 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.1111111111111111 +jitter_p50_per_min_ci_low = 0.10526315789473684 +jitter_p50_per_min_ci_high = 0.11764705882352941 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.1875 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.1164088252424514 +reaction_rate = 0.799 +reaction_rate_ci_low = 0.774161378492356 +reaction_rate_ci_high = 0.8238386215076441 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 168.21026282853566 +fire_decisiveness_mean = 5.091725576756171 +fire_decisiveness_p50 = 4.149589012877854 +step_correction_mean = 0.18638331128822846 +step_correction_p50 = 0.18118615448474884 + +[cell.spm_20.step_minus_10_at_15min] +shares_per_minute = 20 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.989 +convergence_rate_ci_low = 0.9825352674919994 +convergence_rate_ci_high = 0.9954647325080006 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 836.9059656218402 +settled_accuracy_p10 = 0.017763269007001314 +settled_accuracy_p10_ci_low = 0.015533837967138364 +settled_accuracy_p10_ci_high = 0.020285369260933717 +settled_accuracy_p50 = 0.07036491190656657 +settled_accuracy_p50_ci_low = 0.06688740512018265 +settled_accuracy_p50_ci_high = 0.0736352759982537 +settled_accuracy_p90 = 0.11830137025116239 +settled_accuracy_p90_ci_low = 0.11579761308682501 +settled_accuracy_p90_ci_high = 0.12159992006588594 +settled_accuracy_p95 = 0.1329286420260316 +settled_accuracy_p95_ci_low = 0.12437017398718742 +settled_accuracy_p95_ci_high = 0.14250448044876451 +settled_accuracy_p99 = 0.17368728536814237 +settled_accuracy_p99_ci_low = 0.1550158097299652 +settled_accuracy_p99_ci_high = 0.19474440656936132 +settled_accuracy_mean = 0.06820029535356857 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.06666666666666667 +jitter_p50_per_min_ci_low = 0.06666666666666667 +jitter_p50_per_min_ci_high = 0.07142857142857142 +jitter_p90_per_min = 0.10526315789473684 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.1111111111111111 +jitter_p95_per_min = 0.11764705882352941 +jitter_p95_per_min_ci_low = 0.1111111111111111 +jitter_p95_per_min_ci_high = 0.125 +jitter_p99_per_min = 0.15384615384615385 +jitter_p99_per_min_ci_low = 0.14285714285714285 +jitter_p99_per_min_ci_high = 0.15384615384615385 +jitter_mean_per_min = 0.0664016826824847 +reaction_rate = 0.466 +reaction_rate_ci_low = 0.4350814115716775 +reaction_rate_ci_high = 0.49691858842832254 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 182.7038626609442 +fire_decisiveness_mean = 4.481877702466976 +fire_decisiveness_p50 = 3.5258555891507566 +step_correction_mean = 0.28601759090188233 +step_correction_p50 = 0.32315605878829956 + +[cell.spm_20.step_minus_5_at_15min] +shares_per_minute = 20 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.984 +convergence_rate_ci_low = 0.976222972907338 +convergence_rate_ci_high = 0.991777027092662 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 819.1463414634146 +settled_accuracy_p10 = 0.01281793442729251 +settled_accuracy_p10_ci_low = 0.01174179080217197 +settled_accuracy_p10_ci_high = 0.0144883800294473 +settled_accuracy_p50 = 0.039190022847389594 +settled_accuracy_p50_ci_low = 0.036423654165274266 +settled_accuracy_p50_ci_high = 0.042083262604122096 +settled_accuracy_p90 = 0.08299946673176928 +settled_accuracy_p90_ci_low = 0.07976043971988611 +settled_accuracy_p90_ci_high = 0.0865120859886368 +settled_accuracy_p95 = 0.09689050722504633 +settled_accuracy_p95_ci_low = 0.09163764914680272 +settled_accuracy_p95_ci_high = 0.1041059817097969 +settled_accuracy_p99 = 0.12692617452698673 +settled_accuracy_p99_ci_low = 0.12016534493991737 +settled_accuracy_p99_ci_high = 0.13408930409732123 +settled_accuracy_mean = 0.04335449134553485 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.0625 +jitter_p50_per_min_ci_low = 0.058823529411764705 +jitter_p50_per_min_ci_high = 0.0625 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.09523809523809523 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.10526315789473684 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.1111111111111111 +jitter_p99_per_min = 0.13333333333333333 +jitter_p99_per_min_ci_low = 0.125 +jitter_p99_per_min_ci_high = 0.13333333333333333 +jitter_mean_per_min = 0.059298928010315034 +reaction_rate = 0.391 +reaction_rate_ci_low = 0.3607550342965974 +reaction_rate_ci_high = 0.42124496570340264 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 183.3759590792839 +fire_decisiveness_mean = 4.125481859324161 +fire_decisiveness_p50 = 3.1775744959156427 +step_correction_mean = 1.7366367737807886 +step_correction_p50 = 0.5539327263832092 + +[cell.spm_20.step_plus_5_at_15min] +shares_per_minute = 20 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.987 +convergence_rate_ci_low = 0.9799792044895183 +convergence_rate_ci_high = 0.9940207955104817 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 806.9908814589666 +settled_accuracy_p10 = 0.00945608708762713 +settled_accuracy_p10_ci_low = 0.007904146548386337 +settled_accuracy_p10_ci_high = 0.010918613047574799 +settled_accuracy_p50 = 0.03480815619467914 +settled_accuracy_p50_ci_low = 0.03211325574014112 +settled_accuracy_p50_ci_high = 0.036921126881908406 +settled_accuracy_p90 = 0.0738887186667091 +settled_accuracy_p90_ci_low = 0.07005264786672405 +settled_accuracy_p90_ci_high = 0.0756772019922003 +settled_accuracy_p95 = 0.08076871995519941 +settled_accuracy_p95_ci_low = 0.07832832189862116 +settled_accuracy_p95_ci_high = 0.08448412261672433 +settled_accuracy_p99 = 0.10773907151236162 +settled_accuracy_p99_ci_low = 0.095675517240013 +settled_accuracy_p99_ci_high = 0.11390177485702935 +settled_accuracy_mean = 0.03764297595751253 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.0625 +jitter_p50_per_min_ci_low = 0.0625 +jitter_p50_per_min_ci_high = 0.0625 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1111111111111111 +jitter_p95_per_min_ci_low = 0.10526315789473684 +jitter_p95_per_min_ci_high = 0.11764705882352941 +jitter_p99_per_min = 0.13333333333333333 +jitter_p99_per_min_ci_low = 0.13043478260869565 +jitter_p99_per_min_ci_high = 0.14285714285714285 +jitter_mean_per_min = 0.05916225802908688 +reaction_rate = 0.399 +reaction_rate_ci_low = 0.3686485282333789 +reaction_rate_ci_high = 0.42935147176662114 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 172.4812030075188 +fire_decisiveness_mean = 4.664209190299096 +fire_decisiveness_p50 = 3.555319521302433 +step_correction_mean = 0.442121550403442 +step_correction_p50 = 0.5438885688781738 + +[cell.spm_20.step_plus_10_at_15min] +shares_per_minute = 20 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.992 +convergence_rate_ci_low = 0.9864785022321837 +convergence_rate_ci_high = 0.9975214977678163 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 823.4274193548387 +settled_accuracy_p10 = 0.007466044286848383 +settled_accuracy_p10_ci_low = 0.006656650363482952 +settled_accuracy_p10_ci_high = 0.009364981142103823 +settled_accuracy_p50 = 0.05121144618567541 +settled_accuracy_p50_ci_low = 0.046350079984616155 +settled_accuracy_p50_ci_high = 0.05490267780844649 +settled_accuracy_p90 = 0.09493842365057947 +settled_accuracy_p90_ci_low = 0.09222472416273608 +settled_accuracy_p90_ci_high = 0.09755524234017887 +settled_accuracy_p95 = 0.10575844700812509 +settled_accuracy_p95_ci_low = 0.10169207682842529 +settled_accuracy_p95_ci_high = 0.11067954009928571 +settled_accuracy_p99 = 0.12574407716982638 +settled_accuracy_p99_ci_low = 0.11816974357763588 +settled_accuracy_p99_ci_high = 0.13289507583820348 +settled_accuracy_mean = 0.049987478461867275 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.06666666666666667 +jitter_p50_per_min_ci_low = 0.06666666666666667 +jitter_p50_per_min_ci_high = 0.06666666666666667 +jitter_p90_per_min = 0.1111111111111111 +jitter_p90_per_min_ci_low = 0.10526315789473684 +jitter_p90_per_min_ci_high = 0.11764705882352941 +jitter_p95_per_min = 0.125 +jitter_p95_per_min_ci_low = 0.125 +jitter_p95_per_min_ci_high = 0.13333333333333333 +jitter_p99_per_min = 0.14285714285714285 +jitter_p99_per_min_ci_low = 0.14285714285714285 +jitter_p99_per_min_ci_high = 0.15384615384615385 +jitter_mean_per_min = 0.06768729687877363 +reaction_rate = 0.481 +reaction_rate_ci_low = 0.45003206202537854 +reaction_rate_ci_high = 0.5119679379746214 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 182.6195426195426 +fire_decisiveness_mean = 5.067113575149574 +fire_decisiveness_p50 = 3.735938413869931 +step_correction_mean = 0.34052779245153536 +step_correction_p50 = 0.3414476215839386 + +[cell.spm_20.step_plus_25_at_15min] +shares_per_minute = 20 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.989 +convergence_rate_ci_low = 0.9825352674919994 +convergence_rate_ci_high = 0.9954647325080006 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 840 +convergence_p50_secs_ci_high = 900 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 847.9474216380182 +settled_accuracy_p10 = 0.05914771100797944 +settled_accuracy_p10_ci_low = 0.05653712258244348 +settled_accuracy_p10_ci_high = 0.06298623054997265 +settled_accuracy_p50 = 0.11573202454230147 +settled_accuracy_p50_ci_low = 0.11215351157590292 +settled_accuracy_p50_ci_high = 0.11762347440081444 +settled_accuracy_p90 = 0.1483313086142224 +settled_accuracy_p90_ci_low = 0.145682280232435 +settled_accuracy_p90_ci_high = 0.1520193969307735 +settled_accuracy_p95 = 0.1641176752287553 +settled_accuracy_p95_ci_low = 0.158596280171876 +settled_accuracy_p95_ci_high = 0.16810748498962658 +settled_accuracy_p99 = 0.1832641020415482 +settled_accuracy_p99_ci_low = 0.17571494560531442 +settled_accuracy_p99_ci_high = 0.1874968995705677 +settled_accuracy_mean = 0.10813803348055748 +jitter_p10_per_min = 0.0625 +jitter_p10_per_min_ci_low = 0.0625 +jitter_p10_per_min_ci_high = 0.06666666666666667 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.1 +jitter_p50_per_min_ci_high = 0.10526315789473684 +jitter_p90_per_min = 0.15384615384615385 +jitter_p90_per_min_ci_low = 0.15 +jitter_p90_per_min_ci_high = 0.15789473684210525 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.17647058823529413 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.10592828296723547 +reaction_rate = 0.774 +reaction_rate_ci_low = 0.7480772679217641 +reaction_rate_ci_high = 0.7999227320782359 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 166.5891472868217 +fire_decisiveness_mean = 6.309510047089375 +fire_decisiveness_p50 = 4.736908875535624 +step_correction_mean = 0.2057650090034002 +step_correction_p50 = 0.1976844221353531 + +[cell.spm_20.step_plus_50_at_15min] +shares_per_minute = 20 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.849 +convergence_rate_ci_low = 0.8268079005409582 +convergence_rate_ci_high = 0.8711920994590417 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 919.6466431095406 +settled_accuracy_p10 = 0.1081117525425982 +settled_accuracy_p10_ci_low = 0.10309988366902234 +settled_accuracy_p10_ci_high = 0.11257288134410282 +settled_accuracy_p50 = 0.16569232053591165 +settled_accuracy_p50_ci_low = 0.16168144746838975 +settled_accuracy_p50_ci_high = 0.16899255547956848 +settled_accuracy_p90 = 0.20937160065645 +settled_accuracy_p90_ci_low = 0.20586923381631728 +settled_accuracy_p90_ci_high = 0.21246478238698352 +settled_accuracy_p95 = 0.21959111732767855 +settled_accuracy_p95_ci_low = 0.21526760643532838 +settled_accuracy_p95_ci_high = 0.2212611437623072 +settled_accuracy_p99 = 0.23988206377829524 +settled_accuracy_p99_ci_low = 0.2325135105800702 +settled_accuracy_p99_ci_high = 0.24875027637666902 +settled_accuracy_mean = 0.161632391649832 +jitter_p10_per_min = 0.11764705882352941 +jitter_p10_per_min_ci_low = 0.10526315789473684 +jitter_p10_per_min_ci_high = 0.125 +jitter_p50_per_min = 0.16666666666666666 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.16666666666666666 +jitter_p90_per_min = 0.21052631578947367 +jitter_p90_per_min_ci_low = 0.2 +jitter_p90_per_min_ci_high = 0.21052631578947367 +jitter_p95_per_min = 0.2222222222222222 +jitter_p95_per_min_ci_low = 0.21428571428571427 +jitter_p95_per_min_ci_high = 0.23529411764705882 +jitter_p99_per_min = 0.25 +jitter_p99_per_min_ci_low = 0.23529411764705882 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.1658676767750699 +reaction_rate = 0.986 +reaction_rate_ci_low = 0.9787178680044921 +reaction_rate_ci_high = 0.9932821319955079 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 129.61460446247463 +fire_decisiveness_mean = 8.472150450750675 +fire_decisiveness_p50 = 6.58161917197836 +step_correction_mean = 0.13572976919945187 +step_correction_p50 = 0.13167810440063477 + +[cell.spm_25.cold_start_10gh_to_1ph] +shares_per_minute = 25 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.996 +convergence_rate_ci_low = 0.9920878478557194 +convergence_rate_ci_high = 0.9999121521442806 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 846.7469879518072 +settled_accuracy_p10 = 0.07983384650363823 +settled_accuracy_p10_ci_low = 0.07652209113101993 +settled_accuracy_p10_ci_high = 0.084418388607438 +settled_accuracy_p50 = 0.13000852752345937 +settled_accuracy_p50_ci_low = 0.1262983468200901 +settled_accuracy_p50_ci_high = 0.13186059797622485 +settled_accuracy_p90 = 0.16989233255046365 +settled_accuracy_p90_ci_low = 0.16549730588106526 +settled_accuracy_p90_ci_high = 0.17340273016310603 +settled_accuracy_p95 = 0.18125983606243834 +settled_accuracy_p95_ci_low = 0.1759190441603845 +settled_accuracy_p95_ci_high = 0.18397318168698396 +settled_accuracy_p99 = 0.2027715155886176 +settled_accuracy_p99_ci_low = 0.1934379475532142 +settled_accuracy_p99_ci_high = 0.21180181866365988 +settled_accuracy_mean = 0.1270757535604106 +jitter_p10_per_min = 0.07142857142857142 +jitter_p10_per_min_ci_low = 0.06666666666666667 +jitter_p10_per_min_ci_high = 0.07692307692307693 +jitter_p50_per_min = 0.11764705882352941 +jitter_p50_per_min_ci_low = 0.1111111111111111 +jitter_p50_per_min_ci_high = 0.11764705882352941 +jitter_p90_per_min = 0.15789473684210525 +jitter_p90_per_min_ci_low = 0.15 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.17647058823529413 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.1875 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.111520919702087 +bias_mean = -0.0023293830382887944 +bias_p10 = -0.0509157500864318 +bias_p10_ci_low = -0.05552024824741756 +bias_p10_ci_high = -0.04893429021014572 +bias_p50 = -0.002960458125235663 +bias_p50_ci_low = -0.006009492888012657 +bias_p50_ci_high = -0.0007419838664001864 +bias_p90 = 0.04896493776911957 +bias_p90_ci_low = 0.04454524682585754 +bias_p90_ci_high = 0.05357254766220812 +bias_p99 = 0.09383089786020524 +bias_p99_ci_low = 0.0836053859017746 +bias_p99_ci_high = 0.09963603012649748 +variance_mean = 0.0065007016063075435 +variance_p10 = 0.003145992970643732 +variance_p10_ci_low = 0.0030024000753399813 +variance_p10_ci_high = 0.0033064786500643247 +variance_p50 = 0.0058702371290834995 +variance_p50_ci_low = 0.00568207188551464 +variance_p50_ci_high = 0.006039566845595862 +variance_p90 = 0.010861647685054761 +variance_p90_ci_low = 0.010283906588932863 +variance_p90_ci_high = 0.011526432079778699 +variance_p99 = 0.015515801589884018 +variance_p99_ci_low = 0.01452310886544582 +variance_p99_ci_high = 0.017250257851762724 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0 +ramp_target_overshoot_p90_ci_low = 0 +ramp_target_overshoot_p90_ci_high = 0 +ramp_target_overshoot_p99 = 0 +ramp_target_overshoot_p99_ci_low = 0 +ramp_target_overshoot_p99_ci_high = 0 +ramp_target_overshoot_mean = 0 + +[cell.spm_25.stable_1ph] +shares_per_minute = 25 +scenario = "stable_1ph" +convergence_rate = 0.941 +convergence_rate_ci_low = 0.9263958296914887 +convergence_rate_ci_high = 0.9556041703085112 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 900 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 923.9744952178534 +settled_accuracy_p10 = 0.003892985251283454 +settled_accuracy_p10_ci_low = 0.002847160701102469 +settled_accuracy_p10_ci_high = 0.00469252026738054 +settled_accuracy_p50 = 0.02847570065178151 +settled_accuracy_p50_ci_low = 0.027451082502900293 +settled_accuracy_p50_ci_high = 0.029149272328511833 +settled_accuracy_p90 = 0.04817624613276783 +settled_accuracy_p90_ci_low = 0.04505675765801076 +settled_accuracy_p90_ci_high = 0.058832261459358826 +settled_accuracy_p95 = 0.07173159192092471 +settled_accuracy_p95_ci_low = 0.06585379488215715 +settled_accuracy_p95_ci_high = 0.07341401116329127 +settled_accuracy_p99 = 0.08468736093784912 +settled_accuracy_p99_ci_low = 0.08063123403605932 +settled_accuracy_p99_ci_high = 0.08707938931738268 +settled_accuracy_mean = 0.02846756920484249 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.05263157894736842 +jitter_p50_per_min_ci_low = 0.05263157894736842 +jitter_p50_per_min_ci_high = 0.05555555555555555 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.10526315789473684 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.11764705882352941 +jitter_mean_per_min = 0.04098609097569837 +bias_mean = -0.0026591437970575047 +bias_p10 = -0.06047714212194254 +bias_p10_ci_low = -0.06457962712117744 +bias_p10_ci_high = -0.055128908199978864 +bias_p50 = -0.0028849571202080094 +bias_p50_ci_low = -0.006340862334573517 +bias_p50_ci_high = 0.0005342112887078191 +bias_p90 = 0.0535642862077377 +bias_p90_ci_low = 0.04774220012295121 +bias_p90_ci_high = 0.05866626238402709 +bias_p99 = 0.10041638260337744 +bias_p99_ci_low = 0.09323490403126802 +bias_p99_ci_high = 0.11046185913758137 +variance_mean = 0.007912301878388171 +variance_p10 = 0.003965985352834863 +variance_p10_ci_low = 0.003855921011218836 +variance_p10_ci_high = 0.004181064276155009 +variance_p50 = 0.007406553172551714 +variance_p50_ci_low = 0.007191365265124207 +variance_p50_ci_high = 0.007635702537241858 +variance_p90 = 0.012462060811627674 +variance_p90_ci_low = 0.011971313238432873 +variance_p90_ci_high = 0.012987317310457975 +variance_p99 = 0.01916423827214303 +variance_p99_ci_low = 0.0179879490871904 +variance_p99_ci_high = 0.020401245309379944 +upward_step_magnitude_p50 = 1.0314859358945252 +upward_step_magnitude_p50_ci_low = 1.0304435338964528 +upward_step_magnitude_p50_ci_high = 1.0327137503261765 +upward_step_magnitude_p90 = 1.048931648127962 +upward_step_magnitude_p90_ci_low = 1.0473347009672602 +upward_step_magnitude_p90_ci_high = 1.0501563602997108 +upward_step_magnitude_p95 = 1.0549475977073195 +upward_step_magnitude_p95_ci_low = 1.0516409213853783 +upward_step_magnitude_p95_ci_high = 1.0567916003900755 +upward_step_magnitude_p99 = 1.0643754742720426 +upward_step_magnitude_p99_ci_low = 1.0615376320655212 +upward_step_magnitude_p99_ci_high = 1.0674049967056207 +upward_step_magnitude_mean = 1.02588088806757 +fire_decisiveness_mean = 3.836053211614283 +fire_decisiveness_p50 = 2.8392670746257416 + +[cell.spm_25.step_minus_50_at_15min] +shares_per_minute = 25 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.443 +convergence_rate_ci_low = 0.412211712590662 +convergence_rate_ci_high = 0.473788287409338 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 919.7742663656885 +settled_accuracy_p10 = 0.4078325843201076 +settled_accuracy_p10_ci_low = 0.4005389244502493 +settled_accuracy_p10_ci_high = 0.4143181192391654 +settled_accuracy_p50 = 0.47942660306804274 +settled_accuracy_p50_ci_low = 0.474089032391503 +settled_accuracy_p50_ci_high = 0.483804919630088 +settled_accuracy_p90 = 0.5995942866465238 +settled_accuracy_p90_ci_low = 0.5944110663591917 +settled_accuracy_p90_ci_high = 0.6076015821854417 +settled_accuracy_p95 = 0.6179805050089722 +settled_accuracy_p95_ci_low = 0.6140636290017938 +settled_accuracy_p95_ci_high = 0.6240204370652729 +settled_accuracy_p99 = 0.649650520519844 +settled_accuracy_p99_ci_low = 0.6368911120415381 +settled_accuracy_p99_ci_high = 0.6642660259828077 +settled_accuracy_mean = 0.489487933188561 +jitter_p10_per_min = 0.16666666666666666 +jitter_p10_per_min_ci_low = 0.15789473684210525 +jitter_p10_per_min_ci_high = 0.16666666666666666 +jitter_p50_per_min = 0.1875 +jitter_p50_per_min_ci_low = 0.1875 +jitter_p50_per_min_ci_high = 0.2 +jitter_p90_per_min = 0.23529411764705882 +jitter_p90_per_min_ci_low = 0.23529411764705882 +jitter_p90_per_min_ci_high = 0.25 +jitter_p95_per_min = 0.25 +jitter_p95_per_min_ci_low = 0.23529411764705882 +jitter_p95_per_min_ci_high = 0.25 +jitter_p99_per_min = 0.25 +jitter_p99_per_min_ci_low = 0.25 +jitter_p99_per_min_ci_high = 0.26666666666666666 +jitter_mean_per_min = 0.19429410200802844 +reaction_rate = 0.999 +reaction_rate_ci_low = 0.9970409802451226 +reaction_rate_ci_high = 1 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 114.95495495495496 +fire_decisiveness_mean = 6.585964002337784 +fire_decisiveness_p50 = 5.697368215222205 +step_correction_mean = 0.11665028080463528 +step_correction_p50 = 0.1110495999455452 + +[cell.spm_25.step_minus_25_at_15min] +shares_per_minute = 25 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.997 +convergence_rate_ci_low = 0.9936102764714508 +convergence_rate_ci_high = 1 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 914.5035105315948 +settled_accuracy_p10 = 0.13944693885604087 +settled_accuracy_p10_ci_low = 0.1355765470091772 +settled_accuracy_p10_ci_high = 0.14418294556191635 +settled_accuracy_p50 = 0.21441156577415765 +settled_accuracy_p50_ci_low = 0.21222569587641082 +settled_accuracy_p50_ci_high = 0.21585422737968263 +settled_accuracy_p90 = 0.25112423004882567 +settled_accuracy_p90_ci_low = 0.2461830491780015 +settled_accuracy_p90_ci_high = 0.25826568685340057 +settled_accuracy_p95 = 0.28231168738436585 +settled_accuracy_p95_ci_low = 0.27224553683556296 +settled_accuracy_p95_ci_high = 0.2888780659690864 +settled_accuracy_p99 = 0.31715836734335956 +settled_accuracy_p99_ci_low = 0.3080713798503938 +settled_accuracy_p99_ci_high = 0.3237365570880337 +settled_accuracy_mean = 0.20772498751998847 +jitter_p10_per_min = 0.06666666666666667 +jitter_p10_per_min_ci_low = 0.0625 +jitter_p10_per_min_ci_high = 0.06666666666666667 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.15384615384615385 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15384615384615385 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.15789473684210525 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.10147142807508217 +reaction_rate = 0.774 +reaction_rate_ci_low = 0.7480772679217641 +reaction_rate_ci_high = 0.7999227320782359 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 155.58139534883722 +fire_decisiveness_mean = 4.545129854658618 +fire_decisiveness_p50 = 3.6925042519824913 +step_correction_mean = 0.17155089783807134 +step_correction_p50 = 0.16170203685760498 + +[cell.spm_25.step_minus_10_at_15min] +shares_per_minute = 25 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.971 +convergence_rate_ci_low = 0.9605992493347836 +convergence_rate_ci_high = 0.9814007506652164 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 942.1421215242018 +settled_accuracy_p10 = 0.020922232383829842 +settled_accuracy_p10_ci_low = 0.017447111690401362 +settled_accuracy_p10_ci_high = 0.023438963928612555 +settled_accuracy_p50 = 0.07443871823560366 +settled_accuracy_p50_ci_low = 0.07296515670479065 +settled_accuracy_p50_ci_high = 0.07573757302283313 +settled_accuracy_p90 = 0.11515068363427305 +settled_accuracy_p90_ci_low = 0.11126269429414348 +settled_accuracy_p90_ci_high = 0.12056226789187563 +settled_accuracy_p95 = 0.14057159602402347 +settled_accuracy_p95_ci_low = 0.1293090135779873 +settled_accuracy_p95_ci_high = 0.14371989654795736 +settled_accuracy_p99 = 0.15481761488385137 +settled_accuracy_p99_ci_low = 0.15045606065746564 +settled_accuracy_p99_ci_high = 0.16042970551511826 +settled_accuracy_mean = 0.06990467118707006 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.0625 +jitter_p50_per_min_ci_low = 0.0625 +jitter_p50_per_min_ci_high = 0.06666666666666667 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.09090909090909091 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.125 +jitter_p99_per_min_ci_low = 0.11764705882352941 +jitter_p99_per_min_ci_high = 0.14285714285714285 +jitter_mean_per_min = 0.05221908008260197 +reaction_rate = 0.446 +reaction_rate_ci_low = 0.4151909446038993 +reaction_rate_ci_high = 0.4768090553961007 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 173.67713004484304 +fire_decisiveness_mean = 3.938412440548707 +fire_decisiveness_p50 = 3.1049815300519334 +step_correction_mean = 0.2925463792922251 +step_correction_p50 = 0.3240182399749756 + +[cell.spm_25.step_minus_5_at_15min] +shares_per_minute = 25 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.951 +convergence_rate_ci_low = 0.9376203617986135 +convergence_rate_ci_high = 0.9643796382013864 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 933.186119873817 +settled_accuracy_p10 = 0.012582841478336215 +settled_accuracy_p10_ci_low = 0.011141343065955267 +settled_accuracy_p10_ci_high = 0.013795604623673574 +settled_accuracy_p50 = 0.030193620377020336 +settled_accuracy_p50_ci_low = 0.028215674893012577 +settled_accuracy_p50_ci_high = 0.03346655502577223 +settled_accuracy_p90 = 0.08473906978495416 +settled_accuracy_p90_ci_low = 0.0818243551915383 +settled_accuracy_p90_ci_high = 0.08665209627254056 +settled_accuracy_p95 = 0.09245616537263124 +settled_accuracy_p95_ci_low = 0.08926955391607416 +settled_accuracy_p95_ci_high = 0.09693861368485379 +settled_accuracy_p99 = 0.12299246480475601 +settled_accuracy_p99_ci_low = 0.10425552851656983 +settled_accuracy_p99_ci_high = 0.13884746388183244 +settled_accuracy_mean = 0.04106827585247154 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.05555555555555555 +jitter_p50_per_min_ci_low = 0.05263157894736842 +jitter_p50_per_min_ci_high = 0.058823529411764705 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.11764705882352941 +jitter_p99_per_min_ci_low = 0.10526315789473684 +jitter_p99_per_min_ci_high = 0.125 +jitter_mean_per_min = 0.04390796995901208 +reaction_rate = 0.39 +reaction_rate_ci_low = 0.35976894576763824 +reaction_rate_ci_high = 0.4202310542323618 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 179.84615384615384 +fire_decisiveness_mean = 3.819525143716794 +fire_decisiveness_p50 = 2.9469674478213506 +step_correction_mean = 0.5124221781889597 +step_correction_p50 = 0.5665733218193054 + +[cell.spm_25.step_plus_5_at_15min] +shares_per_minute = 25 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.949 +convergence_rate_ci_low = 0.9353643995951773 +convergence_rate_ci_high = 0.9626356004048227 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 942.4868282402529 +settled_accuracy_p10 = 0.008198402962300566 +settled_accuracy_p10_ci_low = 0.00706675568498405 +settled_accuracy_p10_ci_high = 0.010148331053549176 +settled_accuracy_p50 = 0.024484639035452505 +settled_accuracy_p50_ci_low = 0.023377342690738434 +settled_accuracy_p50_ci_high = 0.0256158389203065 +settled_accuracy_p90 = 0.07324140568666493 +settled_accuracy_p90_ci_low = 0.07026241101843267 +settled_accuracy_p90_ci_high = 0.07544212920975535 +settled_accuracy_p95 = 0.0784113451570213 +settled_accuracy_p95_ci_low = 0.07741621649397956 +settled_accuracy_p95_ci_high = 0.08000067492348628 +settled_accuracy_p99 = 0.08875090453168943 +settled_accuracy_p99_ci_low = 0.08518103224689821 +settled_accuracy_p99_ci_high = 0.09332069897019202 +settled_accuracy_mean = 0.03309411897494973 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.05555555555555555 +jitter_p50_per_min_ci_low = 0.05263157894736842 +jitter_p50_per_min_ci_high = 0.05555555555555555 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.125 +jitter_p99_per_min_ci_low = 0.1111111111111111 +jitter_p99_per_min_ci_high = 0.13333333333333333 +jitter_mean_per_min = 0.04199643311676014 +reaction_rate = 0.4 +reaction_rate_ci_low = 0.36963581056573386 +reaction_rate_ci_high = 0.4303641894342662 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 180.45 +fire_decisiveness_mean = 4.0721814006774 +fire_decisiveness_p50 = 3.034216104897263 +step_correction_mean = 0.5050740771740675 +step_correction_p50 = 0.5953463912010193 + +[cell.spm_25.step_plus_10_at_15min] +shares_per_minute = 25 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.976 +convergence_rate_ci_low = 0.9665139239724742 +convergence_rate_ci_high = 0.9854860760275258 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 934.3032786885246 +settled_accuracy_p10 = 0.00843869577702816 +settled_accuracy_p10_ci_low = 0.006727480720385648 +settled_accuracy_p10_ci_high = 0.009402684122780669 +settled_accuracy_p50 = 0.056989763518730086 +settled_accuracy_p50_ci_low = 0.05480152644604808 +settled_accuracy_p50_ci_high = 0.058646925434790664 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.08845064359537091 +settled_accuracy_p90_ci_high = 0.0939970082867857 +settled_accuracy_p95 = 0.10288271011465433 +settled_accuracy_p95_ci_low = 0.09798449504574902 +settled_accuracy_p95_ci_high = 0.11164316239668204 +settled_accuracy_p99 = 0.12094066862514741 +settled_accuracy_p99_ci_low = 0.1187229036517411 +settled_accuracy_p99_ci_high = 0.1257119259225501 +settled_accuracy_mean = 0.051752504823144724 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.0625 +jitter_p50_per_min_ci_low = 0.0625 +jitter_p50_per_min_ci_high = 0.06666666666666667 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.09523809523809523 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.10526315789473684 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.1111111111111111 +jitter_p99_per_min = 0.13333333333333333 +jitter_p99_per_min_ci_low = 0.11764705882352941 +jitter_p99_per_min_ci_high = 0.13333333333333333 +jitter_mean_per_min = 0.05593815877919637 +reaction_rate = 0.48 +reaction_rate_ci_low = 0.4490344811120498 +reaction_rate_ci_high = 0.5109655188879502 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 174.75 +fire_decisiveness_mean = 4.6073395630478915 +fire_decisiveness_p50 = 3.465069351580018 +step_correction_mean = 0.3386318935081363 +step_correction_p50 = 0.33791664242744446 + +[cell.spm_25.step_plus_25_at_15min] +shares_per_minute = 25 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.99 +convergence_rate_ci_low = 0.9838330039727595 +convergence_rate_ci_high = 0.9961669960272405 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 926.1818181818181 +settled_accuracy_p10 = 0.07184460035652518 +settled_accuracy_p10_ci_low = 0.06917560037735582 +settled_accuracy_p10_ci_high = 0.07629676333420876 +settled_accuracy_p50 = 0.12020179688541865 +settled_accuracy_p50_ci_low = 0.11898862971863888 +settled_accuracy_p50_ci_high = 0.12201631314433903 +settled_accuracy_p90 = 0.15393989150483411 +settled_accuracy_p90_ci_low = 0.14872064738899282 +settled_accuracy_p90_ci_high = 0.15983945842181857 +settled_accuracy_p95 = 0.16890200023063973 +settled_accuracy_p95_ci_low = 0.16280491851051393 +settled_accuracy_p95_ci_high = 0.17181624283572627 +settled_accuracy_p99 = 0.18983985785376623 +settled_accuracy_p99_ci_low = 0.18030980886751813 +settled_accuracy_p99_ci_high = 0.19475474985789032 +settled_accuracy_mean = 0.11717402675506847 +jitter_p10_per_min = 0.0625 +jitter_p10_per_min_ci_low = 0.058823529411764705 +jitter_p10_per_min_ci_high = 0.06666666666666667 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13333333333333333 +jitter_p90_per_min_ci_high = 0.15 +jitter_p95_per_min = 0.15384615384615385 +jitter_p95_per_min_ci_low = 0.15384615384615385 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.1875 +jitter_mean_per_min = 0.09583675202127886 +reaction_rate = 0.802 +reaction_rate_ci_low = 0.7773012001587122 +reaction_rate_ci_high = 0.8266987998412879 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 155.3865336658354 +fire_decisiveness_mean = 5.869209873360894 +fire_decisiveness_p50 = 4.452830533278185 +step_correction_mean = 0.187500149773392 +step_correction_p50 = 0.17821426689624786 + +[cell.spm_25.step_plus_50_at_15min] +shares_per_minute = 25 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.854 +convergence_rate_ci_low = 0.8321142499694436 +convergence_rate_ci_high = 0.8758857500305564 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 1140 +convergence_p50_secs_ci_low = 1140 +convergence_p50_secs_ci_high = 1200 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1080.983606557377 +settled_accuracy_p10 = 0.1318381359269447 +settled_accuracy_p10_ci_low = 0.1275268835869705 +settled_accuracy_p10_ci_high = 0.13553628169115406 +settled_accuracy_p50 = 0.17943111548084256 +settled_accuracy_p50_ci_low = 0.17721509133382085 +settled_accuracy_p50_ci_high = 0.18188703144479745 +settled_accuracy_p90 = 0.2113872824766857 +settled_accuracy_p90_ci_low = 0.20811979665835445 +settled_accuracy_p90_ci_high = 0.2146716797285867 +settled_accuracy_p95 = 0.22504465200072554 +settled_accuracy_p95_ci_low = 0.2195011019722758 +settled_accuracy_p95_ci_high = 0.2300360303013519 +settled_accuracy_p99 = 0.25342235070537233 +settled_accuracy_p99_ci_low = 0.2399681420803801 +settled_accuracy_p99_ci_high = 0.26021394663556874 +settled_accuracy_mean = 0.17498568769270836 +jitter_p10_per_min = 0.1 +jitter_p10_per_min_ci_low = 0.1 +jitter_p10_per_min_ci_high = 0.10526315789473684 +jitter_p50_per_min = 0.16666666666666666 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.16666666666666666 +jitter_p90_per_min = 0.1875 +jitter_p90_per_min_ci_low = 0.1875 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.2 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.21428571428571427 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.15563532434514774 +reaction_rate = 0.984 +reaction_rate_ci_low = 0.976222972907338 +reaction_rate_ci_high = 0.991777027092662 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 117.6829268292683 +fire_decisiveness_mean = 8.003498276305395 +fire_decisiveness_p50 = 6.260803195250691 +step_correction_mean = 0.12914204600880422 +step_correction_p50 = 0.12160299718379974 + +[cell.spm_30.cold_start_10gh_to_1ph] +shares_per_minute = 30 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.998 +convergence_rate_ci_low = 0.995230914663648 +convergence_rate_ci_high = 1 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 813.186372745491 +settled_accuracy_p10 = 0.09638960346781034 +settled_accuracy_p10_ci_low = 0.09315072832244409 +settled_accuracy_p10_ci_high = 0.09960814462711998 +settled_accuracy_p50 = 0.13871100379359702 +settled_accuracy_p50_ci_low = 0.13596202336180385 +settled_accuracy_p50_ci_high = 0.14082110783179913 +settled_accuracy_p90 = 0.17565161533386564 +settled_accuracy_p90_ci_low = 0.17127175526792848 +settled_accuracy_p90_ci_high = 0.1799794660295262 +settled_accuracy_p95 = 0.18872240894518222 +settled_accuracy_p95_ci_low = 0.18346697951924684 +settled_accuracy_p95_ci_high = 0.1924011155909261 +settled_accuracy_p99 = 0.21053292424664094 +settled_accuracy_p99_ci_low = 0.20049155901342186 +settled_accuracy_p99_ci_high = 0.21770082210372732 +settled_accuracy_mean = 0.13710456903324492 +jitter_p10_per_min = 0.07692307692307693 +jitter_p10_per_min_ci_low = 0.06666666666666667 +jitter_p10_per_min_ci_high = 0.07692307692307693 +jitter_p50_per_min = 0.11764705882352941 +jitter_p50_per_min_ci_low = 0.11764705882352941 +jitter_p50_per_min_ci_high = 0.11764705882352941 +jitter_p90_per_min = 0.15 +jitter_p90_per_min_ci_low = 0.15 +jitter_p90_per_min_ci_high = 0.15 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.15789473684210525 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.1875 +jitter_mean_per_min = 0.1132600542303836 +bias_mean = 0.00025668567209734814 +bias_p10 = -0.047143168734867104 +bias_p10_ci_low = -0.05219666052230851 +bias_p10_ci_high = -0.04387767256241944 +bias_p50 = -0.000247977851842338 +bias_p50_ci_low = -0.002754677621216368 +bias_p50_ci_high = 0.0020380361814195487 +bias_p90 = 0.04706162439995535 +bias_p90_ci_low = 0.043314696294999754 +bias_p90_ci_high = 0.051963181717324274 +bias_p99 = 0.09021887623387198 +bias_p99_ci_low = 0.08238208666036863 +bias_p99_ci_high = 0.09939008320082894 +variance_mean = 0.0052662607196147454 +variance_p10 = 0.0025686098180506003 +variance_p10_ci_low = 0.00247933157854753 +variance_p10_ci_high = 0.002696191938696512 +variance_p50 = 0.00477283321075205 +variance_p50_ci_low = 0.004608053815919734 +variance_p50_ci_high = 0.004936824785275558 +variance_p90 = 0.008465466230792675 +variance_p90_ci_low = 0.008173759960758286 +variance_p90_ci_high = 0.008979618121104945 +variance_p99 = 0.013273584631248123 +variance_p99_ci_low = 0.012165514697963292 +variance_p99_ci_high = 0.015200784185337504 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0 +ramp_target_overshoot_p90_ci_low = 0 +ramp_target_overshoot_p90_ci_high = 0 +ramp_target_overshoot_p99 = 0 +ramp_target_overshoot_p99_ci_low = 0 +ramp_target_overshoot_p99_ci_high = 0 +ramp_target_overshoot_mean = 0 + +[cell.spm_30.stable_1ph] +shares_per_minute = 30 +scenario = "stable_1ph" +convergence_rate = 0.88 +convergence_rate_ci_low = 0.859858675316653 +convergence_rate_ci_high = 0.900141324683347 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1080 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 978.3409090909091 +settled_accuracy_p10 = 0.004160615404396939 +settled_accuracy_p10_ci_low = 0.0020835289277124636 +settled_accuracy_p10_ci_high = 0.005668350271498923 +settled_accuracy_p50 = 0.02964299224738265 +settled_accuracy_p50_ci_low = 0.028844061211069416 +settled_accuracy_p50_ci_high = 0.030174561566041702 +settled_accuracy_p90 = 0.04397731156652829 +settled_accuracy_p90_ci_low = 0.04206081660348482 +settled_accuracy_p90_ci_high = 0.046145531881710444 +settled_accuracy_p95 = 0.053205652901810785 +settled_accuracy_p95_ci_low = 0.048498167357563515 +settled_accuracy_p95_ci_high = 0.062320848690917474 +settled_accuracy_p99 = 0.08214178747548595 +settled_accuracy_p99_ci_low = 0.07676240797613021 +settled_accuracy_p99_ci_high = 0.08776826181530417 +settled_accuracy_mean = 0.02893766056215352 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.07692307692307693 +jitter_p90_per_min_ci_low = 0.07142857142857142 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.08333333333333333 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.024164601594378405 +bias_mean = 0.00043719210165817513 +bias_p10 = -0.049814949247737716 +bias_p10_ci_low = -0.05300014436529653 +bias_p10_ci_high = -0.046185811328816315 +bias_p50 = -0.0010146683766523474 +bias_p50_ci_low = -0.004143326041578412 +bias_p50_ci_high = 0.0026036826752520864 +bias_p90 = 0.052150238848044 +bias_p90_ci_low = 0.04733912308825078 +bias_p90_ci_high = 0.05628309237465669 +bias_p99 = 0.09938965229127554 +bias_p99_ci_low = 0.0915214487049206 +bias_p99_ci_high = 0.1070257369101713 +variance_mean = 0.006625579980601084 +variance_p10 = 0.00332003285928746 +variance_p10_ci_low = 0.0031394706900044335 +variance_p10_ci_high = 0.0034875056871121126 +variance_p50 = 0.006003614658078476 +variance_p50_ci_low = 0.0057691137217713035 +variance_p50_ci_high = 0.0062299003236176796 +variance_p90 = 0.010688056200058683 +variance_p90_ci_low = 0.010260529209847224 +variance_p90_ci_high = 0.01126731448126337 +variance_p99 = 0.017234477492611276 +variance_p99_ci_low = 0.01535531565915908 +variance_p99_ci_high = 0.019141530869268463 +upward_step_magnitude_p50 = 1.0256521622711143 +upward_step_magnitude_p50_ci_low = 1.024555133657035 +upward_step_magnitude_p50_ci_high = 1.0272856591509882 +upward_step_magnitude_p90 = 1.0435608339511264 +upward_step_magnitude_p90_ci_low = 1.0424550650148268 +upward_step_magnitude_p90_ci_high = 1.0450395106797383 +upward_step_magnitude_p95 = 1.0476657489976788 +upward_step_magnitude_p95_ci_low = 1.0463691386194673 +upward_step_magnitude_p95_ci_high = 1.0501266254347807 +upward_step_magnitude_p99 = 1.0570826438664604 +upward_step_magnitude_p99_ci_low = 1.0533233255372034 +upward_step_magnitude_p99_ci_high = 1.0636313501387036 +upward_step_magnitude_mean = 1.0202245570932302 +fire_decisiveness_mean = 3.318831775998633 +fire_decisiveness_p50 = 2.615882077913252 + +[cell.spm_30.step_minus_50_at_15min] +shares_per_minute = 30 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.475 +convergence_rate_ci_low = 0.44404844107318664 +convergence_rate_ci_high = 0.5059515589268133 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 1260 +convergence_p50_secs_ci_low = 1200 +convergence_p50_secs_ci_high = 1260 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1147.8315789473684 +settled_accuracy_p10 = 0.4237748320416108 +settled_accuracy_p10_ci_low = 0.41846625239469604 +settled_accuracy_p10_ci_high = 0.4274501161352462 +settled_accuracy_p50 = 0.5228614736798025 +settled_accuracy_p50_ci_low = 0.5042478904831644 +settled_accuracy_p50_ci_high = 0.5376000568009431 +settled_accuracy_p90 = 0.6152762861900491 +settled_accuracy_p90_ci_low = 0.6116716006222602 +settled_accuracy_p90_ci_high = 0.6183834266336696 +settled_accuracy_p95 = 0.6289376378122484 +settled_accuracy_p95_ci_low = 0.623398874758819 +settled_accuracy_p95_ci_high = 0.6337603492774824 +settled_accuracy_p99 = 0.6553514185908065 +settled_accuracy_p99_ci_low = 0.6454584981666864 +settled_accuracy_p99_ci_high = 0.6661285654184932 +settled_accuracy_mean = 0.5186656635680945 +jitter_p10_per_min = 0.15789473684210525 +jitter_p10_per_min_ci_low = 0.15 +jitter_p10_per_min_ci_high = 0.16666666666666666 +jitter_p50_per_min = 0.17647058823529413 +jitter_p50_per_min_ci_low = 0.17647058823529413 +jitter_p50_per_min_ci_high = 0.18181818181818182 +jitter_p90_per_min = 0.2222222222222222 +jitter_p90_per_min_ci_low = 0.21052631578947367 +jitter_p90_per_min_ci_high = 0.23529411764705882 +jitter_p95_per_min = 0.23529411764705882 +jitter_p95_per_min_ci_low = 0.2222222222222222 +jitter_p95_per_min_ci_high = 0.23529411764705882 +jitter_p99_per_min = 0.25 +jitter_p99_per_min_ci_low = 0.23529411764705882 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.18216835820537855 +reaction_rate = 0.995 +reaction_rate_ci_low = 0.9906282772274537 +reaction_rate_ci_high = 0.9993717227725463 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 60 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 60 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 104.20100502512562 +fire_decisiveness_mean = 6.388958637224714 +fire_decisiveness_p50 = 5.5333203682402825 +step_correction_mean = 0.10962806553696867 +step_correction_p50 = 0.10179407894611359 + +[cell.spm_30.step_minus_25_at_15min] +shares_per_minute = 30 +scenario = "step_minus_25_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 720 +convergence_p10_secs_ci_low = 720 +convergence_p10_secs_ci_high = 780 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 972.42 +settled_accuracy_p10 = 0.18350176017600783 +settled_accuracy_p10_ci_low = 0.1710366914578738 +settled_accuracy_p10_ci_high = 0.1871721676100233 +settled_accuracy_p50 = 0.2138695051150823 +settled_accuracy_p50_ci_low = 0.21223974399847667 +settled_accuracy_p50_ci_high = 0.21516452722118928 +settled_accuracy_p90 = 0.25597986948847207 +settled_accuracy_p90_ci_low = 0.24391226419846834 +settled_accuracy_p90_ci_high = 0.2745168586860032 +settled_accuracy_p95 = 0.28924027487432524 +settled_accuracy_p95_ci_low = 0.2831590486325406 +settled_accuracy_p95_ci_high = 0.2944901565166598 +settled_accuracy_p99 = 0.31261438146521203 +settled_accuracy_p99_ci_low = 0.307583185238985 +settled_accuracy_p99_ci_high = 0.3255369536745727 +settled_accuracy_mean = 0.21497127946448194 +jitter_p10_per_min = 0.07142857142857142 +jitter_p10_per_min_ci_low = 0.06666666666666667 +jitter_p10_per_min_ci_high = 0.07142857142857142 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.125 +jitter_p90_per_min_ci_low = 0.11764705882352941 +jitter_p90_per_min_ci_high = 0.13333333333333333 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.13333333333333333 +jitter_p95_per_min_ci_high = 0.15384615384615385 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.09232729943423482 +reaction_rate = 0.834 +reaction_rate_ci_low = 0.8109382032269816 +reaction_rate_ci_high = 0.8570617967730183 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 146.54676258992805 +fire_decisiveness_mean = 4.4211350809710535 +fire_decisiveness_p50 = 3.555535748187671 +step_correction_mean = 0.16356986996938858 +step_correction_p50 = 0.15405994653701782 + +[cell.spm_30.step_minus_10_at_15min] +shares_per_minute = 30 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.948 +convergence_rate_ci_low = 0.934238622394542 +convergence_rate_ci_high = 0.9617613776054579 +convergence_p10_secs = 720 +convergence_p10_secs_ci_low = 660 +convergence_p10_secs_ci_high = 720 +convergence_p50_secs = 1080 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1037.3417721518988 +settled_accuracy_p10 = 0.02792824869352084 +settled_accuracy_p10_ci_low = 0.02470351862960718 +settled_accuracy_p10_ci_high = 0.029296822134293077 +settled_accuracy_p50 = 0.07549068696734662 +settled_accuracy_p50_ci_low = 0.0745258106284783 +settled_accuracy_p50_ci_high = 0.07633670605087084 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.10680823157330388 +settled_accuracy_p90_ci_high = 0.11476458396791589 +settled_accuracy_p95 = 0.13565303822334496 +settled_accuracy_p95_ci_low = 0.12087969282035815 +settled_accuracy_p95_ci_high = 0.14159500620570586 +settled_accuracy_p99 = 0.1538902449436268 +settled_accuracy_p99_ci_low = 0.149667158674063 +settled_accuracy_p99_ci_high = 0.15925030450647215 +settled_accuracy_mean = 0.07356305067949588 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.05555555555555555 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.058823529411764705 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.125 +jitter_mean_per_min = 0.039850525739878156 +reaction_rate = 0.452 +reaction_rate_ci_low = 0.42115281287378054 +reaction_rate_ci_high = 0.4828471871262195 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 183.4513274336283 +fire_decisiveness_mean = 3.5204321302708306 +fire_decisiveness_p50 = 2.8447473193014154 +step_correction_mean = 0.2969952935797978 +step_correction_p50 = 0.3243895173072815 + +[cell.spm_30.step_minus_5_at_15min] +shares_per_minute = 30 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.899 +convergence_rate_ci_low = 0.8803234521819475 +convergence_rate_ci_high = 0.9176765478180525 +convergence_p10_secs = 660 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1000.0444938820912 +settled_accuracy_p10 = 0.010129129464514275 +settled_accuracy_p10_ci_low = 0.008836330167984796 +settled_accuracy_p10_ci_high = 0.011604323591033472 +settled_accuracy_p50 = 0.02437358643123755 +settled_accuracy_p50_ci_low = 0.023204691291099033 +settled_accuracy_p50_ci_high = 0.025104790492129103 +settled_accuracy_p90 = 0.08402001596060726 +settled_accuracy_p90_ci_low = 0.08261744068971533 +settled_accuracy_p90_ci_high = 0.08559947607049767 +settled_accuracy_p95 = 0.09007358875532345 +settled_accuracy_p95_ci_low = 0.08754111212669202 +settled_accuracy_p95_ci_high = 0.0923742925577753 +settled_accuracy_p99 = 0.10416249443791137 +settled_accuracy_p99_ci_low = 0.09704916670922792 +settled_accuracy_p99_ci_high = 0.11662482252354334 +settled_accuracy_mean = 0.03611059823455653 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.07692307692307693 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.08333333333333333 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.11764705882352941 +jitter_mean_per_min = 0.02617539745517938 +reaction_rate = 0.363 +reaction_rate_ci_low = 0.33319568807034794 +reaction_rate_ci_high = 0.39280431192965204 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 182.1487603305785 +fire_decisiveness_mean = 3.464802136527086 +fire_decisiveness_p50 = 2.598700212900047 +step_correction_mean = 0.4712791566842187 +step_correction_p50 = 0.6083727478981018 + +[cell.spm_30.step_plus_5_at_15min] +shares_per_minute = 30 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.895 +convergence_rate_ci_low = 0.8759996221090212 +convergence_rate_ci_high = 0.9140003778909789 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1006.0558659217877 +settled_accuracy_p10 = 0.009596887886900163 +settled_accuracy_p10_ci_low = 0.008804683662211543 +settled_accuracy_p10_ci_high = 0.010554946888762462 +settled_accuracy_p50 = 0.022467026855946926 +settled_accuracy_p50_ci_low = 0.021411052818003706 +settled_accuracy_p50_ci_high = 0.023273228073391272 +settled_accuracy_p90 = 0.07470712730705908 +settled_accuracy_p90_ci_low = 0.07263135410742716 +settled_accuracy_p90_ci_high = 0.07675810218162626 +settled_accuracy_p95 = 0.08033065882119239 +settled_accuracy_p95_ci_low = 0.07803521592246765 +settled_accuracy_p95_ci_high = 0.08222395980932895 +settled_accuracy_p99 = 0.08996902638068827 +settled_accuracy_p99_ci_low = 0.08499894351465642 +settled_accuracy_p99_ci_high = 0.09407052873735999 +settled_accuracy_mean = 0.032684468476663134 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.08333333333333333 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.03006268447786814 +reaction_rate = 0.352 +reaction_rate_ci_low = 0.3223984190692456 +reaction_rate_ci_high = 0.38160158093075436 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 177.10227272727272 +fire_decisiveness_mean = 3.6748371114520344 +fire_decisiveness_p50 = 2.8206083053996416 +step_correction_mean = 0.39013635875149205 +step_correction_p50 = 0.6250541806221008 + +[cell.spm_30.step_plus_10_at_15min] +shares_per_minute = 30 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.948 +convergence_rate_ci_low = 0.934238622394542 +convergence_rate_ci_high = 0.9617613776054579 +convergence_p10_secs = 720 +convergence_p10_secs_ci_low = 660 +convergence_p10_secs_ci_high = 720 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1029.873417721519 +settled_accuracy_p10 = 0.016903564011516603 +settled_accuracy_p10_ci_low = 0.015410757807338582 +settled_accuracy_p10_ci_high = 0.01912151200910095 +settled_accuracy_p50 = 0.06006444769373365 +settled_accuracy_p50_ci_low = 0.059044758989796775 +settled_accuracy_p50_ci_high = 0.06119273074330933 +settled_accuracy_p90 = 0.08966494800862679 +settled_accuracy_p90_ci_low = 0.0866387652408046 +settled_accuracy_p90_ci_high = 0.09153435696315793 +settled_accuracy_p95 = 0.11063469917566515 +settled_accuracy_p95_ci_low = 0.09835670521582918 +settled_accuracy_p95_ci_high = 0.11459698960611797 +settled_accuracy_p99 = 0.12451537485456443 +settled_accuracy_p99_ci_low = 0.12194778966885866 +settled_accuracy_p99_ci_high = 0.12650826412121519 +settled_accuracy_mean = 0.057331458006597044 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.05555555555555555 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.058823529411764705 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.09090909090909091 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.11764705882352941 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.14285714285714285 +jitter_mean_per_min = 0.04136828444662338 +reaction_rate = 0.499 +reaction_rate_ci_low = 0.468009740911054 +reaction_rate_ci_high = 0.529990259088946 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 173.38677354709418 +fire_decisiveness_mean = 4.060006102530357 +fire_decisiveness_p50 = 3.035139857037901 +step_correction_mean = 0.30764755645471964 +step_correction_p50 = 0.3323613703250885 + +[cell.spm_30.step_plus_25_at_15min] +shares_per_minute = 30 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.998 +convergence_rate_ci_low = 0.995230914663648 +convergence_rate_ci_high = 1 +convergence_p10_secs = 720 +convergence_p10_secs_ci_low = 720 +convergence_p10_secs_ci_high = 780 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 981.943887775551 +settled_accuracy_p10 = 0.09875804581570335 +settled_accuracy_p10_ci_low = 0.09323332215926039 +settled_accuracy_p10_ci_high = 0.101216377654746 +settled_accuracy_p50 = 0.1234585094359355 +settled_accuracy_p50_ci_low = 0.12258953020145757 +settled_accuracy_p50_ci_high = 0.12444576132910334 +settled_accuracy_p90 = 0.15532716590362994 +settled_accuracy_p90_ci_low = 0.147985402695049 +settled_accuracy_p90_ci_high = 0.16214182926517617 +settled_accuracy_p95 = 0.1714775309865776 +settled_accuracy_p95_ci_low = 0.16761372482531833 +settled_accuracy_p95_ci_high = 0.17556730610853855 +settled_accuracy_p99 = 0.18949609941818224 +settled_accuracy_p99_ci_low = 0.1855652380818419 +settled_accuracy_p99_ci_high = 0.19416789627997866 +settled_accuracy_mean = 0.12329389681942658 +jitter_p10_per_min = 0.06666666666666667 +jitter_p10_per_min_ci_low = 0.0625 +jitter_p10_per_min_ci_high = 0.06666666666666667 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.125 +jitter_p90_per_min_ci_low = 0.11764705882352941 +jitter_p90_per_min_ci_high = 0.13333333333333333 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.15384615384615385 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.08907210925004282 +reaction_rate = 0.824 +reaction_rate_ci_low = 0.8003965214766975 +reaction_rate_ci_high = 0.8476034785233024 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 145.19417475728156 +fire_decisiveness_mean = 5.429911902183622 +fire_decisiveness_p50 = 4.164640774663285 +step_correction_mean = 0.17270501356716583 +step_correction_p50 = 0.16045914590358734 + +[cell.spm_30.step_plus_50_at_15min] +shares_per_minute = 30 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.884 +convergence_rate_ci_low = 0.864152253770264 +convergence_rate_ci_high = 0.9038477462297361 +convergence_p10_secs = 720 +convergence_p10_secs_ci_low = 720 +convergence_p10_secs_ci_high = 780 +convergence_p50_secs = 1200 +convergence_p50_secs_ci_low = 1200 +convergence_p50_secs_ci_high = 1200 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1140.475113122172 +settled_accuracy_p10 = 0.14983592777690435 +settled_accuracy_p10_ci_low = 0.148149347822644 +settled_accuracy_p10_ci_high = 0.15311996711486742 +settled_accuracy_p50 = 0.18306796848317242 +settled_accuracy_p50_ci_low = 0.18178395223065835 +settled_accuracy_p50_ci_high = 0.18531736810491106 +settled_accuracy_p90 = 0.21621509410765394 +settled_accuracy_p90_ci_low = 0.21178805660874223 +settled_accuracy_p90_ci_high = 0.2241284817979735 +settled_accuracy_p95 = 0.23766147622856415 +settled_accuracy_p95_ci_low = 0.23140970399533067 +settled_accuracy_p95_ci_high = 0.24429872177300538 +settled_accuracy_p99 = 0.25502021274225517 +settled_accuracy_p99_ci_low = 0.2509474653027044 +settled_accuracy_p99_ci_high = 0.2581473962968971 +settled_accuracy_mean = 0.18326721165625487 +jitter_p10_per_min = 0.1 +jitter_p10_per_min_ci_low = 0.09090909090909091 +jitter_p10_per_min_ci_high = 0.1 +jitter_p50_per_min = 0.16666666666666666 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.16666666666666666 +jitter_p90_per_min = 0.1875 +jitter_p90_per_min_ci_low = 0.18181818181818182 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.2 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.21428571428571427 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.23076923076923078 +jitter_mean_per_min = 0.1535973688820192 +reaction_rate = 0.988 +reaction_rate_ci_low = 0.9812512216216562 +reaction_rate_ci_high = 0.9947487783783437 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 60 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 111.61943319838056 +fire_decisiveness_mean = 7.53956953717762 +fire_decisiveness_p50 = 5.966178424281651 +step_correction_mean = 0.12011618029160297 +step_correction_p50 = 0.11074478924274445 + +[derived.operational_fitness.spm_6] +score = 0.6011799457486592 +reaction_10_component = 0.834 +reaction_50_component = 0.997 +jitter_component = 0.4375809523770172 +step_safety_component = 0.7472702330499534 +convergence_component = 0 +overshoot_component = 0.8016714939191651 + +[derived.operational_fitness.spm_8] +score = 0.6297429395316362 +reaction_10_component = 0.748 +reaction_50_component = 0.994 +jitter_component = 0.5412856638876219 +step_safety_component = 0.7827681230553352 +convergence_component = 0 +overshoot_component = 0.871294927958969 + +[derived.operational_fitness.spm_10] +score = 0.6475727492390329 +reaction_10_component = 0.669 +reaction_50_component = 0.996 +jitter_component = 0.6182809624159524 +step_safety_component = 0.8150180009798409 +convergence_component = 0 +overshoot_component = 0.892980083900845 + +[derived.operational_fitness.spm_12] +score = 0.6626617548602223 +reaction_10_component = 0.615 +reaction_50_component = 0.998 +jitter_component = 0.6742203987097928 +step_safety_component = 0.8309663253755866 +convergence_component = 0 +overshoot_component = 0.9431507383887738 + +[derived.operational_fitness.spm_15] +score = 0.675280864111678 +reaction_10_component = 0.529 +reaction_50_component = 1 +jitter_component = 0.7392003608313009 +step_safety_component = 0.8562447326073204 +convergence_component = 0 +overshoot_component = 0.9706959075202262 + +[derived.operational_fitness.spm_20] +score = 0.6915246539222696 +reaction_10_component = 0.466 +reaction_50_component = 0.997 +jitter_component = 0.8163352544728874 +step_safety_component = 0.8713633612161908 +convergence_component = 0 +overshoot_component = 1 + +[derived.operational_fitness.spm_25] +score = 0.7051711253332583 +reaction_10_component = 0.446 +reaction_50_component = 0.999 +jitter_component = 0.8633796967476721 +step_safety_component = 0.890104804585361 +convergence_component = 0 +overshoot_component = 1 + +[derived.operational_fitness.spm_30] +score = 0.7233299575058453 +reaction_10_component = 0.452 +reaction_50_component = 0.995 +jitter_component = 0.9194513280187386 +step_safety_component = 0.9046685020046423 +convergence_component = 0 +overshoot_component = 1 + +[derived.decoupling_score.spm_6] +score = 0.6646666666666667 +score_ci_low = 0.6624068509809673 +score_ci_high = 0.6666666666666667 + +[derived.decoupling_score.spm_8] +score = 0.722909090909091 +score_ci_low = 0.7065810176952783 +score_ci_high = 0.7324434884995144 + +[derived.decoupling_score.spm_10] +score = 0.7746666666666667 +score_ci_low = 0.7586554130661383 +score_ci_high = 0.7777094516677738 + +[derived.decoupling_score.spm_12] +score = 0.7984 +score_ci_low = 0.7961847317309184 +score_ci_high = 0.8095238095238095 + +[derived.decoupling_score.spm_15] +score = 0.8461538461538461 +score_ci_low = 0.8461538461538461 +score_ci_high = 0.8571428571428572 + +[derived.decoupling_score.spm_20] +score = 0.8797058823529411 +score_ci_low = 0.8694089919125195 +score_ci_high = 0.8823529411764706 + +[derived.decoupling_score.spm_25] +score = 0.8938421052631579 +score_ci_low = 0.8862586491067755 +score_ci_high = 0.8947368421052632 + +[derived.decoupling_score.spm_30] +score = 0.995 +score_ci_low = 0.9906282772274537 +score_ci_high = 0.9993717227725463 + +[derived.reaction_asymmetry.spm_6] +asymmetry_at_5 = 0.0050000000000000044 +asymmetry_at_5_ci_low = -0.04193974588550076 +asymmetry_at_5_ci_high = 0.051939745885500765 +asymmetry_at_10 = -0.027999999999999914 +asymmetry_at_10_ci_low = -0.07557073274339443 +asymmetry_at_10_ci_high = 0.019570732743394603 +asymmetry_at_25 = 0.018000000000000016 +asymmetry_at_25_ci_low = -0.0191417959352993 +asymmetry_at_25_ci_high = 0.05514179593529933 +asymmetry_at_50 = -0.015000000000000013 +asymmetry_at_50_ci_low = -0.02624039571865333 +asymmetry_at_50_ci_high = -0.0033698807527975383 +max_abs_asymmetry = 0.027999999999999914 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.07557073274339443 + +[derived.reaction_asymmetry.spm_8] +asymmetry_at_5 = 0.0050000000000000044 +asymmetry_at_5_ci_low = -0.05080819639248735 +asymmetry_at_5_ci_high = 0.06080819639248736 +asymmetry_at_10 = -0.0010000000000000009 +asymmetry_at_10_ci_low = -0.054854497227412646 +asymmetry_at_10_ci_high = 0.052854497227412645 +asymmetry_at_25 = -0.010000000000000009 +asymmetry_at_25_ci_low = -0.05167841710757448 +asymmetry_at_25_ci_high = 0.031678417107574464 +asymmetry_at_50 = -0.02100000000000002 +asymmetry_at_50_ci_low = -0.03583260297891133 +asymmetry_at_50_ci_high = -0.006167397021088705 +max_abs_asymmetry = 0.02100000000000002 +max_abs_asymmetry_ci_low = 0.006167397021088705 +max_abs_asymmetry_ci_high = 0.03583260297891133 + +[derived.reaction_asymmetry.spm_10] +asymmetry_at_5 = 0.016000000000000014 +asymmetry_at_5_ci_low = -0.04377289266437634 +asymmetry_at_5_ci_high = 0.07577289266437637 +asymmetry_at_10 = -0.0010000000000000009 +asymmetry_at_10_ci_low = -0.0593550254546763 +asymmetry_at_10_ci_high = 0.0573550254546763 +asymmetry_at_25 = -0.051000000000000045 +asymmetry_at_25_ci_low = -0.09546752370789857 +asymmetry_at_25_ci_high = -0.006532476292101519 +asymmetry_at_50 = -0.017000000000000015 +asymmetry_at_50_ci_low = -0.029799190706141454 +asymmetry_at_50_ci_high = -0.004200809293858576 +max_abs_asymmetry = 0.051000000000000045 +max_abs_asymmetry_ci_low = 0.006532476292101519 +max_abs_asymmetry_ci_high = 0.09546752370789857 + +[derived.reaction_asymmetry.spm_12] +asymmetry_at_5 = -0.019999999999999907 +asymmetry_at_5_ci_low = -0.08147397269500889 +asymmetry_at_5_ci_high = 0.041473972695009076 +asymmetry_at_10 = -0.0010000000000000009 +asymmetry_at_10_ci_low = -0.06133356114297506 +asymmetry_at_10_ci_high = 0.059333561142975055 +asymmetry_at_25 = -0.020000000000000018 +asymmetry_at_25_ci_low = -0.06717887798945088 +asymmetry_at_25_ci_high = 0.027178877989450845 +asymmetry_at_50 = -0.013000000000000012 +asymmetry_at_50_ci_low = -0.022533899388762824 +asymmetry_at_50_ci_high = -0.002697015274885195 +max_abs_asymmetry = 0.020000000000000018 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.06717887798945088 + +[derived.reaction_asymmetry.spm_15] +asymmetry_at_5 = -0.04099999999999998 +asymmetry_at_5_ci_low = -0.10277170866018387 +asymmetry_at_5_ci_high = 0.020771708660183963 +asymmetry_at_10 = 0.020000000000000018 +asymmetry_at_10_ci_low = -0.041779297953643324 +asymmetry_at_10_ci_high = 0.08177929795364336 +asymmetry_at_25 = -0.0119999999999999 +asymmetry_at_25_ci_low = -0.059820069728507064 +asymmetry_at_25_ci_high = 0.035820069728507264 +asymmetry_at_50 = -0.020000000000000018 +asymmetry_at_50_ci_low = -0.028677289899502023 +asymmetry_at_50_ci_high = -0.011322710100498012 +max_abs_asymmetry = 0.04099999999999998 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.1027717086601839 + +[derived.reaction_asymmetry.spm_20] +asymmetry_at_5 = 0.008000000000000007 +asymmetry_at_5_ci_low = -0.05259643747002374 +asymmetry_at_5_ci_high = 0.06859643747002375 +asymmetry_at_10 = 0.014999999999999958 +asymmetry_at_10_ci_low = -0.046886526402943995 +asymmetry_at_10_ci_high = 0.07688652640294386 +asymmetry_at_25 = -0.025000000000000022 +asymmetry_at_25_ci_low = -0.07576135358587999 +asymmetry_at_25_ci_high = 0.025761353585879943 +asymmetry_at_50 = -0.01100000000000001 +asymmetry_at_50_ci_low = -0.02128213199550788 +asymmetry_at_50_ci_high = -0.0003281444759429819 +max_abs_asymmetry = 0.025000000000000022 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.07576135358587999 + +[derived.reaction_asymmetry.spm_25] +asymmetry_at_5 = 0.010000000000000009 +asymmetry_at_5_ci_low = -0.05059524366662793 +asymmetry_at_5_ci_high = 0.07059524366662795 +asymmetry_at_10 = 0.033999999999999975 +asymmetry_at_10_ci_low = -0.02777457428405089 +asymmetry_at_10_ci_high = 0.09577457428405084 +asymmetry_at_25 = 0.028000000000000025 +asymmetry_at_25_ci_low = -0.022621531919523763 +asymmetry_at_25_ci_high = 0.07862153191952381 +asymmetry_at_50 = -0.015000000000000013 +asymmetry_at_50_ci_low = -0.02377702709266205 +asymmetry_at_50_ci_high = -0.005263953152460532 +max_abs_asymmetry = 0.033999999999999975 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.09577457428405084 + +[derived.reaction_asymmetry.spm_30] +asymmetry_at_5 = -0.01100000000000001 +asymmetry_at_5_ci_low = -0.07040589286040644 +asymmetry_at_5_ci_high = 0.04840589286040642 +asymmetry_at_10 = 0.046999999999999986 +asymmetry_at_10_ci_low = -0.014837446215165473 +asymmetry_at_10_ci_high = 0.1088374462151655 +asymmetry_at_25 = -0.010000000000000009 +asymmetry_at_25_ci_low = -0.056665275296320816 +asymmetry_at_25_ci_high = 0.0366652752963208 +asymmetry_at_50 = -0.007000000000000006 +asymmetry_at_50_ci_low = -0.018120501150890034 +asymmetry_at_50_ci_high = 0.004120501150890021 +max_abs_asymmetry = 0.046999999999999986 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.10883744621516547 + diff --git a/sv2/channels-sv2/sim/baseline_EWMA-AdaCUSUM-tau120-s15-f5-eta50.md b/sv2/channels-sv2/sim/baseline_EWMA-AdaCUSUM-tau120-s15-f5-eta50.md new file mode 100644 index 0000000000..5b61903294 --- /dev/null +++ b/sv2/channels-sv2/sim/baseline_EWMA-AdaCUSUM-tau120-s15-f5-eta50.md @@ -0,0 +1,227 @@ +# Vardiff baseline characterization — `EWMA-AdaCUSUM-tau120-s15-f5-eta50` + +*Generated by `cargo run --release --bin generate-baseline` from the vardiff_sim crate. 1000 trials per cell, base seed `0xdeadbeefcafef00d`.* + +## Summary + +Headline per-metric values at each share rate's best and worst cells. ↑ = higher is better; ↓ = lower is better; ↔ = near-zero is better. Where a `(floor: X.X%)` annotation appears, it's the Poisson-noise lower bound on that metric at that share rate — the algorithm cannot do better than this without exotic estimation techniques. + +| Metric | Dir | Best | Worst | +| --- | :-: | --- | --- | +| cold-start convergence rate | ↑ | 100.0% @ SPM=10 | 94.2% @ SPM=6 | +| cold-start p90 time | ↓ | 8m @ SPM=20 | 18m @ SPM=6 | +| settled accuracy p50 (stable) | ↓ | 4.8% @ SPM=20 (floor: 4.8%) | 8.9% @ SPM=6 (floor: 8.7%) | +| settled accuracy p99 (stable) | ↓ | 12.7% @ SPM=30 (floor: 14.9%) | 34.4% @ SPM=6 (floor: 33.3%) | +| stable-load jitter (mean) | ↓ | 0.037/min @ SPM=30 (floor: 0.020/min) | 0.175/min @ SPM=6 (floor: 0.020/min) | +| reaction rate at −50% step | ↑ | 99.9% @ SPM=20 | 99.3% @ SPM=6 | +| reaction rate at +50% step | ↑ | 97.1% @ SPM=12 | 95.9% @ SPM=8 | +| ramp target overshoot p99 (cold start) | ↓ | 14.7% @ SPM=30 (floor: 42.5%) | 49.2% @ SPM=6 (floor: 95.0%) | +| upward step magnitude p95 (stable) | ↓ | 1.138 @ SPM=30 | 1.341 @ SPM=6 | +| operational fitness | ↑ | 0.795 @ SPM=30 | 0.504 @ SPM=6 | +| decoupling score | ↑ | 0.892 @ SPM=30 | 0.648 @ SPM=6 | +| max |reaction asymmetry| | ↓ | 0.027 @ SPM=6 | 0.045 @ SPM=25 | + +## Convergence time (cold start: 10 GH/s → 1 PH/s) + +| share/min | rate | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 94.2% | 2m | 7m | 18m | 25m | 8m51s | +| 8 | 99.0% | 2m | 6m | 14m | 21m | 7m22s | +| 10 | 100.0% | 3m | 6m | 12m | 19m | 6m42s | +| 12 | 100.0% | 3m | 6m | 11m | 16m | 6m19s | +| 15 | 100.0% | 3m | 6m | 10m | 14m | 5m55s | +| 20 | 100.0% | 1m | 5m | 8m | 12m | 4m58s | +| 25 | 100.0% | 3m | 4m | 9m | 10m | 5m05s | +| 30 | 100.0% | 1m | 1m | 8m | 8m | 3m06s | + +## Settled accuracy (stable load, post-convergence) + +`|final_hashrate / true_hashrate - 1|` at trial end. Smaller is better. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 1.6% | 8.9% | 22.1% | 34.4% | 10.9% | +| 8 | 1.3% | 7.7% | 19.0% | 27.9% | 9.0% | +| 10 | 1.5% | 7.0% | 16.6% | 24.9% | 8.1% | +| 12 | 1.1% | 6.8% | 15.3% | 24.6% | 7.8% | +| 15 | 0.7% | 5.8% | 15.0% | 21.1% | 6.8% | +| 20 | 0.8% | 4.8% | 10.7% | 20.1% | 5.5% | +| 25 | 0.9% | 6.1% | 9.9% | 18.2% | 5.8% | +| 30 | 0.4% | 6.5% | 9.6% | 12.7% | 5.7% | + +## Steady-state jitter (fires per minute) + +Post-convergence rate of vardiff fires. Smaller is better — ideal is zero under stable load. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.118 | 0.174 | 0.231 | 0.273 | 0.175 | +| 8 | 0.091 | 0.143 | 0.200 | 0.250 | 0.144 | +| 10 | 0.071 | 0.125 | 0.167 | 0.214 | 0.123 | +| 12 | 0.059 | 0.105 | 0.158 | 0.190 | 0.107 | +| 15 | 0.053 | 0.087 | 0.133 | 0.167 | 0.088 | +| 20 | 0.000 | 0.067 | 0.111 | 0.150 | 0.068 | +| 25 | 0.000 | 0.062 | 0.091 | 0.118 | 0.052 | +| 30 | 0.000 | 0.053 | 0.083 | 0.100 | 0.037 | + +## Reaction time to a 50% drop (step at 15 min) + +| share/min | reacted | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 99.3% | 1m | 2m | 3m | 5m | 2m03s | +| 8 | 99.6% | 1m | 2m | 3m | 5m | 2m | +| 10 | 99.5% | 1m | 2m | 3m | 5m | 2m02s | +| 12 | 99.6% | 1m | 2m | 4m | 5m | 2m10s | +| 15 | 99.7% | 1m | 2m | 4m | 5m | 2m11s | +| 20 | 99.9% | 1m | 2m | 4m | 5m | 2m04s | +| 25 | 99.6% | 1m | 1m | 4m | 5m | 1m56s | +| 30 | 99.7% | 1m | 1m | 4m | 5m | 1m46s | + +## Reaction sensitivity (P[fire within 5 min of step change]) + +| Δ% | 6 | 8 | 10 | 12 | 15 | 20 | 25 | 30 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| -50% | 0.99 | 1.00 | 0.99 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | +| -25% | 0.91 | 0.87 | 0.83 | 0.80 | 0.79 | 0.74 | 0.79 | 0.80 | +| -10% | 0.85 | 0.75 | 0.65 | 0.61 | 0.55 | 0.50 | 0.51 | 0.50 | +| -5% | 0.82 | 0.74 | 0.67 | 0.57 | 0.50 | 0.45 | 0.44 | 0.37 | +| +5% | 0.81 | 0.72 | 0.67 | 0.57 | 0.52 | 0.45 | 0.41 | 0.40 | +| +10% | 0.87 | 0.76 | 0.69 | 0.65 | 0.55 | 0.53 | 0.51 | 0.53 | +| +25% | 0.89 | 0.84 | 0.81 | 0.81 | 0.78 | 0.76 | 0.75 | 0.83 | +| +50% | 0.97 | 0.96 | 0.97 | 0.97 | 0.96 | 0.96 | 0.97 | 0.97 | + +## Estimator bias + +`E[H̃ − H_true] / H_true` averaged over post-settle ticks. Positive = systematic over-estimate. Populated only for algorithms that expose introspection (e.g. ClassicComposed, Parametric, EWMA-60s). + +### Bias — stable load + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | -11.4% | -0.6% | 11.0% | 22.4% | -0.3% | +| 8 | -9.9% | 0.3% | 9.8% | 16.8% | 0.1% | +| 10 | -8.9% | -0.2% | 8.7% | 15.8% | -0.2% | +| 12 | -7.6% | 0.2% | 8.5% | 15.0% | 0.4% | +| 15 | -6.9% | 0.0% | 7.1% | 14.0% | 0.2% | +| 20 | -6.3% | -0.1% | 6.2% | 11.9% | -0.1% | +| 25 | -5.7% | 0.0% | 5.5% | 9.7% | -0.1% | +| 30 | -5.1% | -0.1% | 5.2% | 9.6% | 0.0% | + +### Bias — cold start + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | -11.5% | -0.4% | 11.3% | 22.1% | -0.1% | +| 8 | -9.7% | -0.1% | 10.4% | 17.7% | 0.1% | +| 10 | -7.9% | 0.1% | 8.8% | 16.0% | 0.1% | +| 12 | -8.5% | -0.3% | 8.1% | 14.5% | -0.1% | +| 15 | -6.9% | -0.1% | 6.6% | 12.5% | -0.1% | +| 20 | -5.8% | 0.0% | 6.1% | 11.2% | 0.1% | +| 25 | -5.2% | -0.0% | 5.6% | 10.2% | 0.1% | +| 30 | -5.1% | -0.1% | 5.2% | 9.4% | 0.0% | + +## Estimator variance + +Population variance of `H̃ / H_true` over post-settle ticks (dimensionless). Populated only for algorithms that expose introspection. + +### Variance — stable load + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.016 | 0.030 | 0.053 | 0.086 | 0.033 | +| 8 | 0.012 | 0.023 | 0.042 | 0.066 | 0.025 | +| 10 | 0.010 | 0.018 | 0.033 | 0.055 | 0.020 | +| 12 | 0.008 | 0.015 | 0.028 | 0.043 | 0.017 | +| 15 | 0.007 | 0.012 | 0.021 | 0.032 | 0.013 | +| 20 | 0.005 | 0.009 | 0.017 | 0.025 | 0.010 | +| 25 | 0.004 | 0.007 | 0.013 | 0.019 | 0.008 | +| 30 | 0.003 | 0.006 | 0.011 | 0.017 | 0.006 | + +### Variance — cold start + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.016 | 0.029 | 0.055 | 0.089 | 0.033 | +| 8 | 0.012 | 0.022 | 0.042 | 0.064 | 0.025 | +| 10 | 0.010 | 0.018 | 0.032 | 0.046 | 0.019 | +| 12 | 0.008 | 0.014 | 0.026 | 0.043 | 0.016 | +| 15 | 0.006 | 0.011 | 0.021 | 0.034 | 0.013 | +| 20 | 0.005 | 0.009 | 0.015 | 0.024 | 0.010 | +| 25 | 0.004 | 0.007 | 0.013 | 0.021 | 0.008 | +| 30 | 0.003 | 0.006 | 0.011 | 0.016 | 0.006 | + +## Ramp target overshoot (cold start) + +`max(new_hashrate on fires) / H_true − 1`: how far the algorithm's actual *target* (not its belief) climbs past truth during the cold-start ramp. Reads `new_hashrate` (the actual target the algorithm set), so it's unaffected by estimator-belief noise. Works for any algorithm that fires, including those without introspection. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 1.5% | 14.8% | 31.3% | 49.2% | 16.1% | +| 8 | 0.2% | 11.7% | 24.9% | 36.2% | 12.4% | +| 10 | 0.0% | 8.6% | 21.2% | 31.1% | 9.8% | +| 12 | 0.0% | 6.9% | 18.0% | 25.8% | 8.1% | +| 15 | 0.0% | 5.3% | 14.7% | 23.3% | 6.4% | +| 20 | 0.0% | 2.6% | 11.5% | 17.6% | 4.2% | +| 25 | 0.0% | 1.7% | 8.2% | 17.1% | 3.1% | +| 30 | 0.0% | 0.2% | 9.5% | 14.7% | 3.1% | + +## Upward step magnitude (stable load) + +`new_hashrate / old_hashrate` for upward difficulty adjustments during steady-state. Per-trial p95 of ratios, then distribution across trials. Values near 1.0 indicate gentle retargeting; values >> 1.0 indicate aggressive jumps. + +| share/min | p50 | p90 | p95 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 1.213 | 1.309 | 1.341 | 1.432 | 1.222 | +| 8 | 1.174 | 1.263 | 1.287 | 1.364 | 1.184 | +| 10 | 1.153 | 1.224 | 1.251 | 1.320 | 1.159 | +| 12 | 1.139 | 1.209 | 1.232 | 1.302 | 1.145 | +| 15 | 1.122 | 1.181 | 1.204 | 1.254 | 1.125 | +| 20 | 1.103 | 1.154 | 1.170 | 1.213 | 1.099 | +| 25 | 1.088 | 1.136 | 1.154 | 1.184 | 1.078 | +| 30 | 1.074 | 1.122 | 1.138 | 1.159 | 1.062 | + +## Operational fitness (per share rate) + +`0.15×react(-10%) + 0.1×react(-50%) + 0.25×jitter + 0.25×step_safety + 0.15×convergence + 0.1×overshoot`. Higher is better. + +| share/min | fitness | react-10% | react-50% | jitter | step-safe | conv | overshoot | +| --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.504 | 0.847 | 0.993 | 0.418 | 0.319 | 0.283 | 0.508 | +| 8 | 0.571 | 0.747 | 0.996 | 0.519 | 0.427 | 0.396 | 0.638 | +| 10 | 0.599 | 0.654 | 0.995 | 0.591 | 0.498 | 0.400 | 0.689 | +| 12 | 0.621 | 0.613 | 0.996 | 0.643 | 0.537 | 0.400 | 0.742 | +| 15 | 0.644 | 0.551 | 0.997 | 0.708 | 0.591 | 0.400 | 0.767 | +| 20 | 0.690 | 0.496 | 0.999 | 0.773 | 0.660 | 0.500 | 0.824 | +| 25 | 0.728 | 0.506 | 0.996 | 0.828 | 0.692 | 0.600 | 0.829 | +| 30 | 0.795 | 0.500 | 0.997 | 0.876 | 0.725 | 0.900 | 0.853 | + +## Decoupling score (per share rate) + +`reaction_rate(Step−50) × clamp(1 − jitter_p50 / J_max, 0, 1)` where `J_max = 0.50` fires/min. Higher is better. Score of 1.0 = perfect decoupling between reactivity and jitter. + +| share/min | decoupling score | +| --- | --- | +| 6 | 0.648 | +| 8 | 0.711 | +| 10 | 0.746 | +| 12 | 0.786 | +| 15 | 0.824 | +| 20 | 0.866 | +| 25 | 0.871 | +| 30 | 0.892 | + +## Reaction asymmetry (per share rate) + +`reaction_rate(+δ%) − reaction_rate(−δ%)`. Positive = responds faster to up-steps; negative = responds faster to down-steps; near zero = symmetric. + +| share/min | δ=5% | δ=10% | δ=25% | δ=50% | +| --- | --- | --- | --- | --- | +| 6 | -0.01 | +0.02 | -0.02 | -0.03 | +| 8 | -0.02 | +0.01 | -0.03 | -0.04 | +| 10 | +0.00 | +0.03 | -0.02 | -0.03 | +| 12 | +0.00 | +0.04 | +0.01 | -0.03 | +| 15 | +0.02 | +0.00 | -0.01 | -0.04 | +| 20 | -0.00 | +0.03 | +0.02 | -0.04 | +| 25 | -0.03 | -0.00 | -0.05 | -0.03 | +| 30 | +0.03 | +0.03 | +0.02 | -0.03 | + diff --git a/sv2/channels-sv2/sim/baseline_EWMA-AdaCUSUM-tau120-s15-f5-eta50.toml b/sv2/channels-sv2/sim/baseline_EWMA-AdaCUSUM-tau120-s15-f5-eta50.toml new file mode 100644 index 0000000000..c9c3d6392d --- /dev/null +++ b/sv2/channels-sv2/sim/baseline_EWMA-AdaCUSUM-tau120-s15-f5-eta50.toml @@ -0,0 +1,6582 @@ +# Vardiff baseline characterization. Regenerate with +# `cargo run --release --bin generate-baseline` from the sim crate. + +[meta] +algorithm = "EWMA-AdaCUSUM-tau120-s15-f5-eta50" +trial_count = 1000 +base_seed = 16045690984503111693 +quiet_window_secs = 300 +settle_buffer_secs = 120 +min_settled_window_secs = 600 +react_window_secs = 300 +step_event_at_secs = 900 +trial_duration_secs = 1800 + +[cell.spm_6.cold_start_10gh_to_1ph] +shares_per_minute = 6 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.942 +convergence_rate_ci_low = 0.9275124309285512 +convergence_rate_ci_high = 0.9564875690714487 +convergence_p10_secs = 120 +convergence_p10_secs_ci_low = 120 +convergence_p10_secs_ci_high = 120 +convergence_p50_secs = 420 +convergence_p50_secs_ci_low = 420 +convergence_p50_secs_ci_high = 420 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 531.0191082802547 +settled_accuracy_p10 = 0.021376253836865367 +settled_accuracy_p10_ci_low = 0.015664953891847744 +settled_accuracy_p10_ci_high = 0.0253184969949658 +settled_accuracy_p50 = 0.09697351770107043 +settled_accuracy_p50_ci_low = 0.09257714885437451 +settled_accuracy_p50_ci_high = 0.10184890962522986 +settled_accuracy_p90 = 0.22562228540447282 +settled_accuracy_p90_ci_low = 0.2118541635782608 +settled_accuracy_p90_ci_high = 0.24341063088976755 +settled_accuracy_p95 = 0.2701464000019864 +settled_accuracy_p95_ci_low = 0.2537170761392351 +settled_accuracy_p95_ci_high = 0.2961976586925006 +settled_accuracy_p99 = 0.41917935119283656 +settled_accuracy_p99_ci_low = 0.36310210996310954 +settled_accuracy_p99_ci_high = 0.43883177961770903 +settled_accuracy_mean = 0.11373894530768461 +jitter_p10_per_min = 0.12 +jitter_p10_per_min_ci_low = 0.11538461538461539 +jitter_p10_per_min_ci_high = 0.125 +jitter_p50_per_min = 0.17391304347826086 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.17391304347826086 +jitter_p90_per_min = 0.23076923076923078 +jitter_p90_per_min_ci_low = 0.22727272727272727 +jitter_p90_per_min_ci_high = 0.23076923076923078 +jitter_p95_per_min = 0.24 +jitter_p95_per_min_ci_low = 0.23529411764705882 +jitter_p95_per_min_ci_high = 0.25 +jitter_p99_per_min = 0.2692307692307692 +jitter_p99_per_min_ci_low = 0.2631578947368421 +jitter_p99_per_min_ci_high = 0.2857142857142857 +jitter_mean_per_min = 0.17322621689224674 +bias_mean = -0.0009800228723965308 +bias_p10 = -0.11466664100517864 +bias_p10_ci_low = -0.12255622229704113 +bias_p10_ci_high = -0.1079287467318115 +bias_p50 = -0.004391780719565904 +bias_p50_ci_low = -0.012694704936431662 +bias_p50_ci_high = 0.0015044818531783962 +bias_p90 = 0.1130786492337568 +bias_p90_ci_low = 0.1043889130518085 +bias_p90_ci_high = 0.12597985167944828 +bias_p99 = 0.2212076735426681 +bias_p99_ci_low = 0.19941447232834655 +bias_p99_ci_high = 0.23602246407794036 +variance_mean = 0.03292094609149498 +variance_p10 = 0.015762000735241817 +variance_p10_ci_low = 0.015006475774712334 +variance_p10_ci_high = 0.01650608970951557 +variance_p50 = 0.029272634641380968 +variance_p50_ci_low = 0.02841647048183261 +variance_p50_ci_high = 0.029965754318388427 +variance_p90 = 0.05467343491941077 +variance_p90_ci_low = 0.052351785088632086 +variance_p90_ci_high = 0.05860018417387323 +variance_p99 = 0.0892056903680995 +variance_p99_ci_low = 0.07950554332571906 +variance_p99_ci_high = 0.09728158568745672 +ramp_target_overshoot_p10 = 0.015477250396797926 +ramp_target_overshoot_p10_ci_low = 0.003956067584264034 +ramp_target_overshoot_p10_ci_high = 0.02241603858920782 +ramp_target_overshoot_p50 = 0.14833025426676483 +ramp_target_overshoot_p50_ci_low = 0.13876146965998148 +ramp_target_overshoot_p50_ci_high = 0.15673899503535327 +ramp_target_overshoot_p90 = 0.3132694828275462 +ramp_target_overshoot_p90_ci_low = 0.3060472267899126 +ramp_target_overshoot_p90_ci_high = 0.3247041623132587 +ramp_target_overshoot_p99 = 0.4919065702330174 +ramp_target_overshoot_p99_ci_low = 0.4471888465603453 +ramp_target_overshoot_p99_ci_high = 0.5164498927298349 +ramp_target_overshoot_mean = 0.16109684185010809 + +[cell.spm_6.stable_1ph] +shares_per_minute = 6 +scenario = "stable_1ph" +convergence_rate = 0.934 +convergence_rate_ci_low = 0.9186113161576437 +convergence_rate_ci_high = 0.9493886838423564 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 579.0578158458244 +settled_accuracy_p10 = 0.015587845806108613 +settled_accuracy_p10_ci_low = 0.013647460087170438 +settled_accuracy_p10_ci_high = 0.01847902992256767 +settled_accuracy_p50 = 0.08942618632199206 +settled_accuracy_p50_ci_low = 0.08522101063131937 +settled_accuracy_p50_ci_high = 0.09947755077607712 +settled_accuracy_p90 = 0.22066408114106006 +settled_accuracy_p90_ci_low = 0.21014758514454013 +settled_accuracy_p90_ci_high = 0.23227794129598367 +settled_accuracy_p95 = 0.26362610269092457 +settled_accuracy_p95_ci_low = 0.24944559689006784 +settled_accuracy_p95_ci_high = 0.27565201127616845 +settled_accuracy_p99 = 0.34394601870283803 +settled_accuracy_p99_ci_low = 0.31490438899358253 +settled_accuracy_p99_ci_high = 0.38936382205386555 +settled_accuracy_mean = 0.10867036172550587 +jitter_p10_per_min = 0.11764705882352941 +jitter_p10_per_min_ci_low = 0.1111111111111111 +jitter_p10_per_min_ci_high = 0.125 +jitter_p50_per_min = 0.17391304347826086 +jitter_p50_per_min_ci_low = 0.17391304347826086 +jitter_p50_per_min_ci_high = 0.18181818181818182 +jitter_p90_per_min = 0.23076923076923078 +jitter_p90_per_min_ci_low = 0.2222222222222222 +jitter_p90_per_min_ci_high = 0.23809523809523808 +jitter_p95_per_min = 0.25 +jitter_p95_per_min_ci_low = 0.24 +jitter_p95_per_min_ci_high = 0.25 +jitter_p99_per_min = 0.2727272727272727 +jitter_p99_per_min_ci_low = 0.2692307692307692 +jitter_p99_per_min_ci_high = 0.29411764705882354 +jitter_mean_per_min = 0.17467475271922553 +bias_mean = -0.003000290353567963 +bias_p10 = -0.11401069953365943 +bias_p10_ci_low = -0.12212504077614096 +bias_p10_ci_high = -0.10687807974722308 +bias_p50 = -0.005822534654567492 +bias_p50_ci_low = -0.013332507588184784 +bias_p50_ci_high = 0.002519058396647213 +bias_p90 = 0.11013951053527768 +bias_p90_ci_low = 0.10174395136056849 +bias_p90_ci_high = 0.12037733873643523 +bias_p99 = 0.22415626752700324 +bias_p99_ci_low = 0.1989685692417206 +bias_p99_ci_high = 0.25354652425722857 +variance_mean = 0.032917881203662805 +variance_p10 = 0.015897126176330358 +variance_p10_ci_low = 0.015210036066125216 +variance_p10_ci_high = 0.016555189271847803 +variance_p50 = 0.030093650838932885 +variance_p50_ci_low = 0.0287533210855838 +variance_p50_ci_high = 0.031221181228449114 +variance_p90 = 0.052956746272974566 +variance_p90_ci_low = 0.05179967895303137 +variance_p90_ci_high = 0.05429306001012393 +variance_p99 = 0.08552870364296218 +variance_p99_ci_low = 0.07630540495486776 +variance_p99_ci_high = 0.09301774264375702 +upward_step_magnitude_p50 = 1.2126445577729243 +upward_step_magnitude_p50_ci_low = 1.2070955460865607 +upward_step_magnitude_p50_ci_high = 1.2172109273901544 +upward_step_magnitude_p90 = 1.3094780471221987 +upward_step_magnitude_p90_ci_low = 1.3018179236226888 +upward_step_magnitude_p90_ci_high = 1.3215226035787377 +upward_step_magnitude_p95 = 1.3406809454476476 +upward_step_magnitude_p95_ci_low = 1.3324745293503288 +upward_step_magnitude_p95_ci_high = 1.3591508227908058 +upward_step_magnitude_p99 = 1.432150542585021 +upward_step_magnitude_p99_ci_low = 1.4166676005983694 +upward_step_magnitude_p99_ci_high = 1.4475566219781388 +upward_step_magnitude_mean = 1.2219784903727404 +fire_decisiveness_mean = 10.021114984525369 +fire_decisiveness_p50 = 7.719391091018441 + +[cell.spm_6.step_minus_50_at_15min] +shares_per_minute = 6 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.807 +convergence_rate_ci_low = 0.7825391528846608 +convergence_rate_ci_high = 0.8314608471153393 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 611.003717472119 +settled_accuracy_p10 = 0.016866135464209897 +settled_accuracy_p10_ci_low = 0.014221509317294156 +settled_accuracy_p10_ci_high = 0.02302605817090364 +settled_accuracy_p50 = 0.09822509803095203 +settled_accuracy_p50_ci_low = 0.0915039438873253 +settled_accuracy_p50_ci_high = 0.10592006891275108 +settled_accuracy_p90 = 0.25690300239021646 +settled_accuracy_p90_ci_low = 0.23813439771572154 +settled_accuracy_p90_ci_high = 0.2777569479317752 +settled_accuracy_p95 = 0.31690866235187976 +settled_accuracy_p95_ci_low = 0.30049960536632003 +settled_accuracy_p95_ci_high = 0.35110331335927447 +settled_accuracy_p99 = 0.45226147143836637 +settled_accuracy_p99_ci_low = 0.4004371874111017 +settled_accuracy_p99_ci_high = 0.5137859392298358 +settled_accuracy_mean = 0.12244386944077709 +jitter_p10_per_min = 0.16666666666666666 +jitter_p10_per_min_ci_low = 0.16666666666666666 +jitter_p10_per_min_ci_high = 0.16666666666666666 +jitter_p50_per_min = 0.21739130434782608 +jitter_p50_per_min_ci_low = 0.21052631578947367 +jitter_p50_per_min_ci_high = 0.21739130434782608 +jitter_p90_per_min = 0.2727272727272727 +jitter_p90_per_min_ci_low = 0.2631578947368421 +jitter_p90_per_min_ci_high = 0.2777777777777778 +jitter_p95_per_min = 0.2857142857142857 +jitter_p95_per_min_ci_low = 0.28 +jitter_p95_per_min_ci_high = 0.3 +jitter_p99_per_min = 0.3157894736842105 +jitter_p99_per_min_ci_low = 0.30434782608695654 +jitter_p99_per_min_ci_high = 0.32 +jitter_mean_per_min = 0.21651113341575717 +reaction_rate = 0.993 +reaction_rate_ci_low = 0.9878325091582084 +reaction_rate_ci_high = 0.9981674908417916 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 122.77945619335347 +fire_decisiveness_mean = 10.275232840944422 +fire_decisiveness_p50 = 8.33856995859579 +step_correction_mean = 0.34127772929595196 +step_correction_p50 = 0.3391212224960327 + +[cell.spm_6.step_minus_25_at_15min] +shares_per_minute = 6 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.915 +convergence_rate_ci_low = 0.8977147334414537 +convergence_rate_ci_high = 0.9322852665585464 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 605.2459016393443 +settled_accuracy_p10 = 0.016136639372448025 +settled_accuracy_p10_ci_low = 0.012668990184299789 +settled_accuracy_p10_ci_high = 0.019841674979963475 +settled_accuracy_p50 = 0.09325277645026508 +settled_accuracy_p50_ci_low = 0.08501109220033054 +settled_accuracy_p50_ci_high = 0.09931002245820486 +settled_accuracy_p90 = 0.23750685740735555 +settled_accuracy_p90_ci_low = 0.22127107587408623 +settled_accuracy_p90_ci_high = 0.24941474360253446 +settled_accuracy_p95 = 0.27671731357672247 +settled_accuracy_p95_ci_low = 0.2635272006987195 +settled_accuracy_p95_ci_high = 0.3064119566161778 +settled_accuracy_p99 = 0.41652995099889756 +settled_accuracy_p99_ci_low = 0.34771598562653416 +settled_accuracy_p99_ci_high = 0.45335625294887527 +settled_accuracy_mean = 0.11366708004235207 +jitter_p10_per_min = 0.125 +jitter_p10_per_min_ci_low = 0.125 +jitter_p10_per_min_ci_high = 0.13333333333333333 +jitter_p50_per_min = 0.18181818181818182 +jitter_p50_per_min_ci_low = 0.18181818181818182 +jitter_p50_per_min_ci_high = 0.1875 +jitter_p90_per_min = 0.25 +jitter_p90_per_min_ci_low = 0.23809523809523808 +jitter_p90_per_min_ci_high = 0.25 +jitter_p95_per_min = 0.25925925925925924 +jitter_p95_per_min_ci_low = 0.25 +jitter_p95_per_min_ci_high = 0.2631578947368421 +jitter_p99_per_min = 0.2857142857142857 +jitter_p99_per_min_ci_low = 0.2777777777777778 +jitter_p99_per_min_ci_high = 0.2916666666666667 +jitter_mean_per_min = 0.1839407154714661 +reaction_rate = 0.908 +reaction_rate_ci_low = 0.8900859859997822 +reaction_rate_ci_high = 0.9259140140002179 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 153.03964757709252 +fire_decisiveness_mean = 9.879423081106994 +fire_decisiveness_p50 = 7.781260976179947 +step_correction_mean = -1.7586566786966922 +step_correction_p50 = 0.5212970972061157 + +[cell.spm_6.step_minus_10_at_15min] +shares_per_minute = 6 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.935 +convergence_rate_ci_low = 0.9197201688491006 +convergence_rate_ci_high = 0.9502798311508995 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 614.3743315508021 +settled_accuracy_p10 = 0.019327427504717165 +settled_accuracy_p10_ci_low = 0.015611460553595968 +settled_accuracy_p10_ci_high = 0.022841844166506142 +settled_accuracy_p50 = 0.09059853277652863 +settled_accuracy_p50_ci_low = 0.08413251912882247 +settled_accuracy_p50_ci_high = 0.09681236622500333 +settled_accuracy_p90 = 0.2320268853023757 +settled_accuracy_p90_ci_low = 0.21814966693497784 +settled_accuracy_p90_ci_high = 0.2511592497079832 +settled_accuracy_p95 = 0.29965353184632515 +settled_accuracy_p95_ci_low = 0.2691473334106329 +settled_accuracy_p95_ci_high = 0.31828727738964413 +settled_accuracy_p99 = 0.413105391861708 +settled_accuracy_p99_ci_low = 0.3888507569693487 +settled_accuracy_p99_ci_high = 0.4779250983051657 +settled_accuracy_mean = 0.11316764129864589 +jitter_p10_per_min = 0.12 +jitter_p10_per_min_ci_low = 0.11764705882352941 +jitter_p10_per_min_ci_high = 0.125 +jitter_p50_per_min = 0.17647058823529413 +jitter_p50_per_min_ci_low = 0.17391304347826086 +jitter_p50_per_min_ci_high = 0.18181818181818182 +jitter_p90_per_min = 0.23076923076923078 +jitter_p90_per_min_ci_low = 0.22727272727272727 +jitter_p90_per_min_ci_high = 0.23809523809523808 +jitter_p95_per_min = 0.25 +jitter_p95_per_min_ci_low = 0.24 +jitter_p95_per_min_ci_high = 0.2608695652173913 +jitter_p99_per_min = 0.2777777777777778 +jitter_p99_per_min_ci_low = 0.26666666666666666 +jitter_p99_per_min_ci_high = 0.2916666666666667 +jitter_mean_per_min = 0.1768980747454487 +reaction_rate = 0.847 +reaction_rate_ci_low = 0.8246877436013298 +reaction_rate_ci_high = 0.8693122563986702 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 161.58205430932705 +fire_decisiveness_mean = 9.704899272624425 +fire_decisiveness_p50 = 7.452721056874225 +step_correction_mean = 1.6885725903328082 +step_correction_p50 = 0.747127115726471 + +[cell.spm_6.step_minus_5_at_15min] +shares_per_minute = 6 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.926 +convergence_rate_ci_low = 0.9097752720084434 +convergence_rate_ci_high = 0.9422247279915567 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 592.8725701943845 +settled_accuracy_p10 = 0.017192655351547015 +settled_accuracy_p10_ci_low = 0.014292563426530625 +settled_accuracy_p10_ci_high = 0.020533617196766718 +settled_accuracy_p50 = 0.09158926012335455 +settled_accuracy_p50_ci_low = 0.08634261844520341 +settled_accuracy_p50_ci_high = 0.09766028122287607 +settled_accuracy_p90 = 0.23295344771085658 +settled_accuracy_p90_ci_low = 0.2191051449682162 +settled_accuracy_p90_ci_high = 0.25070663868438925 +settled_accuracy_p95 = 0.29437797958943923 +settled_accuracy_p95_ci_low = 0.2682360392545886 +settled_accuracy_p95_ci_high = 0.3197896341952302 +settled_accuracy_p99 = 0.40689665792909246 +settled_accuracy_p99_ci_low = 0.36404249107257836 +settled_accuracy_p99_ci_high = 0.4367530386010896 +settled_accuracy_mean = 0.11242026573273727 +jitter_p10_per_min = 0.11764705882352941 +jitter_p10_per_min_ci_low = 0.1111111111111111 +jitter_p10_per_min_ci_high = 0.125 +jitter_p50_per_min = 0.17391304347826086 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.17647058823529413 +jitter_p90_per_min = 0.23076923076923078 +jitter_p90_per_min_ci_low = 0.2222222222222222 +jitter_p90_per_min_ci_high = 0.23529411764705882 +jitter_p95_per_min = 0.25 +jitter_p95_per_min_ci_low = 0.23809523809523808 +jitter_p95_per_min_ci_high = 0.25 +jitter_p99_per_min = 0.2777777777777778 +jitter_p99_per_min_ci_low = 0.26666666666666666 +jitter_p99_per_min_ci_high = 0.2857142857142857 +jitter_mean_per_min = 0.173854014969072 +reaction_rate = 0.822 +reaction_rate_ci_low = 0.7982916144455173 +reaction_rate_ci_high = 0.8457083855544826 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 167.95620437956205 +fire_decisiveness_mean = 9.769699437345945 +fire_decisiveness_p50 = 7.491124369547865 +step_correction_mean = 0.9145558943061063 +step_correction_p50 = 0.8400513529777527 + +[cell.spm_6.step_plus_5_at_15min] +shares_per_minute = 6 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.926 +convergence_rate_ci_low = 0.9097752720084434 +convergence_rate_ci_high = 0.9422247279915567 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 591.3174946004319 +settled_accuracy_p10 = 0.01937848494760841 +settled_accuracy_p10_ci_low = 0.01448867707199275 +settled_accuracy_p10_ci_high = 0.022149953426444657 +settled_accuracy_p50 = 0.09209867841544828 +settled_accuracy_p50_ci_low = 0.08519745794159328 +settled_accuracy_p50_ci_high = 0.09822482340460803 +settled_accuracy_p90 = 0.22661041792975145 +settled_accuracy_p90_ci_low = 0.2195083182402291 +settled_accuracy_p90_ci_high = 0.2346592639831555 +settled_accuracy_p95 = 0.26727717842100884 +settled_accuracy_p95_ci_low = 0.2414398163185506 +settled_accuracy_p95_ci_high = 0.28210357288898824 +settled_accuracy_p99 = 0.36317811754891827 +settled_accuracy_p99_ci_low = 0.33741048475740265 +settled_accuracy_p99_ci_high = 0.41136931621430817 +settled_accuracy_mean = 0.11036672677064839 +jitter_p10_per_min = 0.125 +jitter_p10_per_min_ci_low = 0.11764705882352941 +jitter_p10_per_min_ci_high = 0.13043478260869565 +jitter_p50_per_min = 0.17647058823529413 +jitter_p50_per_min_ci_low = 0.17391304347826086 +jitter_p50_per_min_ci_high = 0.18181818181818182 +jitter_p90_per_min = 0.23076923076923078 +jitter_p90_per_min_ci_low = 0.22727272727272727 +jitter_p90_per_min_ci_high = 0.23529411764705882 +jitter_p95_per_min = 0.25 +jitter_p95_per_min_ci_low = 0.23809523809523808 +jitter_p95_per_min_ci_high = 0.25 +jitter_p99_per_min = 0.2727272727272727 +jitter_p99_per_min_ci_low = 0.2608695652173913 +jitter_p99_per_min_ci_high = 0.28 +jitter_mean_per_min = 0.17625087333551914 +reaction_rate = 0.81 +reaction_rate_ci_low = 0.7856849380013129 +reaction_rate_ci_high = 0.8343150619986872 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 163.4814814814815 +fire_decisiveness_mean = 10.021336111412472 +fire_decisiveness_p50 = 7.619981703347648 +step_correction_mean = -1.480281792305134 +step_correction_p50 = 0.7832256555557251 + +[cell.spm_6.step_plus_10_at_15min] +shares_per_minute = 6 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.921 +convergence_rate_ci_low = 0.904281418289819 +convergence_rate_ci_high = 0.9377185817101811 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 616.2214983713355 +settled_accuracy_p10 = 0.017017039001903322 +settled_accuracy_p10_ci_low = 0.013287250285624497 +settled_accuracy_p10_ci_high = 0.020114784223340232 +settled_accuracy_p50 = 0.09290728233071777 +settled_accuracy_p50_ci_low = 0.08477771439040405 +settled_accuracy_p50_ci_high = 0.09791811827717878 +settled_accuracy_p90 = 0.22401701832017107 +settled_accuracy_p90_ci_low = 0.21409698585412218 +settled_accuracy_p90_ci_high = 0.24343478546546438 +settled_accuracy_p95 = 0.27073052331432135 +settled_accuracy_p95_ci_low = 0.25654639354822695 +settled_accuracy_p95_ci_high = 0.288659937843769 +settled_accuracy_p99 = 0.3561410743043387 +settled_accuracy_p99_ci_low = 0.3284912456790279 +settled_accuracy_p99_ci_high = 0.4026242128663924 +settled_accuracy_mean = 0.11073267336034906 +jitter_p10_per_min = 0.125 +jitter_p10_per_min_ci_low = 0.11764705882352941 +jitter_p10_per_min_ci_high = 0.13043478260869565 +jitter_p50_per_min = 0.18181818181818182 +jitter_p50_per_min_ci_low = 0.17647058823529413 +jitter_p50_per_min_ci_high = 0.18181818181818182 +jitter_p90_per_min = 0.23529411764705882 +jitter_p90_per_min_ci_low = 0.22727272727272727 +jitter_p90_per_min_ci_high = 0.23809523809523808 +jitter_p95_per_min = 0.25 +jitter_p95_per_min_ci_low = 0.25 +jitter_p95_per_min_ci_high = 0.25 +jitter_p99_per_min = 0.2727272727272727 +jitter_p99_per_min_ci_low = 0.26666666666666666 +jitter_p99_per_min_ci_high = 0.2777777777777778 +jitter_mean_per_min = 0.1792957130939978 +reaction_rate = 0.868 +reaction_rate_ci_low = 0.8470201248430788 +reaction_rate_ci_high = 0.8889798751569212 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 158.8479262672811 +fire_decisiveness_mean = 10.048923118713775 +fire_decisiveness_p50 = 7.682514072637996 +step_correction_mean = 770.0295189805329 +step_correction_p50 = 0.6944705247879028 + +[cell.spm_6.step_plus_25_at_15min] +shares_per_minute = 6 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.912 +convergence_rate_ci_low = 0.8944412002232499 +convergence_rate_ci_high = 0.9295587997767502 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 607.0394736842105 +settled_accuracy_p10 = 0.018746672742613546 +settled_accuracy_p10_ci_low = 0.01471198057472245 +settled_accuracy_p10_ci_high = 0.021370468192224656 +settled_accuracy_p50 = 0.09226051209323172 +settled_accuracy_p50_ci_low = 0.086212554060215 +settled_accuracy_p50_ci_high = 0.0988938741527372 +settled_accuracy_p90 = 0.22215782157546693 +settled_accuracy_p90_ci_low = 0.21130078879219727 +settled_accuracy_p90_ci_high = 0.23508438429390632 +settled_accuracy_p95 = 0.27580733034933336 +settled_accuracy_p95_ci_low = 0.2518114560948054 +settled_accuracy_p95_ci_high = 0.2917574425875631 +settled_accuracy_p99 = 0.3576674720445956 +settled_accuracy_p99_ci_low = 0.3436480549274763 +settled_accuracy_p99_ci_high = 0.4033428373798724 +settled_accuracy_mean = 0.11048457280001583 +jitter_p10_per_min = 0.13333333333333333 +jitter_p10_per_min_ci_low = 0.125 +jitter_p10_per_min_ci_high = 0.13636363636363635 +jitter_p50_per_min = 0.18181818181818182 +jitter_p50_per_min_ci_low = 0.18181818181818182 +jitter_p50_per_min_ci_high = 0.1875 +jitter_p90_per_min = 0.23809523809523808 +jitter_p90_per_min_ci_low = 0.23076923076923078 +jitter_p90_per_min_ci_high = 0.24 +jitter_p95_per_min = 0.25 +jitter_p95_per_min_ci_low = 0.25 +jitter_p95_per_min_ci_high = 0.2631578947368421 +jitter_p99_per_min = 0.2857142857142857 +jitter_p99_per_min_ci_low = 0.2727272727272727 +jitter_p99_per_min_ci_high = 0.29411764705882354 +jitter_mean_per_min = 0.18406041528984926 +reaction_rate = 0.892 +reaction_rate_ci_low = 0.8727624227720848 +reaction_rate_ci_high = 0.9112375772279152 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 149.46188340807174 +fire_decisiveness_mean = 10.69430250078109 +fire_decisiveness_p50 = 7.974893673069381 +step_correction_mean = 1.0721487983593492 +step_correction_p50 = 0.5218365788459778 + +[cell.spm_6.step_plus_50_at_15min] +shares_per_minute = 6 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.866 +convergence_rate_ci_low = 0.8448861507441205 +convergence_rate_ci_high = 0.8871138492558794 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 647.3903002309469 +settled_accuracy_p10 = 0.01699312742604131 +settled_accuracy_p10_ci_low = 0.01462391611356284 +settled_accuracy_p10_ci_high = 0.02144754534120885 +settled_accuracy_p50 = 0.09056672182418712 +settled_accuracy_p50_ci_low = 0.08285251324035503 +settled_accuracy_p50_ci_high = 0.09679272425388585 +settled_accuracy_p90 = 0.21385939404633425 +settled_accuracy_p90_ci_low = 0.20623761673698626 +settled_accuracy_p90_ci_high = 0.23059366021672945 +settled_accuracy_p95 = 0.2619411945610324 +settled_accuracy_p95_ci_low = 0.24654373694900378 +settled_accuracy_p95_ci_high = 0.28200307609134 +settled_accuracy_p99 = 0.39675699549502674 +settled_accuracy_p99_ci_low = 0.33549322464441467 +settled_accuracy_p99_ci_high = 0.47006716523481695 +settled_accuracy_mean = 0.10834043664247732 +jitter_p10_per_min = 0.14285714285714285 +jitter_p10_per_min_ci_low = 0.13333333333333333 +jitter_p10_per_min_ci_high = 0.14285714285714285 +jitter_p50_per_min = 0.2 +jitter_p50_per_min_ci_low = 0.19230769230769232 +jitter_p50_per_min_ci_high = 0.2 +jitter_p90_per_min = 0.25 +jitter_p90_per_min_ci_low = 0.25 +jitter_p90_per_min_ci_high = 0.2608695652173913 +jitter_p95_per_min = 0.2727272727272727 +jitter_p95_per_min_ci_low = 0.2608695652173913 +jitter_p95_per_min_ci_high = 0.2727272727272727 +jitter_p99_per_min = 0.3 +jitter_p99_per_min_ci_low = 0.2777777777777778 +jitter_p99_per_min_ci_high = 0.3 +jitter_mean_per_min = 0.19562241360022928 +reaction_rate = 0.966 +reaction_rate_ci_low = 0.9547673017311066 +reaction_rate_ci_high = 0.9772326982688934 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 127.32919254658385 +fire_decisiveness_mean = 12.1696322947477 +fire_decisiveness_p50 = 8.66649786858579 +step_correction_mean = 0.5490051331249206 +step_correction_p50 = 0.3758526146411896 + +[cell.spm_8.cold_start_10gh_to_1ph] +shares_per_minute = 8 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.99 +convergence_rate_ci_low = 0.9838330039727595 +convergence_rate_ci_high = 0.9961669960272405 +convergence_p10_secs = 120 +convergence_p10_secs_ci_low = 120 +convergence_p10_secs_ci_high = 120 +convergence_p50_secs = 360 +convergence_p50_secs_ci_low = 360 +convergence_p50_secs_ci_high = 420 +convergence_p90_secs = 840 +convergence_p90_secs_ci_low = 780 +convergence_p90_secs_ci_high = 840 +convergence_p95_secs = 1020 +convergence_p95_secs_ci_low = 960 +convergence_p95_secs_ci_high = 1020 +convergence_p99_secs = 1260 +convergence_p99_secs_ci_low = 1140 +convergence_p99_secs_ci_high = 1320 +convergence_mean_secs = 441.6363636363636 +settled_accuracy_p10 = 0.01733804500199687 +settled_accuracy_p10_ci_low = 0.015010441132741303 +settled_accuracy_p10_ci_high = 0.019384060074245202 +settled_accuracy_p50 = 0.07981867990017699 +settled_accuracy_p50_ci_low = 0.07518367192999253 +settled_accuracy_p50_ci_high = 0.08595712777011144 +settled_accuracy_p90 = 0.18940356392364321 +settled_accuracy_p90_ci_low = 0.1837603794764716 +settled_accuracy_p90_ci_high = 0.20068228240739094 +settled_accuracy_p95 = 0.2262002940576242 +settled_accuracy_p95_ci_low = 0.21336116024784912 +settled_accuracy_p95_ci_high = 0.2415271534882416 +settled_accuracy_p99 = 0.3149123078396374 +settled_accuracy_p99_ci_low = 0.2918161880138065 +settled_accuracy_p99_ci_high = 0.3299677119118436 +settled_accuracy_mean = 0.09411370362349612 +jitter_p10_per_min = 0.1 +jitter_p10_per_min_ci_low = 0.09090909090909091 +jitter_p10_per_min_ci_high = 0.10526315789473684 +jitter_p50_per_min = 0.14285714285714285 +jitter_p50_per_min_ci_low = 0.14285714285714285 +jitter_p50_per_min_ci_high = 0.15 +jitter_p90_per_min = 0.19230769230769232 +jitter_p90_per_min_ci_low = 0.19230769230769232 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.21052631578947367 +jitter_p95_per_min_ci_low = 0.2 +jitter_p95_per_min_ci_high = 0.21428571428571427 +jitter_p99_per_min = 0.23809523809523808 +jitter_p99_per_min_ci_low = 0.22727272727272727 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.14739904858805689 +bias_mean = 0.0009386808747389049 +bias_p10 = -0.09722447306728581 +bias_p10_ci_low = -0.10569069787670624 +bias_p10_ci_high = -0.09016465580310012 +bias_p50 = -0.001305369851100159 +bias_p50_ci_low = -0.005488576218640748 +bias_p50_ci_high = 0.0030294248460519973 +bias_p90 = 0.1039729581791435 +bias_p90_ci_low = 0.09715004580409613 +bias_p90_ci_high = 0.11052190744346062 +bias_p99 = 0.17658149695781916 +bias_p99_ci_low = 0.17168050476773342 +bias_p99_ci_high = 0.19815740673177284 +variance_mean = 0.02485339233750026 +variance_p10 = 0.011750018629054865 +variance_p10_ci_low = 0.011252470605984114 +variance_p10_ci_high = 0.0123298984862379 +variance_p50 = 0.021787674884949242 +variance_p50_ci_low = 0.021073580731743563 +variance_p50_ci_high = 0.022617665043811915 +variance_p90 = 0.04181259421900131 +variance_p90_ci_low = 0.03959573826313229 +variance_p90_ci_high = 0.04329146589154308 +variance_p99 = 0.06385892305692889 +variance_p99_ci_low = 0.05910455150043482 +variance_p99_ci_high = 0.0736001731916856 +ramp_target_overshoot_p10 = 0.0024957115757624493 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0.00867509585326931 +ramp_target_overshoot_p50 = 0.11699229341928463 +ramp_target_overshoot_p50_ci_low = 0.10869012152811441 +ramp_target_overshoot_p50_ci_high = 0.1214388596969056 +ramp_target_overshoot_p90 = 0.24864740405126828 +ramp_target_overshoot_p90_ci_low = 0.23626165773257535 +ramp_target_overshoot_p90_ci_high = 0.2599127007620412 +ramp_target_overshoot_p99 = 0.3617777836237055 +ramp_target_overshoot_p99_ci_low = 0.3424137891000574 +ramp_target_overshoot_p99_ci_high = 0.3761139819910677 +ramp_target_overshoot_mean = 0.12377216433001423 + +[cell.spm_8.stable_1ph] +shares_per_minute = 8 +scenario = "stable_1ph" +convergence_rate = 0.978 +convergence_rate_ci_low = 0.9689084728675541 +convergence_rate_ci_high = 0.9870915271324459 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 960 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 1020 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 565.0306748466257 +settled_accuracy_p10 = 0.013424256002602775 +settled_accuracy_p10_ci_low = 0.011098598290428585 +settled_accuracy_p10_ci_high = 0.016047944183678053 +settled_accuracy_p50 = 0.07652578211858796 +settled_accuracy_p50_ci_low = 0.0707148255092338 +settled_accuracy_p50_ci_high = 0.08105764376346247 +settled_accuracy_p90 = 0.1895887843906927 +settled_accuracy_p90_ci_low = 0.17717914731610507 +settled_accuracy_p90_ci_high = 0.19557959275790648 +settled_accuracy_p95 = 0.22346976856367107 +settled_accuracy_p95_ci_low = 0.20780494888955292 +settled_accuracy_p95_ci_high = 0.24062977374715966 +settled_accuracy_p99 = 0.27890759652888797 +settled_accuracy_p99_ci_low = 0.26390379917376916 +settled_accuracy_p99_ci_high = 0.3082345731315834 +settled_accuracy_mean = 0.09034849727480959 +jitter_p10_per_min = 0.09090909090909091 +jitter_p10_per_min_ci_low = 0.09090909090909091 +jitter_p10_per_min_ci_high = 0.09523809523809523 +jitter_p50_per_min = 0.14285714285714285 +jitter_p50_per_min_ci_low = 0.14285714285714285 +jitter_p50_per_min_ci_high = 0.15 +jitter_p90_per_min = 0.2 +jitter_p90_per_min_ci_low = 0.19047619047619047 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.21052631578947367 +jitter_p95_per_min_ci_low = 0.20833333333333334 +jitter_p95_per_min_ci_high = 0.21739130434782608 +jitter_p99_per_min = 0.25 +jitter_p99_per_min_ci_low = 0.23076923076923078 +jitter_p99_per_min_ci_high = 0.26666666666666666 +jitter_mean_per_min = 0.14423761035723476 +bias_mean = 0.000826883874138541 +bias_p10 = -0.09892624085500874 +bias_p10_ci_low = -0.10624183119549863 +bias_p10_ci_high = -0.0906816271776266 +bias_p50 = 0.00255675945052378 +bias_p50_ci_low = -0.0028440807574092995 +bias_p50_ci_high = 0.007324219127694323 +bias_p90 = 0.09834941896915211 +bias_p90_ci_low = 0.0907403898189367 +bias_p90_ci_high = 0.10717642456817539 +bias_p99 = 0.16842559413570812 +bias_p99_ci_low = 0.1576915700517705 +bias_p99_ci_high = 0.19314359747574453 +variance_mean = 0.024870262001065947 +variance_p10 = 0.011980038750431547 +variance_p10_ci_low = 0.011345344259518518 +variance_p10_ci_high = 0.012444792602940109 +variance_p50 = 0.022526629143792828 +variance_p50_ci_low = 0.02151196254807426 +variance_p50_ci_high = 0.02323872398826241 +variance_p90 = 0.04150470040662219 +variance_p90_ci_low = 0.039344270664234286 +variance_p90_ci_high = 0.04325325007197112 +variance_p99 = 0.06617859822367574 +variance_p99_ci_low = 0.05984092713573029 +variance_p99_ci_high = 0.069181300380189 +upward_step_magnitude_p50 = 1.1744385645039357 +upward_step_magnitude_p50_ci_low = 1.1706859513043595 +upward_step_magnitude_p50_ci_high = 1.1773023707562977 +upward_step_magnitude_p90 = 1.2632826850611507 +upward_step_magnitude_p90_ci_low = 1.2559203741091292 +upward_step_magnitude_p90_ci_high = 1.2668977430705182 +upward_step_magnitude_p95 = 1.2865296783618034 +upward_step_magnitude_p95_ci_low = 1.2752467051726628 +upward_step_magnitude_p95_ci_high = 1.2963170168594338 +upward_step_magnitude_p99 = 1.3635399695950798 +upward_step_magnitude_p99_ci_low = 1.323629142387757 +upward_step_magnitude_p99_ci_high = 1.4335185816204805 +upward_step_magnitude_mean = 1.1843289717702286 +fire_decisiveness_mean = 8.159584421006036 +fire_decisiveness_p50 = 6.228629016468062 + +[cell.spm_8.step_minus_50_at_15min] +shares_per_minute = 8 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.886 +convergence_rate_ci_low = 0.8663018537318864 +convergence_rate_ci_high = 0.9056981462681136 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 595.8690744920993 +settled_accuracy_p10 = 0.017359788274215693 +settled_accuracy_p10_ci_low = 0.014027430480081371 +settled_accuracy_p10_ci_high = 0.0208817286116163 +settled_accuracy_p50 = 0.09538666148228314 +settled_accuracy_p50_ci_low = 0.08756559304338762 +settled_accuracy_p50_ci_high = 0.10429737656012172 +settled_accuracy_p90 = 0.24727798055466954 +settled_accuracy_p90_ci_low = 0.23405001798182035 +settled_accuracy_p90_ci_high = 0.2625080690021402 +settled_accuracy_p95 = 0.3101926755908482 +settled_accuracy_p95_ci_low = 0.2846776167306695 +settled_accuracy_p95_ci_high = 0.3213821392843148 +settled_accuracy_p99 = 0.4061553995692013 +settled_accuracy_p99_ci_low = 0.3736086738476283 +settled_accuracy_p99_ci_high = 0.4502916920366138 +settled_accuracy_mean = 0.11878582158799572 +jitter_p10_per_min = 0.15 +jitter_p10_per_min_ci_low = 0.15 +jitter_p10_per_min_ci_high = 0.15789473684210525 +jitter_p50_per_min = 0.2 +jitter_p50_per_min_ci_low = 0.19230769230769232 +jitter_p50_per_min_ci_high = 0.2 +jitter_p90_per_min = 0.24 +jitter_p90_per_min_ci_low = 0.23809523809523808 +jitter_p90_per_min_ci_high = 0.25 +jitter_p95_per_min = 0.25 +jitter_p95_per_min_ci_low = 0.25 +jitter_p95_per_min_ci_high = 0.2608695652173913 +jitter_p99_per_min = 0.2727272727272727 +jitter_p99_per_min_ci_low = 0.2631578947368421 +jitter_p99_per_min_ci_high = 0.28 +jitter_mean_per_min = 0.1972268125444299 +reaction_rate = 0.996 +reaction_rate_ci_low = 0.9920878478557194 +reaction_rate_ci_high = 0.9999121521442806 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 120.24096385542168 +fire_decisiveness_mean = 8.799490878164486 +fire_decisiveness_p50 = 7.2581191110798855 +step_correction_mean = 0.33843524243877116 +step_correction_p50 = 0.3330684006214142 + +[cell.spm_8.step_minus_25_at_15min] +shares_per_minute = 8 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.96 +convergence_rate_ci_low = 0.9478543242262935 +convergence_rate_ci_high = 0.9721456757737065 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 585.9375 +settled_accuracy_p10 = 0.016243118768997977 +settled_accuracy_p10_ci_low = 0.014248822306556663 +settled_accuracy_p10_ci_high = 0.018948053355304473 +settled_accuracy_p50 = 0.08031615611883858 +settled_accuracy_p50_ci_low = 0.07432843489335195 +settled_accuracy_p50_ci_high = 0.08699375645978735 +settled_accuracy_p90 = 0.19922733539068238 +settled_accuracy_p90_ci_low = 0.19059856721681911 +settled_accuracy_p90_ci_high = 0.21274511847890865 +settled_accuracy_p95 = 0.24499280637723886 +settled_accuracy_p95_ci_low = 0.2264707600866187 +settled_accuracy_p95_ci_high = 0.2589867044814673 +settled_accuracy_p99 = 0.34135997095886306 +settled_accuracy_p99_ci_low = 0.3024378144665414 +settled_accuracy_p99_ci_high = 0.35345066169786676 +settled_accuracy_mean = 0.09797338757757673 +jitter_p10_per_min = 0.10526315789473684 +jitter_p10_per_min_ci_low = 0.1 +jitter_p10_per_min_ci_high = 0.1111111111111111 +jitter_p50_per_min = 0.15384615384615385 +jitter_p50_per_min_ci_low = 0.15 +jitter_p50_per_min_ci_high = 0.15789473684210525 +jitter_p90_per_min = 0.2 +jitter_p90_per_min_ci_low = 0.2 +jitter_p90_per_min_ci_high = 0.20833333333333334 +jitter_p95_per_min = 0.21739130434782608 +jitter_p95_per_min_ci_low = 0.21052631578947367 +jitter_p95_per_min_ci_high = 0.22727272727272727 +jitter_p99_per_min = 0.25 +jitter_p99_per_min_ci_low = 0.23529411764705882 +jitter_p99_per_min_ci_high = 0.2608695652173913 +jitter_mean_per_min = 0.15383414136641596 +reaction_rate = 0.874 +reaction_rate_ci_low = 0.8534317633619214 +reaction_rate_ci_high = 0.8945682366380786 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 162.15102974828375 +fire_decisiveness_mean = 8.088704908798048 +fire_decisiveness_p50 = 6.371880032973763 +step_correction_mean = 0.6088193617846382 +step_correction_p50 = 0.5188038349151611 + +[cell.spm_8.step_minus_10_at_15min] +shares_per_minute = 8 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.98 +convergence_rate_ci_low = 0.971322710100498 +convergence_rate_ci_high = 0.988677289899502 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 571.8979591836735 +settled_accuracy_p10 = 0.014954613902197766 +settled_accuracy_p10_ci_low = 0.012121277648386108 +settled_accuracy_p10_ci_high = 0.017146389412607377 +settled_accuracy_p50 = 0.08243332268290804 +settled_accuracy_p50_ci_low = 0.077138880676338 +settled_accuracy_p50_ci_high = 0.09003213396122378 +settled_accuracy_p90 = 0.20226253807962014 +settled_accuracy_p90_ci_low = 0.19126376803597323 +settled_accuracy_p90_ci_high = 0.2116313083730612 +settled_accuracy_p95 = 0.2372343840468807 +settled_accuracy_p95_ci_low = 0.2219904563738322 +settled_accuracy_p95_ci_high = 0.2501224177534265 +settled_accuracy_p99 = 0.3175407285562013 +settled_accuracy_p99_ci_low = 0.29885598027595917 +settled_accuracy_p99_ci_high = 0.3400274176993665 +settled_accuracy_mean = 0.09625314507557012 +jitter_p10_per_min = 0.09090909090909091 +jitter_p10_per_min_ci_low = 0.09090909090909091 +jitter_p10_per_min_ci_high = 0.09523809523809523 +jitter_p50_per_min = 0.14285714285714285 +jitter_p50_per_min_ci_low = 0.13636363636363635 +jitter_p50_per_min_ci_high = 0.14285714285714285 +jitter_p90_per_min = 0.19047619047619047 +jitter_p90_per_min_ci_low = 0.19047619047619047 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.2 +jitter_p95_per_min_ci_high = 0.21052631578947367 +jitter_p99_per_min = 0.23529411764705882 +jitter_p99_per_min_ci_low = 0.2222222222222222 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.14342990223399146 +reaction_rate = 0.747 +reaction_rate_ci_low = 0.7200550964818948 +reaction_rate_ci_high = 0.7739449035181052 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 172.289156626506 +fire_decisiveness_mean = 8.172702523214303 +fire_decisiveness_p50 = 6.3133343780074505 +step_correction_mean = 0.38141991487308996 +step_correction_p50 = 0.8448352813720703 + +[cell.spm_8.step_minus_5_at_15min] +shares_per_minute = 8 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.981 +convergence_rate_ci_low = 0.9725381099983514 +convergence_rate_ci_high = 0.9894618900016485 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 960 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 557.3700305810397 +settled_accuracy_p10 = 0.014698889941673898 +settled_accuracy_p10_ci_low = 0.01181490414417019 +settled_accuracy_p10_ci_high = 0.017067197095132713 +settled_accuracy_p50 = 0.07915200956082336 +settled_accuracy_p50_ci_low = 0.0739397700059119 +settled_accuracy_p50_ci_high = 0.08499775679789834 +settled_accuracy_p90 = 0.20252219131211469 +settled_accuracy_p90_ci_low = 0.19014505616411514 +settled_accuracy_p90_ci_high = 0.21093580627380293 +settled_accuracy_p95 = 0.2423600619464269 +settled_accuracy_p95_ci_low = 0.22405269303282127 +settled_accuracy_p95_ci_high = 0.2636908618141589 +settled_accuracy_p99 = 0.3147054666104082 +settled_accuracy_p99_ci_low = 0.3073733639830114 +settled_accuracy_p99_ci_high = 0.33432597940266473 +settled_accuracy_mean = 0.0954156476538776 +jitter_p10_per_min = 0.09090909090909091 +jitter_p10_per_min_ci_low = 0.09090909090909091 +jitter_p10_per_min_ci_high = 0.1 +jitter_p50_per_min = 0.14285714285714285 +jitter_p50_per_min_ci_low = 0.14285714285714285 +jitter_p50_per_min_ci_high = 0.14285714285714285 +jitter_p90_per_min = 0.19047619047619047 +jitter_p90_per_min_ci_low = 0.1875 +jitter_p90_per_min_ci_high = 0.19230769230769232 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.2 +jitter_p95_per_min_ci_high = 0.21052631578947367 +jitter_p99_per_min = 0.23076923076923078 +jitter_p99_per_min_ci_low = 0.2222222222222222 +jitter_p99_per_min_ci_high = 0.23809523809523808 +jitter_mean_per_min = 0.14306722341034564 +reaction_rate = 0.74 +reaction_rate_ci_low = 0.7128131678932612 +reaction_rate_ci_high = 0.7671868321067388 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 170.59459459459458 +fire_decisiveness_mean = 8.220751617422659 +fire_decisiveness_p50 = 6.378814434561491 +step_correction_mean = 0.7145895733623892 +step_correction_p50 = 0.9221991300582886 + +[cell.spm_8.step_plus_5_at_15min] +shares_per_minute = 8 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.982 +convergence_rate_ci_low = 0.9737596042813467 +convergence_rate_ci_high = 0.9902403957186533 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 960 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 565.3564154786151 +settled_accuracy_p10 = 0.014976910075009786 +settled_accuracy_p10_ci_low = 0.012978152292138612 +settled_accuracy_p10_ci_high = 0.017059266335161638 +settled_accuracy_p50 = 0.07588530340047672 +settled_accuracy_p50_ci_low = 0.07153824649509544 +settled_accuracy_p50_ci_high = 0.08144319604903871 +settled_accuracy_p90 = 0.19189953763906398 +settled_accuracy_p90_ci_low = 0.18280098104219178 +settled_accuracy_p90_ci_high = 0.20398411935715077 +settled_accuracy_p95 = 0.23549460962387214 +settled_accuracy_p95_ci_low = 0.21593780682334862 +settled_accuracy_p95_ci_high = 0.2520375211440874 +settled_accuracy_p99 = 0.2950031758473517 +settled_accuracy_p99_ci_low = 0.2725057263039541 +settled_accuracy_p99_ci_high = 0.33555955822678674 +settled_accuracy_mean = 0.09261898754063119 +jitter_p10_per_min = 0.09523809523809523 +jitter_p10_per_min_ci_low = 0.09090909090909091 +jitter_p10_per_min_ci_high = 0.1 +jitter_p50_per_min = 0.14285714285714285 +jitter_p50_per_min_ci_low = 0.14285714285714285 +jitter_p50_per_min_ci_high = 0.15 +jitter_p90_per_min = 0.19047619047619047 +jitter_p90_per_min_ci_low = 0.19047619047619047 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.20833333333333334 +jitter_p95_per_min_ci_low = 0.2 +jitter_p95_per_min_ci_high = 0.21052631578947367 +jitter_p99_per_min = 0.23809523809523808 +jitter_p99_per_min_ci_low = 0.2222222222222222 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.14463119152645187 +reaction_rate = 0.723 +reaction_rate_ci_low = 0.6952626411927884 +reaction_rate_ci_high = 0.7507373588072116 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 168.38174273858922 +fire_decisiveness_mean = 8.369201614573598 +fire_decisiveness_p50 = 6.458676376364096 +step_correction_mean = 0.9860236927928766 +step_correction_p50 = 0.8192532062530518 + +[cell.spm_8.step_plus_10_at_15min] +shares_per_minute = 8 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.977 +convergence_rate_ci_low = 0.9677088970730058 +convergence_rate_ci_high = 0.9862911029269942 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 565.3633572159672 +settled_accuracy_p10 = 0.013193541906466377 +settled_accuracy_p10_ci_low = 0.010408340973067531 +settled_accuracy_p10_ci_high = 0.016442099050610892 +settled_accuracy_p50 = 0.07938667621808848 +settled_accuracy_p50_ci_low = 0.07327598697770776 +settled_accuracy_p50_ci_high = 0.08529994337842006 +settled_accuracy_p90 = 0.18676269091175757 +settled_accuracy_p90_ci_low = 0.1800489980127845 +settled_accuracy_p90_ci_high = 0.20020728098243967 +settled_accuracy_p95 = 0.2304939999488752 +settled_accuracy_p95_ci_low = 0.21411833867489394 +settled_accuracy_p95_ci_high = 0.24152767353025628 +settled_accuracy_p99 = 0.3012350410526281 +settled_accuracy_p99_ci_low = 0.27309446359792466 +settled_accuracy_p99_ci_high = 0.3397469885964346 +settled_accuracy_mean = 0.09352887361979186 +jitter_p10_per_min = 0.09523809523809523 +jitter_p10_per_min_ci_low = 0.09090909090909091 +jitter_p10_per_min_ci_high = 0.1 +jitter_p50_per_min = 0.14285714285714285 +jitter_p50_per_min_ci_low = 0.14285714285714285 +jitter_p50_per_min_ci_high = 0.14285714285714285 +jitter_p90_per_min = 0.2 +jitter_p90_per_min_ci_low = 0.19047619047619047 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.21052631578947367 +jitter_p95_per_min_ci_low = 0.20833333333333334 +jitter_p95_per_min_ci_high = 0.21739130434782608 +jitter_p99_per_min = 0.25 +jitter_p99_per_min_ci_low = 0.22727272727272727 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.1451094407557143 +reaction_rate = 0.756 +reaction_rate_ci_low = 0.7293797651700816 +reaction_rate_ci_high = 0.7826202348299184 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 167.3015873015873 +fire_decisiveness_mean = 8.526721991323381 +fire_decisiveness_p50 = 6.599060478660601 +step_correction_mean = 7.519192325513041 +step_correction_p50 = 0.7498528957366943 + +[cell.spm_8.step_plus_25_at_15min] +shares_per_minute = 8 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.972 +convergence_rate_ci_low = 0.9617748845678887 +convergence_rate_ci_high = 0.9822251154321112 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 593.0864197530864 +settled_accuracy_p10 = 0.014154708583255737 +settled_accuracy_p10_ci_low = 0.011900602433571272 +settled_accuracy_p10_ci_high = 0.016709355061286013 +settled_accuracy_p50 = 0.07853368961517737 +settled_accuracy_p50_ci_low = 0.07173110584882192 +settled_accuracy_p50_ci_high = 0.08512388725453457 +settled_accuracy_p90 = 0.18447732289541774 +settled_accuracy_p90_ci_low = 0.1740429148825553 +settled_accuracy_p90_ci_high = 0.19946708047243777 +settled_accuracy_p95 = 0.22723951936740283 +settled_accuracy_p95_ci_low = 0.20987034997325305 +settled_accuracy_p95_ci_high = 0.24004668199826784 +settled_accuracy_p99 = 0.3044446682599564 +settled_accuracy_p99_ci_low = 0.2834371247943517 +settled_accuracy_p99_ci_high = 0.3397605727596431 +settled_accuracy_mean = 0.09101525835408704 +jitter_p10_per_min = 0.1 +jitter_p10_per_min_ci_low = 0.09523809523809523 +jitter_p10_per_min_ci_high = 0.1 +jitter_p50_per_min = 0.15 +jitter_p50_per_min_ci_low = 0.15 +jitter_p50_per_min_ci_high = 0.15384615384615385 +jitter_p90_per_min = 0.2 +jitter_p90_per_min_ci_low = 0.2 +jitter_p90_per_min_ci_high = 0.20833333333333334 +jitter_p95_per_min = 0.21428571428571427 +jitter_p95_per_min_ci_low = 0.21052631578947367 +jitter_p95_per_min_ci_high = 0.2222222222222222 +jitter_p99_per_min = 0.23809523809523808 +jitter_p99_per_min_ci_low = 0.23076923076923078 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.15055741858926427 +reaction_rate = 0.844 +reaction_rate_ci_low = 0.821509992832371 +reaction_rate_ci_high = 0.8664900071676289 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 156.32701421800948 +fire_decisiveness_mean = 9.238506331849067 +fire_decisiveness_p50 = 7.001706649575905 +step_correction_mean = -2.992597621675775 +step_correction_p50 = 0.5280054211616516 + +[cell.spm_8.step_plus_50_at_15min] +shares_per_minute = 8 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.956 +convergence_rate_ci_low = 0.9432880740090259 +convergence_rate_ci_high = 0.968711925990974 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 480 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 480 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 594.4142259414226 +settled_accuracy_p10 = 0.01716778942777708 +settled_accuracy_p10_ci_low = 0.014379818807858435 +settled_accuracy_p10_ci_high = 0.01965627556008831 +settled_accuracy_p50 = 0.07656271265121073 +settled_accuracy_p50_ci_low = 0.07179771491635867 +settled_accuracy_p50_ci_high = 0.08265002342994121 +settled_accuracy_p90 = 0.19043840072957174 +settled_accuracy_p90_ci_low = 0.17900564528706542 +settled_accuracy_p90_ci_high = 0.20508996569484383 +settled_accuracy_p95 = 0.23437913698180668 +settled_accuracy_p95_ci_low = 0.21901281788238247 +settled_accuracy_p95_ci_high = 0.24738841384264365 +settled_accuracy_p99 = 0.2901527764592129 +settled_accuracy_p99_ci_low = 0.275014806452222 +settled_accuracy_p99_ci_high = 0.3173999592514982 +settled_accuracy_mean = 0.09357263778366806 +jitter_p10_per_min = 0.1111111111111111 +jitter_p10_per_min_ci_low = 0.10526315789473684 +jitter_p10_per_min_ci_high = 0.12 +jitter_p50_per_min = 0.16666666666666666 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.17391304347826086 +jitter_p90_per_min = 0.21739130434782608 +jitter_p90_per_min_ci_low = 0.21052631578947367 +jitter_p90_per_min_ci_high = 0.2222222222222222 +jitter_p95_per_min = 0.22727272727272727 +jitter_p95_per_min_ci_low = 0.22727272727272727 +jitter_p95_per_min_ci_high = 0.23809523809523808 +jitter_p99_per_min = 0.2631578947368421 +jitter_p99_per_min_ci_low = 0.25 +jitter_p99_per_min_ci_high = 0.2777777777777778 +jitter_mean_per_min = 0.16830519108884234 +reaction_rate = 0.959 +reaction_rate_ci_low = 0.9467098466079548 +reaction_rate_ci_high = 0.9712901533920452 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 128.32116788321167 +fire_decisiveness_mean = 10.751624350151243 +fire_decisiveness_p50 = 7.826625861793829 +step_correction_mean = 0.30488567445058146 +step_correction_p50 = 0.36125874519348145 + +[cell.spm_10.cold_start_10gh_to_1ph] +shares_per_minute = 10 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 120 +convergence_p10_secs_ci_high = 180 +convergence_p50_secs = 360 +convergence_p50_secs_ci_low = 360 +convergence_p50_secs_ci_high = 360 +convergence_p90_secs = 720 +convergence_p90_secs_ci_low = 660 +convergence_p90_secs_ci_high = 720 +convergence_p95_secs = 900 +convergence_p95_secs_ci_low = 780 +convergence_p95_secs_ci_high = 900 +convergence_p99_secs = 1140 +convergence_p99_secs_ci_low = 1080 +convergence_p99_secs_ci_high = 1260 +convergence_mean_secs = 402.42 +settled_accuracy_p10 = 0.012704513426839759 +settled_accuracy_p10_ci_low = 0.01005002227678764 +settled_accuracy_p10_ci_high = 0.014929709168299055 +settled_accuracy_p50 = 0.0724509318434986 +settled_accuracy_p50_ci_low = 0.06684761006206164 +settled_accuracy_p50_ci_high = 0.07616527329649014 +settled_accuracy_p90 = 0.1709953338535165 +settled_accuracy_p90_ci_low = 0.1580802328087052 +settled_accuracy_p90_ci_high = 0.1815496792498248 +settled_accuracy_p95 = 0.20851925564726126 +settled_accuracy_p95_ci_low = 0.1920940254252672 +settled_accuracy_p95_ci_high = 0.21995098234291954 +settled_accuracy_p99 = 0.2598586110169536 +settled_accuracy_p99_ci_low = 0.2453978585963872 +settled_accuracy_p99_ci_high = 0.29759083872726433 +settled_accuracy_mean = 0.0820610661813532 +jitter_p10_per_min = 0.08695652173913043 +jitter_p10_per_min_ci_low = 0.08333333333333333 +jitter_p10_per_min_ci_high = 0.08695652173913043 +jitter_p50_per_min = 0.125 +jitter_p50_per_min_ci_low = 0.125 +jitter_p50_per_min_ci_high = 0.13043478260869565 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.17391304347826086 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.18181818181818182 +jitter_p95_per_min_ci_high = 0.19047619047619047 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.21052631578947367 +jitter_mean_per_min = 0.12592269751465357 +bias_mean = 0.0013517644610658891 +bias_p10 = -0.078791317351927 +bias_p10_ci_low = -0.08386827958184635 +bias_p10_ci_high = -0.07241669219423133 +bias_p50 = 0.0006090376730412259 +bias_p50_ci_low = -0.004619587059445628 +bias_p50_ci_high = 0.004982691935000382 +bias_p90 = 0.08804715566157988 +bias_p90_ci_low = 0.07814126203426627 +bias_p90_ci_high = 0.09484801041235719 +bias_p99 = 0.16044494788023567 +bias_p99_ci_low = 0.14538401615679125 +bias_p99_ci_high = 0.18612328260865044 +variance_mean = 0.01941809441628735 +variance_p10 = 0.009767543081102587 +variance_p10_ci_low = 0.009237531838862806 +variance_p10_ci_high = 0.01005464780875854 +variance_p50 = 0.017733315938167387 +variance_p50_ci_low = 0.017054208925281842 +variance_p50_ci_high = 0.018250022539347405 +variance_p90 = 0.03239514232043334 +variance_p90_ci_low = 0.03122544375688699 +variance_p90_ci_high = 0.03416118992626572 +variance_p99 = 0.04562130920140035 +variance_p99_ci_low = 0.04308535426023632 +variance_p99_ci_high = 0.05029532447403667 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.08643494288800713 +ramp_target_overshoot_p50_ci_low = 0.0799907470297112 +ramp_target_overshoot_p50_ci_high = 0.09335400107414449 +ramp_target_overshoot_p90 = 0.21197388579319432 +ramp_target_overshoot_p90_ci_low = 0.19545503870470227 +ramp_target_overshoot_p90_ci_high = 0.21995098234291954 +ramp_target_overshoot_p99 = 0.3107248488892913 +ramp_target_overshoot_p99_ci_low = 0.2856262676445145 +ramp_target_overshoot_p99_ci_high = 0.33835491073480783 +ramp_target_overshoot_mean = 0.09752989139571075 + +[cell.spm_10.stable_1ph] +shares_per_minute = 10 +scenario = "stable_1ph" +convergence_rate = 0.993 +convergence_rate_ci_low = 0.9878325091582084 +convergence_rate_ci_high = 0.9981674908417916 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 1020 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 580.3021148036254 +settled_accuracy_p10 = 0.014822938964285992 +settled_accuracy_p10_ci_low = 0.012317228167657568 +settled_accuracy_p10_ci_high = 0.01657474877293119 +settled_accuracy_p50 = 0.069965890577251 +settled_accuracy_p50_ci_low = 0.06567521819273003 +settled_accuracy_p50_ci_high = 0.07604581951701617 +settled_accuracy_p90 = 0.16613557829487235 +settled_accuracy_p90_ci_low = 0.1549432960290813 +settled_accuracy_p90_ci_high = 0.17643370204509568 +settled_accuracy_p95 = 0.19121791919434994 +settled_accuracy_p95_ci_low = 0.18250450417923814 +settled_accuracy_p95_ci_high = 0.19984328737874857 +settled_accuracy_p99 = 0.24924843104507088 +settled_accuracy_p99_ci_low = 0.23282487854469858 +settled_accuracy_p99_ci_high = 0.27813624723603747 +settled_accuracy_mean = 0.08072198823970826 +jitter_p10_per_min = 0.07142857142857142 +jitter_p10_per_min_ci_low = 0.06666666666666667 +jitter_p10_per_min_ci_high = 0.08 +jitter_p50_per_min = 0.125 +jitter_p50_per_min_ci_low = 0.11764705882352941 +jitter_p50_per_min_ci_high = 0.125 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.17391304347826086 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.17647058823529413 +jitter_p95_per_min_ci_high = 0.1875 +jitter_p99_per_min = 0.21428571428571427 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.23076923076923078 +jitter_mean_per_min = 0.12269381074235167 +bias_mean = -0.0019644716256460994 +bias_p10 = -0.08945487712774793 +bias_p10_ci_low = -0.09481835535817433 +bias_p10_ci_high = -0.08223025815166174 +bias_p50 = -0.0022264425535277687 +bias_p50_ci_low = -0.008613376889859367 +bias_p50_ci_high = 0.0035456756832924763 +bias_p90 = 0.08741612394108789 +bias_p90_ci_low = 0.07871548786666602 +bias_p90_ci_high = 0.09472635616852447 +bias_p99 = 0.15807737185183446 +bias_p99_ci_low = 0.14081684465285696 +bias_p99_ci_high = 0.1868142708018382 +variance_mean = 0.02007356613796812 +variance_p10 = 0.010206931303295046 +variance_p10_ci_low = 0.009939656249602972 +variance_p10_ci_high = 0.010576265852268318 +variance_p50 = 0.017976840426441227 +variance_p50_ci_low = 0.017206648181125016 +variance_p50_ci_high = 0.01873793193298302 +variance_p90 = 0.03281553457941467 +variance_p90_ci_low = 0.031221525542776598 +variance_p90_ci_high = 0.03447802300411766 +variance_p99 = 0.05460519329233868 +variance_p99_ci_low = 0.0476098861460865 +variance_p99_ci_high = 0.05939606566436353 +upward_step_magnitude_p50 = 1.153404075280179 +upward_step_magnitude_p50_ci_low = 1.150120349855376 +upward_step_magnitude_p50_ci_high = 1.1569568375203072 +upward_step_magnitude_p90 = 1.224235308871001 +upward_step_magnitude_p90_ci_low = 1.2189571982509986 +upward_step_magnitude_p90_ci_high = 1.2303339456926816 +upward_step_magnitude_p95 = 1.2511661654925212 +upward_step_magnitude_p95_ci_low = 1.2414364223029333 +upward_step_magnitude_p95_ci_high = 1.2590209581656087 +upward_step_magnitude_p99 = 1.3195624386231535 +upward_step_magnitude_p99_ci_low = 1.2852066720762867 +upward_step_magnitude_p99_ci_high = 1.3286697645930556 +upward_step_magnitude_mean = 1.1591865005868915 +fire_decisiveness_mean = 7.00126184826058 +fire_decisiveness_p50 = 5.334058341850081 + +[cell.spm_10.step_minus_50_at_15min] +shares_per_minute = 10 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.918 +convergence_rate_ci_low = 0.9009946984266671 +convergence_rate_ci_high = 0.935005301573333 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 633.4640522875817 +settled_accuracy_p10 = 0.018872019435264176 +settled_accuracy_p10_ci_low = 0.016809227146797445 +settled_accuracy_p10_ci_high = 0.022440466216021693 +settled_accuracy_p50 = 0.09573992254697461 +settled_accuracy_p50_ci_low = 0.08959764947174254 +settled_accuracy_p50_ci_high = 0.09990268543504766 +settled_accuracy_p90 = 0.2397842020497598 +settled_accuracy_p90_ci_low = 0.2187305405263389 +settled_accuracy_p90_ci_high = 0.25368714558550165 +settled_accuracy_p95 = 0.2864694234227789 +settled_accuracy_p95_ci_low = 0.2639911749158337 +settled_accuracy_p95_ci_high = 0.29925272265697944 +settled_accuracy_p99 = 0.385453925368634 +settled_accuracy_p99_ci_low = 0.34938371580576844 +settled_accuracy_p99_ci_high = 0.42874518300956543 +settled_accuracy_mean = 0.113580611604693 +jitter_p10_per_min = 0.14285714285714285 +jitter_p10_per_min_ci_low = 0.13636363636363635 +jitter_p10_per_min_ci_high = 0.15 +jitter_p50_per_min = 0.18181818181818182 +jitter_p50_per_min_ci_low = 0.18181818181818182 +jitter_p50_per_min_ci_high = 0.19047619047619047 +jitter_p90_per_min = 0.22727272727272727 +jitter_p90_per_min_ci_low = 0.2222222222222222 +jitter_p90_per_min_ci_high = 0.23529411764705882 +jitter_p95_per_min = 0.24 +jitter_p95_per_min_ci_low = 0.23809523809523808 +jitter_p95_per_min_ci_high = 0.25 +jitter_p99_per_min = 0.2631578947368421 +jitter_p99_per_min_ci_low = 0.2608695652173913 +jitter_p99_per_min_ci_high = 0.2777777777777778 +jitter_mean_per_min = 0.18508242949567638 +reaction_rate = 0.995 +reaction_rate_ci_low = 0.9906282772274537 +reaction_rate_ci_high = 0.9993717227725463 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 122.1105527638191 +fire_decisiveness_mean = 8.228729591923043 +fire_decisiveness_p50 = 6.894230844217944 +step_correction_mean = 0.3347079929919099 +step_correction_p50 = 0.328538715839386 + +[cell.spm_10.step_minus_25_at_15min] +shares_per_minute = 10 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.99 +convergence_rate_ci_low = 0.9838330039727595 +convergence_rate_ci_high = 0.9961669960272405 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 586 +settled_accuracy_p10 = 0.01405706991428235 +settled_accuracy_p10_ci_low = 0.012044251405550432 +settled_accuracy_p10_ci_high = 0.01611793836918851 +settled_accuracy_p50 = 0.0738933010232492 +settled_accuracy_p50_ci_low = 0.06816121982796686 +settled_accuracy_p50_ci_high = 0.07986106854669317 +settled_accuracy_p90 = 0.19024467981063853 +settled_accuracy_p90_ci_low = 0.18062314785129496 +settled_accuracy_p90_ci_high = 0.19671281101938276 +settled_accuracy_p95 = 0.21782230664616664 +settled_accuracy_p95_ci_low = 0.20317360499239845 +settled_accuracy_p95_ci_high = 0.2297269716159036 +settled_accuracy_p99 = 0.2889364059409776 +settled_accuracy_p99_ci_low = 0.26899424662292537 +settled_accuracy_p99_ci_high = 0.31461923638882383 +settled_accuracy_mean = 0.08915240257336551 +jitter_p10_per_min = 0.09090909090909091 +jitter_p10_per_min_ci_low = 0.09090909090909091 +jitter_p10_per_min_ci_high = 0.09523809523809523 +jitter_p50_per_min = 0.13636363636363635 +jitter_p50_per_min_ci_low = 0.13636363636363635 +jitter_p50_per_min_ci_high = 0.14285714285714285 +jitter_p90_per_min = 0.1875 +jitter_p90_per_min_ci_low = 0.18181818181818182 +jitter_p90_per_min_ci_high = 0.19047619047619047 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.19047619047619047 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.2222222222222222 +jitter_p99_per_min_ci_low = 0.21052631578947367 +jitter_p99_per_min_ci_high = 0.23529411764705882 +jitter_mean_per_min = 0.13652565647819268 +reaction_rate = 0.834 +reaction_rate_ci_low = 0.8109382032269816 +reaction_rate_ci_high = 0.8570617967730183 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 171.58273381294964 +fire_decisiveness_mean = 7.196516706617691 +fire_decisiveness_p50 = 5.642193791620787 +step_correction_mean = 0.5116260288466367 +step_correction_p50 = 0.5182178020477295 + +[cell.spm_10.step_minus_10_at_15min] +shares_per_minute = 10 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.989 +convergence_rate_ci_low = 0.9825352674919994 +convergence_rate_ci_high = 0.9954647325080006 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 960 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 1020 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1200 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 572.639029322548 +settled_accuracy_p10 = 0.013712801649685025 +settled_accuracy_p10_ci_low = 0.010776043179334671 +settled_accuracy_p10_ci_high = 0.016192847015277345 +settled_accuracy_p50 = 0.06989186897814448 +settled_accuracy_p50_ci_low = 0.06572515415465385 +settled_accuracy_p50_ci_high = 0.07568269288485718 +settled_accuracy_p90 = 0.17639035585966645 +settled_accuracy_p90_ci_low = 0.1701270109823656 +settled_accuracy_p90_ci_high = 0.18656793709960717 +settled_accuracy_p95 = 0.21182734082243404 +settled_accuracy_p95_ci_low = 0.1967893627976045 +settled_accuracy_p95_ci_high = 0.22554819553584382 +settled_accuracy_p99 = 0.2973109850872919 +settled_accuracy_p99_ci_low = 0.25318094152991066 +settled_accuracy_p99_ci_high = 0.3403259775804197 +settled_accuracy_mean = 0.08529798774070176 +jitter_p10_per_min = 0.07142857142857142 +jitter_p10_per_min_ci_low = 0.06666666666666667 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.12 +jitter_p50_per_min_ci_low = 0.11764705882352941 +jitter_p50_per_min_ci_high = 0.125 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.17647058823529413 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.18181818181818182 +jitter_p95_per_min_ci_high = 0.19047619047619047 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.21052631578947367 +jitter_mean_per_min = 0.1222716495360735 +reaction_rate = 0.654 +reaction_rate_ci_low = 0.6245162313399389 +reaction_rate_ci_high = 0.6834837686600611 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 171.74311926605503 +fire_decisiveness_mean = 6.920529673021926 +fire_decisiveness_p50 = 5.268887906914387 +step_correction_mean = -1.5927285859161926 +step_correction_p50 = 0.7589065432548523 + +[cell.spm_10.step_minus_5_at_15min] +shares_per_minute = 10 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.993 +convergence_rate_ci_low = 0.9878325091582084 +convergence_rate_ci_high = 0.9981674908417916 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 960 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 1020 +convergence_p95_secs_ci_high = 1080 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 576.4954682779456 +settled_accuracy_p10 = 0.014850838539391842 +settled_accuracy_p10_ci_low = 0.011995109105945367 +settled_accuracy_p10_ci_high = 0.017075179517978878 +settled_accuracy_p50 = 0.07269684319194347 +settled_accuracy_p50_ci_low = 0.06724279980161207 +settled_accuracy_p50_ci_high = 0.0759776896226314 +settled_accuracy_p90 = 0.17223066263363584 +settled_accuracy_p90_ci_low = 0.1656186734442382 +settled_accuracy_p90_ci_high = 0.1783566423612487 +settled_accuracy_p95 = 0.1993292221736449 +settled_accuracy_p95_ci_low = 0.18583143962713466 +settled_accuracy_p95_ci_high = 0.210992601565558 +settled_accuracy_p99 = 0.2695441676286192 +settled_accuracy_p99_ci_low = 0.23914582989400412 +settled_accuracy_p99_ci_high = 0.3035977486176811 +settled_accuracy_mean = 0.08418121625704468 +jitter_p10_per_min = 0.07692307692307693 +jitter_p10_per_min_ci_low = 0.06666666666666667 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.11764705882352941 +jitter_p50_per_min_ci_low = 0.11764705882352941 +jitter_p50_per_min_ci_high = 0.125 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.17391304347826086 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.17647058823529413 +jitter_p95_per_min_ci_high = 0.1875 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.21052631578947367 +jitter_mean_per_min = 0.12102768597320084 +reaction_rate = 0.67 +reaction_rate_ci_low = 0.6408559138074291 +reaction_rate_ci_high = 0.699144086192571 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 179.82089552238807 +fire_decisiveness_mean = 6.943926077162137 +fire_decisiveness_p50 = 5.242345764791722 +step_correction_mean = 5.424166050375398 +step_correction_p50 = 0.9057613015174866 + +[cell.spm_10.step_plus_5_at_15min] +shares_per_minute = 10 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.994 +convergence_rate_ci_low = 0.9892134247733896 +convergence_rate_ci_high = 0.9987865752266104 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 590.0402414486922 +settled_accuracy_p10 = 0.014999087958508572 +settled_accuracy_p10_ci_low = 0.012754711713719002 +settled_accuracy_p10_ci_high = 0.017566609387648868 +settled_accuracy_p50 = 0.07089828353407834 +settled_accuracy_p50_ci_low = 0.06491722152919 +settled_accuracy_p50_ci_high = 0.077244801267629 +settled_accuracy_p90 = 0.17554338051534235 +settled_accuracy_p90_ci_low = 0.1676040177888356 +settled_accuracy_p90_ci_high = 0.18750870018556554 +settled_accuracy_p95 = 0.207858410256076 +settled_accuracy_p95_ci_low = 0.19602219526789155 +settled_accuracy_p95_ci_high = 0.21766320781162585 +settled_accuracy_p99 = 0.27126823875264927 +settled_accuracy_p99_ci_low = 0.24468162210190347 +settled_accuracy_p99_ci_high = 0.28776270406049553 +settled_accuracy_mean = 0.08405021379607522 +jitter_p10_per_min = 0.07142857142857142 +jitter_p10_per_min_ci_low = 0.06666666666666667 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.125 +jitter_p50_per_min_ci_low = 0.11764705882352941 +jitter_p50_per_min_ci_high = 0.125 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.17391304347826086 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.17647058823529413 +jitter_p95_per_min_ci_high = 0.1875 +jitter_p99_per_min = 0.21052631578947367 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.2222222222222222 +jitter_mean_per_min = 0.12162936312695612 +reaction_rate = 0.672 +reaction_rate_ci_low = 0.6429010291315999 +reaction_rate_ci_high = 0.7010989708684002 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 175.17857142857142 +fire_decisiveness_mean = 7.319984822895151 +fire_decisiveness_p50 = 5.501535231926912 +step_correction_mean = 1.996454624303927 +step_correction_p50 = 0.9015395641326904 + +[cell.spm_10.step_plus_10_at_15min] +shares_per_minute = 10 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.997 +convergence_rate_ci_low = 0.9936102764714508 +convergence_rate_ci_high = 1 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 960 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 1020 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 581.283851554664 +settled_accuracy_p10 = 0.013888667734673676 +settled_accuracy_p10_ci_low = 0.011486048341444066 +settled_accuracy_p10_ci_high = 0.016034687230287226 +settled_accuracy_p50 = 0.0705845554315262 +settled_accuracy_p50_ci_low = 0.06701485186297562 +settled_accuracy_p50_ci_high = 0.0761179864143593 +settled_accuracy_p90 = 0.1696474899423639 +settled_accuracy_p90_ci_low = 0.16199244268765645 +settled_accuracy_p90_ci_high = 0.17861018394112915 +settled_accuracy_p95 = 0.2024453006315493 +settled_accuracy_p95_ci_low = 0.18885697557304415 +settled_accuracy_p95_ci_high = 0.21275066000043807 +settled_accuracy_p99 = 0.2451700987055494 +settled_accuracy_p99_ci_low = 0.232839942854971 +settled_accuracy_p99_ci_high = 0.25187744676635027 +settled_accuracy_mean = 0.08306465969673989 +jitter_p10_per_min = 0.07692307692307693 +jitter_p10_per_min_ci_low = 0.07142857142857142 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.125 +jitter_p50_per_min_ci_low = 0.125 +jitter_p50_per_min_ci_high = 0.13043478260869565 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.17647058823529413 +jitter_p95_per_min = 0.1875 +jitter_p95_per_min_ci_low = 0.18181818181818182 +jitter_p95_per_min_ci_high = 0.19047619047619047 +jitter_p99_per_min = 0.21052631578947367 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.21739130434782608 +jitter_mean_per_min = 0.12387070599020636 +reaction_rate = 0.687 +reaction_rate_ci_low = 0.6582586867105903 +reaction_rate_ci_high = 0.7157413132894098 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 171.4410480349345 +fire_decisiveness_mean = 7.531011311621084 +fire_decisiveness_p50 = 5.543454629601769 +step_correction_mean = -0.20954387612217898 +step_correction_p50 = 0.8325210213661194 + +[cell.spm_10.step_plus_25_at_15min] +shares_per_minute = 10 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.988 +convergence_rate_ci_low = 0.9812512216216562 +convergence_rate_ci_high = 0.9947487783783437 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 599.8178137651822 +settled_accuracy_p10 = 0.015337113047616313 +settled_accuracy_p10_ci_low = 0.01309471068349466 +settled_accuracy_p10_ci_high = 0.017911301626310827 +settled_accuracy_p50 = 0.07518178985455737 +settled_accuracy_p50_ci_low = 0.07005950462278054 +settled_accuracy_p50_ci_high = 0.07980349666162934 +settled_accuracy_p90 = 0.16670566138951204 +settled_accuracy_p90_ci_low = 0.15913744603642166 +settled_accuracy_p90_ci_high = 0.17404388125017056 +settled_accuracy_p95 = 0.19645620110582518 +settled_accuracy_p95_ci_low = 0.18379249037873668 +settled_accuracy_p95_ci_high = 0.20977457220516282 +settled_accuracy_p99 = 0.2675343645692696 +settled_accuracy_p99_ci_low = 0.24601894123475587 +settled_accuracy_p99_ci_high = 0.2800319674407128 +settled_accuracy_mean = 0.0855317248824414 +jitter_p10_per_min = 0.09090909090909091 +jitter_p10_per_min_ci_low = 0.09090909090909091 +jitter_p10_per_min_ci_high = 0.09090909090909091 +jitter_p50_per_min = 0.13333333333333333 +jitter_p50_per_min_ci_low = 0.13043478260869565 +jitter_p50_per_min_ci_high = 0.13636363636363635 +jitter_p90_per_min = 0.18181818181818182 +jitter_p90_per_min_ci_low = 0.17647058823529413 +jitter_p90_per_min_ci_high = 0.1875 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.19047619047619047 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.22727272727272727 +jitter_p99_per_min_ci_low = 0.21428571428571427 +jitter_p99_per_min_ci_high = 0.23076923076923078 +jitter_mean_per_min = 0.13384332349109462 +reaction_rate = 0.81 +reaction_rate_ci_low = 0.7856849380013129 +reaction_rate_ci_high = 0.8343150619986872 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 152.88888888888889 +fire_decisiveness_mean = 8.028805610576992 +fire_decisiveness_p50 = 5.803163140926479 +step_correction_mean = 0.48346425703278295 +step_correction_p50 = 0.5587208867073059 + +[cell.spm_10.step_plus_50_at_15min] +shares_per_minute = 10 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.974 +convergence_rate_ci_low = 0.9641367004303834 +convergence_rate_ci_high = 0.9838632995696166 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 480 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 631.9712525667351 +settled_accuracy_p10 = 0.012852957948422894 +settled_accuracy_p10_ci_low = 0.011375131298491215 +settled_accuracy_p10_ci_high = 0.014901925764891244 +settled_accuracy_p50 = 0.07101943105821462 +settled_accuracy_p50_ci_low = 0.06666782392173287 +settled_accuracy_p50_ci_high = 0.07655090149125732 +settled_accuracy_p90 = 0.17210488560578407 +settled_accuracy_p90_ci_low = 0.16274140959572636 +settled_accuracy_p90_ci_high = 0.1807022468315893 +settled_accuracy_p95 = 0.20171725317874545 +settled_accuracy_p95_ci_low = 0.18921898794286363 +settled_accuracy_p95_ci_high = 0.2075397076433685 +settled_accuracy_p99 = 0.2562405203138082 +settled_accuracy_p99_ci_low = 0.23721963147212421 +settled_accuracy_p99_ci_high = 0.2784920298382113 +settled_accuracy_mean = 0.0835466910364301 +jitter_p10_per_min = 0.1 +jitter_p10_per_min_ci_low = 0.09523809523809523 +jitter_p10_per_min_ci_high = 0.1 +jitter_p50_per_min = 0.15789473684210525 +jitter_p50_per_min_ci_low = 0.15 +jitter_p50_per_min_ci_high = 0.15789473684210525 +jitter_p90_per_min = 0.2 +jitter_p90_per_min_ci_low = 0.19230769230769232 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.21052631578947367 +jitter_p95_per_min_ci_low = 0.20833333333333334 +jitter_p95_per_min_ci_high = 0.21052631578947367 +jitter_p99_per_min = 0.22727272727272727 +jitter_p99_per_min_ci_low = 0.2222222222222222 +jitter_p99_per_min_ci_high = 0.23809523809523808 +jitter_mean_per_min = 0.15185430669456448 +reaction_rate = 0.97 +reaction_rate_ci_low = 0.9594268944959392 +reaction_rate_ci_high = 0.9805731055040607 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 131.81443298969072 +fire_decisiveness_mean = 9.91905665106586 +fire_decisiveness_p50 = 7.145048047094953 +step_correction_mean = 0.3831784906461067 +step_correction_p50 = 0.36521002650260925 + +[cell.spm_12.cold_start_10gh_to_1ph] +shares_per_minute = 12 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 180 +convergence_p50_secs = 360 +convergence_p50_secs_ci_low = 360 +convergence_p50_secs_ci_high = 360 +convergence_p90_secs = 660 +convergence_p90_secs_ci_low = 660 +convergence_p90_secs_ci_high = 660 +convergence_p95_secs = 780 +convergence_p95_secs_ci_low = 720 +convergence_p95_secs_ci_high = 780 +convergence_p99_secs = 960 +convergence_p99_secs_ci_low = 900 +convergence_p99_secs_ci_high = 1080 +convergence_mean_secs = 378.54 +settled_accuracy_p10 = 0.011210670094766395 +settled_accuracy_p10_ci_low = 0.009076473974074961 +settled_accuracy_p10_ci_high = 0.01364732586944073 +settled_accuracy_p50 = 0.06481501676278778 +settled_accuracy_p50_ci_low = 0.05971239422216823 +settled_accuracy_p50_ci_high = 0.0695718273227166 +settled_accuracy_p90 = 0.15264173039939632 +settled_accuracy_p90_ci_low = 0.1433439313889704 +settled_accuracy_p90_ci_high = 0.16165901435465324 +settled_accuracy_p95 = 0.18567499539129861 +settled_accuracy_p95_ci_low = 0.1707490443194326 +settled_accuracy_p95_ci_high = 0.19353451720976644 +settled_accuracy_p99 = 0.23859503296420992 +settled_accuracy_p99_ci_low = 0.21783342922071647 +settled_accuracy_p99_ci_high = 0.24909085943034914 +settled_accuracy_mean = 0.07502699380269762 +jitter_p10_per_min = 0.0625 +jitter_p10_per_min_ci_low = 0.058823529411764705 +jitter_p10_per_min_ci_high = 0.07692307692307693 +jitter_p50_per_min = 0.11538461538461539 +jitter_p50_per_min_ci_low = 0.10526315789473684 +jitter_p50_per_min_ci_high = 0.11538461538461539 +jitter_p90_per_min = 0.15384615384615385 +jitter_p90_per_min_ci_low = 0.15 +jitter_p90_per_min_ci_high = 0.16 +jitter_p95_per_min = 0.16 +jitter_p95_per_min_ci_low = 0.16 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.19047619047619047 +jitter_p99_per_min_ci_low = 0.1875 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.10999641884751882 +bias_mean = -0.000762900851890174 +bias_p10 = -0.08501948977419665 +bias_p10_ci_low = -0.0899297959683177 +bias_p10_ci_high = -0.07717863481630019 +bias_p50 = -0.0026923476139314203 +bias_p50_ci_low = -0.007016450809295647 +bias_p50_ci_high = 0.0007654401806960578 +bias_p90 = 0.08066939072380792 +bias_p90_ci_low = 0.07267750903153752 +bias_p90_ci_high = 0.08734961905599874 +bias_p99 = 0.14457282892252488 +bias_p99_ci_low = 0.12811043804961872 +bias_p99_ci_high = 0.16132900474561754 +variance_mean = 0.016233395876908033 +variance_p10 = 0.008147422373614295 +variance_p10_ci_low = 0.00782518609527187 +variance_p10_ci_high = 0.008437079925578303 +variance_p50 = 0.014413492217291957 +variance_p50_ci_low = 0.013880343179241233 +variance_p50_ci_high = 0.01506305402118197 +variance_p90 = 0.026341254866557327 +variance_p90_ci_low = 0.025185511172302184 +variance_p90_ci_high = 0.02788677084380982 +variance_p99 = 0.0431718430330766 +variance_p99_ci_low = 0.03881342158482257 +variance_p99_ci_high = 0.053420441751680425 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.06854418927491612 +ramp_target_overshoot_p50_ci_low = 0.06235104768011035 +ramp_target_overshoot_p50_ci_high = 0.07611547851875433 +ramp_target_overshoot_p90 = 0.18039768847541482 +ramp_target_overshoot_p90_ci_low = 0.1699289739906844 +ramp_target_overshoot_p90_ci_high = 0.18971749919351932 +ramp_target_overshoot_p99 = 0.25800197716137685 +ramp_target_overshoot_p99_ci_low = 0.24424157285462522 +ramp_target_overshoot_p99_ci_high = 0.28533233081637066 +ramp_target_overshoot_mean = 0.08118859959972247 + +[cell.spm_12.stable_1ph] +shares_per_minute = 12 +scenario = "stable_1ph" +convergence_rate = 0.997 +convergence_rate_ci_low = 0.9936102764714508 +convergence_rate_ci_high = 1 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 960 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 1020 +convergence_p95_secs_ci_high = 1080 +convergence_p99_secs = 1260 +convergence_p99_secs_ci_low = 1200 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 605.9578736208626 +settled_accuracy_p10 = 0.011403473863546565 +settled_accuracy_p10_ci_low = 0.009524559864831916 +settled_accuracy_p10_ci_high = 0.013497270447584642 +settled_accuracy_p50 = 0.06798678304328098 +settled_accuracy_p50_ci_low = 0.06391562375575965 +settled_accuracy_p50_ci_high = 0.07259004852038031 +settled_accuracy_p90 = 0.15327107733417555 +settled_accuracy_p90_ci_low = 0.14401924789618736 +settled_accuracy_p90_ci_high = 0.16389776608681705 +settled_accuracy_p95 = 0.180076773883592 +settled_accuracy_p95_ci_low = 0.17172668626290255 +settled_accuracy_p95_ci_high = 0.19384885513283157 +settled_accuracy_p99 = 0.24613055318307087 +settled_accuracy_p99_ci_low = 0.22826469695884766 +settled_accuracy_p99_ci_high = 0.26804683205556934 +settled_accuracy_mean = 0.07779456412825826 +jitter_p10_per_min = 0.058823529411764705 +jitter_p10_per_min_ci_low = 0.05555555555555555 +jitter_p10_per_min_ci_high = 0.0625 +jitter_p50_per_min = 0.10526315789473684 +jitter_p50_per_min_ci_low = 0.1 +jitter_p50_per_min_ci_high = 0.10526315789473684 +jitter_p90_per_min = 0.15789473684210525 +jitter_p90_per_min_ci_low = 0.15 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.17647058823529413 +jitter_p99_per_min = 0.19047619047619047 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.10710867692945751 +bias_mean = 0.003802199382846395 +bias_p10 = -0.07625069228533687 +bias_p10_ci_low = -0.0808915422588107 +bias_p10_ci_high = -0.07065332200060045 +bias_p50 = 0.0015022496004099795 +bias_p50_ci_low = -0.0029234210959167947 +bias_p50_ci_high = 0.00623621488991785 +bias_p90 = 0.08469532216845034 +bias_p90_ci_low = 0.07940405307662725 +bias_p90_ci_high = 0.09470827209546391 +bias_p99 = 0.1500466094024839 +bias_p99_ci_low = 0.1382889455462741 +bias_p99_ci_high = 0.1596520743019886 +variance_mean = 0.01689226013328954 +variance_p10 = 0.008195703826282041 +variance_p10_ci_low = 0.007826966577261002 +variance_p10_ci_high = 0.008645494546713482 +variance_p50 = 0.015420118228445552 +variance_p50_ci_low = 0.014800761204705996 +variance_p50_ci_high = 0.015899258761591824 +variance_p90 = 0.027965701345740425 +variance_p90_ci_low = 0.027236490322361112 +variance_p90_ci_high = 0.02944949337117962 +variance_p99 = 0.0431161511156646 +variance_p99_ci_low = 0.03947421224164788 +variance_p99_ci_high = 0.04882672397814027 +upward_step_magnitude_p50 = 1.1392913512280076 +upward_step_magnitude_p50_ci_low = 1.1352900493947695 +upward_step_magnitude_p50_ci_high = 1.144230305276213 +upward_step_magnitude_p90 = 1.208741385989991 +upward_step_magnitude_p90_ci_low = 1.2041658804399369 +upward_step_magnitude_p90_ci_high = 1.213977713150355 +upward_step_magnitude_p95 = 1.231713040210802 +upward_step_magnitude_p95_ci_low = 1.2212239120408528 +upward_step_magnitude_p95_ci_high = 1.2383343697358702 +upward_step_magnitude_p99 = 1.3017985164609838 +upward_step_magnitude_p99_ci_low = 1.2650547591177155 +upward_step_magnitude_p99_ci_high = 1.3107486054274562 +upward_step_magnitude_mean = 1.1448445157480285 +fire_decisiveness_mean = 6.52812327956513 +fire_decisiveness_p50 = 4.915083771974274 + +[cell.spm_12.step_minus_50_at_15min] +shares_per_minute = 12 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.914 +convergence_rate_ci_low = 0.8966228562070748 +convergence_rate_ci_high = 0.9313771437929252 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 711.5973741794311 +settled_accuracy_p10 = 0.014397871414180363 +settled_accuracy_p10_ci_low = 0.012190929283966478 +settled_accuracy_p10_ci_high = 0.01755212228094183 +settled_accuracy_p50 = 0.100137096700049 +settled_accuracy_p50_ci_low = 0.08967448912202203 +settled_accuracy_p50_ci_high = 0.10674651458366236 +settled_accuracy_p90 = 0.23038184742786139 +settled_accuracy_p90_ci_low = 0.22037041274837588 +settled_accuracy_p90_ci_high = 0.24053219745763443 +settled_accuracy_p95 = 0.2716054809420554 +settled_accuracy_p95_ci_low = 0.2554194938233336 +settled_accuracy_p95_ci_high = 0.29091337245466975 +settled_accuracy_p99 = 0.3470527564932693 +settled_accuracy_p99_ci_low = 0.3245785345182164 +settled_accuracy_p99_ci_high = 0.3652610021460745 +settled_accuracy_mean = 0.11199375786893381 +jitter_p10_per_min = 0.14285714285714285 +jitter_p10_per_min_ci_low = 0.13636363636363635 +jitter_p10_per_min_ci_high = 0.14285714285714285 +jitter_p50_per_min = 0.17647058823529413 +jitter_p50_per_min_ci_low = 0.17391304347826086 +jitter_p50_per_min_ci_high = 0.18181818181818182 +jitter_p90_per_min = 0.21052631578947367 +jitter_p90_per_min_ci_low = 0.21052631578947367 +jitter_p90_per_min_ci_high = 0.2222222222222222 +jitter_p95_per_min = 0.2222222222222222 +jitter_p95_per_min_ci_low = 0.2222222222222222 +jitter_p95_per_min_ci_high = 0.23529411764705882 +jitter_p99_per_min = 0.25 +jitter_p99_per_min_ci_low = 0.23809523809523808 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.17766246524433793 +reaction_rate = 0.996 +reaction_rate_ci_low = 0.9920878478557194 +reaction_rate_ci_high = 0.9999121521442806 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 129.6987951807229 +fire_decisiveness_mean = 7.686953211503147 +fire_decisiveness_p50 = 6.339576940410879 +step_correction_mean = 0.3355637534285884 +step_correction_p50 = 0.328518807888031 + +[cell.spm_12.step_minus_25_at_15min] +shares_per_minute = 12 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.992 +convergence_rate_ci_low = 0.9864785022321837 +convergence_rate_ci_high = 0.9975214977678163 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 639.616935483871 +settled_accuracy_p10 = 0.011892316938876712 +settled_accuracy_p10_ci_low = 0.010353465962518738 +settled_accuracy_p10_ci_high = 0.014098498452603803 +settled_accuracy_p50 = 0.06835610396719871 +settled_accuracy_p50_ci_low = 0.06463102517915598 +settled_accuracy_p50_ci_high = 0.07223320670039945 +settled_accuracy_p90 = 0.17803650382149194 +settled_accuracy_p90_ci_low = 0.16859759744900416 +settled_accuracy_p90_ci_high = 0.18907788037281392 +settled_accuracy_p95 = 0.215235573137879 +settled_accuracy_p95_ci_low = 0.20305504600044144 +settled_accuracy_p95_ci_high = 0.2304211456986216 +settled_accuracy_p99 = 0.3020393667750818 +settled_accuracy_p99_ci_low = 0.266927383109558 +settled_accuracy_p99_ci_high = 0.34043207907464224 +settled_accuracy_mean = 0.08408410100653459 +jitter_p10_per_min = 0.08333333333333333 +jitter_p10_per_min_ci_low = 0.07142857142857142 +jitter_p10_per_min_ci_high = 0.08695652173913043 +jitter_p50_per_min = 0.125 +jitter_p50_per_min_ci_low = 0.11764705882352941 +jitter_p50_per_min_ci_high = 0.125 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.15789473684210525 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.17647058823529413 +jitter_p95_per_min_ci_high = 0.1875 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.19047619047619047 +jitter_p99_per_min_ci_high = 0.21052631578947367 +jitter_mean_per_min = 0.1221665048456434 +reaction_rate = 0.8 +reaction_rate_ci_low = 0.77520774314428 +reaction_rate_ci_high = 0.8247922568557201 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 169.2 +fire_decisiveness_mean = 6.313568787466911 +fire_decisiveness_p50 = 4.935721228890914 +step_correction_mean = 0.5028738969936967 +step_correction_p50 = 0.5055254697799683 + +[cell.spm_12.step_minus_10_at_15min] +shares_per_minute = 12 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.996 +convergence_rate_ci_low = 0.9920878478557194 +convergence_rate_ci_high = 0.9999121521442806 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 960 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1020 +convergence_p95_secs_ci_low = 1020 +convergence_p95_secs_ci_high = 1080 +convergence_p99_secs = 1260 +convergence_p99_secs_ci_low = 1200 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 611.3855421686746 +settled_accuracy_p10 = 0.012286812847171813 +settled_accuracy_p10_ci_low = 0.009885135722085714 +settled_accuracy_p10_ci_high = 0.01430582031452432 +settled_accuracy_p50 = 0.06833151331607645 +settled_accuracy_p50_ci_low = 0.06356439785266543 +settled_accuracy_p50_ci_high = 0.07193056171237955 +settled_accuracy_p90 = 0.16457651137551177 +settled_accuracy_p90_ci_low = 0.15624345455555466 +settled_accuracy_p90_ci_high = 0.17581687333090001 +settled_accuracy_p95 = 0.19581039359721775 +settled_accuracy_p95_ci_low = 0.18697595899499264 +settled_accuracy_p95_ci_high = 0.20522300834871565 +settled_accuracy_p99 = 0.2528905838433917 +settled_accuracy_p99_ci_low = 0.23344236038280397 +settled_accuracy_p99_ci_high = 0.2723432066628664 +settled_accuracy_mean = 0.07956217364120398 +jitter_p10_per_min = 0.058823529411764705 +jitter_p10_per_min_ci_low = 0.058823529411764705 +jitter_p10_per_min_ci_high = 0.0625 +jitter_p50_per_min = 0.10526315789473684 +jitter_p50_per_min_ci_low = 0.10526315789473684 +jitter_p50_per_min_ci_high = 0.1111111111111111 +jitter_p90_per_min = 0.15384615384615385 +jitter_p90_per_min_ci_low = 0.15 +jitter_p90_per_min_ci_high = 0.15789473684210525 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.16 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.10808395625668746 +reaction_rate = 0.613 +reaction_rate_ci_low = 0.58281148215629 +reaction_rate_ci_high = 0.64318851784371 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 175.69331158238174 +fire_decisiveness_mean = 6.243789578782506 +fire_decisiveness_p50 = 4.881336076449845 +step_correction_mean = 0.3463932710895725 +step_correction_p50 = 0.7215955257415771 + +[cell.spm_12.step_minus_5_at_15min] +shares_per_minute = 12 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.998 +convergence_rate_ci_low = 0.995230914663648 +convergence_rate_ci_high = 1 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1020 +convergence_p95_secs_ci_low = 960 +convergence_p95_secs_ci_high = 1020 +convergence_p99_secs = 1200 +convergence_p99_secs_ci_low = 1140 +convergence_p99_secs_ci_high = 1260 +convergence_mean_secs = 604.3887775551102 +settled_accuracy_p10 = 0.012666550956855871 +settled_accuracy_p10_ci_low = 0.01070457031854033 +settled_accuracy_p10_ci_high = 0.015379091265442235 +settled_accuracy_p50 = 0.06741551682691205 +settled_accuracy_p50_ci_low = 0.062074145688258975 +settled_accuracy_p50_ci_high = 0.07313142607114398 +settled_accuracy_p90 = 0.1612955203843882 +settled_accuracy_p90_ci_low = 0.15243058064779547 +settled_accuracy_p90_ci_high = 0.17192902594732462 +settled_accuracy_p95 = 0.19319165733676846 +settled_accuracy_p95_ci_low = 0.18204395658890016 +settled_accuracy_p95_ci_high = 0.20650563223508622 +settled_accuracy_p99 = 0.25644663647898014 +settled_accuracy_p99_ci_low = 0.24127311026205445 +settled_accuracy_p99_ci_high = 0.2677592131111224 +settled_accuracy_mean = 0.07897046651892825 +jitter_p10_per_min = 0.058823529411764705 +jitter_p10_per_min_ci_low = 0.05555555555555555 +jitter_p10_per_min_ci_high = 0.0625 +jitter_p50_per_min = 0.10526315789473684 +jitter_p50_per_min_ci_low = 0.1 +jitter_p50_per_min_ci_high = 0.10526315789473684 +jitter_p90_per_min = 0.15384615384615385 +jitter_p90_per_min_ci_low = 0.15 +jitter_p90_per_min_ci_high = 0.15789473684210525 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.1050815450069533 +reaction_rate = 0.568 +reaction_rate_ci_low = 0.5372976150502928 +reaction_rate_ci_high = 0.5987023849497071 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 179.57746478873239 +fire_decisiveness_mean = 6.175072869809603 +fire_decisiveness_p50 = 4.716850678821988 +step_correction_mean = 12.16644281778537 +step_correction_p50 = 0.9585201740264893 + +[cell.spm_12.step_plus_5_at_15min] +shares_per_minute = 12 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.996 +convergence_rate_ci_low = 0.9920878478557194 +convergence_rate_ci_high = 0.9999121521442806 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1020 +convergence_p95_secs_ci_low = 1020 +convergence_p95_secs_ci_high = 1080 +convergence_p99_secs = 1260 +convergence_p99_secs_ci_low = 1200 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 608.3734939759037 +settled_accuracy_p10 = 0.011863122449143892 +settled_accuracy_p10_ci_low = 0.009910765655955944 +settled_accuracy_p10_ci_high = 0.01700308662451211 +settled_accuracy_p50 = 0.06670455441692047 +settled_accuracy_p50_ci_low = 0.061692224919785765 +settled_accuracy_p50_ci_high = 0.07145074931207018 +settled_accuracy_p90 = 0.15284294262038278 +settled_accuracy_p90_ci_low = 0.14787918716203485 +settled_accuracy_p90_ci_high = 0.16232088802546407 +settled_accuracy_p95 = 0.181203278645357 +settled_accuracy_p95_ci_low = 0.17291782589249372 +settled_accuracy_p95_ci_high = 0.18898221921744918 +settled_accuracy_p99 = 0.23320498282715985 +settled_accuracy_p99_ci_low = 0.21342857424075268 +settled_accuracy_p99_ci_high = 0.27786305930289346 +settled_accuracy_mean = 0.07745737289356443 +jitter_p10_per_min = 0.058823529411764705 +jitter_p10_per_min_ci_low = 0.05555555555555555 +jitter_p10_per_min_ci_high = 0.0625 +jitter_p50_per_min = 0.10526315789473684 +jitter_p50_per_min_ci_low = 0.1 +jitter_p50_per_min_ci_high = 0.10526315789473684 +jitter_p90_per_min = 0.15 +jitter_p90_per_min_ci_low = 0.15 +jitter_p90_per_min_ci_high = 0.15789473684210525 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.16 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.10582334214753485 +reaction_rate = 0.57 +reaction_rate_ci_low = 0.539314886997112 +reaction_rate_ci_high = 0.6006851130028878 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 181.78947368421052 +fire_decisiveness_mean = 6.503539154284152 +fire_decisiveness_p50 = 4.795596331021594 +step_correction_mean = 0.8733423020756036 +step_correction_p50 = 1.0616703033447266 + +[cell.spm_12.step_plus_10_at_15min] +shares_per_minute = 12 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.995 +convergence_rate_ci_low = 0.9906282772274537 +convergence_rate_ci_high = 0.9993717227725463 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 960 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 621.286432160804 +settled_accuracy_p10 = 0.010934169436585095 +settled_accuracy_p10_ci_low = 0.008957264281483357 +settled_accuracy_p10_ci_high = 0.013129910500566888 +settled_accuracy_p50 = 0.0659955902154542 +settled_accuracy_p50_ci_low = 0.06261092409090518 +settled_accuracy_p50_ci_high = 0.06972922243947188 +settled_accuracy_p90 = 0.15356814481263414 +settled_accuracy_p90_ci_low = 0.1471608953957645 +settled_accuracy_p90_ci_high = 0.16865159438157262 +settled_accuracy_p95 = 0.18809870640341197 +settled_accuracy_p95_ci_low = 0.177132080679254 +settled_accuracy_p95_ci_high = 0.1989677192326138 +settled_accuracy_p99 = 0.24890415798598253 +settled_accuracy_p99_ci_low = 0.23570335612045357 +settled_accuracy_p99_ci_high = 0.2779406998002658 +settled_accuracy_mean = 0.07655931523822092 +jitter_p10_per_min = 0.0625 +jitter_p10_per_min_ci_low = 0.058823529411764705 +jitter_p10_per_min_ci_high = 0.0625 +jitter_p50_per_min = 0.10526315789473684 +jitter_p50_per_min_ci_low = 0.10526315789473684 +jitter_p50_per_min_ci_high = 0.1111111111111111 +jitter_p90_per_min = 0.15789473684210525 +jitter_p90_per_min_ci_low = 0.15384615384615385 +jitter_p90_per_min_ci_high = 0.15789473684210525 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.17647058823529413 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.1875 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.10990813799833105 +reaction_rate = 0.649 +reaction_rate_ci_low = 0.6194176972093112 +reaction_rate_ci_high = 0.6785823027906889 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 175.9322033898305 +fire_decisiveness_mean = 6.702112795125167 +fire_decisiveness_p50 = 4.89381336116011 +step_correction_mean = 9.629315906662052 +step_correction_p50 = 0.748650312423706 + +[cell.spm_12.step_plus_25_at_15min] +shares_per_minute = 12 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 637.4174174174174 +settled_accuracy_p10 = 0.011863128844935122 +settled_accuracy_p10_ci_low = 0.01098545230191994 +settled_accuracy_p10_ci_high = 0.013809715344607731 +settled_accuracy_p50 = 0.06320119365727839 +settled_accuracy_p50_ci_low = 0.058977415559334556 +settled_accuracy_p50_ci_high = 0.06698087214892023 +settled_accuracy_p90 = 0.14882705520085093 +settled_accuracy_p90_ci_low = 0.13940948066760117 +settled_accuracy_p90_ci_high = 0.15499419857308305 +settled_accuracy_p95 = 0.17525812215874503 +settled_accuracy_p95_ci_low = 0.16709569809644909 +settled_accuracy_p95_ci_high = 0.18410162064144053 +settled_accuracy_p99 = 0.22673035100834027 +settled_accuracy_p99_ci_low = 0.21082281263227154 +settled_accuracy_p99_ci_high = 0.25317800727696294 +settled_accuracy_mean = 0.07312143090911787 +jitter_p10_per_min = 0.07142857142857142 +jitter_p10_per_min_ci_low = 0.0625 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.11764705882352941 +jitter_p50_per_min_ci_low = 0.1111111111111111 +jitter_p50_per_min_ci_high = 0.125 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.15789473684210525 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.17647058823529413 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.19047619047619047 +jitter_p99_per_min_ci_high = 0.21052631578947367 +jitter_mean_per_min = 0.11839775560620718 +reaction_rate = 0.807 +reaction_rate_ci_low = 0.7825391528846608 +reaction_rate_ci_high = 0.8314608471153393 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 163.04832713754647 +fire_decisiveness_mean = 7.626929623457463 +fire_decisiveness_p50 = 5.671294501260114 +step_correction_mean = 0.5278080393649093 +step_correction_p50 = 0.5351706743240356 + +[cell.spm_12.step_plus_50_at_15min] +shares_per_minute = 12 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.971 +convergence_rate_ci_low = 0.9605992493347836 +convergence_rate_ci_high = 0.9814007506652164 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 694.2945417095777 +settled_accuracy_p10 = 0.01218598532499171 +settled_accuracy_p10_ci_low = 0.009628153367196135 +settled_accuracy_p10_ci_high = 0.014984156492142797 +settled_accuracy_p50 = 0.06369946467707077 +settled_accuracy_p50_ci_low = 0.05904998366570258 +settled_accuracy_p50_ci_high = 0.0679845892995723 +settled_accuracy_p90 = 0.15789167573605667 +settled_accuracy_p90_ci_low = 0.14755172102469682 +settled_accuracy_p90_ci_high = 0.16842221961939252 +settled_accuracy_p95 = 0.1911458176279952 +settled_accuracy_p95_ci_low = 0.17702172832882557 +settled_accuracy_p95_ci_high = 0.20110468347388766 +settled_accuracy_p99 = 0.24161400932419497 +settled_accuracy_p99_ci_low = 0.2214427850858336 +settled_accuracy_p99_ci_high = 0.2840873879091841 +settled_accuracy_mean = 0.07555064907245254 +jitter_p10_per_min = 0.09090909090909091 +jitter_p10_per_min_ci_low = 0.09090909090909091 +jitter_p10_per_min_ci_high = 0.09523809523809523 +jitter_p50_per_min = 0.14285714285714285 +jitter_p50_per_min_ci_low = 0.13636363636363635 +jitter_p50_per_min_ci_high = 0.14285714285714285 +jitter_p90_per_min = 0.18181818181818182 +jitter_p90_per_min_ci_low = 0.18181818181818182 +jitter_p90_per_min_ci_high = 0.19047619047619047 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.2 +jitter_p95_per_min_ci_high = 0.21052631578947367 +jitter_p99_per_min = 0.2222222222222222 +jitter_p99_per_min_ci_low = 0.21739130434782608 +jitter_p99_per_min_ci_high = 0.23529411764705882 +jitter_mean_per_min = 0.14012887485817882 +reaction_rate = 0.971 +reaction_rate_ci_low = 0.9605992493347836 +reaction_rate_ci_high = 0.9814007506652164 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 130.69001029866118 +fire_decisiveness_mean = 9.275576275753133 +fire_decisiveness_p50 = 6.8129207262505815 +step_correction_mean = 0.3802538514444192 +step_correction_p50 = 0.35888758301734924 + +[cell.spm_15.cold_start_10gh_to_1ph] +shares_per_minute = 15 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 180 +convergence_p50_secs = 360 +convergence_p50_secs_ci_low = 300 +convergence_p50_secs_ci_high = 360 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 540 +convergence_p90_secs_ci_high = 660 +convergence_p95_secs = 660 +convergence_p95_secs_ci_low = 660 +convergence_p95_secs_ci_high = 720 +convergence_p99_secs = 840 +convergence_p99_secs_ci_low = 780 +convergence_p99_secs_ci_high = 960 +convergence_mean_secs = 355.26 +settled_accuracy_p10 = 0.009434701094767073 +settled_accuracy_p10_ci_low = 0.007870997434360927 +settled_accuracy_p10_ci_high = 0.011226440678011596 +settled_accuracy_p50 = 0.05906935707895511 +settled_accuracy_p50_ci_low = 0.053598038434723216 +settled_accuracy_p50_ci_high = 0.06164492820391643 +settled_accuracy_p90 = 0.144355060656012 +settled_accuracy_p90_ci_low = 0.13633803433168734 +settled_accuracy_p90_ci_high = 0.15288479870796645 +settled_accuracy_p95 = 0.17234798013389696 +settled_accuracy_p95_ci_low = 0.16212219974000686 +settled_accuracy_p95_ci_high = 0.18122527499702878 +settled_accuracy_p99 = 0.2169459815916357 +settled_accuracy_p99_ci_low = 0.2025479088508606 +settled_accuracy_p99_ci_high = 0.233327792378057 +settled_accuracy_mean = 0.06845584152805272 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0.047619047619047616 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09523809523809523 +jitter_p90_per_min = 0.13043478260869565 +jitter_p90_per_min_ci_low = 0.125 +jitter_p90_per_min_ci_high = 0.13333333333333333 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.13636363636363635 +jitter_p95_per_min_ci_high = 0.14814814814814814 +jitter_p99_per_min = 0.16 +jitter_p99_per_min_ci_low = 0.16 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.09434047229595754 +bias_mean = -0.0008336693821515324 +bias_p10 = -0.06879151369833743 +bias_p10_ci_low = -0.07356081003917819 +bias_p10_ci_high = -0.06523375841936781 +bias_p50 = -0.0005759318103857135 +bias_p50_ci_low = -0.004275851921520532 +bias_p50_ci_high = 0.0035316146100788245 +bias_p90 = 0.06644957678836322 +bias_p90_ci_low = 0.06126471763191012 +bias_p90_ci_high = 0.07286687612002711 +bias_p99 = 0.12516647810900525 +bias_p99_ci_low = 0.1118117892749572 +bias_p99_ci_high = 0.15202441361165714 +variance_mean = 0.012747331161009045 +variance_p10 = 0.006464591463610924 +variance_p10_ci_low = 0.0061135103044814565 +variance_p10_ci_high = 0.006797497139236672 +variance_p50 = 0.011316284907086468 +variance_p50_ci_low = 0.010861083981941123 +variance_p50_ci_high = 0.011663056604777414 +variance_p90 = 0.020996682827989173 +variance_p90_ci_low = 0.019832429376190553 +variance_p90_ci_high = 0.022094317636877258 +variance_p99 = 0.03388258073528074 +variance_p99_ci_low = 0.03048975331754176 +variance_p99_ci_high = 0.0378724925945527 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.05283964115279338 +ramp_target_overshoot_p50_ci_low = 0.05012072549246338 +ramp_target_overshoot_p50_ci_high = 0.05915008904339736 +ramp_target_overshoot_p90 = 0.14698109764735778 +ramp_target_overshoot_p90_ci_low = 0.13648070777840737 +ramp_target_overshoot_p90_ci_high = 0.15995686510601415 +ramp_target_overshoot_p99 = 0.233327792378057 +ramp_target_overshoot_p99_ci_low = 0.21173725993565196 +ramp_target_overshoot_p99_ci_high = 0.2529080116643261 +ramp_target_overshoot_mean = 0.06351544393084542 + +[cell.spm_15.stable_1ph] +shares_per_minute = 15 +scenario = "stable_1ph" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 684.5645645645645 +settled_accuracy_p10 = 0.007102735149294714 +settled_accuracy_p10_ci_low = 0.006125361641284188 +settled_accuracy_p10_ci_high = 0.008558594863849911 +settled_accuracy_p50 = 0.05837095512222168 +settled_accuracy_p50_ci_low = 0.05424624296053171 +settled_accuracy_p50_ci_high = 0.06257344645829943 +settled_accuracy_p90 = 0.15033774885057616 +settled_accuracy_p90_ci_low = 0.14087754638715744 +settled_accuracy_p90_ci_high = 0.15670799073978192 +settled_accuracy_p95 = 0.16982428416148254 +settled_accuracy_p95_ci_low = 0.16274309095781203 +settled_accuracy_p95_ci_high = 0.18073793042032094 +settled_accuracy_p99 = 0.21124602304478146 +settled_accuracy_p99_ci_low = 0.2023578565455404 +settled_accuracy_p99_ci_high = 0.22384235698144594 +settled_accuracy_mean = 0.06778120087421378 +jitter_p10_per_min = 0.05263157894736842 +jitter_p10_per_min_ci_low = 0.05263157894736842 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.08695652173913043 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.13333333333333333 +jitter_p90_per_min_ci_low = 0.125 +jitter_p90_per_min_ci_high = 0.13333333333333333 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.15 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.15789473684210525 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.08773479625820813 +bias_mean = 0.001500534082369046 +bias_p10 = -0.06886026496437707 +bias_p10_ci_low = -0.07353463404983221 +bias_p10_ci_high = -0.06366004847400464 +bias_p50 = 0.0003269720498888985 +bias_p50_ci_low = -0.004580557956453689 +bias_p50_ci_high = 0.005718378164239052 +bias_p90 = 0.07077877672541226 +bias_p90_ci_low = 0.06560048717362568 +bias_p90_ci_high = 0.07688013458534504 +bias_p99 = 0.14001912510815698 +bias_p99_ci_low = 0.12135100712869566 +bias_p99_ci_high = 0.15976479600270216 +variance_mean = 0.013325265740083646 +variance_p10 = 0.006764659988365878 +variance_p10_ci_low = 0.006520254483386295 +variance_p10_ci_high = 0.00721094791737699 +variance_p50 = 0.012036364656770868 +variance_p50_ci_low = 0.011701807667835578 +variance_p50_ci_high = 0.012506080379775603 +variance_p90 = 0.02123806701347846 +variance_p90_ci_low = 0.020681915857322198 +variance_p90_ci_high = 0.022415988411937492 +variance_p99 = 0.03210845322220011 +variance_p99_ci_low = 0.029630977928595037 +variance_p99_ci_high = 0.037518133340134284 +upward_step_magnitude_p50 = 1.1217398173207211 +upward_step_magnitude_p50_ci_low = 1.118425331379529 +upward_step_magnitude_p50_ci_high = 1.1249414726812226 +upward_step_magnitude_p90 = 1.180561434105705 +upward_step_magnitude_p90_ci_low = 1.1729520622504754 +upward_step_magnitude_p90_ci_high = 1.1861463680581668 +upward_step_magnitude_p95 = 1.20442125659188 +upward_step_magnitude_p95_ci_low = 1.1946253340294615 +upward_step_magnitude_p95_ci_high = 1.2122177594081427 +upward_step_magnitude_p99 = 1.2537101454628425 +upward_step_magnitude_p99_ci_low = 1.2385060466093885 +upward_step_magnitude_p99_ci_high = 1.2706980953048517 +upward_step_magnitude_mean = 1.125064221225767 +fire_decisiveness_mean = 5.523107066885578 +fire_decisiveness_p50 = 4.1426134625258015 + +[cell.spm_15.step_minus_50_at_15min] +shares_per_minute = 15 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.909 +convergence_rate_ci_low = 0.891173802693788 +convergence_rate_ci_high = 0.9268261973062121 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 801.8481848184819 +settled_accuracy_p10 = 0.02553566128169482 +settled_accuracy_p10_ci_low = 0.021425780179141762 +settled_accuracy_p10_ci_high = 0.028747759989976585 +settled_accuracy_p50 = 0.12369935470128812 +settled_accuracy_p50_ci_low = 0.11533101346935326 +settled_accuracy_p50_ci_high = 0.12807022217933217 +settled_accuracy_p90 = 0.2627659012609822 +settled_accuracy_p90_ci_low = 0.2526013241518563 +settled_accuracy_p90_ci_high = 0.2727836441737661 +settled_accuracy_p95 = 0.2954714065568449 +settled_accuracy_p95_ci_low = 0.2838927114471148 +settled_accuracy_p95_ci_high = 0.306745158984592 +settled_accuracy_p99 = 0.372875845043215 +settled_accuracy_p99_ci_low = 0.33885675082632827 +settled_accuracy_p99_ci_high = 0.4054535750603594 +settled_accuracy_mean = 0.1336319867290877 +jitter_p10_per_min = 0.125 +jitter_p10_per_min_ci_low = 0.11764705882352941 +jitter_p10_per_min_ci_high = 0.13333333333333333 +jitter_p50_per_min = 0.16666666666666666 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.16666666666666666 +jitter_p90_per_min = 0.2 +jitter_p90_per_min_ci_low = 0.2 +jitter_p90_per_min_ci_high = 0.21052631578947367 +jitter_p95_per_min = 0.21052631578947367 +jitter_p95_per_min_ci_low = 0.21052631578947367 +jitter_p95_per_min_ci_high = 0.2222222222222222 +jitter_p99_per_min = 0.23529411764705882 +jitter_p99_per_min_ci_low = 0.2222222222222222 +jitter_p99_per_min_ci_high = 0.23809523809523808 +jitter_mean_per_min = 0.16602249310690737 +reaction_rate = 0.997 +reaction_rate_ci_low = 0.9936102764714508 +reaction_rate_ci_high = 1 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 130.65195586760282 +fire_decisiveness_mean = 6.946281034351688 +fire_decisiveness_p50 = 5.746881701769247 +step_correction_mean = 0.3289146351300128 +step_correction_p50 = 0.3225599229335785 + +[cell.spm_15.step_minus_25_at_15min] +shares_per_minute = 15 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.992 +convergence_rate_ci_low = 0.9864785022321837 +convergence_rate_ci_high = 0.9975214977678163 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 713.9516129032259 +settled_accuracy_p10 = 0.014610941733311011 +settled_accuracy_p10_ci_low = 0.013224293659080288 +settled_accuracy_p10_ci_high = 0.017468795049620733 +settled_accuracy_p50 = 0.07213236444837279 +settled_accuracy_p50_ci_low = 0.06714796546953705 +settled_accuracy_p50_ci_high = 0.07601349371337585 +settled_accuracy_p90 = 0.15113354475906182 +settled_accuracy_p90_ci_low = 0.14540593748800434 +settled_accuracy_p90_ci_high = 0.16844405236960958 +settled_accuracy_p95 = 0.1897504901407685 +settled_accuracy_p95_ci_low = 0.17953562635073372 +settled_accuracy_p95_ci_high = 0.20360712824978022 +settled_accuracy_p99 = 0.24859404694273946 +settled_accuracy_p99_ci_low = 0.2272843879461386 +settled_accuracy_p99_ci_high = 0.26646970066136233 +settled_accuracy_mean = 0.08025468529477474 +jitter_p10_per_min = 0.058823529411764705 +jitter_p10_per_min_ci_low = 0.058823529411764705 +jitter_p10_per_min_ci_high = 0.0625 +jitter_p50_per_min = 0.10526315789473684 +jitter_p50_per_min_ci_low = 0.10526315789473684 +jitter_p50_per_min_ci_high = 0.1111111111111111 +jitter_p90_per_min = 0.15384615384615385 +jitter_p90_per_min_ci_low = 0.15 +jitter_p90_per_min_ci_high = 0.15789473684210525 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.17391304347826086 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.19047619047619047 +jitter_mean_per_min = 0.10768885503414123 +reaction_rate = 0.787 +reaction_rate_ci_low = 0.761623411387659 +reaction_rate_ci_high = 0.8123765886123411 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 175.57814485387547 +fire_decisiveness_mean = 5.727245553366172 +fire_decisiveness_p50 = 4.600539137258956 +step_correction_mean = 0.5081638009719351 +step_correction_p50 = 0.4941917955875397 + +[cell.spm_15.step_minus_10_at_15min] +shares_per_minute = 15 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.998 +convergence_rate_ci_low = 0.995230914663648 +convergence_rate_ci_high = 1 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 692.5851703406813 +settled_accuracy_p10 = 0.012155130342191844 +settled_accuracy_p10_ci_low = 0.009818399684737522 +settled_accuracy_p10_ci_high = 0.014565382488836653 +settled_accuracy_p50 = 0.0629720502764699 +settled_accuracy_p50_ci_low = 0.05761825420763256 +settled_accuracy_p50_ci_high = 0.06644992988987819 +settled_accuracy_p90 = 0.13954744018829257 +settled_accuracy_p90_ci_low = 0.1322565840320422 +settled_accuracy_p90_ci_high = 0.14890420545155125 +settled_accuracy_p95 = 0.17387101452571363 +settled_accuracy_p95_ci_low = 0.15603631186085798 +settled_accuracy_p95_ci_high = 0.18413203445369097 +settled_accuracy_p99 = 0.2250710515101546 +settled_accuracy_p99_ci_low = 0.21506370308950573 +settled_accuracy_p99_ci_high = 0.268018860573505 +settled_accuracy_mean = 0.07162419848714252 +jitter_p10_per_min = 0.05555555555555555 +jitter_p10_per_min_ci_low = 0.05263157894736842 +jitter_p10_per_min_ci_high = 0.05555555555555555 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09523809523809523 +jitter_p90_per_min = 0.13636363636363635 +jitter_p90_per_min_ci_low = 0.13333333333333333 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.15789473684210525 +jitter_p99_per_min = 0.17647058823529413 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.1875 +jitter_mean_per_min = 0.09115944492796675 +reaction_rate = 0.551 +reaction_rate_ci_low = 0.5201713120876026 +reaction_rate_ci_high = 0.5818286879123975 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 176.4065335753176 +fire_decisiveness_mean = 5.315269141644196 +fire_decisiveness_p50 = 4.1548753701502665 +step_correction_mean = 0.007209245446805729 +step_correction_p50 = 0.6907143592834473 + +[cell.spm_15.step_minus_5_at_15min] +shares_per_minute = 15 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.997 +convergence_rate_ci_low = 0.9936102764714508 +convergence_rate_ci_high = 1 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 696.5295887662988 +settled_accuracy_p10 = 0.013488599228191456 +settled_accuracy_p10_ci_low = 0.010558202352723756 +settled_accuracy_p10_ci_high = 0.015400636743035934 +settled_accuracy_p50 = 0.0584338076658526 +settled_accuracy_p50_ci_low = 0.05495064566851493 +settled_accuracy_p50_ci_high = 0.06201925770107786 +settled_accuracy_p90 = 0.14433534426812233 +settled_accuracy_p90_ci_low = 0.13627571090716128 +settled_accuracy_p90_ci_high = 0.15443127250486943 +settled_accuracy_p95 = 0.17398538284159137 +settled_accuracy_p95_ci_low = 0.16066434385225925 +settled_accuracy_p95_ci_high = 0.18937450511627385 +settled_accuracy_p99 = 0.2303157161261118 +settled_accuracy_p99_ci_low = 0.21325254556285733 +settled_accuracy_p99_ci_high = 0.24172733131427493 +settled_accuracy_mean = 0.07059510883750994 +jitter_p10_per_min = 0.05263157894736842 +jitter_p10_per_min_ci_low = 0.05 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.13333333333333333 +jitter_p90_per_min_ci_low = 0.13043478260869565 +jitter_p90_per_min_ci_high = 0.13636363636363635 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.15 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.087670780497134 +reaction_rate = 0.502 +reaction_rate_ci_low = 0.47100992685391013 +reaction_rate_ci_high = 0.5329900731460898 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 169.72111553784862 +fire_decisiveness_mean = 5.46855979094738 +fire_decisiveness_p50 = 4.204515642734904 +step_correction_mean = 0.9308333576794164 +step_correction_p50 = 1.0821775197982788 + +[cell.spm_15.step_plus_5_at_15min] +shares_per_minute = 15 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.995 +convergence_rate_ci_low = 0.9906282772274537 +convergence_rate_ci_high = 0.9993717227725463 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 688.5226130653266 +settled_accuracy_p10 = 0.010147691921459923 +settled_accuracy_p10_ci_low = 0.00874045088723674 +settled_accuracy_p10_ci_high = 0.012924145630592632 +settled_accuracy_p50 = 0.055248239542616595 +settled_accuracy_p50_ci_low = 0.05099641331854121 +settled_accuracy_p50_ci_high = 0.05971532545436864 +settled_accuracy_p90 = 0.14012613143955943 +settled_accuracy_p90_ci_low = 0.1340187130206162 +settled_accuracy_p90_ci_high = 0.15056776020888885 +settled_accuracy_p95 = 0.1655041493094369 +settled_accuracy_p95_ci_low = 0.1595700635131122 +settled_accuracy_p95_ci_high = 0.17455016924856848 +settled_accuracy_p99 = 0.21002097759343497 +settled_accuracy_p99_ci_low = 0.1964265102275835 +settled_accuracy_p99_ci_high = 0.22401439120942834 +settled_accuracy_mean = 0.06757387887603254 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0.05 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09523809523809523 +jitter_p90_per_min = 0.13636363636363635 +jitter_p90_per_min_ci_low = 0.13333333333333333 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15384615384615385 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.15789473684210525 +jitter_p99_per_min = 0.17391304347826086 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.19047619047619047 +jitter_mean_per_min = 0.08959326531179526 +reaction_rate = 0.522 +reaction_rate_ci_low = 0.4910396920945544 +reaction_rate_ci_high = 0.5529603079054457 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 180.22988505747125 +fire_decisiveness_mean = 5.802929552345406 +fire_decisiveness_p50 = 4.376621629426756 +step_correction_mean = 0.9483279814208604 +step_correction_p50 = 1.069200873374939 + +[cell.spm_15.step_plus_10_at_15min] +shares_per_minute = 15 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.995 +convergence_rate_ci_low = 0.9906282772274537 +convergence_rate_ci_high = 0.9993717227725463 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 689.0653266331658 +settled_accuracy_p10 = 0.012939931403758154 +settled_accuracy_p10_ci_low = 0.010417492181969745 +settled_accuracy_p10_ci_high = 0.01431670027905696 +settled_accuracy_p50 = 0.06474022737825735 +settled_accuracy_p50_ci_low = 0.05939250492807846 +settled_accuracy_p50_ci_high = 0.06833128376757958 +settled_accuracy_p90 = 0.13641981646701473 +settled_accuracy_p90_ci_low = 0.1289335175044629 +settled_accuracy_p90_ci_high = 0.1469642054124276 +settled_accuracy_p95 = 0.1628272769717698 +settled_accuracy_p95_ci_low = 0.153311727939196 +settled_accuracy_p95_ci_high = 0.172564346267835 +settled_accuracy_p99 = 0.20999260765344885 +settled_accuracy_p99_ci_low = 0.1984351188745087 +settled_accuracy_p99_ci_high = 0.22629884175589243 +settled_accuracy_mean = 0.0698069193144622 +jitter_p10_per_min = 0.05263157894736842 +jitter_p10_per_min_ci_low = 0.05 +jitter_p10_per_min_ci_high = 0.05555555555555555 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09523809523809523 +jitter_p90_per_min = 0.13636363636363635 +jitter_p90_per_min_ci_low = 0.13333333333333333 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.15384615384615385 +jitter_p99_per_min = 0.17647058823529413 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.09138436720416153 +reaction_rate = 0.552 +reaction_rate_ci_low = 0.5211777302328333 +reaction_rate_ci_high = 0.5828222697671668 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 173.3695652173913 +fire_decisiveness_mean = 5.919436052278929 +fire_decisiveness_p50 = 4.429832712974466 +step_correction_mean = 2.0681306502741315 +step_correction_p50 = 0.7366251945495605 + +[cell.spm_15.step_plus_25_at_15min] +shares_per_minute = 15 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.996 +convergence_rate_ci_low = 0.9920878478557194 +convergence_rate_ci_high = 0.9999121521442806 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 721.8674698795181 +settled_accuracy_p10 = 0.010401444139764182 +settled_accuracy_p10_ci_low = 0.009338010266260133 +settled_accuracy_p10_ci_high = 0.012176017203920586 +settled_accuracy_p50 = 0.05392213181554917 +settled_accuracy_p50_ci_low = 0.04986091822532812 +settled_accuracy_p50_ci_high = 0.056891779497244 +settled_accuracy_p90 = 0.12948053660460945 +settled_accuracy_p90_ci_low = 0.12403285392193852 +settled_accuracy_p90_ci_high = 0.1355609753269167 +settled_accuracy_p95 = 0.15526488887953538 +settled_accuracy_p95_ci_low = 0.14192418395086726 +settled_accuracy_p95_ci_high = 0.1667726091904137 +settled_accuracy_p99 = 0.19498657071137337 +settled_accuracy_p99_ci_low = 0.18008700744511086 +settled_accuracy_p99_ci_high = 0.21198680242485257 +settled_accuracy_mean = 0.06310721290345576 +jitter_p10_per_min = 0.05555555555555555 +jitter_p10_per_min_ci_low = 0.05263157894736842 +jitter_p10_per_min_ci_high = 0.058823529411764705 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.1 +jitter_p50_per_min_ci_high = 0.10526315789473684 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.15384615384615385 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.10049963173299867 +reaction_rate = 0.778 +reaction_rate_ci_low = 0.752241393950759 +reaction_rate_ci_high = 0.8037586060492411 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 164.4987146529563 +fire_decisiveness_mean = 6.792209173030643 +fire_decisiveness_p50 = 5.0085335128424155 +step_correction_mean = 0.5814264315565938 +step_correction_p50 = 0.5170418620109558 + +[cell.spm_15.step_plus_50_at_15min] +shares_per_minute = 15 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.977 +convergence_rate_ci_low = 0.9677088970730058 +convergence_rate_ci_high = 0.9862911029269942 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 774.96417604913 +settled_accuracy_p10 = 0.01079003148837343 +settled_accuracy_p10_ci_low = 0.009556928493537509 +settled_accuracy_p10_ci_high = 0.01246820046509134 +settled_accuracy_p50 = 0.05579565118459229 +settled_accuracy_p50_ci_low = 0.051712926894020184 +settled_accuracy_p50_ci_high = 0.059227330021973223 +settled_accuracy_p90 = 0.1363505359000654 +settled_accuracy_p90_ci_low = 0.1298972581197474 +settled_accuracy_p90_ci_high = 0.14348778721586886 +settled_accuracy_p95 = 0.1623518202742319 +settled_accuracy_p95_ci_low = 0.15014677603204252 +settled_accuracy_p95_ci_high = 0.17025822864276086 +settled_accuracy_p99 = 0.20160075219193208 +settled_accuracy_p99_ci_low = 0.1875802789778085 +settled_accuracy_p99_ci_high = 0.21678972493508564 +settled_accuracy_mean = 0.06572163476117435 +jitter_p10_per_min = 0.09090909090909091 +jitter_p10_per_min_ci_low = 0.08695652173913043 +jitter_p10_per_min_ci_high = 0.09090909090909091 +jitter_p50_per_min = 0.125 +jitter_p50_per_min_ci_low = 0.125 +jitter_p50_per_min_ci_high = 0.13333333333333333 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.17391304347826086 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.17647058823529413 +jitter_p95_per_min_ci_high = 0.1875 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.21052631578947367 +jitter_mean_per_min = 0.12804097311372703 +reaction_rate = 0.961 +reaction_rate_ci_low = 0.9490008614309192 +reaction_rate_ci_high = 0.9729991385690807 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 134.79708636836628 +fire_decisiveness_mean = 8.678012157179518 +fire_decisiveness_p50 = 6.336039532440818 +step_correction_mean = 0.36659399877446747 +step_correction_p50 = 0.3516782820224762 + +[cell.spm_20.cold_start_10gh_to_1ph] +shares_per_minute = 20 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 60 +convergence_p10_secs_ci_low = 60 +convergence_p10_secs_ci_high = 60 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 300 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 480 +convergence_p90_secs_ci_low = 480 +convergence_p90_secs_ci_high = 480 +convergence_p95_secs = 480 +convergence_p95_secs_ci_low = 480 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 720 +convergence_p99_secs_ci_low = 660 +convergence_p99_secs_ci_high = 780 +convergence_mean_secs = 297.54 +settled_accuracy_p10 = 0.008392970185343351 +settled_accuracy_p10_ci_low = 0.006323735445848744 +settled_accuracy_p10_ci_high = 0.010689435541297865 +settled_accuracy_p50 = 0.05231478272062162 +settled_accuracy_p50_ci_low = 0.04742523082597394 +settled_accuracy_p50_ci_high = 0.05706790229298242 +settled_accuracy_p90 = 0.1214603345336649 +settled_accuracy_p90_ci_low = 0.11651219659998302 +settled_accuracy_p90_ci_high = 0.12757415345019085 +settled_accuracy_p95 = 0.14187948173971132 +settled_accuracy_p95_ci_low = 0.13597450561067015 +settled_accuracy_p95_ci_high = 0.14670729347867595 +settled_accuracy_p99 = 0.1794882291386557 +settled_accuracy_p99_ci_low = 0.16768512198479035 +settled_accuracy_p99_ci_high = 0.19121664412591743 +settled_accuracy_mean = 0.05997706802845762 +jitter_p10_per_min = 0.045454545454545456 +jitter_p10_per_min_ci_low = 0.043478260869565216 +jitter_p10_per_min_ci_high = 0.045454545454545456 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.08 +jitter_p50_per_min_ci_high = 0.08333333333333333 +jitter_p90_per_min = 0.1111111111111111 +jitter_p90_per_min_ci_low = 0.1111111111111111 +jitter_p90_per_min_ci_high = 0.12 +jitter_p95_per_min = 0.12 +jitter_p95_per_min_ci_low = 0.12 +jitter_p95_per_min_ci_high = 0.12 +jitter_p99_per_min = 0.14814814814814814 +jitter_p99_per_min_ci_low = 0.13636363636363635 +jitter_p99_per_min_ci_high = 0.15 +jitter_mean_per_min = 0.07964654274470823 +bias_mean = 0.0013785919556342295 +bias_p10 = -0.058090606073191914 +bias_p10_ci_low = -0.06463527803038477 +bias_p10_ci_high = -0.054074988201466834 +bias_p50 = 0.00040236709355098016 +bias_p50_ci_low = -0.003255451034989818 +bias_p50_ci_high = 0.004448042672648126 +bias_p90 = 0.06081780791231107 +bias_p90_ci_low = 0.057906759571849535 +bias_p90_ci_high = 0.06572073566334159 +bias_p99 = 0.11156630857929724 +bias_p99_ci_low = 0.10100706070380759 +bias_p99_ci_high = 0.13072018877907357 +variance_mean = 0.009528238458953975 +variance_p10 = 0.004738817470674009 +variance_p10_ci_low = 0.0044370170825102214 +variance_p10_ci_high = 0.005073084505638016 +variance_p50 = 0.008577496416324472 +variance_p50_ci_low = 0.008258032750712472 +variance_p50_ci_high = 0.008835542683333558 +variance_p90 = 0.015168763135104268 +variance_p90_ci_low = 0.014253050639298654 +variance_p90_ci_high = 0.01580485784335681 +variance_p99 = 0.024254859114805766 +variance_p99_ci_low = 0.022432832756032268 +variance_p99_ci_high = 0.029989436382660974 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.025659141593061152 +ramp_target_overshoot_p50_ci_low = 0.020087763631303712 +ramp_target_overshoot_p50_ci_high = 0.029844520168596178 +ramp_target_overshoot_p90 = 0.11537295650989887 +ramp_target_overshoot_p90_ci_low = 0.10813043359507346 +ramp_target_overshoot_p90_ci_high = 0.12066724196859568 +ramp_target_overshoot_p99 = 0.17639424203255039 +ramp_target_overshoot_p99_ci_low = 0.16350155534860678 +ramp_target_overshoot_p99_ci_high = 0.1946737572998507 +ramp_target_overshoot_mean = 0.04220043619419988 + +[cell.spm_20.stable_1ph] +shares_per_minute = 20 +scenario = "stable_1ph" +convergence_rate = 0.98 +convergence_rate_ci_low = 0.971322710100498 +convergence_rate_ci_high = 0.988677289899502 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 828.1224489795918 +settled_accuracy_p10 = 0.007767247129267352 +settled_accuracy_p10_ci_low = 0.00702784165609649 +settled_accuracy_p10_ci_high = 0.009446713581579336 +settled_accuracy_p50 = 0.04777466668536756 +settled_accuracy_p50_ci_low = 0.043340515547748204 +settled_accuracy_p50_ci_high = 0.05285453932079531 +settled_accuracy_p90 = 0.10677711622604436 +settled_accuracy_p90_ci_low = 0.10202527172211617 +settled_accuracy_p90_ci_high = 0.11525518045204675 +settled_accuracy_p95 = 0.14517117156173265 +settled_accuracy_p95_ci_low = 0.12808552300052334 +settled_accuracy_p95_ci_high = 0.15681831771363308 +settled_accuracy_p99 = 0.2012510971460546 +settled_accuracy_p99_ci_low = 0.18762692383499524 +settled_accuracy_p99_ci_high = 0.21901400837156237 +settled_accuracy_mean = 0.05496231703019649 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.06666666666666667 +jitter_p50_per_min_ci_low = 0.06666666666666667 +jitter_p50_per_min_ci_high = 0.07142857142857142 +jitter_p90_per_min = 0.1111111111111111 +jitter_p90_per_min_ci_low = 0.10526315789473684 +jitter_p90_per_min_ci_high = 0.1111111111111111 +jitter_p95_per_min = 0.125 +jitter_p95_per_min_ci_low = 0.11764705882352941 +jitter_p95_per_min_ci_high = 0.125 +jitter_p99_per_min = 0.15 +jitter_p99_per_min_ci_low = 0.13636363636363635 +jitter_p99_per_min_ci_high = 0.15384615384615385 +jitter_mean_per_min = 0.06815276777928482 +bias_mean = -0.0012154128054006556 +bias_p10 = -0.06346555991951162 +bias_p10_ci_low = -0.06794620690435145 +bias_p10_ci_high = -0.058241364372106384 +bias_p50 = -0.0012183331854053795 +bias_p50_ci_low = -0.004806421671297604 +bias_p50_ci_high = 0.0025600548489935863 +bias_p90 = 0.061897296388339705 +bias_p90_ci_low = 0.0555840511176842 +bias_p90_ci_high = 0.06811036578396741 +bias_p99 = 0.11898987355132226 +bias_p99_ci_low = 0.10149238141843266 +bias_p99_ci_high = 0.1261197948549816 +variance_mean = 0.009984443879563628 +variance_p10 = 0.004926317207465787 +variance_p10_ci_low = 0.004675791351129044 +variance_p10_ci_high = 0.005107286019620079 +variance_p50 = 0.008940036684701239 +variance_p50_ci_low = 0.008600164730924266 +variance_p50_ci_high = 0.009220748895625868 +variance_p90 = 0.016684295032977744 +variance_p90_ci_low = 0.016009623458098286 +variance_p90_ci_high = 0.017636508514045676 +variance_p99 = 0.02542299913582086 +variance_p99_ci_low = 0.02377500232088632 +variance_p99_ci_high = 0.026566717931235165 +upward_step_magnitude_p50 = 1.1032818181079984 +upward_step_magnitude_p50_ci_low = 1.1000336148304148 +upward_step_magnitude_p50_ci_high = 1.1048801658294272 +upward_step_magnitude_p90 = 1.154481700442386 +upward_step_magnitude_p90_ci_low = 1.1508580186489936 +upward_step_magnitude_p90_ci_high = 1.1592275792957496 +upward_step_magnitude_p95 = 1.1701574583033862 +upward_step_magnitude_p95_ci_low = 1.1626963703155229 +upward_step_magnitude_p95_ci_high = 1.1786348019477637 +upward_step_magnitude_p99 = 1.2127075659797266 +upward_step_magnitude_p99_ci_low = 1.1976647455382696 +upward_step_magnitude_p99_ci_high = 1.2327581723330148 +upward_step_magnitude_mean = 1.0993316541464129 +fire_decisiveness_mean = 4.658369152663697 +fire_decisiveness_p50 = 3.5582390148893825 + +[cell.spm_20.step_minus_50_at_15min] +shares_per_minute = 20 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.895 +convergence_rate_ci_low = 0.8759996221090212 +convergence_rate_ci_high = 0.9140003778909789 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 1200 +convergence_p50_secs_ci_low = 1140 +convergence_p50_secs_ci_high = 1200 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1019.3296089385475 +settled_accuracy_p10 = 0.038918645332400637 +settled_accuracy_p10_ci_low = 0.03476675408043706 +settled_accuracy_p10_ci_high = 0.05195736090630798 +settled_accuracy_p50 = 0.1593936875119999 +settled_accuracy_p50_ci_low = 0.15269635701540296 +settled_accuracy_p50_ci_high = 0.16452120744148724 +settled_accuracy_p90 = 0.2750189062449564 +settled_accuracy_p90_ci_low = 0.26703254867187876 +settled_accuracy_p90_ci_high = 0.2830002977620334 +settled_accuracy_p95 = 0.3049903963858924 +settled_accuracy_p95_ci_low = 0.2911136253074509 +settled_accuracy_p95_ci_high = 0.32293262249834087 +settled_accuracy_p99 = 0.3836727218771745 +settled_accuracy_p99_ci_low = 0.35396631175248694 +settled_accuracy_p99_ci_high = 0.397628278762977 +settled_accuracy_mean = 0.15995064921451416 +jitter_p10_per_min = 0.1111111111111111 +jitter_p10_per_min_ci_low = 0.10526315789473684 +jitter_p10_per_min_ci_high = 0.11764705882352941 +jitter_p50_per_min = 0.16666666666666666 +jitter_p50_per_min_ci_low = 0.15789473684210525 +jitter_p50_per_min_ci_high = 0.16666666666666666 +jitter_p90_per_min = 0.1875 +jitter_p90_per_min_ci_low = 0.1875 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.19047619047619047 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.21052631578947367 +jitter_p99_per_min_ci_low = 0.21052631578947367 +jitter_p99_per_min_ci_high = 0.23076923076923078 +jitter_mean_per_min = 0.1559397363224974 +reaction_rate = 0.999 +reaction_rate_ci_low = 0.9970409802451226 +reaction_rate_ci_high = 1 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 124.26426426426427 +fire_decisiveness_mean = 6.6014968484869465 +fire_decisiveness_p50 = 5.529108323872052 +step_correction_mean = 0.3131356196360545 +step_correction_p50 = 0.30871906876564026 + +[cell.spm_20.step_minus_25_at_15min] +shares_per_minute = 20 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 840 +convergence_p50_secs_ci_high = 900 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 836.0960960960961 +settled_accuracy_p10 = 0.020140443639694805 +settled_accuracy_p10_ci_low = 0.015879030815584727 +settled_accuracy_p10_ci_high = 0.0226867328729905 +settled_accuracy_p50 = 0.06903927219632378 +settled_accuracy_p50_ci_low = 0.06532976266458346 +settled_accuracy_p50_ci_high = 0.07315062960193441 +settled_accuracy_p90 = 0.1517360928736562 +settled_accuracy_p90_ci_low = 0.13655320466744825 +settled_accuracy_p90_ci_high = 0.16261166579320752 +settled_accuracy_p95 = 0.18428165464687263 +settled_accuracy_p95_ci_low = 0.17115748741194303 +settled_accuracy_p95_ci_high = 0.19900059691097005 +settled_accuracy_p99 = 0.28294483714065777 +settled_accuracy_p99_ci_low = 0.252590066581835 +settled_accuracy_p99_ci_high = 0.3150672551606939 +settled_accuracy_mean = 0.07903445431680445 +jitter_p10_per_min = 0.05555555555555555 +jitter_p10_per_min_ci_low = 0.05555555555555555 +jitter_p10_per_min_ci_high = 0.058823529411764705 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.13333333333333333 +jitter_p90_per_min_ci_low = 0.125 +jitter_p90_per_min_ci_high = 0.13333333333333333 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.15384615384615385 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.15384615384615385 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.0915481026144589 +reaction_rate = 0.744 +reaction_rate_ci_low = 0.7169502957058677 +reaction_rate_ci_high = 0.7710497042941323 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 165.08064516129033 +fire_decisiveness_mean = 4.949546918608055 +fire_decisiveness_p50 = 3.939234997306471 +step_correction_mean = 0.4801030377506889 +step_correction_p50 = 0.44124284386634827 + +[cell.spm_20.step_minus_10_at_15min] +shares_per_minute = 20 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.992 +convergence_rate_ci_low = 0.9864785022321837 +convergence_rate_ci_high = 0.9975214977678163 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 828.3266129032259 +settled_accuracy_p10 = 0.011796321614012895 +settled_accuracy_p10_ci_low = 0.00965107491623507 +settled_accuracy_p10_ci_high = 0.013653745849037113 +settled_accuracy_p50 = 0.062087257182419364 +settled_accuracy_p50_ci_low = 0.05769789006002146 +settled_accuracy_p50_ci_high = 0.06703109265534501 +settled_accuracy_p90 = 0.12383837351973692 +settled_accuracy_p90_ci_low = 0.11873377503393656 +settled_accuracy_p90_ci_high = 0.12870503379863396 +settled_accuracy_p95 = 0.14134051447892393 +settled_accuracy_p95_ci_low = 0.1335443285739477 +settled_accuracy_p95_ci_high = 0.14925630329329298 +settled_accuracy_p99 = 0.1967094286835962 +settled_accuracy_p99_ci_low = 0.1696368180108262 +settled_accuracy_p99_ci_high = 0.2093964340586434 +settled_accuracy_mean = 0.06577173754916188 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.06666666666666667 +jitter_p50_per_min_ci_low = 0.06666666666666667 +jitter_p50_per_min_ci_high = 0.06666666666666667 +jitter_p90_per_min = 0.1111111111111111 +jitter_p90_per_min_ci_low = 0.10526315789473684 +jitter_p90_per_min_ci_high = 0.11764705882352941 +jitter_p95_per_min = 0.125 +jitter_p95_per_min_ci_low = 0.11764705882352941 +jitter_p95_per_min_ci_high = 0.13333333333333333 +jitter_p99_per_min = 0.15384615384615385 +jitter_p99_per_min_ci_low = 0.14285714285714285 +jitter_p99_per_min_ci_high = 0.15384615384615385 +jitter_mean_per_min = 0.06588628688045396 +reaction_rate = 0.496 +reaction_rate_ci_low = 0.46501067063649165 +reaction_rate_ci_high = 0.5269893293635083 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 170.56451612903226 +fire_decisiveness_mean = 4.43384075047136 +fire_decisiveness_p50 = 3.534822503162397 +step_correction_mean = 1.253174623354308 +step_correction_p50 = 0.7542439699172974 + +[cell.spm_20.step_minus_5_at_15min] +shares_per_minute = 20 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.982 +convergence_rate_ci_low = 0.9737596042813467 +convergence_rate_ci_high = 0.9902403957186533 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 829.4908350305499 +settled_accuracy_p10 = 0.011546751249266851 +settled_accuracy_p10_ci_low = 0.010225059820488713 +settled_accuracy_p10_ci_high = 0.012861025382479907 +settled_accuracy_p50 = 0.04806584128414437 +settled_accuracy_p50_ci_low = 0.04374607898798133 +settled_accuracy_p50_ci_high = 0.05158658424567841 +settled_accuracy_p90 = 0.12575848028232062 +settled_accuracy_p90_ci_low = 0.12005479191554347 +settled_accuracy_p90_ci_high = 0.13276930805038645 +settled_accuracy_p95 = 0.14393685889400498 +settled_accuracy_p95_ci_low = 0.139024913848112 +settled_accuracy_p95_ci_high = 0.15059829672050284 +settled_accuracy_p99 = 0.18231493512020935 +settled_accuracy_p99_ci_low = 0.16977970561530942 +settled_accuracy_p99_ci_high = 0.212813159101767 +settled_accuracy_mean = 0.05946852392921974 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.06666666666666667 +jitter_p50_per_min_ci_low = 0.06666666666666667 +jitter_p50_per_min_ci_high = 0.07142857142857142 +jitter_p90_per_min = 0.10526315789473684 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.1111111111111111 +jitter_p95_per_min = 0.11764705882352941 +jitter_p95_per_min_ci_low = 0.11764705882352941 +jitter_p95_per_min_ci_high = 0.125 +jitter_p99_per_min = 0.15384615384615385 +jitter_p99_per_min_ci_low = 0.14285714285714285 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.06622470075587238 +reaction_rate = 0.452 +reaction_rate_ci_low = 0.42115281287378054 +reaction_rate_ci_high = 0.4828471871262195 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 178.141592920354 +fire_decisiveness_mean = 4.519693116893005 +fire_decisiveness_p50 = 3.441035845769127 +step_correction_mean = 1.018980793325247 +step_correction_p50 = 1.2879842519760132 + +[cell.spm_20.step_plus_5_at_15min] +shares_per_minute = 20 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.987 +convergence_rate_ci_low = 0.9799792044895183 +convergence_rate_ci_high = 0.9940207955104817 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 816.4133738601823 +settled_accuracy_p10 = 0.012942808287600194 +settled_accuracy_p10_ci_low = 0.010464829264171027 +settled_accuracy_p10_ci_high = 0.014778651300908607 +settled_accuracy_p50 = 0.047923466233181666 +settled_accuracy_p50_ci_low = 0.04556027533299112 +settled_accuracy_p50_ci_high = 0.05098471720130715 +settled_accuracy_p90 = 0.1220066088814562 +settled_accuracy_p90_ci_low = 0.11593242533115666 +settled_accuracy_p90_ci_high = 0.12756488500927188 +settled_accuracy_p95 = 0.1420169398125477 +settled_accuracy_p95_ci_low = 0.13498750944157878 +settled_accuracy_p95_ci_high = 0.1472998778362924 +settled_accuracy_p99 = 0.19003864064785492 +settled_accuracy_p99_ci_low = 0.17641822451917766 +settled_accuracy_p99_ci_high = 0.20540836130494922 +settled_accuracy_mean = 0.059048030073465714 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.06666666666666667 +jitter_p50_per_min_ci_low = 0.06666666666666667 +jitter_p50_per_min_ci_high = 0.07142857142857142 +jitter_p90_per_min = 0.11764705882352941 +jitter_p90_per_min_ci_low = 0.1111111111111111 +jitter_p90_per_min_ci_high = 0.11764705882352941 +jitter_p95_per_min = 0.125 +jitter_p95_per_min_ci_low = 0.125 +jitter_p95_per_min_ci_high = 0.13333333333333333 +jitter_p99_per_min = 0.15384615384615385 +jitter_p99_per_min_ci_low = 0.14285714285714285 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.0697199729667761 +reaction_rate = 0.45 +reaction_rate_ci_low = 0.41916501986379756 +reaction_rate_ci_high = 0.48083498013620246 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 177.2 +fire_decisiveness_mean = 4.80545566547774 +fire_decisiveness_p50 = 3.534094440463381 +step_correction_mean = 0.8263994272549947 +step_correction_p50 = 1.1748926639556885 + +[cell.spm_20.step_plus_10_at_15min] +shares_per_minute = 20 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.99 +convergence_rate_ci_low = 0.9838330039727595 +convergence_rate_ci_high = 0.9961669960272405 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 840 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 844.9090909090909 +settled_accuracy_p10 = 0.01183916298894827 +settled_accuracy_p10_ci_low = 0.010073711767545679 +settled_accuracy_p10_ci_high = 0.013151690377753988 +settled_accuracy_p50 = 0.05845115057234396 +settled_accuracy_p50_ci_low = 0.05507411045521349 +settled_accuracy_p50_ci_high = 0.0624125258819066 +settled_accuracy_p90 = 0.11857264080156771 +settled_accuracy_p90_ci_low = 0.11291505841796223 +settled_accuracy_p90_ci_high = 0.12529536289332432 +settled_accuracy_p95 = 0.13438922421968713 +settled_accuracy_p95_ci_low = 0.12900160249869486 +settled_accuracy_p95_ci_high = 0.1421479851752856 +settled_accuracy_p99 = 0.1694817920531757 +settled_accuracy_p99_ci_low = 0.1581672373665579 +settled_accuracy_p99_ci_high = 0.18182012298370653 +settled_accuracy_mean = 0.06173196011512708 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.07142857142857142 +jitter_p50_per_min_ci_low = 0.06666666666666667 +jitter_p50_per_min_ci_high = 0.07142857142857142 +jitter_p90_per_min = 0.1111111111111111 +jitter_p90_per_min_ci_low = 0.1111111111111111 +jitter_p90_per_min_ci_high = 0.11764705882352941 +jitter_p95_per_min = 0.125 +jitter_p95_per_min_ci_low = 0.125 +jitter_p95_per_min_ci_high = 0.13333333333333333 +jitter_p99_per_min = 0.15384615384615385 +jitter_p99_per_min_ci_low = 0.14285714285714285 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.06892340789779564 +reaction_rate = 0.527 +reaction_rate_ci_low = 0.4960548958056367 +reaction_rate_ci_high = 0.5579451041943633 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 174.99051233396585 +fire_decisiveness_mean = 5.041950595907337 +fire_decisiveness_p50 = 3.6066677352894576 +step_correction_mean = 0.9083278863434547 +step_correction_p50 = 0.7500627040863037 + +[cell.spm_20.step_plus_25_at_15min] +shares_per_minute = 20 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 900 +convergence_p50_secs_ci_low = 840 +convergence_p50_secs_ci_high = 900 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 847.3873873873874 +settled_accuracy_p10 = 0.006503868799060619 +settled_accuracy_p10_ci_low = 0.005190253087383523 +settled_accuracy_p10_ci_high = 0.007480759083909216 +settled_accuracy_p50 = 0.03847624872412636 +settled_accuracy_p50_ci_low = 0.0355238882853266 +settled_accuracy_p50_ci_high = 0.04139446417385351 +settled_accuracy_p90 = 0.12010521381098238 +settled_accuracy_p90_ci_low = 0.1108809128007846 +settled_accuracy_p90_ci_high = 0.12579121348499434 +settled_accuracy_p95 = 0.13884823583149386 +settled_accuracy_p95_ci_low = 0.13192029271060313 +settled_accuracy_p95_ci_high = 0.15120099093482753 +settled_accuracy_p99 = 0.18946125649694312 +settled_accuracy_p99_ci_low = 0.16939286129210218 +settled_accuracy_p99_ci_high = 0.19575112855631338 +settled_accuracy_mean = 0.0509162647830086 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0.045454545454545456 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.125 +jitter_p90_per_min_ci_low = 0.11764705882352941 +jitter_p90_per_min_ci_high = 0.13333333333333333 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.13636363636363635 +jitter_p95_per_min_ci_high = 0.14285714285714285 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.15384615384615385 +jitter_p99_per_min_ci_high = 0.17647058823529413 +jitter_mean_per_min = 0.08423345071578292 +reaction_rate = 0.763 +reaction_rate_ci_low = 0.736643210180297 +reaction_rate_ci_high = 0.789356789819703 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 162.38532110091742 +fire_decisiveness_mean = 6.277010130170077 +fire_decisiveness_p50 = 4.596615560522508 +step_correction_mean = 0.5286169513415541 +step_correction_p50 = 0.44793838262557983 + +[cell.spm_20.step_plus_50_at_15min] +shares_per_minute = 20 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.988 +convergence_rate_ci_low = 0.9812512216216562 +convergence_rate_ci_high = 0.9947487783783437 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 928.5425101214574 +settled_accuracy_p10 = 0.011839345676055046 +settled_accuracy_p10_ci_low = 0.008899798503400724 +settled_accuracy_p10_ci_high = 0.014679840166372693 +settled_accuracy_p50 = 0.0594205140699996 +settled_accuracy_p50_ci_low = 0.056497162503038934 +settled_accuracy_p50_ci_high = 0.06402042400095709 +settled_accuracy_p90 = 0.1428435421274995 +settled_accuracy_p90_ci_low = 0.1375628798864983 +settled_accuracy_p90_ci_high = 0.1470020546944395 +settled_accuracy_p95 = 0.1584022399685895 +settled_accuracy_p95_ci_low = 0.15282271958937255 +settled_accuracy_p95_ci_high = 0.16630283223562625 +settled_accuracy_p99 = 0.18901721396032578 +settled_accuracy_p99_ci_low = 0.17761559703042384 +settled_accuracy_p99_ci_high = 0.1994561318755379 +settled_accuracy_mean = 0.07028369645641053 +jitter_p10_per_min = 0.08333333333333333 +jitter_p10_per_min_ci_low = 0.07142857142857142 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.1111111111111111 +jitter_p50_per_min_ci_low = 0.10526315789473684 +jitter_p50_per_min_ci_high = 0.11764705882352941 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.17647058823529413 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.11546542747215821 +reaction_rate = 0.964 +reaction_rate_ci_low = 0.9524536202037175 +reaction_rate_ci_high = 0.9755463797962824 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 134.00414937759336 +fire_decisiveness_mean = 8.169927568770019 +fire_decisiveness_p50 = 5.936847110477892 +step_correction_mean = 0.3516050950929337 +step_correction_p50 = 0.34440210461616516 + +[cell.spm_25.cold_start_10gh_to_1ph] +shares_per_minute = 25 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 180 +convergence_p50_secs = 240 +convergence_p50_secs_ci_low = 240 +convergence_p50_secs_ci_high = 240 +convergence_p90_secs = 540 +convergence_p90_secs_ci_low = 540 +convergence_p90_secs_ci_high = 540 +convergence_p95_secs = 540 +convergence_p95_secs_ci_low = 540 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 600 +convergence_p99_secs_ci_low = 600 +convergence_p99_secs_ci_high = 660 +convergence_mean_secs = 304.98 +settled_accuracy_p10 = 0.0078035530251635565 +settled_accuracy_p10_ci_low = 0.00632682245363303 +settled_accuracy_p10_ci_high = 0.009102445104780754 +settled_accuracy_p50 = 0.044500559385943106 +settled_accuracy_p50_ci_low = 0.04121484225289551 +settled_accuracy_p50_ci_high = 0.04726309580844068 +settled_accuracy_p90 = 0.11137675782444068 +settled_accuracy_p90_ci_low = 0.1032929581795673 +settled_accuracy_p90_ci_high = 0.11580929834930309 +settled_accuracy_p95 = 0.1315933704763005 +settled_accuracy_p95_ci_low = 0.12451318390560306 +settled_accuracy_p95_ci_high = 0.14017599031377492 +settled_accuracy_p99 = 0.17111089531882784 +settled_accuracy_p99_ci_low = 0.15815217351184918 +settled_accuracy_p99_ci_high = 0.1774155047381878 +settled_accuracy_mean = 0.05273657139869836 +jitter_p10_per_min = 0.041666666666666664 +jitter_p10_per_min_ci_low = 0.04 +jitter_p10_per_min_ci_high = 0.041666666666666664 +jitter_p50_per_min = 0.08 +jitter_p50_per_min_ci_low = 0.08 +jitter_p50_per_min_ci_high = 0.08333333333333333 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.08695652173913043 +jitter_p90_per_min_ci_high = 0.10526315789473684 +jitter_p95_per_min = 0.125 +jitter_p95_per_min_ci_low = 0.12 +jitter_p95_per_min_ci_high = 0.125 +jitter_p99_per_min = 0.125 +jitter_p99_per_min_ci_low = 0.125 +jitter_p99_per_min_ci_high = 0.13043478260869565 +jitter_mean_per_min = 0.0727861261151024 +bias_mean = 0.0007263444315372106 +bias_p10 = -0.05183258786628137 +bias_p10_ci_low = -0.057039893172011726 +bias_p10_ci_high = -0.04775787887301285 +bias_p50 = -0.00048018158839400294 +bias_p50_ci_low = -0.0026131874097454198 +bias_p50_ci_high = 0.002284901438923208 +bias_p90 = 0.056237981089279944 +bias_p90_ci_low = 0.052014000788260725 +bias_p90_ci_high = 0.06082924820774916 +bias_p99 = 0.1016645085927409 +bias_p99_ci_low = 0.0938670342179166 +bias_p99_ci_high = 0.11588930624441382 +variance_mean = 0.007927319647040477 +variance_p10 = 0.003771592976752544 +variance_p10_ci_low = 0.0036129182027626956 +variance_p10_ci_high = 0.003936839425318665 +variance_p50 = 0.00719332213878967 +variance_p50_ci_low = 0.00698430414806592 +variance_p50_ci_high = 0.007453063403107185 +variance_p90 = 0.012795106246349393 +variance_p90_ci_low = 0.012408422398526384 +variance_p90_ci_high = 0.013441736228742866 +variance_p99 = 0.02080139785655456 +variance_p99_ci_low = 0.018595746219140695 +variance_p99_ci_high = 0.022783621335866623 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.01672815963803087 +ramp_target_overshoot_p50_ci_low = 0.01194021056480099 +ramp_target_overshoot_p50_ci_high = 0.02149080866920361 +ramp_target_overshoot_p90 = 0.08228150813215152 +ramp_target_overshoot_p90_ci_low = 0.07669536622012196 +ramp_target_overshoot_p90_ci_high = 0.08756774052706362 +ramp_target_overshoot_p99 = 0.17121692732532723 +ramp_target_overshoot_p99_ci_low = 0.14982409759883808 +ramp_target_overshoot_p99_ci_high = 0.1774155047381878 +ramp_target_overshoot_mean = 0.03081108190160485 + +[cell.spm_25.stable_1ph] +shares_per_minute = 25 +scenario = "stable_1ph" +convergence_rate = 0.955 +convergence_rate_ci_low = 0.9421511572505537 +convergence_rate_ci_high = 0.9678488427494463 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 948.4397905759163 +settled_accuracy_p10 = 0.009040168078178645 +settled_accuracy_p10_ci_low = 0.0076406127012519365 +settled_accuracy_p10_ci_high = 0.010433750766131622 +settled_accuracy_p50 = 0.06130629687176725 +settled_accuracy_p50_ci_low = 0.059110897466311485 +settled_accuracy_p50_ci_high = 0.06346760497386739 +settled_accuracy_p90 = 0.09916710516717453 +settled_accuracy_p90_ci_low = 0.09576414884719386 +settled_accuracy_p90_ci_high = 0.10380701208449472 +settled_accuracy_p95 = 0.11876437010512131 +settled_accuracy_p95_ci_low = 0.10996908227486446 +settled_accuracy_p95_ci_high = 0.1287347341593048 +settled_accuracy_p99 = 0.18212184943173226 +settled_accuracy_p99_ci_low = 0.1691439344893999 +settled_accuracy_p99_ci_high = 0.20449232110169135 +settled_accuracy_mean = 0.057929475428122656 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.0625 +jitter_p50_per_min_ci_low = 0.058823529411764705 +jitter_p50_per_min_ci_high = 0.0625 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.09523809523809523 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.11764705882352941 +jitter_p99_per_min_ci_low = 0.1111111111111111 +jitter_p99_per_min_ci_high = 0.125 +jitter_mean_per_min = 0.05157181503142191 +bias_mean = -0.0006502315314116874 +bias_p10 = -0.057112271848800036 +bias_p10_ci_low = -0.06088271278077982 +bias_p10_ci_high = -0.05339015636361983 +bias_p50 = 0.000028069165744515052 +bias_p50_ci_low = -0.0038472311336221286 +bias_p50_ci_high = 0.004009221337289012 +bias_p90 = 0.055416702800964 +bias_p90_ci_low = 0.050617521822981654 +bias_p90_ci_high = 0.061710790256721035 +bias_p99 = 0.09675809824482805 +bias_p99_ci_low = 0.08905434316582161 +bias_p99_ci_high = 0.1130771375182744 +variance_mean = 0.007929108707171542 +variance_p10 = 0.0040030859882489705 +variance_p10_ci_low = 0.003794722778816402 +variance_p10_ci_high = 0.004139628907924124 +variance_p50 = 0.007117080761831096 +variance_p50_ci_low = 0.006966335518851108 +variance_p50_ci_high = 0.007441192668737472 +variance_p90 = 0.012830710341079351 +variance_p90_ci_low = 0.012199972887050447 +variance_p90_ci_high = 0.013454391353420513 +variance_p99 = 0.019009581285355525 +variance_p99_ci_low = 0.017477167189578216 +variance_p99_ci_high = 0.02069365200187132 +upward_step_magnitude_p50 = 1.0876159561961842 +upward_step_magnitude_p50_ci_low = 1.0844279851751149 +upward_step_magnitude_p50_ci_high = 1.0900284883842273 +upward_step_magnitude_p90 = 1.1363246125587128 +upward_step_magnitude_p90_ci_low = 1.1324677318767309 +upward_step_magnitude_p90_ci_high = 1.140102429862646 +upward_step_magnitude_p95 = 1.1539580541030336 +upward_step_magnitude_p95_ci_low = 1.1451890992820732 +upward_step_magnitude_p95_ci_high = 1.160873046692045 +upward_step_magnitude_p99 = 1.1839711492098273 +upward_step_magnitude_p99_ci_low = 1.1768227457601959 +upward_step_magnitude_p99_ci_high = 1.2037462524096432 +upward_step_magnitude_mean = 1.0778964982041745 +fire_decisiveness_mean = 3.950398631797651 +fire_decisiveness_p50 = 2.963230008605862 + +[cell.spm_25.step_minus_50_at_15min] +shares_per_minute = 25 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.911 +convergence_rate_ci_low = 0.893351399874211 +convergence_rate_ci_high = 0.9286486001257891 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 1200 +convergence_p50_secs_ci_low = 1200 +convergence_p50_secs_ci_high = 1200 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1110.8232711306257 +settled_accuracy_p10 = 0.08410049391453467 +settled_accuracy_p10_ci_low = 0.07819974564398047 +settled_accuracy_p10_ci_high = 0.09468624625960342 +settled_accuracy_p50 = 0.17466659141525942 +settled_accuracy_p50_ci_low = 0.16907239643944516 +settled_accuracy_p50_ci_high = 0.17943668953043312 +settled_accuracy_p90 = 0.2761504959244452 +settled_accuracy_p90_ci_low = 0.2677232331091517 +settled_accuracy_p90_ci_high = 0.2947858223933022 +settled_accuracy_p95 = 0.3301301824737013 +settled_accuracy_p95_ci_low = 0.30899518500605416 +settled_accuracy_p95_ci_high = 0.3423494988075091 +settled_accuracy_p99 = 0.413369199889861 +settled_accuracy_p99_ci_low = 0.389588099880271 +settled_accuracy_p99_ci_high = 0.4301648039370891 +settled_accuracy_mean = 0.1800827681816202 +jitter_p10_per_min = 0.10526315789473684 +jitter_p10_per_min_ci_low = 0.1 +jitter_p10_per_min_ci_high = 0.1111111111111111 +jitter_p50_per_min = 0.15789473684210525 +jitter_p50_per_min_ci_low = 0.15789473684210525 +jitter_p50_per_min_ci_high = 0.16666666666666666 +jitter_p90_per_min = 0.18181818181818182 +jitter_p90_per_min_ci_low = 0.18181818181818182 +jitter_p90_per_min_ci_high = 0.1875 +jitter_p95_per_min = 0.1875 +jitter_p95_per_min_ci_low = 0.1875 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.15038504270561054 +reaction_rate = 0.996 +reaction_rate_ci_low = 0.9920878478557194 +reaction_rate_ci_high = 0.9999121521442806 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 60 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 115.72289156626506 +fire_decisiveness_mean = 6.325333746172186 +fire_decisiveness_p50 = 5.327332408747637 +step_correction_mean = 0.2941478222279424 +step_correction_p50 = 0.2758711576461792 + +[cell.spm_25.step_minus_25_at_15min] +shares_per_minute = 25 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 660 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 911.1711711711712 +settled_accuracy_p10 = 0.018935168453537043 +settled_accuracy_p10_ci_low = 0.016660625377655114 +settled_accuracy_p10_ci_high = 0.021217943549992624 +settled_accuracy_p50 = 0.0683911795331209 +settled_accuracy_p50_ci_low = 0.06437699576167266 +settled_accuracy_p50_ci_high = 0.07194025414216032 +settled_accuracy_p90 = 0.183379085173764 +settled_accuracy_p90_ci_low = 0.16623456015195592 +settled_accuracy_p90_ci_high = 0.19851356551985977 +settled_accuracy_p95 = 0.21901353371025856 +settled_accuracy_p95_ci_low = 0.2087914221629794 +settled_accuracy_p95_ci_high = 0.22746692405450997 +settled_accuracy_p99 = 0.2624277785597202 +settled_accuracy_p99_ci_low = 0.24730358823934173 +settled_accuracy_p99_ci_high = 0.2802627195678977 +settled_accuracy_mean = 0.08227551704918566 +jitter_p10_per_min = 0.05555555555555555 +jitter_p10_per_min_ci_low = 0.05263157894736842 +jitter_p10_per_min_ci_high = 0.058823529411764705 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.125 +jitter_p90_per_min_ci_low = 0.11764705882352941 +jitter_p90_per_min_ci_high = 0.125 +jitter_p95_per_min = 0.13333333333333333 +jitter_p95_per_min_ci_low = 0.13333333333333333 +jitter_p95_per_min_ci_high = 0.13636363636363635 +jitter_p99_per_min = 0.15384615384615385 +jitter_p99_per_min_ci_low = 0.14285714285714285 +jitter_p99_per_min_ci_high = 0.15384615384615385 +jitter_mean_per_min = 0.0846747181442843 +reaction_rate = 0.794 +reaction_rate_ci_low = 0.7689331401567727 +reaction_rate_ci_high = 0.8190668598432274 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 154.911838790932 +fire_decisiveness_mean = 4.684542207471131 +fire_decisiveness_p50 = 3.704708806669892 +step_correction_mean = 0.42950987845884464 +step_correction_p50 = 0.40623173117637634 + +[cell.spm_25.step_minus_10_at_15min] +shares_per_minute = 25 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.977 +convergence_rate_ci_low = 0.9677088970730058 +convergence_rate_ci_high = 0.9862911029269942 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 951.1566018423746 +settled_accuracy_p10 = 0.008006907739106062 +settled_accuracy_p10_ci_low = 0.006310544778576066 +settled_accuracy_p10_ci_high = 0.009065736488096166 +settled_accuracy_p50 = 0.037587227542670965 +settled_accuracy_p50_ci_low = 0.0345252737575632 +settled_accuracy_p50_ci_high = 0.03982642665057057 +settled_accuracy_p90 = 0.11422577435240888 +settled_accuracy_p90_ci_low = 0.11048587190632797 +settled_accuracy_p90_ci_high = 0.12030002136298856 +settled_accuracy_p95 = 0.1387076845987767 +settled_accuracy_p95_ci_low = 0.1250256784612982 +settled_accuracy_p95_ci_high = 0.14787788721907957 +settled_accuracy_p99 = 0.20237147813611833 +settled_accuracy_p99_ci_low = 0.1788135823867565 +settled_accuracy_p99_ci_high = 0.21593865355011488 +settled_accuracy_mean = 0.053290201621126486 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.058823529411764705 +jitter_p50_per_min_ci_low = 0.058823529411764705 +jitter_p50_per_min_ci_high = 0.0625 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.09523809523809523 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1111111111111111 +jitter_p95_per_min_ci_low = 0.10526315789473684 +jitter_p95_per_min_ci_high = 0.1111111111111111 +jitter_p99_per_min = 0.13333333333333333 +jitter_p99_per_min_ci_low = 0.125 +jitter_p99_per_min_ci_high = 0.14285714285714285 +jitter_mean_per_min = 0.04814648730326577 +reaction_rate = 0.506 +reaction_rate_ci_low = 0.4750119103137996 +reaction_rate_ci_high = 0.5369880896862004 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 177.15415019762847 +fire_decisiveness_mean = 3.9069340914113435 +fire_decisiveness_p50 = 3.1009639093535704 +step_correction_mean = 0.7147927495684077 +step_correction_p50 = 0.7562236785888672 + +[cell.spm_25.step_minus_5_at_15min] +shares_per_minute = 25 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.947 +convergence_rate_ci_low = 0.9331142610711565 +convergence_rate_ci_high = 0.9608857389288434 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 927.624076029567 +settled_accuracy_p10 = 0.012931313088072383 +settled_accuracy_p10_ci_low = 0.010997447531993831 +settled_accuracy_p10_ci_high = 0.014292280862890028 +settled_accuracy_p50 = 0.04106921233901728 +settled_accuracy_p50_ci_low = 0.0385566564470462 +settled_accuracy_p50_ci_high = 0.04404707990610124 +settled_accuracy_p90 = 0.12321491303079668 +settled_accuracy_p90_ci_low = 0.11976834302491302 +settled_accuracy_p90_ci_high = 0.1278523474998734 +settled_accuracy_p95 = 0.1380471023699108 +settled_accuracy_p95_ci_low = 0.13281303477376505 +settled_accuracy_p95_ci_high = 0.1443414900273048 +settled_accuracy_p99 = 0.1614834958462792 +settled_accuracy_p99_ci_low = 0.15366368837525413 +settled_accuracy_p99_ci_high = 0.1760883627365526 +settled_accuracy_mean = 0.05327505543015615 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.058823529411764705 +jitter_p50_per_min_ci_low = 0.058823529411764705 +jitter_p50_per_min_ci_high = 0.0625 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.09090909090909091 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.11764705882352941 +jitter_p99_per_min_ci_low = 0.1111111111111111 +jitter_p99_per_min_ci_high = 0.13333333333333333 +jitter_mean_per_min = 0.04986139830444648 +reaction_rate = 0.442 +reaction_rate_ci_low = 0.41121888797330414 +reaction_rate_ci_high = 0.47278111202669587 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 180.9502262443439 +fire_decisiveness_mean = 3.941216149944697 +fire_decisiveness_p50 = 2.9761626656612474 +step_correction_mean = 0.9544637816793778 +step_correction_p50 = 1.3930706977844238 + +[cell.spm_25.step_plus_5_at_15min] +shares_per_minute = 25 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.947 +convergence_rate_ci_low = 0.9331142610711565 +convergence_rate_ci_high = 0.9608857389288434 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 900 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 918.5638859556494 +settled_accuracy_p10 = 0.011560621231277768 +settled_accuracy_p10_ci_low = 0.009849408975383112 +settled_accuracy_p10_ci_high = 0.012799770526014664 +settled_accuracy_p50 = 0.039398786339292946 +settled_accuracy_p50_ci_low = 0.03706620986617981 +settled_accuracy_p50_ci_high = 0.04157234674858801 +settled_accuracy_p90 = 0.10824315499119341 +settled_accuracy_p90_ci_low = 0.10127073520259022 +settled_accuracy_p90_ci_high = 0.11279403111985276 +settled_accuracy_p95 = 0.12474209422366478 +settled_accuracy_p95_ci_low = 0.1179469057634247 +settled_accuracy_p95_ci_high = 0.13064793038164235 +settled_accuracy_p99 = 0.1680522411230625 +settled_accuracy_p99_ci_low = 0.15357973409292902 +settled_accuracy_p99_ci_high = 0.18021032303141893 +settled_accuracy_mean = 0.04908388167670931 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.0625 +jitter_p50_per_min_ci_low = 0.058823529411764705 +jitter_p50_per_min_ci_high = 0.0625 +jitter_p90_per_min = 0.09523809523809523 +jitter_p90_per_min_ci_low = 0.09090909090909091 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.10526315789473684 +jitter_p99_per_min = 0.125 +jitter_p99_per_min_ci_low = 0.11764705882352941 +jitter_p99_per_min_ci_high = 0.125 +jitter_mean_per_min = 0.053123710323069166 +reaction_rate = 0.411 +reaction_rate_ci_low = 0.38050457925523895 +reaction_rate_ci_high = 0.441495420744761 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 178.54014598540147 +fire_decisiveness_mean = 4.195943245796809 +fire_decisiveness_p50 = 3.239364171902393 +step_correction_mean = 0.9998416725881488 +step_correction_p50 = 1.4638919830322266 + +[cell.spm_25.step_plus_10_at_15min] +shares_per_minute = 25 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.983 +convergence_rate_ci_low = 0.9749876983581495 +convergence_rate_ci_high = 0.9910123016418505 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 933.5096642929807 +settled_accuracy_p10 = 0.006728395841275825 +settled_accuracy_p10_ci_low = 0.005451680183307328 +settled_accuracy_p10_ci_high = 0.008148297414533379 +settled_accuracy_p50 = 0.0353192127739651 +settled_accuracy_p50_ci_low = 0.03227186020954931 +settled_accuracy_p50_ci_high = 0.03893833287058723 +settled_accuracy_p90 = 0.1068169978458664 +settled_accuracy_p90_ci_low = 0.10328633943529852 +settled_accuracy_p90_ci_high = 0.1101687806264271 +settled_accuracy_p95 = 0.1239874721170291 +settled_accuracy_p95_ci_low = 0.11805980705469132 +settled_accuracy_p95_ci_high = 0.1319935597452231 +settled_accuracy_p99 = 0.1577521995388157 +settled_accuracy_p99_ci_low = 0.1534303886146272 +settled_accuracy_p99_ci_high = 0.17367365581095362 +settled_accuracy_mean = 0.05046761762369095 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.058823529411764705 +jitter_p50_per_min_ci_low = 0.05555555555555555 +jitter_p50_per_min_ci_high = 0.058823529411764705 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.09090909090909091 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.10526315789473684 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.11764705882352941 +jitter_p99_per_min = 0.13333333333333333 +jitter_p99_per_min_ci_low = 0.125 +jitter_p99_per_min_ci_high = 0.14285714285714285 +jitter_mean_per_min = 0.04712579119339667 +reaction_rate = 0.505 +reaction_rate_ci_low = 0.4740112284851432 +reaction_rate_ci_high = 0.5359887715148568 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 164.67326732673268 +fire_decisiveness_mean = 4.521339128868061 +fire_decisiveness_p50 = 3.3842786013263435 +step_correction_mean = 1.1761839677791783 +step_correction_p50 = 0.791226327419281 + +[cell.spm_25.step_plus_25_at_15min] +shares_per_minute = 25 +scenario = "step_plus_25_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 927.06 +settled_accuracy_p10 = 0.007528218471236414 +settled_accuracy_p10_ci_low = 0.006552401928182627 +settled_accuracy_p10_ci_high = 0.008971542191717363 +settled_accuracy_p50 = 0.035167620757834084 +settled_accuracy_p50_ci_low = 0.032621564214161625 +settled_accuracy_p50_ci_high = 0.03766858014612762 +settled_accuracy_p90 = 0.12120418853789228 +settled_accuracy_p90_ci_low = 0.11530333313075403 +settled_accuracy_p90_ci_high = 0.1263656653451769 +settled_accuracy_p95 = 0.13509239440769494 +settled_accuracy_p95_ci_low = 0.13216838075227644 +settled_accuracy_p95_ci_high = 0.139188289857886 +settled_accuracy_p99 = 0.1764222193255054 +settled_accuracy_p99_ci_low = 0.15233700975365572 +settled_accuracy_p99_ci_high = 0.18809830234979796 +settled_accuracy_mean = 0.04919854629319638 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.08333333333333333 +jitter_p90_per_min = 0.11764705882352941 +jitter_p90_per_min_ci_low = 0.1111111111111111 +jitter_p90_per_min_ci_high = 0.11764705882352941 +jitter_p95_per_min = 0.13333333333333333 +jitter_p95_per_min_ci_low = 0.125 +jitter_p95_per_min_ci_high = 0.13636363636363635 +jitter_p99_per_min = 0.15384615384615385 +jitter_p99_per_min_ci_low = 0.14285714285714285 +jitter_p99_per_min_ci_high = 0.15384615384615385 +jitter_mean_per_min = 0.07623355087465201 +reaction_rate = 0.749 +reaction_rate_ci_low = 0.7221259054403688 +reaction_rate_ci_high = 0.7758740945596312 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 151.88251001335112 +fire_decisiveness_mean = 5.59671731704427 +fire_decisiveness_p50 = 4.163440133423768 +step_correction_mean = 0.46088534911898016 +step_correction_p50 = 0.4096917510032654 + +[cell.spm_25.step_plus_50_at_15min] +shares_per_minute = 25 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.992 +convergence_rate_ci_low = 0.9864785022321837 +convergence_rate_ci_high = 0.9975214977678163 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1018.7903225806451 +settled_accuracy_p10 = 0.014699793868415245 +settled_accuracy_p10_ci_low = 0.012568953238633496 +settled_accuracy_p10_ci_high = 0.01726075757316803 +settled_accuracy_p50 = 0.0738155442202224 +settled_accuracy_p50_ci_low = 0.06940729720305472 +settled_accuracy_p50_ci_high = 0.08014990509464537 +settled_accuracy_p90 = 0.13868288207693158 +settled_accuracy_p90_ci_low = 0.13459228367972398 +settled_accuracy_p90_ci_high = 0.1439101256626888 +settled_accuracy_p95 = 0.15401600465860776 +settled_accuracy_p95_ci_low = 0.14833734211856953 +settled_accuracy_p95_ci_high = 0.15862038851379012 +settled_accuracy_p99 = 0.1857941989487889 +settled_accuracy_p99_ci_low = 0.17609857880428292 +settled_accuracy_p99_ci_high = 0.19257908399264811 +settled_accuracy_mean = 0.07637172422623692 +jitter_p10_per_min = 0.08333333333333333 +jitter_p10_per_min_ci_low = 0.08333333333333333 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.1875 +jitter_mean_per_min = 0.10669739886806494 +reaction_rate = 0.966 +reaction_rate_ci_low = 0.9547673017311066 +reaction_rate_ci_high = 0.9772326982688934 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 120.31055900621118 +fire_decisiveness_mean = 7.763396086257492 +fire_decisiveness_p50 = 5.896975286986844 +step_correction_mean = 0.32477126926121996 +step_correction_p50 = 0.30857232213020325 + +[cell.spm_30.cold_start_10gh_to_1ph] +shares_per_minute = 30 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 60 +convergence_p10_secs_ci_low = 60 +convergence_p10_secs_ci_high = 60 +convergence_p50_secs = 60 +convergence_p50_secs_ci_low = 60 +convergence_p50_secs_ci_high = 180 +convergence_p90_secs = 480 +convergence_p90_secs_ci_low = 480 +convergence_p90_secs_ci_high = 480 +convergence_p95_secs = 480 +convergence_p95_secs_ci_low = 480 +convergence_p95_secs_ci_high = 480 +convergence_p99_secs = 480 +convergence_p99_secs_ci_low = 480 +convergence_p99_secs_ci_high = 540 +convergence_mean_secs = 186.18 +settled_accuracy_p10 = 0.004330736376850108 +settled_accuracy_p10_ci_low = 0.0023667283374765313 +settled_accuracy_p10_ci_high = 0.0057829722127020755 +settled_accuracy_p50 = 0.04734409620834246 +settled_accuracy_p50_ci_low = 0.041659706918138806 +settled_accuracy_p50_ci_high = 0.05175764492444579 +settled_accuracy_p90 = 0.09448236952811928 +settled_accuracy_p90_ci_low = 0.09079500583880673 +settled_accuracy_p90_ci_high = 0.09944829131099253 +settled_accuracy_p95 = 0.10896701270458053 +settled_accuracy_p95_ci_low = 0.10332597574108482 +settled_accuracy_p95_ci_high = 0.11586768306174267 +settled_accuracy_p99 = 0.15612092238987274 +settled_accuracy_p99_ci_low = 0.13424168761078414 +settled_accuracy_p99_ci_high = 0.1660014276739913 +settled_accuracy_mean = 0.049357037213409054 +jitter_p10_per_min = 0.037037037037037035 +jitter_p10_per_min_ci_low = 0.037037037037037035 +jitter_p10_per_min_ci_high = 0.037037037037037035 +jitter_p50_per_min = 0.05 +jitter_p50_per_min_ci_low = 0.047619047619047616 +jitter_p50_per_min_ci_high = 0.05 +jitter_p90_per_min = 0.08 +jitter_p90_per_min_ci_low = 0.08 +jitter_p90_per_min_ci_high = 0.08 +jitter_p95_per_min = 0.08 +jitter_p95_per_min_ci_low = 0.08 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.12 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.12 +jitter_mean_per_min = 0.05468971734892737 +bias_mean = 0.000313582330227401 +bias_p10 = -0.05079912194337354 +bias_p10_ci_low = -0.055554692755325 +bias_p10_ci_high = -0.047083865690592475 +bias_p50 = -0.0011682028633452416 +bias_p50_ci_low = -0.004316986123642174 +bias_p50_ci_high = 0.002214076862163541 +bias_p90 = 0.05217819852037736 +bias_p90_ci_low = 0.04818062233716659 +bias_p90_ci_high = 0.05484639753909108 +bias_p99 = 0.09432982401417192 +bias_p99_ci_low = 0.08553055203656879 +bias_p99_ci_high = 0.10278403633678011 +variance_mean = 0.006461145172835724 +variance_p10 = 0.003123400292009434 +variance_p10_ci_low = 0.0029866993218940164 +variance_p10_ci_high = 0.0032999836942461786 +variance_p50 = 0.005880462450450918 +variance_p50_ci_low = 0.0056235272376613625 +variance_p50_ci_high = 0.006081218824542059 +variance_p90 = 0.010513890395532754 +variance_p90_ci_low = 0.010158211575080551 +variance_p90_ci_high = 0.01103376730572925 +variance_p99 = 0.016464117209285135 +variance_p99_ci_low = 0.014930335892423229 +variance_p99_ci_high = 0.017044059972474827 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.0021619120818840987 +ramp_target_overshoot_p50_ci_low = 0.000004966056000643704 +ramp_target_overshoot_p50_ci_high = 0.008700999875110416 +ramp_target_overshoot_p90 = 0.09454988104618156 +ramp_target_overshoot_p90_ci_low = 0.08787066994310044 +ramp_target_overshoot_p90_ci_high = 0.10211412385920804 +ramp_target_overshoot_p99 = 0.14662287052666567 +ramp_target_overshoot_p99_ci_low = 0.1352327513272289 +ramp_target_overshoot_p99_ci_high = 0.15204915912256767 +ramp_target_overshoot_mean = 0.030986648288680353 + +[cell.spm_30.stable_1ph] +shares_per_minute = 30 +scenario = "stable_1ph" +convergence_rate = 0.896 +convergence_rate_ci_low = 0.8770797554349845 +convergence_rate_ci_high = 0.9149202445650155 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 963.1473214285714 +settled_accuracy_p10 = 0.004432607633727326 +settled_accuracy_p10_ci_low = 0.0019851473318086565 +settled_accuracy_p10_ci_high = 0.006336217694715152 +settled_accuracy_p50 = 0.06534222400523015 +settled_accuracy_p50_ci_low = 0.06356652344069025 +settled_accuracy_p50_ci_high = 0.06691270566098839 +settled_accuracy_p90 = 0.09596775714321859 +settled_accuracy_p90_ci_low = 0.09288074935905999 +settled_accuracy_p90_ci_high = 0.09729866015138011 +settled_accuracy_p95 = 0.10561653551693051 +settled_accuracy_p95_ci_low = 0.10075570621644858 +settled_accuracy_p95_ci_high = 0.11035898477977657 +settled_accuracy_p99 = 0.1273870539349249 +settled_accuracy_p99_ci_low = 0.11711644481929961 +settled_accuracy_p99_ci_high = 0.13265214703740202 +settled_accuracy_mean = 0.057299324998904444 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.05263157894736842 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.05555555555555555 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.10526315789473684 +jitter_mean_per_min = 0.03712416023167497 +bias_mean = 0.00041934610259386534 +bias_p10 = -0.050524463019675905 +bias_p10_ci_low = -0.053844335032898295 +bias_p10_ci_high = -0.04625429415939646 +bias_p50 = -0.0011179948362836688 +bias_p50_ci_low = -0.004041232265833446 +bias_p50_ci_high = 0.0015914090254620535 +bias_p90 = 0.052294314516835284 +bias_p90_ci_low = 0.048749472396285444 +bias_p90_ci_high = 0.055868370185878036 +bias_p99 = 0.0961156156327614 +bias_p99_ci_low = 0.0867478079480907 +bias_p99_ci_high = 0.10420227623450562 +variance_mean = 0.006441095228252787 +variance_p10 = 0.003282943930250553 +variance_p10_ci_low = 0.0030625883773270656 +variance_p10_ci_high = 0.00342293475596659 +variance_p50 = 0.005824697033087254 +variance_p50_ci_low = 0.005658403361792529 +variance_p50_ci_high = 0.0060359642859360565 +variance_p90 = 0.010587045184770964 +variance_p90_ci_low = 0.010007483401401117 +variance_p90_ci_high = 0.011194701203307133 +variance_p99 = 0.01730072173788837 +variance_p99_ci_low = 0.014348830910977921 +variance_p99_ci_high = 0.01888232862030432 +upward_step_magnitude_p50 = 1.0737531122574946 +upward_step_magnitude_p50_ci_low = 1.07096527579294 +upward_step_magnitude_p50_ci_high = 1.077780852109443 +upward_step_magnitude_p90 = 1.1217165653428522 +upward_step_magnitude_p90_ci_low = 1.1166331267744842 +upward_step_magnitude_p90_ci_high = 1.1264369266260528 +upward_step_magnitude_p95 = 1.137681878225381 +upward_step_magnitude_p95_ci_low = 1.1305090730394924 +upward_step_magnitude_p95_ci_high = 1.1429710548218344 +upward_step_magnitude_p99 = 1.1589394987926263 +upward_step_magnitude_p99_ci_low = 1.1527500089352456 +upward_step_magnitude_p99_ci_high = 1.176091435635548 +upward_step_magnitude_mean = 1.0624076256590442 +fire_decisiveness_mean = 3.418701964454621 +fire_decisiveness_p50 = 2.671243944509488 + +[cell.spm_30.step_minus_50_at_15min] +shares_per_minute = 30 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.926 +convergence_rate_ci_low = 0.9097752720084434 +convergence_rate_ci_high = 0.9422247279915567 +convergence_p10_secs = 720 +convergence_p10_secs_ci_low = 720 +convergence_p10_secs_ci_high = 780 +convergence_p50_secs = 1200 +convergence_p50_secs_ci_low = 1200 +convergence_p50_secs_ci_high = 1260 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1142.7861771058315 +settled_accuracy_p10 = 0.10079234765666922 +settled_accuracy_p10_ci_low = 0.09515050538679493 +settled_accuracy_p10_ci_high = 0.1063325871051255 +settled_accuracy_p50 = 0.1821944612235249 +settled_accuracy_p50_ci_low = 0.17641880387709397 +settled_accuracy_p50_ci_high = 0.18700334826259501 +settled_accuracy_p90 = 0.32500950764843095 +settled_accuracy_p90_ci_low = 0.3111109932977705 +settled_accuracy_p90_ci_high = 0.3387954133238342 +settled_accuracy_p95 = 0.3743785467454517 +settled_accuracy_p95_ci_low = 0.3543780917473478 +settled_accuracy_p95_ci_high = 0.3872466715848517 +settled_accuracy_p99 = 0.44199824429787715 +settled_accuracy_p99_ci_low = 0.4239077075940594 +settled_accuracy_p99_ci_high = 0.45939997561263857 +settled_accuracy_mean = 0.1960525450332359 +jitter_p10_per_min = 0.09523809523809523 +jitter_p10_per_min_ci_low = 0.09090909090909091 +jitter_p10_per_min_ci_high = 0.1 +jitter_p50_per_min = 0.16666666666666666 +jitter_p50_per_min_ci_low = 0.15789473684210525 +jitter_p50_per_min_ci_high = 0.16666666666666666 +jitter_p90_per_min = 0.18181818181818182 +jitter_p90_per_min_ci_low = 0.17647058823529413 +jitter_p90_per_min_ci_high = 0.18181818181818182 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.18181818181818182 +jitter_p95_per_min_ci_high = 0.1875 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.1875 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.14750619348156416 +reaction_rate = 0.997 +reaction_rate_ci_low = 0.9936102764714508 +reaction_rate_ci_high = 1 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 60 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 60 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 106.27883650952859 +fire_decisiveness_mean = 5.985038700453036 +fire_decisiveness_p50 = 4.97138864864683 +step_correction_mean = 0.2770484191185254 +step_correction_p50 = 0.25404584407806396 + +[cell.spm_30.step_minus_25_at_15min] +shares_per_minute = 30 +scenario = "step_minus_25_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 720 +convergence_p10_secs_ci_low = 660 +convergence_p10_secs_ci_high = 720 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1260 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1320 +convergence_mean_secs = 956.04 +settled_accuracy_p10 = 0.020453976249367845 +settled_accuracy_p10_ci_low = 0.017120902701901253 +settled_accuracy_p10_ci_high = 0.02360916656965717 +settled_accuracy_p50 = 0.06922681909982686 +settled_accuracy_p50_ci_low = 0.06656232878851243 +settled_accuracy_p50_ci_high = 0.07185605488824987 +settled_accuracy_p90 = 0.2066463544541628 +settled_accuracy_p90_ci_low = 0.1990594737537683 +settled_accuracy_p90_ci_high = 0.21685853388966292 +settled_accuracy_p95 = 0.22711679474467816 +settled_accuracy_p95_ci_low = 0.22054898450420546 +settled_accuracy_p95_ci_high = 0.23040817131836966 +settled_accuracy_p99 = 0.2513453313840148 +settled_accuracy_p99_ci_low = 0.2408373360787719 +settled_accuracy_p99_ci_high = 0.2726490848006389 +settled_accuracy_mean = 0.08845624783965382 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.1111111111111111 +jitter_p95_per_min = 0.125 +jitter_p95_per_min_ci_low = 0.11764705882352941 +jitter_p95_per_min_ci_high = 0.13333333333333333 +jitter_p99_per_min = 0.14285714285714285 +jitter_p99_per_min_ci_low = 0.14285714285714285 +jitter_p99_per_min_ci_high = 0.15384615384615385 +jitter_mean_per_min = 0.07906960270319988 +reaction_rate = 0.804 +reaction_rate_ci_low = 0.7793956366796456 +reaction_rate_ci_high = 0.8286043633203545 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 146.49253731343285 +fire_decisiveness_mean = 4.2847907478621465 +fire_decisiveness_p50 = 3.450522250848074 +step_correction_mean = 0.4035220890125232 +step_correction_p50 = 0.37747278809547424 + +[cell.spm_30.step_minus_10_at_15min] +shares_per_minute = 30 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.964 +convergence_rate_ci_low = 0.9524536202037175 +convergence_rate_ci_high = 0.9755463797962824 +convergence_p10_secs = 660 +convergence_p10_secs_ci_low = 660 +convergence_p10_secs_ci_high = 720 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1026.0373443983403 +settled_accuracy_p10 = 0.006934955478860916 +settled_accuracy_p10_ci_low = 0.005627376539262929 +settled_accuracy_p10_ci_high = 0.008550713236738838 +settled_accuracy_p50 = 0.030328509075914667 +settled_accuracy_p50_ci_low = 0.028650638335789624 +settled_accuracy_p50_ci_high = 0.03262795703093979 +settled_accuracy_p90 = 0.10706824114004543 +settled_accuracy_p90_ci_low = 0.10143803111539773 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.1340307187098395 +settled_accuracy_p95_ci_low = 0.11886970776699357 +settled_accuracy_p95_ci_high = 0.1456644131758562 +settled_accuracy_p99 = 0.19492627159181097 +settled_accuracy_p99_ci_low = 0.18761573016867805 +settled_accuracy_p99_ci_high = 0.2044174037146247 +settled_accuracy_mean = 0.04634198990458984 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.05263157894736842 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.11764705882352941 +jitter_p99_per_min_ci_low = 0.10526315789473684 +jitter_p99_per_min_ci_high = 0.125 +jitter_mean_per_min = 0.036407302278045305 +reaction_rate = 0.5 +reaction_rate_ci_low = 0.4690096789303499 +reaction_rate_ci_high = 0.5309903210696502 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 185.88 +fire_decisiveness_mean = 3.532659797547587 +fire_decisiveness_p50 = 2.7471715123405573 +step_correction_mean = 0.7276219483017922 +step_correction_p50 = 0.7989371418952942 + +[cell.spm_30.step_minus_5_at_15min] +shares_per_minute = 30 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.896 +convergence_rate_ci_low = 0.8770797554349845 +convergence_rate_ci_high = 0.9149202445650155 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 983.9732142857143 +settled_accuracy_p10 = 0.01251163544091205 +settled_accuracy_p10_ci_low = 0.011208522571501511 +settled_accuracy_p10_ci_high = 0.01325216410194252 +settled_accuracy_p50 = 0.035802932487846384 +settled_accuracy_p50_ci_low = 0.033729409852414904 +settled_accuracy_p50_ci_high = 0.03766382598374707 +settled_accuracy_p90 = 0.12041541376182407 +settled_accuracy_p90_ci_low = 0.11399005785702454 +settled_accuracy_p90_ci_high = 0.12413013666261108 +settled_accuracy_p95 = 0.13396547058184027 +settled_accuracy_p95_ci_low = 0.12732847451025187 +settled_accuracy_p95_ci_high = 0.13965164000290198 +settled_accuracy_p99 = 0.16434007297064746 +settled_accuracy_p99_ci_low = 0.15351308195482893 +settled_accuracy_p99_ci_high = 0.17193566619287814 +settled_accuracy_mean = 0.0479211536536574 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.05263157894736842 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.05555555555555555 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.10526315789473684 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.11764705882352941 +jitter_mean_per_min = 0.03782375385538941 +reaction_rate = 0.372 +reaction_rate_ci_low = 0.34204237616899497 +reaction_rate_ci_high = 0.40195762383100503 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 189.3548387096774 +fire_decisiveness_mean = 3.5138797484646607 +fire_decisiveness_p50 = 2.682187691616784 +step_correction_mean = 0.9642009115026843 +step_correction_p50 = 1.470743179321289 + +[cell.spm_30.step_plus_5_at_15min] +shares_per_minute = 30 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.904 +convergence_rate_ci_low = 0.8857410456378247 +convergence_rate_ci_high = 0.9222589543621753 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 991.1946902654868 +settled_accuracy_p10 = 0.012133283583291465 +settled_accuracy_p10_ci_low = 0.010963416207034893 +settled_accuracy_p10_ci_high = 0.013366680689224752 +settled_accuracy_p50 = 0.03653330153012058 +settled_accuracy_p50_ci_low = 0.0339004608014537 +settled_accuracy_p50_ci_high = 0.039126643895668556 +settled_accuracy_p90 = 0.11065587862830495 +settled_accuracy_p90_ci_low = 0.10554767931777498 +settled_accuracy_p90_ci_high = 0.11361339845833673 +settled_accuracy_p95 = 0.125809956118469 +settled_accuracy_p95_ci_low = 0.11777900576356537 +settled_accuracy_p95_ci_high = 0.12787652581601505 +settled_accuracy_p99 = 0.1468721706421321 +settled_accuracy_p99_ci_low = 0.13669680430120557 +settled_accuracy_p99_ci_high = 0.17444739680860888 +settled_accuracy_mean = 0.046602216139389016 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.05 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.05555555555555555 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.125 +jitter_mean_per_min = 0.03825542239473793 +reaction_rate = 0.402 +reaction_rate_ci_low = 0.3716107704342476 +reaction_rate_ci_high = 0.43238922956575243 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 173.43283582089552 +fire_decisiveness_mean = 3.5289343013079333 +fire_decisiveness_p50 = 2.5850726398443946 +step_correction_mean = 1.0549221999609648 +step_correction_p50 = 1.5214688777923584 + +[cell.spm_30.step_plus_10_at_15min] +shares_per_minute = 30 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.963 +convergence_rate_ci_low = 0.9513004252384969 +convergence_rate_ci_high = 0.974699574761503 +convergence_p10_secs = 720 +convergence_p10_secs_ci_low = 660 +convergence_p10_secs_ci_high = 720 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1030.8411214953271 +settled_accuracy_p10 = 0.004892541319385879 +settled_accuracy_p10_ci_low = 0.004293564192710542 +settled_accuracy_p10_ci_high = 0.00549896142930173 +settled_accuracy_p50 = 0.024670622063186376 +settled_accuracy_p50_ci_low = 0.02281426883335569 +settled_accuracy_p50_ci_high = 0.026457426105360837 +settled_accuracy_p90 = 0.09793910504959435 +settled_accuracy_p90_ci_low = 0.09267276735058538 +settled_accuracy_p90_ci_high = 0.10632039224277645 +settled_accuracy_p95 = 0.1183353194507053 +settled_accuracy_p95_ci_low = 0.11018391062514521 +settled_accuracy_p95_ci_high = 0.13121509690794686 +settled_accuracy_p99 = 0.16056778248576975 +settled_accuracy_p99_ci_low = 0.1549817625557789 +settled_accuracy_p99_ci_high = 0.16810691442771664 +settled_accuracy_mean = 0.03990362605671296 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.05 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.13333333333333333 +jitter_p99_per_min_ci_low = 0.11764705882352941 +jitter_p99_per_min_ci_high = 0.14285714285714285 +jitter_mean_per_min = 0.03547633368777172 +reaction_rate = 0.527 +reaction_rate_ci_low = 0.4960548958056367 +reaction_rate_ci_high = 0.5579451041943633 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 178.9753320683112 +fire_decisiveness_mean = 4.180801327243615 +fire_decisiveness_p50 = 3.0853892967704795 +step_correction_mean = 0.6945736674588364 +step_correction_p50 = 0.827505350112915 + +[cell.spm_30.step_plus_25_at_15min] +shares_per_minute = 30 +scenario = "step_plus_25_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 720 +convergence_p10_secs_ci_low = 720 +convergence_p10_secs_ci_high = 780 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1320 +convergence_mean_secs = 972.9 +settled_accuracy_p10 = 0.00670895348185474 +settled_accuracy_p10_ci_low = 0.0055637004835917825 +settled_accuracy_p10_ci_high = 0.0077537042481305996 +settled_accuracy_p50 = 0.03502674583436505 +settled_accuracy_p50_ci_low = 0.03279636937834429 +settled_accuracy_p50_ci_high = 0.037998648373828825 +settled_accuracy_p90 = 0.12780630471117094 +settled_accuracy_p90_ci_low = 0.12418060079289384 +settled_accuracy_p90_ci_high = 0.13282738977879416 +settled_accuracy_p95 = 0.1397988194423715 +settled_accuracy_p95_ci_low = 0.13658113740609323 +settled_accuracy_p95_ci_high = 0.14339982729936973 +settled_accuracy_p99 = 0.16701361053624164 +settled_accuracy_p99_ci_low = 0.1526078074342876 +settled_accuracy_p99_ci_high = 0.18008303460047037 +settled_accuracy_mean = 0.05433686463745219 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.08333333333333333 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.11764705882352941 +jitter_p95_per_min_ci_low = 0.10526315789473684 +jitter_p95_per_min_ci_high = 0.125 +jitter_p99_per_min = 0.14285714285714285 +jitter_p99_per_min_ci_low = 0.13333333333333333 +jitter_p99_per_min_ci_high = 0.15 +jitter_mean_per_min = 0.06629351212841851 +reaction_rate = 0.828 +reaction_rate_ci_low = 0.8046097177101258 +reaction_rate_ci_high = 0.8513902822898741 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 143.9855072463768 +fire_decisiveness_mean = 5.513142703132246 +fire_decisiveness_p50 = 4.211150669325363 +step_correction_mean = 0.4343878782313803 +step_correction_p50 = 0.41036444902420044 + +[cell.spm_30.step_plus_50_at_15min] +shares_per_minute = 30 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 780 +convergence_p10_secs_ci_low = 720 +convergence_p10_secs_ci_high = 840 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 1047.027027027027 +settled_accuracy_p10 = 0.022364610328805656 +settled_accuracy_p10_ci_low = 0.019345695740403568 +settled_accuracy_p10_ci_high = 0.027810002459763505 +settled_accuracy_p50 = 0.10158188117955191 +settled_accuracy_p50_ci_low = 0.09907594674276399 +settled_accuracy_p50_ci_high = 0.1040513978731501 +settled_accuracy_p90 = 0.14483935972417716 +settled_accuracy_p90_ci_low = 0.14202499295133242 +settled_accuracy_p90_ci_high = 0.1478051240927888 +settled_accuracy_p95 = 0.15514432834809921 +settled_accuracy_p95_ci_low = 0.1522310878498866 +settled_accuracy_p95_ci_high = 0.15902608396249385 +settled_accuracy_p99 = 0.17657102520242052 +settled_accuracy_p99_ci_low = 0.16780284954971292 +settled_accuracy_p99_ci_high = 0.1878399455398152 +settled_accuracy_mean = 0.0933584119752277 +jitter_p10_per_min = 0.08333333333333333 +jitter_p10_per_min_ci_low = 0.07692307692307693 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.15789473684210525 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.09790381928687791 +reaction_rate = 0.971 +reaction_rate_ci_low = 0.9605992493347836 +reaction_rate_ci_high = 0.9814007506652164 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 60 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 60 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 104.6755921730175 +fire_decisiveness_mean = 7.725707475879427 +fire_decisiveness_p50 = 6.046056588950272 +step_correction_mean = 0.2945824574859454 +step_correction_p50 = 0.26893889904022217 + +[derived.operational_fitness.spm_6] +score = 0.5036465763201865 +reaction_10_component = 0.847 +reaction_50_component = 0.993 +jitter_component = 0.41775082426924826 +step_safety_component = 0.3186381091047048 +convergence_component = 0.2826 +overshoot_component = 0.5080934297669826 + +[derived.operational_fitness.spm_8] +score = 0.5714093738256987 +reaction_10_component = 0.747 +reaction_50_component = 0.996 +jitter_component = 0.5192079654758841 +step_safety_component = 0.42694064327639314 +convergence_component = 0.396 +overshoot_component = 0.6382222163762945 + +[derived.operational_fitness.spm_10] +score = 0.5986995900795171 +reaction_10_component = 0.654 +reaction_50_component = 0.995 +jitter_component = 0.5910206308588277 +step_safety_component = 0.4976676690149575 +convergence_component = 0.4 +overshoot_component = 0.6892751511107087 + +[derived.operational_fitness.spm_12] +score = 0.6206360514039133 +reaction_10_component = 0.613 +reaction_50_component = 0.996 +jitter_component = 0.6429710769018082 +step_safety_component = 0.5365739195783958 +convergence_component = 0.4 +overshoot_component = 0.7419980228386232 + +[derived.operational_fitness.spm_15] +score = 0.6436942622510811 +reaction_10_component = 0.551 +reaction_50_component = 0.997 +jitter_component = 0.7075506791393062 +step_safety_component = 0.5911574868162401 +convergence_component = 0.4 +overshoot_component = 0.766672207621943 + +[derived.operational_fitness.spm_20] +score = 0.6897878734956477 +reaction_10_component = 0.496 +reaction_50_component = 0.999 +jitter_component = 0.7728241074023839 +step_safety_component = 0.6596850833932275 +convergence_component = 0.5 +overshoot_component = 0.8236057579674496 + +[derived.operational_fitness.spm_25] +score = 0.7284227676897654 +reaction_10_component = 0.506 +reaction_50_component = 0.996 +jitter_component = 0.8280939498952603 +step_safety_component = 0.6920838917939327 +convergence_component = 0.6 +overshoot_component = 0.8287830726746728 + +[derived.operational_fitness.spm_30] +score = 0.7952599736415804 +reaction_10_component = 0.5 +reaction_50_component = 0.997 +jitter_component = 0.8762527992277501 +step_safety_component = 0.724636243549238 +convergence_component = 0.9 +overshoot_component = 0.8533771294733343 + +[derived.decoupling_score.spm_6] +score = 0.6476086956521739 +score_ci_low = 0.6286206876461327 +score_ci_high = 0.6509787983750814 + +[derived.decoupling_score.spm_8] +score = 0.7114285714285714 +score_ci_low = 0.6944614934990035 +score_ci_high = 0.7142229658173433 + +[derived.decoupling_score.spm_10] +score = 0.74625 +score_ci_low = 0.7429712079205903 +score_ci_high = 0.7642254350613589 + +[derived.decoupling_score.spm_12] +score = 0.7863157894736842 +score_ci_low = 0.7832272483071469 +score_ci_high = 0.7999297217154245 + +[derived.decoupling_score.spm_15] +score = 0.8236086956521739 +score_ci_low = 0.8129538625675506 +score_ci_high = 0.8333333333333334 + +[derived.decoupling_score.spm_20] +score = 0.8658 +score_ci_low = 0.8546065544958193 +score_ci_high = 0.8666666666666667 + +[derived.decoupling_score.spm_25] +score = 0.8714999999999999 +score_ci_low = 0.8680768668737544 +score_ci_high = 0.8822754283626005 + +[derived.decoupling_score.spm_30] +score = 0.8920526315789473 +score_ci_low = 0.8832091346412896 +score_ci_high = 1 + +[derived.reaction_asymmetry.spm_6] +asymmetry_at_5 = -0.0119999999999999 +asymmetry_at_5_ci_low = -0.060023447553169684 +asymmetry_at_5_ci_high = 0.036023447553169885 +asymmetry_at_10 = 0.02100000000000002 +asymmetry_at_10_ci_low = -0.0222921315555914 +asymmetry_at_10_ci_high = 0.06429213155559144 +asymmetry_at_25 = -0.016000000000000014 +asymmetry_at_25_ci_low = -0.053151591228133066 +asymmetry_at_25_ci_high = 0.021151591228133038 +asymmetry_at_50 = -0.027000000000000024 +asymmetry_at_50_ci_low = -0.043400189110684995 +asymmetry_at_50_ci_high = -0.010599810889315053 +max_abs_asymmetry = 0.027000000000000024 +max_abs_asymmetry_ci_low = 0.010599810889315053 +max_abs_asymmetry_ci_high = 0.043400189110684995 + +[derived.reaction_asymmetry.spm_8] +asymmetry_at_5 = -0.017000000000000015 +asymmetry_at_5_ci_low = -0.07192419091395041 +asymmetry_at_5_ci_high = 0.037924190913950384 +asymmetry_at_10 = 0.009000000000000008 +asymmetry_at_10_ci_low = -0.04456513834802356 +asymmetry_at_10_ci_high = 0.06256513834802357 +asymmetry_at_25 = -0.030000000000000027 +asymmetry_at_25_ci_low = -0.07305824380570758 +asymmetry_at_25_ci_high = 0.013058243805707526 +asymmetry_at_50 = -0.03700000000000003 +asymmetry_at_50_ci_low = -0.05320230553632588 +asymmetry_at_50_ci_high = -0.020797694463674188 +max_abs_asymmetry = 0.03700000000000003 +max_abs_asymmetry_ci_low = 0.020797694463674188 +max_abs_asymmetry_ci_high = 0.05320230553632588 + +[derived.reaction_asymmetry.spm_10] +asymmetry_at_5 = 0.0020000000000000018 +asymmetry_at_5_ci_low = -0.0562430570609711 +asymmetry_at_5_ci_high = 0.060243057060971106 +asymmetry_at_10 = 0.03300000000000003 +asymmetry_at_10_ci_low = -0.025225081949470818 +asymmetry_at_10_ci_high = 0.09122508194947088 +asymmetry_at_25 = -0.02399999999999991 +asymmetry_at_25_ci_low = -0.07137685877170541 +asymmetry_at_25_ci_high = 0.02337685877170559 +asymmetry_at_50 = -0.025000000000000022 +asymmetry_at_50_ci_low = -0.03994482827660706 +asymmetry_at_50_ci_high = -0.010055171723392986 +max_abs_asymmetry = 0.03300000000000003 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.09122508194947088 + +[derived.reaction_asymmetry.spm_12] +asymmetry_at_5 = 0.0020000000000000018 +asymmetry_at_5_ci_low = -0.059387497952595014 +asymmetry_at_5_ci_high = 0.06338749795259502 +asymmetry_at_10 = 0.03600000000000003 +asymmetry_at_10_ci_low = -0.023770820634398837 +asymmetry_at_10_ci_high = 0.0957708206343989 +asymmetry_at_25 = 0.007000000000000006 +asymmetry_at_25_ci_low = -0.0422531039710593 +asymmetry_at_25_ci_high = 0.056253103971059315 +asymmetry_at_50 = -0.025000000000000022 +asymmetry_at_50_ci_low = -0.03931290280949706 +asymmetry_at_50_ci_high = -0.010687097190502981 +max_abs_asymmetry = 0.03600000000000003 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.0957708206343989 + +[derived.reaction_asymmetry.spm_15] +asymmetry_at_5 = 0.020000000000000018 +asymmetry_at_5_ci_low = -0.041950381051535424 +asymmetry_at_5_ci_high = 0.08195038105153557 +asymmetry_at_10 = 0.0010000000000000009 +asymmetry_at_10_ci_low = -0.06065095767956419 +asymmetry_at_10_ci_high = 0.06265095767956419 +asymmetry_at_25 = -0.009000000000000008 +asymmetry_at_25_ci_low = -0.060135194661582125 +asymmetry_at_25_ci_high = 0.04213519466158211 +asymmetry_at_50 = -0.03600000000000003 +asymmetry_at_50_ci_low = -0.05099913856908078 +asymmetry_at_50_ci_high = -0.020611137902370125 +max_abs_asymmetry = 0.03600000000000003 +max_abs_asymmetry_ci_low = 0.020805999666644703 +max_abs_asymmetry_ci_high = 0.05119400033335536 + +[derived.reaction_asymmetry.spm_20] +asymmetry_at_5 = -0.0020000000000000018 +asymmetry_at_5_ci_low = -0.06368216726242193 +asymmetry_at_5_ci_high = 0.059682167262421926 +asymmetry_at_10 = 0.031000000000000028 +asymmetry_at_10_ci_low = -0.030934433557871566 +asymmetry_at_10_ci_high = 0.09293443355787162 +asymmetry_at_25 = 0.019000000000000017 +asymmetry_at_25_ci_low = -0.03440649411383534 +asymmetry_at_25_ci_high = 0.07240649411383537 +asymmetry_at_50 = -0.03500000000000003 +asymmetry_at_50_ci_low = -0.04754637979628251 +asymmetry_at_50_ci_high = -0.021494600448840107 +max_abs_asymmetry = 0.03500000000000003 +max_abs_asymmetry_ci_low = 0.02197411032627883 +max_abs_asymmetry_ci_high = 0.048025889673721234 + +[derived.reaction_asymmetry.spm_25] +asymmetry_at_5 = -0.031000000000000028 +asymmetry_at_5_ci_low = -0.09227653277145692 +asymmetry_at_5_ci_high = 0.030276532771456866 +asymmetry_at_10 = -0.0010000000000000009 +asymmetry_at_10_ci_low = -0.06297686120105717 +asymmetry_at_10_ci_high = 0.06097686120105722 +asymmetry_at_25 = -0.04500000000000004 +asymmetry_at_25_ci_low = -0.09694095440285855 +asymmetry_at_25_ci_high = 0.006940954402858468 +asymmetry_at_50 = -0.030000000000000027 +asymmetry_at_50_ci_low = -0.045144850413174065 +asymmetry_at_50_ci_high = -0.014855149586825989 +max_abs_asymmetry = 0.04500000000000004 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.09694095440285855 + +[derived.reaction_asymmetry.spm_30] +asymmetry_at_5 = 0.030000000000000027 +asymmetry_at_5_ci_low = -0.03034685339675741 +asymmetry_at_5_ci_high = 0.09034685339675746 +asymmetry_at_10 = 0.027000000000000024 +asymmetry_at_10_ci_low = -0.03493542526401344 +asymmetry_at_10_ci_high = 0.08893542526401338 +asymmetry_at_25 = 0.02399999999999991 +asymmetry_at_25_ci_low = -0.023994645610228682 +asymmetry_at_25_ci_high = 0.0719946456102285 +asymmetry_at_50 = -0.026000000000000023 +asymmetry_at_50_ci_low = -0.03940075066521642 +asymmetry_at_50_ci_high = -0.012209525806234467 +max_abs_asymmetry = 0.030000000000000027 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.09034685339675746 + diff --git a/sv2/channels-sv2/sim/baseline_FullRemedy.md b/sv2/channels-sv2/sim/baseline_FullRemedy.md new file mode 100644 index 0000000000..09a7cf63a6 --- /dev/null +++ b/sv2/channels-sv2/sim/baseline_FullRemedy.md @@ -0,0 +1,227 @@ +# Vardiff baseline characterization — `FullRemedy` + +*Generated by `cargo run --release --bin generate-baseline` from the vardiff_sim crate. 1000 trials per cell, base seed `0xdeadbeefcafef00d`.* + +## Summary + +Headline per-metric values at each share rate's best and worst cells. ↑ = higher is better; ↓ = lower is better; ↔ = near-zero is better. Where a `(floor: X.X%)` annotation appears, it's the Poisson-noise lower bound on that metric at that share rate — the algorithm cannot do better than this without exotic estimation techniques. + +| Metric | Dir | Best | Worst | +| --- | :-: | --- | --- | +| cold-start convergence rate | ↑ | 100.0% @ SPM=6 | 99.8% @ SPM=25 | +| cold-start p90 time | ↓ | 15m @ SPM=6 | 17m @ SPM=25 | +| settled accuracy p50 (stable) | ↓ | 3.2% @ SPM=30 (floor: 3.9%) | 6.4% @ SPM=6 (floor: 8.7%) | +| settled accuracy p99 (stable) | ↓ | 8.4% @ SPM=30 (floor: 14.9%) | 19.3% @ SPM=6 (floor: 33.3%) | +| stable-load jitter (mean) | ↓ | 0.014/min @ SPM=30 (floor: 0.020/min) | 0.031/min @ SPM=6 (floor: 0.020/min) | +| reaction rate at −50% step | ↑ | 100.0% @ SPM=25 | 84.5% @ SPM=6 | +| reaction rate at +50% step | ↑ | 100.0% @ SPM=30 | 81.9% @ SPM=6 | +| ramp target overshoot p99 (cold start) | ↓ | 0.0% @ SPM=20 (floor: 52.0%) | 7.0% @ SPM=6 (floor: 95.0%) | +| upward step magnitude p95 (stable) | ↓ | 1.052 @ SPM=30 | 1.124 @ SPM=6 | +| operational fitness | ↑ | 0.719 @ SPM=30 | 0.653 @ SPM=6 | +| decoupling score | ↑ | 1.000 @ SPM=25 | 0.845 @ SPM=6 | +| max |reaction asymmetry| | ↓ | 0.028 @ SPM=20 | 0.070 @ SPM=30 | + +## Convergence time (cold start: 10 GH/s → 1 PH/s) + +| share/min | rate | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 100.0% | 5m | 9m | 15m | 20m | 9m37s | +| 8 | 100.0% | 6m | 10m | 15m | 19m | 9m52s | +| 10 | 99.9% | 6m | 10m | 16m | 21m | 10m28s | +| 12 | 100.0% | 6m | 10m | 16m | 21m | 10m40s | +| 15 | 99.9% | 6m | 11m | 16m | 20m | 10m51s | +| 20 | 100.0% | 7m | 11m | 16m | 22m | 11m12s | +| 25 | 99.8% | 7m | 12m | 17m | 21m | 11m52s | +| 30 | 99.9% | 7m | 11m | 17m | 22m | 11m37s | + +## Settled accuracy (stable load, post-convergence) + +`|final_hashrate / true_hashrate - 1|` at trial end. Smaller is better. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.2% | 6.4% | 9.5% | 19.3% | 6.0% | +| 8 | 0.1% | 5.8% | 8.8% | 17.2% | 5.4% | +| 10 | 0.0% | 5.0% | 7.4% | 13.9% | 4.5% | +| 12 | 0.0% | 4.8% | 7.1% | 13.9% | 4.4% | +| 15 | 0.0% | 4.3% | 6.4% | 12.1% | 3.9% | +| 20 | 0.0% | 3.9% | 5.6% | 10.1% | 3.4% | +| 25 | 0.0% | 3.4% | 5.0% | 9.5% | 2.8% | +| 30 | 0.0% | 3.2% | 4.6% | 8.4% | 2.6% | + +## Steady-state jitter (fires per minute) + +Post-convergence rate of vardiff fires. Smaller is better — ideal is zero under stable load. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.000 | 0.000 | 0.083 | 0.105 | 0.031 | +| 8 | 0.000 | 0.000 | 0.083 | 0.105 | 0.029 | +| 10 | 0.000 | 0.000 | 0.077 | 0.105 | 0.028 | +| 12 | 0.000 | 0.000 | 0.077 | 0.100 | 0.025 | +| 15 | 0.000 | 0.000 | 0.083 | 0.105 | 0.025 | +| 20 | 0.000 | 0.000 | 0.067 | 0.100 | 0.018 | +| 25 | 0.000 | 0.000 | 0.071 | 0.100 | 0.018 | +| 30 | 0.000 | 0.000 | 0.067 | 0.100 | 0.014 | + +## Reaction time to a 50% drop (step at 15 min) + +| share/min | reacted | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 84.5% | 1m | 3m | 5m | 5m | 2m44s | +| 8 | 92.6% | 1m | 2m | 4m | 5m | 2m32s | +| 10 | 96.2% | 1m | 2m | 4m | 5m | 2m19s | +| 12 | 98.1% | 1m | 2m | 4m | 5m | 2m17s | +| 15 | 99.4% | 1m | 2m | 3m | 5m | 2m05s | +| 20 | 99.8% | 1m | 2m | 3m | 4m | 1m49s | +| 25 | 100.0% | 1m | 1m | 3m | 4m | 1m38s | +| 30 | 100.0% | 1m | 1m | 2m | 3m | 1m32s | + +## Reaction sensitivity (P[fire within 5 min of step change]) + +| Δ% | 6 | 8 | 10 | 12 | 15 | 20 | 25 | 30 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| -50% | 0.84 | 0.93 | 0.96 | 0.98 | 0.99 | 1.00 | 1.00 | 1.00 | +| -25% | 0.49 | 0.54 | 0.61 | 0.67 | 0.71 | 0.80 | 0.84 | 0.90 | +| -10% | 0.32 | 0.32 | 0.33 | 0.35 | 0.32 | 0.36 | 0.35 | 0.38 | +| -5% | 0.28 | 0.30 | 0.27 | 0.29 | 0.27 | 0.27 | 0.25 | 0.26 | +| +5% | 0.31 | 0.31 | 0.30 | 0.29 | 0.30 | 0.29 | 0.29 | 0.25 | +| +10% | 0.35 | 0.36 | 0.39 | 0.39 | 0.36 | 0.36 | 0.39 | 0.45 | +| +25% | 0.52 | 0.58 | 0.61 | 0.60 | 0.73 | 0.78 | 0.84 | 0.87 | +| +50% | 0.82 | 0.89 | 0.89 | 0.95 | 0.95 | 0.98 | 0.99 | 1.00 | + +## Estimator bias + +`E[H̃ − H_true] / H_true` averaged over post-settle ticks. Positive = systematic over-estimate. Populated only for algorithms that expose introspection (e.g. ClassicComposed, Parametric, EWMA-60s). + +### Bias — stable load + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | -11.0% | -0.7% | 10.5% | 20.0% | -0.4% | +| 8 | -9.5% | -0.2% | 9.8% | 19.3% | 0.2% | +| 10 | -8.2% | -0.2% | 8.6% | 16.0% | 0.1% | +| 12 | -8.2% | -0.0% | 7.9% | 14.9% | -0.1% | +| 15 | -7.2% | -0.2% | 7.4% | 13.7% | -0.0% | +| 20 | -6.1% | -0.0% | 6.1% | 11.4% | 0.0% | +| 25 | -5.7% | -0.1% | 5.4% | 10.3% | -0.1% | +| 30 | -5.0% | -0.1% | 5.4% | 9.5% | -0.0% | + +### Bias — cold start + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | -9.7% | -0.2% | 11.0% | 20.1% | 0.3% | +| 8 | -9.0% | -0.8% | 8.4% | 17.3% | -0.5% | +| 10 | -7.6% | 0.0% | 7.8% | 13.9% | 0.0% | +| 12 | -7.4% | -0.2% | 7.6% | 14.2% | -0.0% | +| 15 | -6.5% | -0.0% | 6.7% | 12.7% | 0.1% | +| 20 | -5.5% | -0.2% | 5.3% | 10.6% | -0.2% | +| 25 | -4.9% | -0.1% | 5.1% | 9.3% | -0.1% | +| 30 | -4.5% | -0.1% | 4.6% | 9.2% | -0.0% | + +## Estimator variance + +Population variance of `H̃ / H_true` over post-settle ticks (dimensionless). Populated only for algorithms that expose introspection. + +### Variance — stable load + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.016 | 0.030 | 0.052 | 0.085 | 0.033 | +| 8 | 0.012 | 0.023 | 0.041 | 0.064 | 0.025 | +| 10 | 0.010 | 0.018 | 0.032 | 0.050 | 0.020 | +| 12 | 0.008 | 0.015 | 0.027 | 0.039 | 0.017 | +| 15 | 0.006 | 0.012 | 0.022 | 0.034 | 0.013 | +| 20 | 0.005 | 0.009 | 0.016 | 0.024 | 0.010 | +| 25 | 0.004 | 0.007 | 0.013 | 0.021 | 0.008 | +| 30 | 0.003 | 0.006 | 0.011 | 0.016 | 0.007 | + +### Variance — cold start + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.013 | 0.024 | 0.045 | 0.076 | 0.027 | +| 8 | 0.010 | 0.018 | 0.033 | 0.048 | 0.020 | +| 10 | 0.008 | 0.015 | 0.026 | 0.041 | 0.016 | +| 12 | 0.007 | 0.013 | 0.022 | 0.037 | 0.014 | +| 15 | 0.005 | 0.010 | 0.018 | 0.027 | 0.011 | +| 20 | 0.004 | 0.008 | 0.013 | 0.019 | 0.008 | +| 25 | 0.003 | 0.006 | 0.011 | 0.017 | 0.007 | +| 30 | 0.003 | 0.005 | 0.009 | 0.015 | 0.006 | + +## Ramp target overshoot (cold start) + +`max(new_hashrate on fires) / H_true − 1`: how far the algorithm's actual *target* (not its belief) climbs past truth during the cold-start ramp. Reads `new_hashrate` (the actual target the algorithm set), so it's unaffected by estimator-belief noise. Works for any algorithm that fires, including those without introspection. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.0% | 0.0% | 0.0% | 7.0% | 0.3% | +| 8 | 0.0% | 0.0% | 0.0% | 3.7% | 0.1% | +| 10 | 0.0% | 0.0% | 0.0% | 4.5% | 0.1% | +| 12 | 0.0% | 0.0% | 0.0% | 3.0% | 0.1% | +| 15 | 0.0% | 0.0% | 0.0% | 2.7% | 0.1% | +| 20 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | +| 25 | 0.0% | 0.0% | 0.0% | 0.3% | 0.0% | +| 30 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | + +## Upward step magnitude (stable load) + +`new_hashrate / old_hashrate` for upward difficulty adjustments during steady-state. Per-trial p95 of ratios, then distribution across trials. Values near 1.0 indicate gentle retargeting; values >> 1.0 indicate aggressive jumps. + +| share/min | p50 | p90 | p95 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 1.068 | 1.108 | 1.124 | 1.143 | 1.054 | +| 8 | 1.059 | 1.093 | 1.104 | 1.125 | 1.047 | +| 10 | 1.051 | 1.080 | 1.091 | 1.108 | 1.039 | +| 12 | 1.047 | 1.075 | 1.081 | 1.101 | 1.036 | +| 15 | 1.043 | 1.068 | 1.075 | 1.090 | 1.033 | +| 20 | 1.036 | 1.059 | 1.065 | 1.078 | 1.027 | +| 25 | 1.000 | 1.051 | 1.058 | 1.071 | 1.022 | +| 30 | 1.000 | 1.046 | 1.052 | 1.061 | 1.018 | + +## Operational fitness (per share rate) + +`0.15×react(-10%) + 0.1×react(-50%) + 0.25×jitter + 0.25×step_safety + 0.15×convergence + 0.1×overshoot`. Higher is better. + +| share/min | fitness | react-10% | react-50% | jitter | step-safe | conv | overshoot | +| --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.653 | 0.322 | 0.845 | 0.897 | 0.752 | 0.100 | 0.930 | +| 8 | 0.661 | 0.324 | 0.926 | 0.904 | 0.791 | 0.000 | 0.963 | +| 10 | 0.673 | 0.333 | 0.962 | 0.907 | 0.818 | 0.000 | 0.955 | +| 12 | 0.686 | 0.347 | 0.981 | 0.916 | 0.838 | 0.000 | 0.970 | +| 15 | 0.685 | 0.316 | 0.994 | 0.915 | 0.849 | 0.000 | 0.973 | +| 20 | 0.706 | 0.358 | 0.998 | 0.939 | 0.869 | 0.000 | 1.000 | +| 25 | 0.707 | 0.348 | 1.000 | 0.939 | 0.883 | 0.000 | 0.997 | +| 30 | 0.719 | 0.380 | 1.000 | 0.954 | 0.896 | 0.000 | 1.000 | + +## Decoupling score (per share rate) + +`reaction_rate(Step−50) × clamp(1 − jitter_p50 / J_max, 0, 1)` where `J_max = 0.50` fires/min. Higher is better. Score of 1.0 = perfect decoupling between reactivity and jitter. + +| share/min | decoupling score | +| --- | --- | +| 6 | 0.845 | +| 8 | 0.926 | +| 10 | 0.962 | +| 12 | 0.981 | +| 15 | 0.994 | +| 20 | 0.998 | +| 25 | 1.000 | +| 30 | 1.000 | + +## Reaction asymmetry (per share rate) + +`reaction_rate(+δ%) − reaction_rate(−δ%)`. Positive = responds faster to up-steps; negative = responds faster to down-steps; near zero = symmetric. + +| share/min | δ=5% | δ=10% | δ=25% | δ=50% | +| --- | --- | --- | --- | --- | +| 6 | +0.04 | +0.03 | +0.02 | -0.03 | +| 8 | +0.01 | +0.03 | +0.04 | -0.04 | +| 10 | +0.03 | +0.06 | -0.01 | -0.07 | +| 12 | +0.00 | +0.04 | -0.07 | -0.03 | +| 15 | +0.03 | +0.04 | +0.02 | -0.04 | +| 20 | +0.03 | +0.01 | -0.02 | -0.02 | +| 25 | +0.04 | +0.04 | +0.01 | -0.01 | +| 30 | -0.01 | +0.07 | -0.03 | +0.00 | + diff --git a/sv2/channels-sv2/sim/baseline_FullRemedy.toml b/sv2/channels-sv2/sim/baseline_FullRemedy.toml new file mode 100644 index 0000000000..84bdcecb5b --- /dev/null +++ b/sv2/channels-sv2/sim/baseline_FullRemedy.toml @@ -0,0 +1,6582 @@ +# Vardiff baseline characterization. Regenerate with +# `cargo run --release --bin generate-baseline` from the sim crate. + +[meta] +algorithm = "FullRemedy" +trial_count = 1000 +base_seed = 16045690984503111693 +quiet_window_secs = 300 +settle_buffer_secs = 120 +min_settled_window_secs = 600 +react_window_secs = 300 +step_event_at_secs = 900 +trial_duration_secs = 1800 + +[cell.spm_6.cold_start_10gh_to_1ph] +shares_per_minute = 6 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 900 +convergence_p95_secs = 1020 +convergence_p95_secs_ci_low = 960 +convergence_p95_secs_ci_high = 1080 +convergence_p99_secs = 1200 +convergence_p99_secs_ci_low = 1140 +convergence_p99_secs_ci_high = 1320 +convergence_mean_secs = 576.6 +settled_accuracy_p10 = 0.03644474413772192 +settled_accuracy_p10_ci_low = 0.030956648277271848 +settled_accuracy_p10_ci_high = 0.04057623429476398 +settled_accuracy_p50 = 0.11935566631351746 +settled_accuracy_p50_ci_low = 0.1127088687921699 +settled_accuracy_p50_ci_high = 0.12326079826934289 +settled_accuracy_p90 = 0.20188762472937516 +settled_accuracy_p90_ci_low = 0.19558341796320433 +settled_accuracy_p90_ci_high = 0.20829658843361265 +settled_accuracy_p95 = 0.22401959149357553 +settled_accuracy_p95_ci_low = 0.2152887952824616 +settled_accuracy_p95_ci_high = 0.23343664295688105 +settled_accuracy_p99 = 0.2560176351359468 +settled_accuracy_p99_ci_low = 0.2464416698806221 +settled_accuracy_p99_ci_high = 0.27051590141197723 +settled_accuracy_mean = 0.11904823859026811 +jitter_p10_per_min = 0.047619047619047616 +jitter_p10_per_min_ci_low = 0.045454545454545456 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.09523809523809523 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09523809523809523 +jitter_p90_per_min = 0.13636363636363635 +jitter_p90_per_min_ci_low = 0.13333333333333333 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.15789473684210525 +jitter_p99_per_min = 0.17647058823529413 +jitter_p99_per_min_ci_low = 0.17391304347826086 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.08830859468836394 +bias_mean = 0.0030715008133647428 +bias_p10 = -0.09731964050176677 +bias_p10_ci_low = -0.10578491872298795 +bias_p10_ci_high = -0.09069075751529485 +bias_p50 = -0.0016976529546925908 +bias_p50_ci_low = -0.009614178455801639 +bias_p50_ci_high = 0.005752469467594545 +bias_p90 = 0.10976946872232234 +bias_p90_ci_low = 0.10119704590026309 +bias_p90_ci_high = 0.11591017003729831 +bias_p99 = 0.2006985439449633 +bias_p99_ci_low = 0.18533029247290123 +bias_p99_ci_high = 0.22048298610317754 +variance_mean = 0.027108118129749167 +variance_p10 = 0.012801472468247277 +variance_p10_ci_low = 0.012208520973627655 +variance_p10_ci_high = 0.013164006674135531 +variance_p50 = 0.024051754352692092 +variance_p50_ci_low = 0.022986425818601375 +variance_p50_ci_high = 0.02525793839737116 +variance_p90 = 0.044524789228708006 +variance_p90_ci_low = 0.04286081523192842 +variance_p90_ci_high = 0.04684217716418528 +variance_p99 = 0.07621565130441361 +variance_p99_ci_low = 0.06454511618533132 +variance_p99_ci_high = 0.08324987859149152 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0 +ramp_target_overshoot_p90_ci_low = 0 +ramp_target_overshoot_p90_ci_high = 0 +ramp_target_overshoot_p99 = 0.06984066543539802 +ramp_target_overshoot_p99_ci_low = 0.05538091964780456 +ramp_target_overshoot_p99_ci_high = 0.09100619743656213 +ramp_target_overshoot_mean = 0.002723939899716538 + +[cell.spm_6.stable_1ph] +shares_per_minute = 6 +scenario = "stable_1ph" +convergence_rate = 0.886 +convergence_rate_ci_low = 0.8663018537318864 +convergence_rate_ci_high = 0.9056981462681136 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 876.0948081264108 +settled_accuracy_p10 = 0.0018671028384968924 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0.0045215939885489 +settled_accuracy_p50 = 0.06357491204879939 +settled_accuracy_p50_ci_low = 0.06218609409025233 +settled_accuracy_p50_ci_high = 0.06492628326074734 +settled_accuracy_p90 = 0.0950756118935967 +settled_accuracy_p90_ci_low = 0.09180432316649689 +settled_accuracy_p90_ci_high = 0.09996925742900165 +settled_accuracy_p95 = 0.12299585247082434 +settled_accuracy_p95_ci_low = 0.10718379594717486 +settled_accuracy_p95_ci_high = 0.15177575760707507 +settled_accuracy_p99 = 0.19311978442485112 +settled_accuracy_p99_ci_low = 0.17798082981587804 +settled_accuracy_p99_ci_high = 0.20871185808944692 +settled_accuracy_mean = 0.05954883569139348 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.09523809523809523 +jitter_p99_per_min = 0.10526315789473684 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.11764705882352941 +jitter_mean_per_min = 0.03094921287904283 +bias_mean = -0.0036302783334166092 +bias_p10 = -0.10985163116520005 +bias_p10_ci_low = -0.11500998232002824 +bias_p10_ci_high = -0.10362669762867187 +bias_p50 = -0.007304418480511262 +bias_p50_ci_low = -0.015113308426455026 +bias_p50_ci_high = -0.0005088547339223776 +bias_p90 = 0.1053099504337809 +bias_p90_ci_low = 0.09754387594362612 +bias_p90_ci_high = 0.11951348163938018 +bias_p99 = 0.1998764921386786 +bias_p99_ci_low = 0.18245037558164975 +bias_p99_ci_high = 0.21256578951341973 +variance_mean = 0.03272754704729991 +variance_p10 = 0.016375808043934258 +variance_p10_ci_low = 0.01582948980419592 +variance_p10_ci_high = 0.01722536248837776 +variance_p50 = 0.02962033343281233 +variance_p50_ci_low = 0.028533291139480305 +variance_p50_ci_high = 0.0306489543503545 +variance_p90 = 0.05190569194746976 +variance_p90_ci_low = 0.050124285356647334 +variance_p90_ci_high = 0.05474678437256481 +variance_p99 = 0.08538825558896793 +variance_p99_ci_low = 0.07202677242559714 +variance_p99_ci_high = 0.09213528244853848 +upward_step_magnitude_p50 = 1.0683260183552141 +upward_step_magnitude_p50_ci_low = 1.0641683557408714 +upward_step_magnitude_p50_ci_high = 1.070631207863602 +upward_step_magnitude_p90 = 1.1077301963249708 +upward_step_magnitude_p90_ci_low = 1.104927742372806 +upward_step_magnitude_p90_ci_high = 1.1101828240094849 +upward_step_magnitude_p95 = 1.1239112838277747 +upward_step_magnitude_p95_ci_low = 1.116036126312574 +upward_step_magnitude_p95_ci_high = 1.127817221758761 +upward_step_magnitude_p99 = 1.1427509560482119 +upward_step_magnitude_p99_ci_low = 1.1382389527918337 +upward_step_magnitude_p99_ci_high = 1.1580527181741074 +upward_step_magnitude_mean = 1.0542306832307577 +fire_decisiveness_mean = 7.496959298547896 +fire_decisiveness_p50 = 5.51198170965327 + +[cell.spm_6.step_minus_50_at_15min] +shares_per_minute = 6 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.941 +convergence_rate_ci_low = 0.9263958296914887 +convergence_rate_ci_high = 0.9556041703085112 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 962.7417640807652 +settled_accuracy_p10 = 0.4131423719265901 +settled_accuracy_p10_ci_low = 0.40804880908272856 +settled_accuracy_p10_ci_high = 0.4195489868205571 +settled_accuracy_p50 = 0.6099228778213992 +settled_accuracy_p50_ci_low = 0.6012180527409912 +settled_accuracy_p50_ci_high = 0.6195295118279709 +settled_accuracy_p90 = 0.7306897093454665 +settled_accuracy_p90_ci_low = 0.7150924011894106 +settled_accuracy_p90_ci_high = 0.7493085270335647 +settled_accuracy_p95 = 0.7953189016614208 +settled_accuracy_p95_ci_low = 0.7731164705891038 +settled_accuracy_p95_ci_high = 0.8312260366826452 +settled_accuracy_p99 = 0.9198944297024909 +settled_accuracy_p99_ci_low = 0.8786313361757516 +settled_accuracy_p99_ci_high = 0.9597427341399773 +settled_accuracy_mean = 0.5823450706961685 +jitter_p10_per_min = 0.08333333333333333 +jitter_p10_per_min_ci_low = 0.07692307692307693 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.1111111111111111 +jitter_p50_per_min_ci_low = 0.10526315789473684 +jitter_p50_per_min_ci_high = 0.11764705882352941 +jitter_p90_per_min = 0.18181818181818182 +jitter_p90_per_min_ci_low = 0.17647058823529413 +jitter_p90_per_min_ci_high = 0.18181818181818182 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.1875 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.23076923076923078 +jitter_mean_per_min = 0.12170304078273424 +reaction_rate = 0.845 +reaction_rate_ci_low = 0.8225689153182464 +reaction_rate_ci_high = 0.8674310846817536 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 164.23668639053255 +fire_decisiveness_mean = 7.549629802264072 +fire_decisiveness_p50 = 6.19588641980485 +step_correction_mean = 0.17321771571974784 +step_correction_p50 = 0.1676030308008194 + +[cell.spm_6.step_minus_25_at_15min] +shares_per_minute = 6 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.957 +convergence_rate_ci_low = 0.9444267871409094 +convergence_rate_ci_high = 0.9695732128590905 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 972.2884012539186 +settled_accuracy_p10 = 0.10984817201272268 +settled_accuracy_p10_ci_low = 0.10702942079413758 +settled_accuracy_p10_ci_high = 0.11408918374236787 +settled_accuracy_p50 = 0.23390176926702178 +settled_accuracy_p50_ci_low = 0.2291365925752007 +settled_accuracy_p50_ci_high = 0.23610106093744276 +settled_accuracy_p90 = 0.3255272005197627 +settled_accuracy_p90_ci_low = 0.31565691837352094 +settled_accuracy_p90_ci_high = 0.33018920851896016 +settled_accuracy_p95 = 0.35105362257671 +settled_accuracy_p95_ci_low = 0.33661483744756904 +settled_accuracy_p95_ci_high = 0.3653308990413364 +settled_accuracy_p99 = 0.4386510008929059 +settled_accuracy_p99_ci_low = 0.4144177218938909 +settled_accuracy_p99_ci_high = 0.4612595295704469 +settled_accuracy_mean = 0.2198091146542404 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.0625 +jitter_p50_per_min_ci_low = 0.058823529411764705 +jitter_p50_per_min_ci_high = 0.06666666666666667 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.10526315789473684 +jitter_p95_per_min = 0.11764705882352941 +jitter_p95_per_min_ci_low = 0.1111111111111111 +jitter_p95_per_min_ci_high = 0.125 +jitter_p99_per_min = 0.14285714285714285 +jitter_p99_per_min_ci_low = 0.13333333333333333 +jitter_p99_per_min_ci_high = 0.15384615384615385 +jitter_mean_per_min = 0.055824500894297725 +reaction_rate = 0.494 +reaction_rate_ci_low = 0.46301191031379957 +reaction_rate_ci_high = 0.5249880896862004 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 185.22267206477733 +fire_decisiveness_mean = 7.115267889667159 +fire_decisiveness_p50 = 5.5537543107385545 +step_correction_mean = 0.28047259571219263 +step_correction_p50 = 0.2918669283390045 + +[cell.spm_6.step_minus_10_at_15min] +shares_per_minute = 6 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.902 +convergence_rate_ci_low = 0.883572247190718 +convergence_rate_ci_high = 0.920427752809282 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 889.290465631929 +settled_accuracy_p10 = 0.022276712963083867 +settled_accuracy_p10_ci_low = 0.020311019760205218 +settled_accuracy_p10_ci_high = 0.023482733821264423 +settled_accuracy_p50 = 0.06276103018072043 +settled_accuracy_p50_ci_low = 0.05312479378005208 +settled_accuracy_p50_ci_high = 0.07270522170345406 +settled_accuracy_p90 = 0.19273389955816267 +settled_accuracy_p90_ci_low = 0.18774942593958932 +settled_accuracy_p90_ci_high = 0.19703736733416366 +settled_accuracy_p95 = 0.21305908674529084 +settled_accuracy_p95_ci_low = 0.20291110797107903 +settled_accuracy_p95_ci_high = 0.2189391654416193 +settled_accuracy_p99 = 0.24895532003658172 +settled_accuracy_p99_ci_low = 0.2343325221860042 +settled_accuracy_p99_ci_high = 0.2876164385400244 +settled_accuracy_mean = 0.08821616070932568 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.047619047619047616 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.13043478260869565 +jitter_mean_per_min = 0.03305155800571421 +reaction_rate = 0.322 +reaction_rate_ci_low = 0.29303998022100125 +reaction_rate_ci_high = 0.35096001977899877 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 185.2173913043478 +fire_decisiveness_mean = 6.948997103059054 +fire_decisiveness_p50 = 5.287295889630691 +step_correction_mean = -0.341683605165215 +step_correction_p50 = 0.6491608619689941 + +[cell.spm_6.step_minus_5_at_15min] +shares_per_minute = 6 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.897 +convergence_rate_ci_low = 0.8781604335081723 +convergence_rate_ci_high = 0.9158395664918277 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 900 +convergence_p50_secs_ci_low = 840 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 858.5953177257525 +settled_accuracy_p10 = 0.01171106200625982 +settled_accuracy_p10_ci_low = 0.010161129796809165 +settled_accuracy_p10_ci_high = 0.013785785537163697 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.13900760682512692 +settled_accuracy_p90_ci_low = 0.1357791759497653 +settled_accuracy_p90_ci_high = 0.1460099576839755 +settled_accuracy_p95 = 0.16060917330143765 +settled_accuracy_p95_ci_low = 0.15250842693077327 +settled_accuracy_p95_ci_high = 0.1707784268029131 +settled_accuracy_p99 = 0.25518498982382365 +settled_accuracy_p99_ci_low = 0.2278031602341406 +settled_accuracy_p99_ci_high = 0.2633194319086263 +settled_accuracy_mean = 0.06990455791399657 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.043478260869565216 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.11764705882352941 +jitter_mean_per_min = 0.0318506928741566 +reaction_rate = 0.276 +reaction_rate_ci_low = 0.2482936130395896 +reaction_rate_ci_high = 0.3037063869604104 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 176.08695652173913 +fire_decisiveness_mean = 7.075096726091748 +fire_decisiveness_p50 = 5.35345473107791 +step_correction_mean = 0.352945484328961 +step_correction_p50 = 1.2266521453857422 + +[cell.spm_6.step_plus_5_at_15min] +shares_per_minute = 6 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.891 +convergence_rate_ci_low = 0.8716844013709127 +convergence_rate_ci_high = 0.9103155986290873 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 907.6767676767677 +settled_accuracy_p10 = 0.012034729415121292 +settled_accuracy_p10_ci_low = 0.010860132461403715 +settled_accuracy_p10_ci_high = 0.012680188912106427 +settled_accuracy_p50 = 0.04322821016554923 +settled_accuracy_p50_ci_low = 0.04007051416514851 +settled_accuracy_p50_ci_high = 0.04697544160512135 +settled_accuracy_p90 = 0.12173350773969782 +settled_accuracy_p90_ci_low = 0.11883715285061225 +settled_accuracy_p90_ci_high = 0.12534364534611497 +settled_accuracy_p95 = 0.13405150049679737 +settled_accuracy_p95_ci_low = 0.1292630589705448 +settled_accuracy_p95_ci_high = 0.1381205988565416 +settled_accuracy_p99 = 0.17973046265877168 +settled_accuracy_p99_ci_low = 0.15876271185790714 +settled_accuracy_p99_ci_high = 0.19208757029973633 +settled_accuracy_mean = 0.05695101749189483 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.045454545454545456 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.11764705882352941 +jitter_mean_per_min = 0.03397941577959521 +reaction_rate = 0.313 +reaction_rate_ci_low = 0.2842586867105903 +reaction_rate_ci_high = 0.3417413132894097 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 179.61661341853036 +fire_decisiveness_mean = 7.945248050302085 +fire_decisiveness_p50 = 5.8300003415848884 +step_correction_mean = 0.6258836404774517 +step_correction_p50 = 1.3003743886947632 + +[cell.spm_6.step_plus_10_at_15min] +shares_per_minute = 6 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.886 +convergence_rate_ci_low = 0.8663018537318864 +convergence_rate_ci_high = 0.9056981462681136 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 905.079006772009 +settled_accuracy_p10 = 0.010167115106406888 +settled_accuracy_p10_ci_low = 0.008243714019353088 +settled_accuracy_p10_ci_high = 0.011811770370301122 +settled_accuracy_p50 = 0.04455839529769401 +settled_accuracy_p50_ci_low = 0.04054089257353166 +settled_accuracy_p50_ci_high = 0.054459881313701164 +settled_accuracy_p90 = 0.14783466840320003 +settled_accuracy_p90_ci_low = 0.1411885724339842 +settled_accuracy_p90_ci_high = 0.15052573390102553 +settled_accuracy_p95 = 0.15706921431441856 +settled_accuracy_p95_ci_low = 0.15239197043647057 +settled_accuracy_p95_ci_high = 0.15966632740084863 +settled_accuracy_p99 = 0.17119062779550365 +settled_accuracy_p99_ci_low = 0.16763593220955264 +settled_accuracy_p99_ci_high = 0.17273974443845952 +settled_accuracy_mean = 0.06243730247496874 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.045454545454545456 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.05 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09523809523809523 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.13333333333333333 +jitter_p99_per_min_ci_low = 0.11764705882352941 +jitter_p99_per_min_ci_high = 0.15384615384615385 +jitter_mean_per_min = 0.03731685414860329 +reaction_rate = 0.352 +reaction_rate_ci_low = 0.3223984190692456 +reaction_rate_ci_high = 0.38160158093075436 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 183.23863636363637 +fire_decisiveness_mean = 8.902671668707933 +fire_decisiveness_p50 = 6.3098375319583155 +step_correction_mean = -0.6709865977648984 +step_correction_p50 = 0.6865727305412292 + +[cell.spm_6.step_plus_25_at_15min] +shares_per_minute = 6 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.944 +convergence_rate_ci_low = 0.9297493037924457 +convergence_rate_ci_high = 0.9582506962075542 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 961.9067796610169 +settled_accuracy_p10 = 0.026750129332199224 +settled_accuracy_p10_ci_low = 0.024274832372799704 +settled_accuracy_p10_ci_high = 0.03052948570130265 +settled_accuracy_p50 = 0.11223227053654661 +settled_accuracy_p50_ci_low = 0.10363841702112675 +settled_accuracy_p50_ci_high = 0.1186186182961736 +settled_accuracy_p90 = 0.17416575094387277 +settled_accuracy_p90_ci_low = 0.1594372347455114 +settled_accuracy_p90_ci_high = 0.1830713653893935 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.19429572524064165 +settled_accuracy_p95_ci_high = 0.20434106291418253 +settled_accuracy_p99 = 0.24446555898031463 +settled_accuracy_p99_ci_low = 0.22541222558112517 +settled_accuracy_p99_ci_high = 0.24706970495508218 +settled_accuracy_mean = 0.10261260120821729 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.06666666666666667 +jitter_p50_per_min_ci_low = 0.0625 +jitter_p50_per_min_ci_high = 0.06666666666666667 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.1111111111111111 +jitter_p95_per_min = 0.125 +jitter_p95_per_min_ci_low = 0.1111111111111111 +jitter_p95_per_min_ci_high = 0.13333333333333333 +jitter_p99_per_min = 0.15384615384615385 +jitter_p99_per_min_ci_low = 0.14285714285714285 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.05890297429051155 +reaction_rate = 0.515 +reaction_rate_ci_low = 0.484023627714014 +reaction_rate_ci_high = 0.545976372285986 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 168.93203883495147 +fire_decisiveness_mean = 10.482312335759394 +fire_decisiveness_p50 = 7.686543661299648 +step_correction_mean = 0.3112679799783577 +step_correction_p50 = 0.3124118447303772 + +[cell.spm_6.step_plus_50_at_15min] +shares_per_minute = 6 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.973 +convergence_rate_ci_low = 0.9629539722476991 +convergence_rate_ci_high = 0.9830460277523009 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 982.2610483042138 +settled_accuracy_p10 = 0.07906336785741352 +settled_accuracy_p10_ci_low = 0.07325057706911609 +settled_accuracy_p10_ci_high = 0.08266872443320072 +settled_accuracy_p50 = 0.18441971994844963 +settled_accuracy_p50_ci_low = 0.1798114885184341 +settled_accuracy_p50_ci_high = 0.18649195217088677 +settled_accuracy_p90 = 0.24760011993696063 +settled_accuracy_p90_ci_low = 0.23377972061416963 +settled_accuracy_p90_ci_high = 0.2555689842876676 +settled_accuracy_p95 = 0.2715430859930291 +settled_accuracy_p95_ci_low = 0.26297744488997765 +settled_accuracy_p95_ci_high = 0.2813322111538331 +settled_accuracy_p99 = 0.2928160588109866 +settled_accuracy_p99_ci_low = 0.28852073364125264 +settled_accuracy_p99_ci_high = 0.2976562632120575 +settled_accuracy_mean = 0.17113242032768614 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0.045454545454545456 +jitter_p10_per_min_ci_high = 0.05555555555555555 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.15384615384615385 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.1875 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.21428571428571427 +jitter_mean_per_min = 0.09482147811125496 +reaction_rate = 0.819 +reaction_rate_ci_low = 0.7951363258822116 +reaction_rate_ci_high = 0.8428636741177883 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 164.76190476190476 +fire_decisiveness_mean = 12.436682832446925 +fire_decisiveness_p50 = 9.093128697596477 +step_correction_mean = 0.20788815693067836 +step_correction_p50 = 0.19078606367111206 + +[cell.spm_8.cold_start_10gh_to_1ph] +shares_per_minute = 8 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 900 +convergence_p95_secs = 960 +convergence_p95_secs_ci_low = 960 +convergence_p95_secs_ci_high = 1020 +convergence_p99_secs = 1140 +convergence_p99_secs_ci_low = 1080 +convergence_p99_secs_ci_high = 1200 +convergence_mean_secs = 592.32 +settled_accuracy_p10 = 0.037848930026324834 +settled_accuracy_p10_ci_low = 0.0329961537896275 +settled_accuracy_p10_ci_high = 0.041717219215335 +settled_accuracy_p50 = 0.12044813152478517 +settled_accuracy_p50_ci_low = 0.11650649234646882 +settled_accuracy_p50_ci_high = 0.125592361561626 +settled_accuracy_p90 = 0.1943847194188426 +settled_accuracy_p90_ci_low = 0.18876797586443095 +settled_accuracy_p90_ci_high = 0.19943734585513173 +settled_accuracy_p95 = 0.21226198415009412 +settled_accuracy_p95_ci_low = 0.20554841330819795 +settled_accuracy_p95_ci_high = 0.21775195905876055 +settled_accuracy_p99 = 0.23983305730338733 +settled_accuracy_p99_ci_low = 0.228192689146839 +settled_accuracy_p99_ci_high = 0.24772781127591337 +settled_accuracy_mean = 0.11803068036108057 +jitter_p10_per_min = 0.047619047619047616 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09523809523809523 +jitter_p90_per_min = 0.13636363636363635 +jitter_p90_per_min_ci_low = 0.13636363636363635 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.15384615384615385 +jitter_p99_per_min = 0.17391304347826086 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.17647058823529413 +jitter_mean_per_min = 0.08694928690604789 +bias_mean = -0.004914292702639602 +bias_p10 = -0.08958321400170377 +bias_p10_ci_low = -0.09621898094489344 +bias_p10_ci_high = -0.08223903175273248 +bias_p50 = -0.008184568903548418 +bias_p50_ci_low = -0.013825037207715427 +bias_p50_ci_high = -0.0035424332655054616 +bias_p90 = 0.08398500662217917 +bias_p90_ci_low = 0.07430579614427006 +bias_p90_ci_high = 0.09208630402055673 +bias_p99 = 0.17325964346706027 +bias_p99_ci_low = 0.15029561507957245 +bias_p99_ci_high = 0.1912166688502361 +variance_mean = 0.02017318346582649 +variance_p10 = 0.010078906223388539 +variance_p10_ci_low = 0.009644205360036144 +variance_p10_ci_high = 0.010437683877661679 +variance_p50 = 0.01836108261764539 +variance_p50_ci_low = 0.017690412324785527 +variance_p50_ci_high = 0.0188781646927658 +variance_p90 = 0.03300990527742492 +variance_p90_ci_low = 0.031270027313490247 +variance_p90_ci_high = 0.03488896464839062 +variance_p99 = 0.04844873246304688 +variance_p99_ci_low = 0.0464859022001417 +variance_p99_ci_high = 0.05402737186114498 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0 +ramp_target_overshoot_p90_ci_low = 0 +ramp_target_overshoot_p90_ci_high = 0 +ramp_target_overshoot_p99 = 0.036743848348461006 +ramp_target_overshoot_p99_ci_low = 0.018527549631870865 +ramp_target_overshoot_p99_ci_high = 0.052528323128647525 +ramp_target_overshoot_mean = 0.0010114372967314417 + +[cell.spm_8.stable_1ph] +shares_per_minute = 8 +scenario = "stable_1ph" +convergence_rate = 0.878 +convergence_rate_ci_low = 0.8577146154682738 +convergence_rate_ci_high = 0.8982853845317262 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 900 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 858.4510250569476 +settled_accuracy_p10 = 0.0005532454820130761 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0.004058542820925215 +settled_accuracy_p50 = 0.05796065152238805 +settled_accuracy_p50_ci_low = 0.056296351673537304 +settled_accuracy_p50_ci_high = 0.05917028881172404 +settled_accuracy_p90 = 0.08821534107308815 +settled_accuracy_p90_ci_low = 0.08405975883355665 +settled_accuracy_p90_ci_high = 0.094358352345834 +settled_accuracy_p95 = 0.12659476667623415 +settled_accuracy_p95_ci_low = 0.10644170611940917 +settled_accuracy_p95_ci_high = 0.14020269964199428 +settled_accuracy_p99 = 0.17158924730764258 +settled_accuracy_p99_ci_low = 0.16019604110042174 +settled_accuracy_p99_ci_high = 0.18602771958507125 +settled_accuracy_mean = 0.05420230839731212 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.10526315789473684 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.11764705882352941 +jitter_mean_per_min = 0.028933620874535094 +bias_mean = 0.0016317949284199006 +bias_p10 = -0.09481315971921496 +bias_p10_ci_low = -0.10300859319478177 +bias_p10_ci_high = -0.08771732618686556 +bias_p50 = -0.0015564841593639228 +bias_p50_ci_low = -0.00751600919941035 +bias_p50_ci_high = 0.00513840922582441 +bias_p90 = 0.09775508873365464 +bias_p90_ci_low = 0.09202440139077965 +bias_p90_ci_high = 0.10786118576511199 +bias_p99 = 0.19335205527026772 +bias_p99_ci_low = 0.1763590275387196 +bias_p99_ci_high = 0.20811487175571863 +variance_mean = 0.024856394270623573 +variance_p10 = 0.012138405659527014 +variance_p10_ci_low = 0.011518822093030054 +variance_p10_ci_high = 0.012727967215284958 +variance_p50 = 0.022539797361975814 +variance_p50_ci_low = 0.02177680500890996 +variance_p50_ci_high = 0.023334658604907445 +variance_p90 = 0.04078300199662994 +variance_p90_ci_low = 0.03840154487267566 +variance_p90_ci_high = 0.042878568775722395 +variance_p99 = 0.06413040205009526 +variance_p99_ci_low = 0.05747001566635936 +variance_p99_ci_high = 0.07177126875770001 +upward_step_magnitude_p50 = 1.0593518182912056 +upward_step_magnitude_p50_ci_low = 1.056873085258256 +upward_step_magnitude_p50_ci_high = 1.0618929625684872 +upward_step_magnitude_p90 = 1.0930666409147582 +upward_step_magnitude_p90_ci_low = 1.0907421911621518 +upward_step_magnitude_p90_ci_high = 1.0970285469702663 +upward_step_magnitude_p95 = 1.1042923433952563 +upward_step_magnitude_p95_ci_low = 1.1005373167196701 +upward_step_magnitude_p95_ci_high = 1.1069870327553673 +upward_step_magnitude_p99 = 1.124788531578177 +upward_step_magnitude_p99_ci_low = 1.1182665565454932 +upward_step_magnitude_p99_ci_high = 1.1371983699793593 +upward_step_magnitude_mean = 1.0471852932208536 +fire_decisiveness_mean = 6.3329071068388725 +fire_decisiveness_p50 = 4.641706570177707 + +[cell.spm_8.step_minus_50_at_15min] +shares_per_minute = 8 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.893 +convergence_rate_ci_low = 0.873840962404129 +convergence_rate_ci_high = 0.912159037595871 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 999.5744680851063 +settled_accuracy_p10 = 0.4245143717325113 +settled_accuracy_p10_ci_low = 0.4069807043894096 +settled_accuracy_p10_ci_high = 0.4352834654964133 +settled_accuracy_p50 = 0.5179093763230933 +settled_accuracy_p50_ci_low = 0.5124304743771309 +settled_accuracy_p50_ci_high = 0.5240395026937834 +settled_accuracy_p90 = 0.7187464788817461 +settled_accuracy_p90_ci_low = 0.7097506697632487 +settled_accuracy_p90_ci_high = 0.726152478991402 +settled_accuracy_p95 = 0.7484236295413491 +settled_accuracy_p95_ci_low = 0.7358425964258759 +settled_accuracy_p95_ci_high = 0.7648647645643181 +settled_accuracy_p99 = 0.8279308571996504 +settled_accuracy_p99_ci_low = 0.7985351611193248 +settled_accuracy_p99_ci_high = 0.9252890429141729 +settled_accuracy_mean = 0.5512552283677761 +jitter_p10_per_min = 0.09090909090909091 +jitter_p10_per_min_ci_low = 0.08333333333333333 +jitter_p10_per_min_ci_high = 0.09090909090909091 +jitter_p50_per_min = 0.13043478260869565 +jitter_p50_per_min_ci_low = 0.125 +jitter_p50_per_min_ci_high = 0.13636363636363635 +jitter_p90_per_min = 0.1875 +jitter_p90_per_min_ci_low = 0.18181818181818182 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.2 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.23529411764705882 +jitter_p99_per_min_ci_low = 0.21428571428571427 +jitter_p99_per_min_ci_high = 0.2727272727272727 +jitter_mean_per_min = 0.13577063604437975 +reaction_rate = 0.926 +reaction_rate_ci_low = 0.9097752720084434 +reaction_rate_ci_high = 0.9422247279915567 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 151.5550755939525 +fire_decisiveness_mean = 7.108677595594637 +fire_decisiveness_p50 = 5.844351633443562 +step_correction_mean = 0.15959070091886088 +step_correction_p50 = 0.15427803993225098 + +[cell.spm_8.step_minus_25_at_15min] +shares_per_minute = 8 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.97 +convergence_rate_ci_low = 0.9594268944959392 +convergence_rate_ci_high = 0.9805731055040607 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 967.6701030927835 +settled_accuracy_p10 = 0.12586392595261708 +settled_accuracy_p10_ci_low = 0.12230438236089158 +settled_accuracy_p10_ci_high = 0.1290262745516657 +settled_accuracy_p50 = 0.22928807964945186 +settled_accuracy_p50_ci_low = 0.2221185266007455 +settled_accuracy_p50_ci_high = 0.23438182133634156 +settled_accuracy_p90 = 0.3068142071432285 +settled_accuracy_p90_ci_low = 0.2936298208882333 +settled_accuracy_p90_ci_high = 0.31511646832716655 +settled_accuracy_p95 = 0.3306399116453653 +settled_accuracy_p95_ci_low = 0.32429570813764763 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.3684855524907187 +settled_accuracy_p99_ci_low = 0.35064354268226605 +settled_accuracy_p99_ci_high = 0.3881953361845354 +settled_accuracy_mean = 0.21196974821917697 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.07142857142857142 +jitter_p50_per_min_ci_low = 0.06666666666666667 +jitter_p50_per_min_ci_high = 0.07142857142857142 +jitter_p90_per_min = 0.10526315789473684 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.11764705882352941 +jitter_p95_per_min = 0.125 +jitter_p95_per_min_ci_low = 0.11764705882352941 +jitter_p95_per_min_ci_high = 0.13333333333333333 +jitter_p99_per_min = 0.15789473684210525 +jitter_p99_per_min_ci_low = 0.14285714285714285 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.062457756604318224 +reaction_rate = 0.542 +reaction_rate_ci_low = 0.5111192063314429 +reaction_rate_ci_high = 0.5728807936685572 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 183.43173431734317 +fire_decisiveness_mean = 6.34282314878645 +fire_decisiveness_p50 = 4.9268848808077905 +step_correction_mean = 0.2683475229243071 +step_correction_p50 = 0.26827844977378845 + +[cell.spm_8.step_minus_10_at_15min] +shares_per_minute = 8 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.899 +convergence_rate_ci_low = 0.8803234521819475 +convergence_rate_ci_high = 0.9176765478180525 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 891.7908787541713 +settled_accuracy_p10 = 0.028611715194453602 +settled_accuracy_p10_ci_low = 0.02539123535861676 +settled_accuracy_p10_ci_high = 0.030274971115226368 +settled_accuracy_p50 = 0.052500457645172416 +settled_accuracy_p50_ci_low = 0.05012465471557204 +settled_accuracy_p50_ci_high = 0.05480176973531892 +settled_accuracy_p90 = 0.17508956237191065 +settled_accuracy_p90_ci_low = 0.16861400435238272 +settled_accuracy_p90_ci_high = 0.18155199688018353 +settled_accuracy_p95 = 0.1928470898427379 +settled_accuracy_p95_ci_low = 0.18512621499666881 +settled_accuracy_p95_ci_high = 0.1985711777121022 +settled_accuracy_p99 = 0.22552664613383966 +settled_accuracy_p99_ci_low = 0.2110907837532423 +settled_accuracy_p99_ci_high = 0.2864044524494549 +settled_accuracy_mean = 0.0807719798867276 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.043478260869565216 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.09523809523809523 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.13333333333333333 +jitter_mean_per_min = 0.0318490061144129 +reaction_rate = 0.324 +reaction_rate_ci_low = 0.2949930594788075 +reaction_rate_ci_high = 0.3530069405211925 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 185.55555555555554 +fire_decisiveness_mean = 6.091164326380076 +fire_decisiveness_p50 = 4.533992448158429 +step_correction_mean = 0.36828246731081127 +step_correction_p50 = 0.5951429009437561 + +[cell.spm_8.step_minus_5_at_15min] +shares_per_minute = 8 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.893 +convergence_rate_ci_low = 0.873840962404129 +convergence_rate_ci_high = 0.912159037595871 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 886.494960806271 +settled_accuracy_p10 = 0.005158835026843223 +settled_accuracy_p10_ci_low = 0.003875572253182913 +settled_accuracy_p10_ci_high = 0.0059166707108586625 +settled_accuracy_p50 = 0.04749237837560227 +settled_accuracy_p50_ci_low = 0.04005841155577916 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.12833934593440022 +settled_accuracy_p90_ci_low = 0.12437116344801957 +settled_accuracy_p90_ci_high = 0.132067773171755 +settled_accuracy_p95 = 0.140728066191663 +settled_accuracy_p95_ci_low = 0.13627281462984553 +settled_accuracy_p95_ci_high = 0.14596637224241737 +settled_accuracy_p99 = 0.19926409125449296 +settled_accuracy_p99_ci_low = 0.1714471136583282 +settled_accuracy_p99_ci_high = 0.22722404605278723 +settled_accuracy_mean = 0.05730988132821589 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.07692307692307693 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.08333333333333333 +jitter_p95_per_min_ci_high = 0.09523809523809523 +jitter_p99_per_min = 0.10526315789473684 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.13333333333333333 +jitter_mean_per_min = 0.029735948819394075 +reaction_rate = 0.303 +reaction_rate_ci_low = 0.2745164723813921 +reaction_rate_ci_high = 0.3314835276186079 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 182.17821782178217 +fire_decisiveness_mean = 6.451541614672308 +fire_decisiveness_p50 = 4.716769482760771 +step_correction_mean = 0.43714714325693965 +step_correction_p50 = 1.1251540184020996 + +[cell.spm_8.step_plus_5_at_15min] +shares_per_minute = 8 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.884 +convergence_rate_ci_low = 0.864152253770264 +convergence_rate_ci_high = 0.9038477462297361 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 880.5203619909503 +settled_accuracy_p10 = 0.0059509588834822935 +settled_accuracy_p10_ci_low = 0.004973214613269494 +settled_accuracy_p10_ci_high = 0.006838202049850084 +settled_accuracy_p50 = 0.03871159151687642 +settled_accuracy_p50_ci_low = 0.03403077983446212 +settled_accuracy_p50_ci_high = 0.04393131937698935 +settled_accuracy_p90 = 0.10913448860293262 +settled_accuracy_p90_ci_low = 0.10648349652292965 +settled_accuracy_p90_ci_high = 0.11158760538808798 +settled_accuracy_p95 = 0.11792376918179204 +settled_accuracy_p95_ci_low = 0.11398888856080114 +settled_accuracy_p95_ci_high = 0.12263385311389619 +settled_accuracy_p99 = 0.14348783840286505 +settled_accuracy_p99_ci_low = 0.133165791247444 +settled_accuracy_p99_ci_high = 0.16773075768214407 +settled_accuracy_mean = 0.0489077843604122 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.13333333333333333 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.14285714285714285 +jitter_mean_per_min = 0.030307574917501526 +reaction_rate = 0.312 +reaction_rate_ci_low = 0.28328375913180837 +reaction_rate_ci_high = 0.34071624086819163 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 179.42307692307693 +fire_decisiveness_mean = 6.7818221574728526 +fire_decisiveness_p50 = 4.89593895512435 +step_correction_mean = 0.46166930643793863 +step_correction_p50 = 1.1480504274368286 + +[cell.spm_8.step_plus_10_at_15min] +shares_per_minute = 8 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.913 +convergence_rate_ci_low = 0.8955316821187614 +convergence_rate_ci_high = 0.9304683178812386 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 927.8641840087623 +settled_accuracy_p10 = 0.011992232209851572 +settled_accuracy_p10_ci_low = 0.010836068477154015 +settled_accuracy_p10_ci_high = 0.014826727655203431 +settled_accuracy_p50 = 0.04117781671312126 +settled_accuracy_p50_ci_low = 0.039682387162391364 +settled_accuracy_p50_ci_high = 0.04294686741002551 +settled_accuracy_p90 = 0.11245865712598235 +settled_accuracy_p90_ci_low = 0.10134738129311094 +settled_accuracy_p90_ci_high = 0.13467303371177242 +settled_accuracy_p95 = 0.14390404115554878 +settled_accuracy_p95_ci_low = 0.14055573583437098 +settled_accuracy_p95_ci_high = 0.14746855903905476 +settled_accuracy_p99 = 0.15644497985117323 +settled_accuracy_p99_ci_low = 0.15300809082782263 +settled_accuracy_p99_ci_high = 0.1616342643712262 +settled_accuracy_mean = 0.0556512818372845 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.043478260869565216 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.05 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.125 +jitter_p99_per_min_ci_low = 0.1111111111111111 +jitter_p99_per_min_ci_high = 0.13333333333333333 +jitter_mean_per_min = 0.036691653278338336 +reaction_rate = 0.357 +reaction_rate_ci_low = 0.3273041564928692 +reaction_rate_ci_high = 0.38669584350713077 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 183.19327731092437 +fire_decisiveness_mean = 7.748410850654606 +fire_decisiveness_p50 = 5.441962744120794 +step_correction_mean = 0.42451403446558145 +step_correction_p50 = 0.6242616176605225 + +[cell.spm_8.step_plus_25_at_15min] +shares_per_minute = 8 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.956 +convergence_rate_ci_low = 0.9432880740090259 +convergence_rate_ci_high = 0.968711925990974 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 989.560669456067 +settled_accuracy_p10 = 0.041644538637846895 +settled_accuracy_p10_ci_low = 0.03817076918352458 +settled_accuracy_p10_ci_high = 0.04657838218464794 +settled_accuracy_p50 = 0.1129370209635201 +settled_accuracy_p50_ci_low = 0.10375008616777903 +settled_accuracy_p50_ci_high = 0.11928653937958766 +settled_accuracy_p90 = 0.16372017601634492 +settled_accuracy_p90_ci_low = 0.16025515755764974 +settled_accuracy_p90_ci_high = 0.17622459714818473 +settled_accuracy_p95 = 0.19194278115875207 +settled_accuracy_p95_ci_low = 0.185363159876073 +settled_accuracy_p95_ci_high = 0.19889509821838314 +settled_accuracy_p99 = 0.21961906647599871 +settled_accuracy_p99_ci_low = 0.20992446655970765 +settled_accuracy_p99_ci_high = 0.24363287221849872 +settled_accuracy_mean = 0.10832986668636638 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.06666666666666667 +jitter_p50_per_min_ci_low = 0.06666666666666667 +jitter_p50_per_min_ci_high = 0.07142857142857142 +jitter_p90_per_min = 0.1111111111111111 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.11764705882352941 +jitter_p95_per_min = 0.13333333333333333 +jitter_p95_per_min_ci_low = 0.11764705882352941 +jitter_p95_per_min_ci_high = 0.13333333333333333 +jitter_p99_per_min = 0.15384615384615385 +jitter_p99_per_min_ci_low = 0.15384615384615385 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.06081666798839554 +reaction_rate = 0.585 +reaction_rate_ci_low = 0.5544607721119214 +reaction_rate_ci_high = 0.6155392278880786 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 176.2051282051282 +fire_decisiveness_mean = 9.311837485171322 +fire_decisiveness_p50 = 6.6517047352405925 +step_correction_mean = 0.298469347322089 +step_correction_p50 = 0.28965091705322266 + +[cell.spm_8.step_plus_50_at_15min] +shares_per_minute = 8 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.958 +convergence_rate_ci_low = 0.9455673567733969 +convergence_rate_ci_high = 0.970432643226603 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1003.7160751565762 +settled_accuracy_p10 = 0.08574758960621498 +settled_accuracy_p10_ci_low = 0.07919955411081603 +settled_accuracy_p10_ci_high = 0.09208606649092499 +settled_accuracy_p50 = 0.1758853515757295 +settled_accuracy_p50_ci_low = 0.1676207608337641 +settled_accuracy_p50_ci_high = 0.18241620720210527 +settled_accuracy_p90 = 0.23032835651019956 +settled_accuracy_p90_ci_low = 0.2272094944546157 +settled_accuracy_p90_ci_high = 0.23276968748118154 +settled_accuracy_p95 = 0.24475434621605774 +settled_accuracy_p95_ci_low = 0.23776160265271495 +settled_accuracy_p95_ci_high = 0.25519125086536876 +settled_accuracy_p99 = 0.28782445681414903 +settled_accuracy_p99_ci_low = 0.28056649902276076 +settled_accuracy_p99_ci_high = 0.29237533253560277 +settled_accuracy_mean = 0.16535201095288235 +jitter_p10_per_min = 0.0625 +jitter_p10_per_min_ci_low = 0.058823529411764705 +jitter_p10_per_min_ci_high = 0.07142857142857142 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.1 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.17647058823529413 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.18181818181818182 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.18181818181818182 +jitter_p95_per_min_ci_high = 0.1875 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.21428571428571427 +jitter_mean_per_min = 0.11014576095807523 +reaction_rate = 0.886 +reaction_rate_ci_low = 0.8663018537318864 +reaction_rate_ci_high = 0.9056981462681136 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 152.91196388261852 +fire_decisiveness_mean = 11.258739325807108 +fire_decisiveness_p50 = 8.265285763921717 +step_correction_mean = 0.18497174847913112 +step_correction_p50 = 0.17348432540893555 + +[cell.spm_10.cold_start_10gh_to_1ph] +shares_per_minute = 10 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 960 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1020 +convergence_p95_secs_ci_low = 960 +convergence_p95_secs_ci_high = 1080 +convergence_p99_secs = 1260 +convergence_p99_secs_ci_low = 1200 +convergence_p99_secs_ci_high = 1260 +convergence_mean_secs = 627.5675675675676 +settled_accuracy_p10 = 0.04146549386319631 +settled_accuracy_p10_ci_low = 0.03512766555572411 +settled_accuracy_p10_ci_high = 0.04728960381006553 +settled_accuracy_p50 = 0.1089801660420956 +settled_accuracy_p50_ci_low = 0.10599093587405706 +settled_accuracy_p50_ci_high = 0.11358309597487071 +settled_accuracy_p90 = 0.17586971914470284 +settled_accuracy_p90_ci_low = 0.17242931607812306 +settled_accuracy_p90_ci_high = 0.1803580271362748 +settled_accuracy_p95 = 0.1885053788761829 +settled_accuracy_p95_ci_low = 0.18234230205284008 +settled_accuracy_p95_ci_high = 0.19481341084765136 +settled_accuracy_p99 = 0.2307817491536398 +settled_accuracy_p99_ci_low = 0.21980012161468487 +settled_accuracy_p99_ci_high = 0.24194121518450806 +settled_accuracy_mean = 0.11028987023225921 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0.043478260869565216 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.15 +jitter_p95_per_min_ci_high = 0.15789473684210525 +jitter_p99_per_min = 0.17647058823529413 +jitter_p99_per_min_ci_low = 0.17391304347826086 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.08931018249886136 +bias_mean = 0.0002539614583687381 +bias_p10 = -0.07649280694161667 +bias_p10_ci_low = -0.08179366906907101 +bias_p10_ci_high = -0.0708698858395912 +bias_p50 = 0.00019678791612631166 +bias_p50_ci_low = -0.003722352132230005 +bias_p50_ci_high = 0.004746458134510805 +bias_p90 = 0.07774867164271364 +bias_p90_ci_low = 0.07128699922318664 +bias_p90_ci_high = 0.08434614768042499 +bias_p99 = 0.13949384989461383 +bias_p99_ci_low = 0.1245585318380296 +bias_p99_ci_high = 0.15989741018378226 +variance_mean = 0.016371870530534592 +variance_p10 = 0.008452825099303231 +variance_p10_ci_low = 0.008073507929651632 +variance_p10_ci_high = 0.008793217996281397 +variance_p50 = 0.01472341958992898 +variance_p50_ci_low = 0.014110654385890454 +variance_p50_ci_high = 0.015314772156522053 +variance_p90 = 0.026104337610663796 +variance_p90_ci_low = 0.024936624053823384 +variance_p90_ci_high = 0.02753016823692138 +variance_p99 = 0.040701498409259386 +variance_p99_ci_low = 0.03742975967172731 +variance_p99_ci_high = 0.04731451767472672 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0 +ramp_target_overshoot_p90_ci_low = 0 +ramp_target_overshoot_p90_ci_high = 0 +ramp_target_overshoot_p99 = 0.044852813817661596 +ramp_target_overshoot_p99_ci_low = 0.023076389819558285 +ramp_target_overshoot_p99_ci_high = 0.05683583983825158 +ramp_target_overshoot_mean = 0.0010914799860225661 + +[cell.spm_10.stable_1ph] +shares_per_minute = 10 +scenario = "stable_1ph" +convergence_rate = 0.876 +convergence_rate_ci_low = 0.8555723237151163 +convergence_rate_ci_high = 0.8964276762848837 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 843.4931506849315 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0.050382986936386986 +settled_accuracy_p50_ci_low = 0.049026716777303525 +settled_accuracy_p50_ci_high = 0.05137049388299331 +settled_accuracy_p90 = 0.07384880949880346 +settled_accuracy_p90_ci_low = 0.07103513612127266 +settled_accuracy_p90_ci_high = 0.07830316040474972 +settled_accuracy_p95 = 0.09300308881972352 +settled_accuracy_p95_ci_low = 0.08168752756916065 +settled_accuracy_p95_ci_high = 0.10110735666838311 +settled_accuracy_p99 = 0.1389920557196851 +settled_accuracy_p99_ci_low = 0.1326112106298294 +settled_accuracy_p99_ci_high = 0.1471833637660851 +settled_accuracy_mean = 0.04464385734775969 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.07692307692307693 +jitter_p90_per_min_ci_low = 0.07142857142857142 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.08333333333333333 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.10526315789473684 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.027797383322718118 +bias_mean = 0.0005395216979543118 +bias_p10 = -0.08195109940197205 +bias_p10_ci_low = -0.09114924528010727 +bias_p10_ci_high = -0.07456351537765554 +bias_p50 = -0.0015920624538831856 +bias_p50_ci_low = -0.005483966899237617 +bias_p50_ci_high = 0.0023940769659350344 +bias_p90 = 0.08589673685581667 +bias_p90_ci_low = 0.08151750549398203 +bias_p90_ci_high = 0.09380523754950514 +bias_p99 = 0.1597014028497158 +bias_p99_ci_low = 0.14545085658620474 +bias_p99_ci_high = 0.179108403559611 +variance_mean = 0.019643015897754322 +variance_p10 = 0.00979333796544096 +variance_p10_ci_low = 0.009446261240151603 +variance_p10_ci_high = 0.0103782247941434 +variance_p50 = 0.01766743838464687 +variance_p50_ci_low = 0.017033843658484114 +variance_p50_ci_high = 0.018201684719067756 +variance_p90 = 0.03181161796673613 +variance_p90_ci_low = 0.030285551864961777 +variance_p90_ci_high = 0.033151787491214744 +variance_p99 = 0.05009080680583824 +variance_p99_ci_low = 0.047349688996720415 +variance_p99_ci_high = 0.05418028465105087 +upward_step_magnitude_p50 = 1.0507596018860543 +upward_step_magnitude_p50_ci_low = 1.0490458068723738 +upward_step_magnitude_p50_ci_high = 1.0526618697697447 +upward_step_magnitude_p90 = 1.08039544710628 +upward_step_magnitude_p90_ci_low = 1.0784203324828179 +upward_step_magnitude_p90_ci_high = 1.0833965219220167 +upward_step_magnitude_p95 = 1.0908188294858367 +upward_step_magnitude_p95_ci_low = 1.0871026280084473 +upward_step_magnitude_p95_ci_high = 1.0946014206544041 +upward_step_magnitude_p99 = 1.1078312622754696 +upward_step_magnitude_p99_ci_low = 1.10170086746932 +upward_step_magnitude_p99_ci_high = 1.1192601703988032 +upward_step_magnitude_mean = 1.0394174108773127 +fire_decisiveness_mean = 5.336806907036236 +fire_decisiveness_p50 = 4.052865670721307 + +[cell.spm_10.step_minus_50_at_15min] +shares_per_minute = 10 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.812 +convergence_rate_ci_low = 0.7877834087947954 +convergence_rate_ci_high = 0.8362165912052048 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1028.9408866995075 +settled_accuracy_p10 = 0.3542688385153345 +settled_accuracy_p10_ci_low = 0.34318486995744824 +settled_accuracy_p10_ci_high = 0.36060123100475194 +settled_accuracy_p50 = 0.5199363324777178 +settled_accuracy_p50_ci_low = 0.5156785434369846 +settled_accuracy_p50_ci_high = 0.5241146646224413 +settled_accuracy_p90 = 0.6822168420299599 +settled_accuracy_p90_ci_low = 0.6563709364659573 +settled_accuracy_p90_ci_high = 0.693838352595479 +settled_accuracy_p95 = 0.7145843870823221 +settled_accuracy_p95_ci_low = 0.7010760436720334 +settled_accuracy_p95_ci_high = 0.723459937114967 +settled_accuracy_p99 = 0.7531213843001898 +settled_accuracy_p99_ci_low = 0.7454783556798024 +settled_accuracy_p99_ci_high = 0.7966935596494797 +settled_accuracy_mean = 0.5167715031063689 +jitter_p10_per_min = 0.1 +jitter_p10_per_min_ci_low = 0.09090909090909091 +jitter_p10_per_min_ci_high = 0.1 +jitter_p50_per_min = 0.16666666666666666 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.16666666666666666 +jitter_p90_per_min = 0.2 +jitter_p90_per_min_ci_low = 0.2 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.21428571428571427 +jitter_p95_per_min_ci_low = 0.2 +jitter_p95_per_min_ci_high = 0.23076923076923078 +jitter_p99_per_min = 0.25 +jitter_p99_per_min_ci_low = 0.23529411764705882 +jitter_p99_per_min_ci_high = 0.2727272727272727 +jitter_mean_per_min = 0.15725032505218028 +reaction_rate = 0.962 +reaction_rate_ci_low = 0.9501495346251718 +reaction_rate_ci_high = 0.9738504653748281 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 139.20997920997922 +fire_decisiveness_mean = 6.760060922242966 +fire_decisiveness_p50 = 5.607727094592676 +step_correction_mean = 0.147092547089543 +step_correction_p50 = 0.14319166541099548 + +[cell.spm_10.step_minus_25_at_15min] +shares_per_minute = 10 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.967 +convergence_rate_ci_low = 0.9559279948699434 +convergence_rate_ci_high = 0.9780720051300565 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 975.760082730093 +settled_accuracy_p10 = 0.13660384948967286 +settled_accuracy_p10_ci_low = 0.13266769095670483 +settled_accuracy_p10_ci_high = 0.1396436125649625 +settled_accuracy_p50 = 0.2255187984900684 +settled_accuracy_p50_ci_low = 0.20785905635453372 +settled_accuracy_p50_ci_high = 0.23429117963154722 +settled_accuracy_p90 = 0.30628780521893995 +settled_accuracy_p90_ci_low = 0.28982349563626864 +settled_accuracy_p90_ci_high = 0.3166557666959471 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.32387292229840514 +settled_accuracy_p95_ci_high = 0.33669554704058413 +settled_accuracy_p99 = 0.3709537270070493 +settled_accuracy_p99_ci_low = 0.35589584024368204 +settled_accuracy_p99_ci_high = 0.39010471756519016 +settled_accuracy_mean = 0.21419564148512477 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.07692307692307693 +jitter_p50_per_min_ci_low = 0.07142857142857142 +jitter_p50_per_min_ci_high = 0.08333333333333333 +jitter_p90_per_min = 0.1111111111111111 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.11764705882352941 +jitter_p95_per_min = 0.125 +jitter_p95_per_min_ci_low = 0.11764705882352941 +jitter_p95_per_min_ci_high = 0.13333333333333333 +jitter_p99_per_min = 0.15384615384615385 +jitter_p99_per_min_ci_low = 0.14285714285714285 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.06732731140955667 +reaction_rate = 0.614 +reaction_rate_ci_low = 0.5838259289057641 +reaction_rate_ci_high = 0.6441740710942359 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 181.1726384364821 +fire_decisiveness_mean = 5.667452118873089 +fire_decisiveness_p50 = 4.342554846724177 +step_correction_mean = 0.24363604433082214 +step_correction_p50 = 0.2385684698820114 + +[cell.spm_10.step_minus_10_at_15min] +shares_per_minute = 10 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.885 +convergence_rate_ci_low = 0.8652268151275522 +convergence_rate_ci_high = 0.9047731848724478 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 903.3898305084746 +settled_accuracy_p10 = 0.030531848934963746 +settled_accuracy_p10_ci_low = 0.027702464647609393 +settled_accuracy_p10_ci_high = 0.032119570100614836 +settled_accuracy_p50 = 0.05653631018313643 +settled_accuracy_p50_ci_low = 0.0551577449781131 +settled_accuracy_p50_ci_high = 0.057651361247389676 +settled_accuracy_p90 = 0.16809704240049905 +settled_accuracy_p90_ci_low = 0.16203957260601243 +settled_accuracy_p90_ci_high = 0.17519253719602013 +settled_accuracy_p95 = 0.18269113257020608 +settled_accuracy_p95_ci_low = 0.17918253200999623 +settled_accuracy_p95_ci_high = 0.18529309237274205 +settled_accuracy_p99 = 0.20954273138297586 +settled_accuracy_p99_ci_low = 0.19431118156713367 +settled_accuracy_p99_ci_high = 0.23665269932358002 +settled_accuracy_mean = 0.07919657014050724 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.04 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.11764705882352941 +jitter_mean_per_min = 0.0309739565512851 +reaction_rate = 0.333 +reaction_rate_ci_low = 0.3037893578023351 +reaction_rate_ci_high = 0.3622106421976649 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 199.63963963963963 +fire_decisiveness_mean = 5.714023398424139 +fire_decisiveness_p50 = 4.534811394540281 +step_correction_mean = 0.3350908000010986 +step_correction_p50 = 0.5400908589363098 + +[cell.spm_10.step_minus_5_at_15min] +shares_per_minute = 10 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.879 +convergence_rate_ci_low = 0.8587864220287451 +convergence_rate_ci_high = 0.8992135779712549 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 900 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 875.5631399317406 +settled_accuracy_p10 = 0.002998000226474784 +settled_accuracy_p10_ci_low = 0.0024419856227381187 +settled_accuracy_p10_ci_high = 0.0036108807628765227 +settled_accuracy_p50 = 0.04699662046821773 +settled_accuracy_p50_ci_low = 0.04132132974731828 +settled_accuracy_p50_ci_high = 0.052424526721796205 +settled_accuracy_p90 = 0.11908015927829863 +settled_accuracy_p90_ci_low = 0.1160527017922941 +settled_accuracy_p90_ci_high = 0.12204057854057715 +settled_accuracy_p95 = 0.13189745793739993 +settled_accuracy_p95_ci_low = 0.12654323015310065 +settled_accuracy_p95_ci_high = 0.13616657070099025 +settled_accuracy_p99 = 0.18583087449985358 +settled_accuracy_p99_ci_low = 0.15413090735494084 +settled_accuracy_p99_ci_high = 0.2007440183219915 +settled_accuracy_mean = 0.05193234274997865 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.07692307692307693 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.10526315789473684 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.11764705882352941 +jitter_mean_per_min = 0.031253039786995736 +reaction_rate = 0.273 +reaction_rate_ci_low = 0.24538757175473336 +reaction_rate_ci_high = 0.3006124282452667 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 195.16483516483515 +fire_decisiveness_mean = 5.327460905597358 +fire_decisiveness_p50 = 4.083306316694568 +step_correction_mean = 0.43531329793371126 +step_correction_p50 = 1.0348738431930542 + +[cell.spm_10.step_plus_5_at_15min] +shares_per_minute = 10 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.867 +convergence_rate_ci_low = 0.845952939929767 +convergence_rate_ci_high = 0.888047060070233 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 878.9619377162629 +settled_accuracy_p10 = 0.0038571621589320593 +settled_accuracy_p10_ci_low = 0.0030003416800149507 +settled_accuracy_p10_ci_high = 0.004650133342127827 +settled_accuracy_p50 = 0.03588502985194253 +settled_accuracy_p50_ci_low = 0.031227482577578902 +settled_accuracy_p50_ci_high = 0.041156974803751245 +settled_accuracy_p90 = 0.10283686447421347 +settled_accuracy_p90_ci_low = 0.1008041687774004 +settled_accuracy_p90_ci_high = 0.10413283261168926 +settled_accuracy_p95 = 0.1098820814077881 +settled_accuracy_p95_ci_low = 0.10743861551718126 +settled_accuracy_p95_ci_high = 0.11266901688318542 +settled_accuracy_p99 = 0.12856372063843158 +settled_accuracy_p99_ci_low = 0.11937479076413227 +settled_accuracy_p99_ci_high = 0.15361175461060306 +settled_accuracy_mean = 0.045080636547439185 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.09523809523809523 +jitter_p99_per_min = 0.11764705882352941 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.13333333333333333 +jitter_mean_per_min = 0.029813622997100747 +reaction_rate = 0.299 +reaction_rate_ci_low = 0.27062403273190494 +reaction_rate_ci_high = 0.32737596726809504 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 176.78929765886286 +fire_decisiveness_mean = 6.441986974645171 +fire_decisiveness_p50 = 4.846630135189471 +step_correction_mean = 0.4629756042789855 +step_correction_p50 = 1.0625133514404297 + +[cell.spm_10.step_plus_10_at_15min] +shares_per_minute = 10 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.9 +convergence_rate_ci_low = 0.88140580735821 +convergence_rate_ci_high = 0.9185941926417901 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 920.5333333333333 +settled_accuracy_p10 = 0.018021719723240626 +settled_accuracy_p10_ci_low = 0.01566052480230795 +settled_accuracy_p10_ci_high = 0.020049261567600896 +settled_accuracy_p50 = 0.042325134277213405 +settled_accuracy_p50_ci_low = 0.04126212985113975 +settled_accuracy_p50_ci_high = 0.0434473775289137 +settled_accuracy_p90 = 0.10693407231175456 +settled_accuracy_p90_ci_low = 0.09876472711674633 +settled_accuracy_p90_ci_high = 0.12831574989550842 +settled_accuracy_p95 = 0.13926968594332212 +settled_accuracy_p95_ci_low = 0.13548560005422394 +settled_accuracy_p95_ci_high = 0.14189095822125386 +settled_accuracy_p99 = 0.15362146585650405 +settled_accuracy_p99_ci_low = 0.14890749512682877 +settled_accuracy_p99_ci_high = 0.15793003803181416 +settled_accuracy_mean = 0.054782234050464715 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.043478260869565216 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.10526315789473684 +jitter_p99_per_min = 0.13333333333333333 +jitter_p99_per_min_ci_low = 0.11764705882352941 +jitter_p99_per_min_ci_high = 0.15384615384615385 +jitter_mean_per_min = 0.03472644106366096 +reaction_rate = 0.394 +reaction_rate_ci_low = 0.3637140992803582 +reaction_rate_ci_high = 0.42428590071964184 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 181.06598984771574 +fire_decisiveness_mean = 6.92577369206302 +fire_decisiveness_p50 = 5.189327960611983 +step_correction_mean = 0.5637414813192968 +step_correction_p50 = 0.5688067078590393 + +[cell.spm_10.step_plus_25_at_15min] +shares_per_minute = 10 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.958 +convergence_rate_ci_low = 0.9455673567733969 +convergence_rate_ci_high = 0.970432643226603 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 986.8058455114823 +settled_accuracy_p10 = 0.048326219078115296 +settled_accuracy_p10_ci_low = 0.04591931947104044 +settled_accuracy_p10_ci_high = 0.05308676069924645 +settled_accuracy_p50 = 0.10488658817041485 +settled_accuracy_p50_ci_low = 0.09599434181023847 +settled_accuracy_p50_ci_high = 0.11385378170786364 +settled_accuracy_p90 = 0.1601245368683204 +settled_accuracy_p90_ci_low = 0.15863117678020489 +settled_accuracy_p90_ci_high = 0.16161070288641122 +settled_accuracy_p95 = 0.1803057286486981 +settled_accuracy_p95_ci_low = 0.16419675631193742 +settled_accuracy_p95_ci_high = 0.1862667135963414 +settled_accuracy_p99 = 0.21073906077228233 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.22702283827322567 +settled_accuracy_mean = 0.10797834772827376 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.06666666666666667 +jitter_p50_per_min_ci_low = 0.06666666666666667 +jitter_p50_per_min_ci_high = 0.07692307692307693 +jitter_p90_per_min = 0.1111111111111111 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.11764705882352941 +jitter_p95_per_min = 0.13333333333333333 +jitter_p95_per_min_ci_low = 0.11764705882352941 +jitter_p95_per_min_ci_high = 0.14285714285714285 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.15384615384615385 +jitter_p99_per_min_ci_high = 0.1875 +jitter_mean_per_min = 0.061729194608059965 +reaction_rate = 0.608 +reaction_rate_ci_low = 0.5777412561794115 +reaction_rate_ci_high = 0.6382587438205884 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 168.35526315789474 +fire_decisiveness_mean = 8.29445669634725 +fire_decisiveness_p50 = 6.311943700744514 +step_correction_mean = 0.2886136259001337 +step_correction_p50 = 0.2709026038646698 + +[cell.spm_10.step_plus_50_at_15min] +shares_per_minute = 10 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.947 +convergence_rate_ci_low = 0.9331142610711565 +convergence_rate_ci_high = 0.9608857389288434 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1001.5628299894404 +settled_accuracy_p10 = 0.09850033165200278 +settled_accuracy_p10_ci_low = 0.08598613924588072 +settled_accuracy_p10_ci_high = 0.10462361278150045 +settled_accuracy_p50 = 0.16595968224758495 +settled_accuracy_p50_ci_low = 0.15993044300529236 +settled_accuracy_p50_ci_high = 0.17044505971838797 +settled_accuracy_p90 = 0.23370983791777844 +settled_accuracy_p90_ci_low = 0.23127933384342036 +settled_accuracy_p90_ci_high = 0.2366391845432002 +settled_accuracy_p95 = 0.24731727844746954 +settled_accuracy_p95_ci_low = 0.24125511112288245 +settled_accuracy_p95_ci_high = 0.2530915040089493 +settled_accuracy_p99 = 0.2851628298143384 +settled_accuracy_p99_ci_low = 0.2726960610049991 +settled_accuracy_p99_ci_high = 0.29339811635263147 +settled_accuracy_mean = 0.16706791385655756 +jitter_p10_per_min = 0.06666666666666667 +jitter_p10_per_min_ci_low = 0.0625 +jitter_p10_per_min_ci_high = 0.07692307692307693 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.1 +jitter_p50_per_min_ci_high = 0.10526315789473684 +jitter_p90_per_min = 0.18181818181818182 +jitter_p90_per_min_ci_low = 0.17647058823529413 +jitter_p90_per_min_ci_high = 0.18181818181818182 +jitter_p95_per_min = 0.1875 +jitter_p95_per_min_ci_low = 0.18181818181818182 +jitter_p95_per_min_ci_high = 0.1875 +jitter_p99_per_min = 0.21052631578947367 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.23529411764705882 +jitter_mean_per_min = 0.1137716980848471 +reaction_rate = 0.893 +reaction_rate_ci_low = 0.873840962404129 +reaction_rate_ci_high = 0.912159037595871 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 144.45688689809631 +fire_decisiveness_mean = 10.308555066714932 +fire_decisiveness_p50 = 7.487846405886273 +step_correction_mean = 0.17275332905610757 +step_correction_p50 = 0.16068868339061737 + +[cell.spm_12.cold_start_10gh_to_1ph] +shares_per_minute = 12 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 960 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 1020 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1260 +convergence_p99_secs_ci_low = 1200 +convergence_p99_secs_ci_high = 1260 +convergence_mean_secs = 639.72 +settled_accuracy_p10 = 0.036996244789248345 +settled_accuracy_p10_ci_low = 0.03443201506245053 +settled_accuracy_p10_ci_high = 0.043411315400189276 +settled_accuracy_p50 = 0.10851919524928288 +settled_accuracy_p50_ci_low = 0.1030229792161832 +settled_accuracy_p50_ci_high = 0.11330539949202612 +settled_accuracy_p90 = 0.17079326906138392 +settled_accuracy_p90_ci_low = 0.16545912093695248 +settled_accuracy_p90_ci_high = 0.17538076395523816 +settled_accuracy_p95 = 0.19102692736492144 +settled_accuracy_p95_ci_low = 0.18313351556969282 +settled_accuracy_p95_ci_high = 0.19422714780412076 +settled_accuracy_p99 = 0.22199370908078908 +settled_accuracy_p99_ci_low = 0.21240150348016507 +settled_accuracy_p99_ci_high = 0.22616580010107934 +settled_accuracy_mean = 0.10708916566970857 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0.045454545454545456 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09523809523809523 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13636363636363635 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15 +jitter_p95_per_min_ci_low = 0.15 +jitter_p95_per_min_ci_high = 0.15789473684210525 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.19047619047619047 +jitter_mean_per_min = 0.08908723219461745 +bias_mean = -0.0002561959080694588 +bias_p10 = -0.0743499890978117 +bias_p10_ci_low = -0.07918784950627955 +bias_p10_ci_high = -0.06820539193662757 +bias_p50 = -0.002483522486674197 +bias_p50_ci_low = -0.006891917948364455 +bias_p50_ci_high = 0.002005343568089826 +bias_p90 = 0.07612621946917957 +bias_p90_ci_low = 0.06980278071515439 +bias_p90_ci_high = 0.08554136009585887 +bias_p99 = 0.14190157821648222 +bias_p99_ci_low = 0.12498384309927613 +bias_p99_ci_high = 0.15482973723357957 +variance_mean = 0.013844206799539576 +variance_p10 = 0.00657730055805852 +variance_p10_ci_low = 0.00621490273495711 +variance_p10_ci_high = 0.006911502332826676 +variance_p50 = 0.012684674655262561 +variance_p50_ci_low = 0.012279550682863887 +variance_p50_ci_high = 0.013098136864266488 +variance_p90 = 0.022356882035085058 +variance_p90_ci_low = 0.02131361237221502 +variance_p90_ci_high = 0.023589308971240838 +variance_p99 = 0.03662508886121857 +variance_p99_ci_low = 0.03321648258480892 +variance_p99_ci_high = 0.0425043324193299 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0 +ramp_target_overshoot_p90_ci_low = 0 +ramp_target_overshoot_p90_ci_high = 0 +ramp_target_overshoot_p99 = 0.030395282622609043 +ramp_target_overshoot_p99_ci_low = 0.012526272281736972 +ramp_target_overshoot_p99_ci_high = 0.04757488359464079 +ramp_target_overshoot_mean = 0.0008079085247115978 + +[cell.spm_12.stable_1ph] +shares_per_minute = 12 +scenario = "stable_1ph" +convergence_rate = 0.857 +convergence_rate_ci_low = 0.8353022599886532 +convergence_rate_ci_high = 0.8786977400113468 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 900 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 849.7316219369895 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0.00022917677354128418 +settled_accuracy_p50 = 0.0477467493975805 +settled_accuracy_p50_ci_low = 0.046864804695419426 +settled_accuracy_p50_ci_high = 0.04883854352019945 +settled_accuracy_p90 = 0.07134242761352616 +settled_accuracy_p90_ci_low = 0.06800241940879648 +settled_accuracy_p90_ci_high = 0.07412502958662082 +settled_accuracy_p95 = 0.08922170561072384 +settled_accuracy_p95_ci_low = 0.07795070464643672 +settled_accuracy_p95_ci_high = 0.10779368131114087 +settled_accuracy_p99 = 0.13867999949802567 +settled_accuracy_p99_ci_low = 0.12828201775687154 +settled_accuracy_p99_ci_high = 0.1469800239055199 +settled_accuracy_mean = 0.04392777348020062 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.07692307692307693 +jitter_p90_per_min_ci_low = 0.07142857142857142 +jitter_p90_per_min_ci_high = 0.07692307692307693 +jitter_p95_per_min = 0.08333333333333333 +jitter_p95_per_min_ci_low = 0.08333333333333333 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.09090909090909091 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.02505486934771508 +bias_mean = -0.0014688459916152286 +bias_p10 = -0.08174986110849103 +bias_p10_ci_low = -0.0888356742277012 +bias_p10_ci_high = -0.07419468858835898 +bias_p50 = -0.0002420828678700757 +bias_p50_ci_low = -0.006966867954291061 +bias_p50_ci_high = 0.0026358384176628185 +bias_p90 = 0.07928222223051862 +bias_p90_ci_low = 0.07220176016027066 +bias_p90_ci_high = 0.08348122037357748 +bias_p99 = 0.1489322137205847 +bias_p99_ci_low = 0.12902302677870817 +bias_p99_ci_high = 0.16205921630430078 +variance_mean = 0.016524789154489405 +variance_p10 = 0.00836278860266539 +variance_p10_ci_low = 0.00797558063951102 +variance_p10_ci_high = 0.008699432426573289 +variance_p50 = 0.014926499236283036 +variance_p50_ci_low = 0.014481480343272913 +variance_p50_ci_high = 0.015673941733526014 +variance_p90 = 0.026633655904717515 +variance_p90_ci_low = 0.025581721532406756 +variance_p90_ci_high = 0.028446765953669403 +variance_p99 = 0.03923405746568687 +variance_p99_ci_low = 0.037608931207885936 +variance_p99_ci_high = 0.04538327886096546 +upward_step_magnitude_p50 = 1.0471228382808562 +upward_step_magnitude_p50_ci_low = 1.0456362427061892 +upward_step_magnitude_p50_ci_high = 1.0488645817597702 +upward_step_magnitude_p90 = 1.0748053168697476 +upward_step_magnitude_p90_ci_low = 1.0730062804012959 +upward_step_magnitude_p90_ci_high = 1.0770006666424217 +upward_step_magnitude_p95 = 1.0812338037640676 +upward_step_magnitude_p95_ci_low = 1.07852750534002 +upward_step_magnitude_p95_ci_high = 1.08418209829422 +upward_step_magnitude_p99 = 1.1007844288106141 +upward_step_magnitude_p99_ci_low = 1.0949348174950932 +upward_step_magnitude_p99_ci_high = 1.1069546870145166 +upward_step_magnitude_mean = 1.0363306443809426 +fire_decisiveness_mean = 5.1225764703608165 +fire_decisiveness_p50 = 3.8166767528299133 + +[cell.spm_12.step_minus_50_at_15min] +shares_per_minute = 12 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.708 +convergence_rate_ci_low = 0.67981849866313 +convergence_rate_ci_high = 0.7361815013368699 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1140 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1004.0677966101695 +settled_accuracy_p10 = 0.35481926542502285 +settled_accuracy_p10_ci_low = 0.34886764863489494 +settled_accuracy_p10_ci_high = 0.35953943454473114 +settled_accuracy_p50 = 0.5099952278886188 +settled_accuracy_p50_ci_low = 0.5034530530876085 +settled_accuracy_p50_ci_high = 0.5168020800526885 +settled_accuracy_p90 = 0.6046105400780517 +settled_accuracy_p90_ci_low = 0.5937385013154344 +settled_accuracy_p90_ci_high = 0.6153972163645505 +settled_accuracy_p95 = 0.6550655348264474 +settled_accuracy_p95_ci_low = 0.6297824042032698 +settled_accuracy_p95_ci_high = 0.689846851530562 +settled_accuracy_p99 = 0.7506599653543775 +settled_accuracy_p99_ci_low = 0.7292291520103702 +settled_accuracy_p99_ci_high = 0.7646973950553249 +settled_accuracy_mean = 0.49028217512716016 +jitter_p10_per_min = 0.11538461538461539 +jitter_p10_per_min_ci_low = 0.1 +jitter_p10_per_min_ci_high = 0.125 +jitter_p50_per_min = 0.17647058823529413 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.18181818181818182 +jitter_p90_per_min = 0.21428571428571427 +jitter_p90_per_min_ci_low = 0.21052631578947367 +jitter_p90_per_min_ci_high = 0.23076923076923078 +jitter_p95_per_min = 0.23529411764705882 +jitter_p95_per_min_ci_low = 0.23076923076923078 +jitter_p95_per_min_ci_high = 0.25 +jitter_p99_per_min = 0.2727272727272727 +jitter_p99_per_min_ci_low = 0.25 +jitter_p99_per_min_ci_high = 0.2857142857142857 +jitter_mean_per_min = 0.1731343960668773 +reaction_rate = 0.981 +reaction_rate_ci_low = 0.9725381099983514 +reaction_rate_ci_high = 0.9894618900016485 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 137.18654434250766 +fire_decisiveness_mean = 6.622966872038693 +fire_decisiveness_p50 = 5.5777726576596685 +step_correction_mean = 0.14191010534368403 +step_correction_p50 = 0.13771186769008636 + +[cell.spm_12.step_minus_25_at_15min] +shares_per_minute = 12 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.969 +convergence_rate_ci_low = 0.9582576621538884 +convergence_rate_ci_high = 0.9797423378461115 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 989.1021671826626 +settled_accuracy_p10 = 0.14355784886922907 +settled_accuracy_p10_ci_low = 0.13699683899357828 +settled_accuracy_p10_ci_high = 0.14696984244002098 +settled_accuracy_p50 = 0.1905010356687189 +settled_accuracy_p50_ci_low = 0.18505116961353618 +settled_accuracy_p50_ci_high = 0.20021025654286806 +settled_accuracy_p90 = 0.28173007723514343 +settled_accuracy_p90_ci_low = 0.2745280434965651 +settled_accuracy_p90_ci_high = 0.29879326631454495 +settled_accuracy_p95 = 0.3177763057572873 +settled_accuracy_p95_ci_low = 0.3110787517142959 +settled_accuracy_p95_ci_high = 0.3247397898562001 +settled_accuracy_p99 = 0.35748363595105914 +settled_accuracy_p99_ci_low = 0.34337448955880046 +settled_accuracy_p99_ci_high = 0.36571914618556356 +settled_accuracy_mean = 0.20841585116721548 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.07692307692307693 +jitter_p50_per_min_ci_high = 0.08333333333333333 +jitter_p90_per_min = 0.1111111111111111 +jitter_p90_per_min_ci_low = 0.10526315789473684 +jitter_p90_per_min_ci_high = 0.125 +jitter_p95_per_min = 0.13333333333333333 +jitter_p95_per_min_ci_low = 0.125 +jitter_p95_per_min_ci_high = 0.14285714285714285 +jitter_p99_per_min = 0.15789473684210525 +jitter_p99_per_min_ci_low = 0.15384615384615385 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.07228614454011564 +reaction_rate = 0.666 +reaction_rate_ci_low = 0.6367674689703406 +reaction_rate_ci_high = 0.6952325310296594 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 178.46846846846847 +fire_decisiveness_mean = 5.518883178923006 +fire_decisiveness_p50 = 4.487237208829725 +step_correction_mean = 0.2404222504512684 +step_correction_p50 = 0.2318343073129654 + +[cell.spm_12.step_minus_10_at_15min] +shares_per_minute = 12 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.896 +convergence_rate_ci_low = 0.8770797554349845 +convergence_rate_ci_high = 0.9149202445650155 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 904.6875 +settled_accuracy_p10 = 0.03071774048927578 +settled_accuracy_p10_ci_low = 0.02667159792544127 +settled_accuracy_p10_ci_high = 0.03510114237928508 +settled_accuracy_p50 = 0.05828934285135867 +settled_accuracy_p50_ci_low = 0.05715341347374503 +settled_accuracy_p50_ci_high = 0.059495960232778256 +settled_accuracy_p90 = 0.137902005399281 +settled_accuracy_p90_ci_low = 0.13019022753260456 +settled_accuracy_p90_ci_high = 0.16063528233631308 +settled_accuracy_p95 = 0.17131394309690262 +settled_accuracy_p95_ci_low = 0.16720591124703565 +settled_accuracy_p95_ci_high = 0.17526218128415794 +settled_accuracy_p99 = 0.19642630384134874 +settled_accuracy_p99_ci_low = 0.18393808983565418 +settled_accuracy_p99_ci_high = 0.21091883592963856 +settled_accuracy_mean = 0.0753088130716136 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.045454545454545456 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.125 +jitter_p99_per_min_ci_low = 0.1111111111111111 +jitter_p99_per_min_ci_high = 0.13333333333333333 +jitter_mean_per_min = 0.033563063396850855 +reaction_rate = 0.347 +reaction_rate_ci_low = 0.3174962377721078 +reaction_rate_ci_high = 0.37650376222789217 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 197.63688760806917 +fire_decisiveness_mean = 4.892068337460117 +fire_decisiveness_p50 = 3.7098419893361907 +step_correction_mean = 0.3905604737636335 +step_correction_p50 = 0.5048425793647766 + +[cell.spm_12.step_minus_5_at_15min] +shares_per_minute = 12 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.882 +convergence_rate_ci_low = 0.862004541475625 +convergence_rate_ci_high = 0.901995458524375 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 900 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 856.6666666666666 +settled_accuracy_p10 = 0.002651365280402329 +settled_accuracy_p10_ci_low = 0.0021830866870635735 +settled_accuracy_p10_ci_high = 0.0031460635741348275 +settled_accuracy_p50 = 0.047507566171283155 +settled_accuracy_p50_ci_low = 0.03883356881480737 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.11524718349393193 +settled_accuracy_p90_ci_low = 0.1134538227081281 +settled_accuracy_p90_ci_high = 0.11778884344088203 +settled_accuracy_p95 = 0.12457792939200862 +settled_accuracy_p95_ci_low = 0.12038998303417259 +settled_accuracy_p95_ci_high = 0.12973937813252712 +settled_accuracy_p99 = 0.1804738917200588 +settled_accuracy_p99_ci_low = 0.14097340207259013 +settled_accuracy_p99_ci_high = 0.19387560262877424 +settled_accuracy_mean = 0.04940595119998784 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.07692307692307693 +jitter_p90_per_min_ci_low = 0.07142857142857142 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.08333333333333333 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.125 +jitter_mean_per_min = 0.02649048932700837 +reaction_rate = 0.29 +reaction_rate_ci_low = 0.26187553662734164 +reaction_rate_ci_high = 0.3181244633726583 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 186.6206896551724 +fire_decisiveness_mean = 5.036654607896345 +fire_decisiveness_p50 = 3.8589061901563255 +step_correction_mean = 0.6904856318029864 +step_correction_p50 = 0.991567075252533 + +[cell.spm_12.step_plus_5_at_15min] +shares_per_minute = 12 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.867 +convergence_rate_ci_low = 0.845952939929767 +convergence_rate_ci_high = 0.888047060070233 +convergence_p10_secs = 120 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 886.7128027681661 +settled_accuracy_p10 = 0.0024710124836557767 +settled_accuracy_p10_ci_low = 0.0020166534813716996 +settled_accuracy_p10_ci_high = 0.003047893107458899 +settled_accuracy_p50 = 0.02950272072139093 +settled_accuracy_p50_ci_low = 0.023952561571109365 +settled_accuracy_p50_ci_high = 0.03474718299335977 +settled_accuracy_p90 = 0.0960191785644301 +settled_accuracy_p90_ci_low = 0.09364665633573555 +settled_accuracy_p90_ci_high = 0.0977169051332405 +settled_accuracy_p95 = 0.10246258872271885 +settled_accuracy_p95_ci_low = 0.10064643097776094 +settled_accuracy_p95_ci_high = 0.10454111019033485 +settled_accuracy_p99 = 0.11932832586124009 +settled_accuracy_p99_ci_low = 0.11179257504912687 +settled_accuracy_p99_ci_high = 0.13697386806191758 +settled_accuracy_mean = 0.03969164203132025 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.09523809523809523 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.11764705882352941 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.125 +jitter_mean_per_min = 0.028943873354216446 +reaction_rate = 0.294 +reaction_rate_ci_low = 0.26576212007958105 +reaction_rate_ci_high = 0.3222378799204189 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 182.85714285714286 +fire_decisiveness_mean = 5.382082371140265 +fire_decisiveness_p50 = 3.814106115388718 +step_correction_mean = 0.6350329125008616 +step_correction_p50 = 0.989149808883667 + +[cell.spm_12.step_plus_10_at_15min] +shares_per_minute = 12 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.89 +convergence_rate_ci_low = 0.8706068919458484 +convergence_rate_ci_high = 0.9093931080541516 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 935.4606741573034 +settled_accuracy_p10 = 0.020957305522931513 +settled_accuracy_p10_ci_low = 0.019244199216449154 +settled_accuracy_p10_ci_high = 0.022099803450335243 +settled_accuracy_p50 = 0.04490833752611223 +settled_accuracy_p50_ci_low = 0.04359568812118786 +settled_accuracy_p50_ci_high = 0.04589178744279654 +settled_accuracy_p90 = 0.09886923392240887 +settled_accuracy_p90_ci_low = 0.09345623284872806 +settled_accuracy_p90_ci_high = 0.10913603619778989 +settled_accuracy_p95 = 0.1319734270856383 +settled_accuracy_p95_ci_low = 0.12584644869341177 +settled_accuracy_p95_ci_high = 0.1344010597832005 +settled_accuracy_p99 = 0.1446289389167177 +settled_accuracy_p99_ci_low = 0.1419401307170881 +settled_accuracy_p99_ci_high = 0.15049724313731017 +settled_accuracy_mean = 0.05442525917901328 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.043478260869565216 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.047619047619047616 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.08695652173913043 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09523809523809523 +jitter_p95_per_min_ci_high = 0.1111111111111111 +jitter_p99_per_min = 0.14285714285714285 +jitter_p99_per_min_ci_low = 0.11538461538461539 +jitter_p99_per_min_ci_high = 0.14285714285714285 +jitter_mean_per_min = 0.038168019152080096 +reaction_rate = 0.389 +reaction_rate_ci_low = 0.3587829907767165 +reaction_rate_ci_high = 0.41921700922328353 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 183.39331619537276 +fire_decisiveness_mean = 6.293758827143834 +fire_decisiveness_p50 = 4.542311087196303 +step_correction_mean = 0.21759357320618813 +step_correction_p50 = 0.539495587348938 + +[cell.spm_12.step_plus_25_at_15min] +shares_per_minute = 12 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.958 +convergence_rate_ci_low = 0.9455673567733969 +convergence_rate_ci_high = 0.970432643226603 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 982.7974947807933 +settled_accuracy_p10 = 0.060027857157122555 +settled_accuracy_p10_ci_low = 0.05175456925452038 +settled_accuracy_p10_ci_high = 0.06397858271666557 +settled_accuracy_p50 = 0.10239110486527436 +settled_accuracy_p50_ci_low = 0.09918389181149478 +settled_accuracy_p50_ci_high = 0.10548074319253076 +settled_accuracy_p90 = 0.16253648306183055 +settled_accuracy_p90_ci_low = 0.16115135614662413 +settled_accuracy_p90_ci_high = 0.16429001078681005 +settled_accuracy_p95 = 0.17961751384536362 +settled_accuracy_p95_ci_low = 0.166164978708774 +settled_accuracy_p95_ci_high = 0.18699556952660656 +settled_accuracy_p99 = 0.20597186195202388 +settled_accuracy_p99_ci_low = 0.20107667310983324 +settled_accuracy_p99_ci_high = 0.21101893157107965 +settled_accuracy_mean = 0.110411292177383 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.07692307692307693 +jitter_p50_per_min_ci_low = 0.07692307692307693 +jitter_p50_per_min_ci_high = 0.08333333333333333 +jitter_p90_per_min = 0.125 +jitter_p90_per_min_ci_low = 0.1111111111111111 +jitter_p90_per_min_ci_high = 0.13333333333333333 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.13333333333333333 +jitter_p95_per_min_ci_high = 0.15384615384615385 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.1875 +jitter_mean_per_min = 0.06999466690201105 +reaction_rate = 0.6 +reaction_rate_ci_low = 0.5696358105657339 +reaction_rate_ci_high = 0.6303641894342661 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 170.4 +fire_decisiveness_mean = 7.54664421925338 +fire_decisiveness_p50 = 5.663070987880161 +step_correction_mean = 0.2667160153388977 +step_correction_p50 = 0.24571046233177185 + +[cell.spm_12.step_plus_50_at_15min] +shares_per_minute = 12 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.932 +convergence_rate_ci_low = 0.9163966272363954 +convergence_rate_ci_high = 0.9476033727636047 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1080 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1033.4549356223176 +settled_accuracy_p10 = 0.09466582067742191 +settled_accuracy_p10_ci_low = 0.0854064976233172 +settled_accuracy_p10_ci_high = 0.10385427677180592 +settled_accuracy_p50 = 0.1616179177443977 +settled_accuracy_p50_ci_low = 0.15868212866809217 +settled_accuracy_p50_ci_high = 0.164411257073386 +settled_accuracy_p90 = 0.23245570747908595 +settled_accuracy_p90_ci_low = 0.2293525936367734 +settled_accuracy_p90_ci_high = 0.23660419845576242 +settled_accuracy_p95 = 0.24373151765978684 +settled_accuracy_p95_ci_low = 0.23939440603779338 +settled_accuracy_p95_ci_high = 0.2465215462848489 +settled_accuracy_p99 = 0.25849600447249255 +settled_accuracy_p99_ci_low = 0.25448235757195126 +settled_accuracy_p99_ci_high = 0.27514862152578534 +settled_accuracy_mean = 0.16228610982535502 +jitter_p10_per_min = 0.08333333333333333 +jitter_p10_per_min_ci_low = 0.08333333333333333 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.11764705882352941 +jitter_p50_per_min_ci_low = 0.1111111111111111 +jitter_p50_per_min_ci_high = 0.125 +jitter_p90_per_min = 0.18181818181818182 +jitter_p90_per_min_ci_low = 0.18181818181818182 +jitter_p90_per_min_ci_high = 0.1875 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.19047619047619047 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.23076923076923078 +jitter_p99_per_min_ci_low = 0.21052631578947367 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.1262020124923233 +reaction_rate = 0.949 +reaction_rate_ci_low = 0.9353643995951773 +reaction_rate_ci_high = 0.9626356004048227 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 135.5532139093783 +fire_decisiveness_mean = 9.448249582155798 +fire_decisiveness_p50 = 6.968804325707644 +step_correction_mean = 0.15829077171450295 +step_correction_p50 = 0.14793020486831665 + +[cell.spm_15.cold_start_10gh_to_1ph] +shares_per_minute = 15 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 960 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 960 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 1020 +convergence_p95_secs_ci_high = 1080 +convergence_p99_secs = 1200 +convergence_p99_secs_ci_low = 1200 +convergence_p99_secs_ci_high = 1320 +convergence_mean_secs = 650.6906906906906 +settled_accuracy_p10 = 0.04343218625716483 +settled_accuracy_p10_ci_low = 0.038319497386814394 +settled_accuracy_p10_ci_high = 0.04645631303493736 +settled_accuracy_p50 = 0.10588369590798996 +settled_accuracy_p50_ci_low = 0.10149913822151169 +settled_accuracy_p50_ci_high = 0.10910874662719239 +settled_accuracy_p90 = 0.1597416469763665 +settled_accuracy_p90_ci_low = 0.1547457946397599 +settled_accuracy_p90_ci_high = 0.1649138614098593 +settled_accuracy_p95 = 0.17440050476603808 +settled_accuracy_p95_ci_low = 0.170506244446322 +settled_accuracy_p95_ci_high = 0.17716109503145427 +settled_accuracy_p99 = 0.19310763772030914 +settled_accuracy_p99_ci_low = 0.18851255952472423 +settled_accuracy_p99_ci_high = 0.21348490899467498 +settled_accuracy_mean = 0.10376901538074784 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0.045454545454545456 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.08695652173913043 +jitter_p50_per_min_ci_high = 0.09523809523809523 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13636363636363635 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.15 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.17647058823529413 +jitter_p99_per_min_ci_high = 0.19047619047619047 +jitter_mean_per_min = 0.08947414970918598 +bias_mean = 0.0007028096846385249 +bias_p10 = -0.06478125393966566 +bias_p10_ci_low = -0.07018332683148507 +bias_p10_ci_high = -0.06054319490520518 +bias_p50 = -0.0003092270531982817 +bias_p50_ci_low = -0.004744843989708339 +bias_p50_ci_high = 0.003906629543125779 +bias_p90 = 0.0667629787193657 +bias_p90_ci_low = 0.06227962618765782 +bias_p90_ci_high = 0.07239021951306168 +bias_p99 = 0.1267119316902114 +bias_p99_ci_low = 0.11252184698190543 +bias_p99_ci_high = 0.14415462413686386 +variance_mean = 0.010898693851082207 +variance_p10 = 0.005409611638095521 +variance_p10_ci_low = 0.0050410822065994594 +variance_p10_ci_high = 0.005621068213172228 +variance_p50 = 0.009898694840759831 +variance_p50_ci_low = 0.009498225342587683 +variance_p50_ci_high = 0.010219199097685469 +variance_p90 = 0.01771703970477437 +variance_p90_ci_low = 0.01705734619403195 +variance_p90_ci_high = 0.018696356412593602 +variance_p99 = 0.027050094331793922 +variance_p99_ci_low = 0.02508244737079669 +variance_p99_ci_high = 0.029092438994211194 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0 +ramp_target_overshoot_p90_ci_low = 0 +ramp_target_overshoot_p90_ci_high = 0 +ramp_target_overshoot_p99 = 0.0273042483065582 +ramp_target_overshoot_p99_ci_low = 0.001483307240288223 +ramp_target_overshoot_p99_ci_high = 0.040004332548316146 +ramp_target_overshoot_mean = 0.0005350881719887461 + +[cell.spm_15.stable_1ph] +shares_per_minute = 15 +scenario = "stable_1ph" +convergence_rate = 0.856 +convergence_rate_ci_low = 0.8342392329546957 +convergence_rate_ci_high = 0.8777607670453043 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 843.7149532710281 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0.04349875825111882 +settled_accuracy_p50_ci_low = 0.04268197625674941 +settled_accuracy_p50_ci_high = 0.044376273768198304 +settled_accuracy_p90 = 0.06368262177692063 +settled_accuracy_p90_ci_low = 0.06194470350330428 +settled_accuracy_p90_ci_high = 0.06589291935037811 +settled_accuracy_p95 = 0.0750714659079249 +settled_accuracy_p95_ci_low = 0.0678559207567786 +settled_accuracy_p95_ci_high = 0.07831685061318372 +settled_accuracy_p99 = 0.12085320063315863 +settled_accuracy_p99_ci_low = 0.11090444563346447 +settled_accuracy_p99_ci_high = 0.1261369500000704 +settled_accuracy_mean = 0.038878141911224226 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.08695652173913043 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.10526315789473684 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.13333333333333333 +jitter_mean_per_min = 0.02545210033948083 +bias_mean = -0.00022534842119101745 +bias_p10 = -0.07214945056612491 +bias_p10_ci_low = -0.07647078110575622 +bias_p10_ci_high = -0.0678851025168618 +bias_p50 = -0.0017381407924841432 +bias_p50_ci_low = -0.006616171154646773 +bias_p50_ci_high = 0.0034574734425762282 +bias_p90 = 0.07403564764270099 +bias_p90_ci_low = 0.06830990869559904 +bias_p90_ci_high = 0.08045347324914731 +bias_p99 = 0.13714292392879213 +bias_p99_ci_low = 0.12576311830227258 +bias_p99_ci_high = 0.1471282815162064 +variance_mean = 0.013372014108839729 +variance_p10 = 0.00645456554873826 +variance_p10_ci_low = 0.006246606998819125 +variance_p10_ci_high = 0.006788022877508591 +variance_p50 = 0.012228352171050458 +variance_p50_ci_low = 0.011839255843396313 +variance_p50_ci_high = 0.012714623052598337 +variance_p90 = 0.02225469733477405 +variance_p90_ci_low = 0.021227113147489714 +variance_p90_ci_high = 0.02290303351367329 +variance_p99 = 0.03386334833250866 +variance_p99_ci_low = 0.029408420362755518 +variance_p99_ci_high = 0.03824166134628316 +upward_step_magnitude_p50 = 1.0428024366691964 +upward_step_magnitude_p50_ci_low = 1.0412006822824074 +upward_step_magnitude_p50_ci_high = 1.0441659545856863 +upward_step_magnitude_p90 = 1.0679097420664068 +upward_step_magnitude_p90_ci_low = 1.0662796536705756 +upward_step_magnitude_p90_ci_high = 1.0707038185606719 +upward_step_magnitude_p95 = 1.0754309009881848 +upward_step_magnitude_p95_ci_low = 1.0728298956034366 +upward_step_magnitude_p95_ci_high = 1.0780596894429904 +upward_step_magnitude_p99 = 1.0902441762759292 +upward_step_magnitude_p99_ci_low = 1.0865329218307218 +upward_step_magnitude_p99_ci_high = 1.0955781230737658 +upward_step_magnitude_mean = 1.0329500671077936 +fire_decisiveness_mean = 4.78907320859649 +fire_decisiveness_p50 = 3.514357360301169 + +[cell.spm_15.step_minus_50_at_15min] +shares_per_minute = 15 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.571 +convergence_rate_ci_low = 0.5403237144621451 +convergence_rate_ci_high = 0.6016762855378548 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 1200 +convergence_p50_secs_ci_low = 1140 +convergence_p50_secs_ci_high = 1200 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1071.6987740805605 +settled_accuracy_p10 = 0.3449848639310722 +settled_accuracy_p10_ci_low = 0.333545218389359 +settled_accuracy_p10_ci_high = 0.35317147435693097 +settled_accuracy_p50 = 0.43386854218943083 +settled_accuracy_p50_ci_low = 0.4281943534466879 +settled_accuracy_p50_ci_high = 0.44276382222834854 +settled_accuracy_p90 = 0.5864025628607059 +settled_accuracy_p90_ci_low = 0.5795881945037706 +settled_accuracy_p90_ci_high = 0.594669838142142 +settled_accuracy_p95 = 0.6113258557504344 +settled_accuracy_p95_ci_low = 0.6015527917589778 +settled_accuracy_p95_ci_high = 0.6190267322123424 +settled_accuracy_p99 = 0.7148705392821404 +settled_accuracy_p99_ci_low = 0.6559284206109846 +settled_accuracy_p99_ci_high = 0.7438250616847908 +settled_accuracy_mean = 0.45373908489412274 +jitter_p10_per_min = 0.15 +jitter_p10_per_min_ci_low = 0.14285714285714285 +jitter_p10_per_min_ci_high = 0.15789473684210525 +jitter_p50_per_min = 0.1875 +jitter_p50_per_min_ci_low = 0.18181818181818182 +jitter_p50_per_min_ci_high = 0.2 +jitter_p90_per_min = 0.25 +jitter_p90_per_min_ci_low = 0.25 +jitter_p90_per_min_ci_high = 0.26666666666666666 +jitter_p95_per_min = 0.2727272727272727 +jitter_p95_per_min_ci_low = 0.25 +jitter_p95_per_min_ci_high = 0.2727272727272727 +jitter_p99_per_min = 0.29411764705882354 +jitter_p99_per_min_ci_low = 0.2727272727272727 +jitter_p99_per_min_ci_high = 0.3125 +jitter_mean_per_min = 0.195687348225966 +reaction_rate = 0.994 +reaction_rate_ci_low = 0.9892134247733896 +reaction_rate_ci_high = 0.9987865752266104 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 125.07042253521126 +fire_decisiveness_mean = 6.446219446725512 +fire_decisiveness_p50 = 5.332235289244579 +step_correction_mean = 0.1323734134345707 +step_correction_p50 = 0.12779320776462555 + +[cell.spm_15.step_minus_25_at_15min] +shares_per_minute = 15 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.981 +convergence_rate_ci_low = 0.9725381099983514 +convergence_rate_ci_high = 0.9894618900016485 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 998.5932721712538 +settled_accuracy_p10 = 0.14697225835910244 +settled_accuracy_p10_ci_low = 0.14184630441779444 +settled_accuracy_p10_ci_high = 0.1515029119430602 +settled_accuracy_p50 = 0.19136333982380438 +settled_accuracy_p50_ci_low = 0.18783842440557885 +settled_accuracy_p50_ci_high = 0.19426092158723018 +settled_accuracy_p90 = 0.2739981519113812 +settled_accuracy_p90_ci_low = 0.2725605905794726 +settled_accuracy_p90_ci_high = 0.27806566485958895 +settled_accuracy_p95 = 0.2909473454015352 +settled_accuracy_p95_ci_low = 0.2798609611725118 +settled_accuracy_p95_ci_high = 0.30552670122981906 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.32065939200622484 +settled_accuracy_p99_ci_high = 0.3407332636534548 +settled_accuracy_mean = 0.20446323091954097 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.125 +jitter_p90_per_min_ci_low = 0.11764705882352941 +jitter_p90_per_min_ci_high = 0.13333333333333333 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.13636363636363635 +jitter_p95_per_min_ci_high = 0.15384615384615385 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08059799518443377 +reaction_rate = 0.715 +reaction_rate_ci_low = 0.6870210429072132 +reaction_rate_ci_high = 0.7429789570927867 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 178.74125874125875 +fire_decisiveness_mean = 5.230083569549778 +fire_decisiveness_p50 = 4.220273697888743 +step_correction_mean = 0.2221048601857432 +step_correction_p50 = 0.21234051883220673 + +[cell.spm_15.step_minus_10_at_15min] +shares_per_minute = 15 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.883 +convergence_rate_ci_low = 0.8630781643014506 +convergence_rate_ci_high = 0.9029218356985494 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 905.0962627406568 +settled_accuracy_p10 = 0.03450454457501251 +settled_accuracy_p10_ci_low = 0.028774864300283864 +settled_accuracy_p10_ci_high = 0.039741571219841565 +settled_accuracy_p50 = 0.06309135492424334 +settled_accuracy_p50_ci_low = 0.06219925442051677 +settled_accuracy_p50_ci_high = 0.06413191514904315 +settled_accuracy_p90 = 0.13289270150088983 +settled_accuracy_p90_ci_low = 0.12448858385010264 +settled_accuracy_p90_ci_high = 0.15552143774031024 +settled_accuracy_p95 = 0.16351112087089414 +settled_accuracy_p95_ci_low = 0.1597685340702384 +settled_accuracy_p95_ci_high = 0.1680862304167945 +settled_accuracy_p99 = 0.18530964589262067 +settled_accuracy_p99_ci_low = 0.1766007794321769 +settled_accuracy_p99_ci_high = 0.19064599365672108 +settled_accuracy_mean = 0.07712141462503476 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.11764705882352941 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.125 +jitter_mean_per_min = 0.03187420079833097 +reaction_rate = 0.316 +reaction_rate_ci_low = 0.2871844002248782 +reaction_rate_ci_high = 0.34481559977512183 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 186.64556962025316 +fire_decisiveness_mean = 4.395456171552797 +fire_decisiveness_p50 = 3.199855109455754 +step_correction_mean = 0.3604685525539555 +step_correction_p50 = 0.45915284752845764 + +[cell.spm_15.step_minus_5_at_15min] +shares_per_minute = 15 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.866 +convergence_rate_ci_low = 0.8448861507441205 +convergence_rate_ci_high = 0.8871138492558794 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 878.2448036951502 +settled_accuracy_p10 = 0.0029199420207666194 +settled_accuracy_p10_ci_low = 0.0025066926964292247 +settled_accuracy_p10_ci_high = 0.003332061090541627 +settled_accuracy_p50 = 0.038968987439551794 +settled_accuracy_p50_ci_low = 0.027656057602858608 +settled_accuracy_p50_ci_high = 0.045302580802075276 +settled_accuracy_p90 = 0.1047346151691606 +settled_accuracy_p90_ci_low = 0.10202150973329305 +settled_accuracy_p90_ci_high = 0.10700487273934067 +settled_accuracy_p95 = 0.11271244635617594 +settled_accuracy_p95_ci_low = 0.10952173772683071 +settled_accuracy_p95_ci_high = 0.11585201096657749 +settled_accuracy_p99 = 0.14443572500143587 +settled_accuracy_p99_ci_low = 0.12505171797633863 +settled_accuracy_p99_ci_high = 0.16889146681116962 +settled_accuracy_mean = 0.043222301010384115 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.07692307692307693 +jitter_p90_per_min_ci_low = 0.07142857142857142 +jitter_p90_per_min_ci_high = 0.07692307692307693 +jitter_p95_per_min = 0.08333333333333333 +jitter_p95_per_min_ci_low = 0.07692307692307693 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.09090909090909091 +jitter_p99_per_min_ci_high = 0.10526315789473684 +jitter_mean_per_min = 0.023866110762071777 +reaction_rate = 0.273 +reaction_rate_ci_low = 0.24538757175473336 +reaction_rate_ci_high = 0.3006124282452667 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 186.15384615384616 +fire_decisiveness_mean = 4.490135286562901 +fire_decisiveness_p50 = 3.23205743145855 +step_correction_mean = 0.8097614608841501 +step_correction_p50 = 0.8959463834762573 + +[cell.spm_15.step_plus_5_at_15min] +shares_per_minute = 15 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.868 +convergence_rate_ci_low = 0.8470201248430788 +convergence_rate_ci_high = 0.8889798751569212 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 852.3041474654378 +settled_accuracy_p10 = 0.0023383286619168553 +settled_accuracy_p10_ci_low = 0.002028605251441551 +settled_accuracy_p10_ci_high = 0.002789811569799072 +settled_accuracy_p50 = 0.029802857150526663 +settled_accuracy_p50_ci_low = 0.023217751408040055 +settled_accuracy_p50_ci_high = 0.03858293422730019 +settled_accuracy_p90 = 0.09139703920781372 +settled_accuracy_p90_ci_low = 0.08837950487459656 +settled_accuracy_p90_ci_high = 0.0939072944017526 +settled_accuracy_p95 = 0.09862575096422665 +settled_accuracy_p95_ci_low = 0.09640240216517504 +settled_accuracy_p95_ci_high = 0.10047431270611207 +settled_accuracy_p99 = 0.11183680298970655 +settled_accuracy_p99_ci_low = 0.1070488088559165 +settled_accuracy_p99_ci_high = 0.11962494706388471 +settled_accuracy_mean = 0.0370586098186795 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.08333333333333333 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.125 +jitter_mean_per_min = 0.029132845377756972 +reaction_rate = 0.304 +reaction_rate_ci_low = 0.27548998256051044 +reaction_rate_ci_high = 0.33251001743948955 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 182.96052631578948 +fire_decisiveness_mean = 5.32302921791829 +fire_decisiveness_p50 = 4.000997713581381 +step_correction_mean = 0.8546581869258693 +step_correction_p50 = 0.940468966960907 + +[cell.spm_15.step_plus_10_at_15min] +shares_per_minute = 15 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.889 +convergence_rate_ci_low = 0.8695298883824463 +convergence_rate_ci_high = 0.9084701116175538 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 937.8627671541058 +settled_accuracy_p10 = 0.021288945333545417 +settled_accuracy_p10_ci_low = 0.01878834699700338 +settled_accuracy_p10_ci_high = 0.02329312109117554 +settled_accuracy_p50 = 0.04706942601238451 +settled_accuracy_p50_ci_low = 0.046149119437124964 +settled_accuracy_p50_ci_high = 0.048281839175800645 +settled_accuracy_p90 = 0.09196129136247289 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09554508779273263 +settled_accuracy_p95 = 0.11959690510995569 +settled_accuracy_p95_ci_low = 0.10060808562993595 +settled_accuracy_p95_ci_high = 0.1289338225447596 +settled_accuracy_p99 = 0.137631558541778 +settled_accuracy_p99_ci_low = 0.13401018114696006 +settled_accuracy_p99_ci_high = 0.141341031574294 +settled_accuracy_mean = 0.05371616091900582 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.043478260869565216 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09523809523809523 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.125 +jitter_p99_per_min_ci_low = 0.1111111111111111 +jitter_p99_per_min_ci_high = 0.13333333333333333 +jitter_mean_per_min = 0.0347167337672509 +reaction_rate = 0.356 +reaction_rate_ci_low = 0.3263227261629374 +reaction_rate_ci_high = 0.3856772738370626 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 186.40449438202248 +fire_decisiveness_mean = 5.766028580901103 +fire_decisiveness_p50 = 4.410245082327364 +step_correction_mean = 0.43531587950131867 +step_correction_p50 = 0.5016649961471558 + +[cell.spm_15.step_plus_25_at_15min] +shares_per_minute = 15 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.975 +convergence_rate_ci_low = 0.9653232753475155 +convergence_rate_ci_high = 0.9846767246524845 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1006.4 +settled_accuracy_p10 = 0.06327034262885922 +settled_accuracy_p10_ci_low = 0.05584638448589141 +settled_accuracy_p10_ci_high = 0.06827913335293267 +settled_accuracy_p50 = 0.10158595958049332 +settled_accuracy_p50_ci_low = 0.09963072945937312 +settled_accuracy_p50_ci_high = 0.10373902662729328 +settled_accuracy_p90 = 0.1599393700958186 +settled_accuracy_p90_ci_low = 0.15824795833366445 +settled_accuracy_p90_ci_high = 0.161589335424696 +settled_accuracy_p95 = 0.16504925360986622 +settled_accuracy_p95_ci_low = 0.16340299269018066 +settled_accuracy_p95_ci_high = 0.1669602992561332 +settled_accuracy_p99 = 0.1954240668056375 +settled_accuracy_p99_ci_low = 0.18964228936353522 +settled_accuracy_p99_ci_high = 0.20135439642504116 +settled_accuracy_mean = 0.10669351677925558 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.08333333333333333 +jitter_p90_per_min = 0.125 +jitter_p90_per_min_ci_low = 0.11764705882352941 +jitter_p90_per_min_ci_high = 0.13043478260869565 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.13333333333333333 +jitter_p95_per_min_ci_high = 0.15 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.07516972317629902 +reaction_rate = 0.731 +reaction_rate_ci_low = 0.7035153063979239 +reaction_rate_ci_high = 0.758484693602076 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 171.70998632010944 +fire_decisiveness_mean = 7.181451482888469 +fire_decisiveness_p50 = 5.326363348410524 +step_correction_mean = 0.2455336897546061 +step_correction_p50 = 0.22878669202327728 + +[cell.spm_15.step_plus_50_at_15min] +shares_per_minute = 15 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.89 +convergence_rate_ci_low = 0.8706068919458484 +convergence_rate_ci_high = 0.9093931080541516 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1140 +convergence_p50_secs_ci_low = 1140 +convergence_p50_secs_ci_high = 1140 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1078.247191011236 +settled_accuracy_p10 = 0.09620404530438831 +settled_accuracy_p10_ci_low = 0.08990565478073254 +settled_accuracy_p10_ci_high = 0.10246279685941262 +settled_accuracy_p50 = 0.16230779685985997 +settled_accuracy_p50_ci_low = 0.15929953021111287 +settled_accuracy_p50_ci_high = 0.16417861301369707 +settled_accuracy_p90 = 0.2252854386025036 +settled_accuracy_p90_ci_low = 0.22186431822629304 +settled_accuracy_p90_ci_high = 0.22882780232520583 +settled_accuracy_p95 = 0.23844915532758026 +settled_accuracy_p95_ci_low = 0.23333089653593886 +settled_accuracy_p95_ci_high = 0.24235882822913757 +settled_accuracy_p99 = 0.2578788713649254 +settled_accuracy_p99_ci_low = 0.25080134693752276 +settled_accuracy_p99_ci_high = 0.2657302504654895 +settled_accuracy_mean = 0.16052261300260184 +jitter_p10_per_min = 0.08333333333333333 +jitter_p10_per_min_ci_low = 0.08333333333333333 +jitter_p10_per_min_ci_high = 0.09090909090909091 +jitter_p50_per_min = 0.15 +jitter_p50_per_min_ci_low = 0.13333333333333333 +jitter_p50_per_min_ci_high = 0.15789473684210525 +jitter_p90_per_min = 0.1875 +jitter_p90_per_min_ci_low = 0.18181818181818182 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.2 +jitter_p95_per_min_ci_high = 0.2222222222222222 +jitter_p99_per_min = 0.26666666666666666 +jitter_p99_per_min_ci_low = 0.23076923076923078 +jitter_p99_per_min_ci_high = 0.2727272727272727 +jitter_mean_per_min = 0.13977857816812003 +reaction_rate = 0.955 +reaction_rate_ci_low = 0.9421511572505537 +reaction_rate_ci_high = 0.9678488427494463 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 131.18324607329842 +fire_decisiveness_mean = 8.990288825283397 +fire_decisiveness_p50 = 6.9673761385999455 +step_correction_mean = 0.14349033520483845 +step_correction_p50 = 0.13724084198474884 + +[cell.spm_20.cold_start_10gh_to_1ph] +shares_per_minute = 20 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 960 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 1020 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 671.82 +settled_accuracy_p10 = 0.0450742730717425 +settled_accuracy_p10_ci_low = 0.0401923715876904 +settled_accuracy_p10_ci_high = 0.04946688382200559 +settled_accuracy_p50 = 0.0982856973359324 +settled_accuracy_p50_ci_low = 0.09369061914034749 +settled_accuracy_p50_ci_high = 0.10078456302834393 +settled_accuracy_p90 = 0.15219552355685573 +settled_accuracy_p90_ci_low = 0.14874525548713957 +settled_accuracy_p90_ci_high = 0.1575007477605268 +settled_accuracy_p95 = 0.16639535671079586 +settled_accuracy_p95_ci_low = 0.16193838855911968 +settled_accuracy_p95_ci_high = 0.16921647917232763 +settled_accuracy_p99 = 0.18417390430181912 +settled_accuracy_p99_ci_low = 0.178292147840024 +settled_accuracy_p99_ci_high = 0.19093894764307295 +settled_accuracy_mean = 0.097965981442654 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.09523809523809523 +jitter_p50_per_min_ci_low = 0.09523809523809523 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.15 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.17391304347826086 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.0915228991860222 +bias_mean = -0.0015706033806429753 +bias_p10 = -0.055225905234039 +bias_p10_ci_low = -0.05923255524218972 +bias_p10_ci_high = -0.05164540004987743 +bias_p50 = -0.002235911967565901 +bias_p50_ci_low = -0.005819493563375085 +bias_p50_ci_high = 0.0013085239677491894 +bias_p90 = 0.052749005332714115 +bias_p90_ci_low = 0.04847395871757206 +bias_p90_ci_high = 0.056711444727095606 +bias_p99 = 0.10591248207897497 +bias_p99_ci_low = 0.09444837712203837 +bias_p99_ci_high = 0.11447769599612867 +variance_mean = 0.008196342587299973 +variance_p10 = 0.0041204150138489425 +variance_p10_ci_low = 0.0039325895982640436 +variance_p10_ci_high = 0.004369404910538103 +variance_p50 = 0.007596756162022036 +variance_p50_ci_low = 0.0073097224708595235 +variance_p50_ci_high = 0.007795358820383881 +variance_p90 = 0.013342770340581038 +variance_p90_ci_low = 0.012582172625155775 +variance_p90_ci_high = 0.014035818935540886 +variance_p99 = 0.018732655479157378 +variance_p99_ci_low = 0.017888292708753927 +variance_p99_ci_high = 0.01992918970803099 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0 +ramp_target_overshoot_p90_ci_low = 0 +ramp_target_overshoot_p90_ci_high = 0 +ramp_target_overshoot_p99 = 0 +ramp_target_overshoot_p99_ci_low = 0 +ramp_target_overshoot_p99_ci_high = 0.00742566300706371 +ramp_target_overshoot_mean = 0.0001264202836275643 + +[cell.spm_20.stable_1ph] +shares_per_minute = 20 +scenario = "stable_1ph" +convergence_rate = 0.863 +convergence_rate_ci_low = 0.8416881204582983 +convergence_rate_ci_high = 0.8843118795417017 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 900 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 816.6396292004634 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0.03931270858693492 +settled_accuracy_p50_ci_low = 0.03866242368631545 +settled_accuracy_p50_ci_high = 0.04016411875557879 +settled_accuracy_p90 = 0.055912623184193544 +settled_accuracy_p90_ci_low = 0.05402203224299096 +settled_accuracy_p90_ci_high = 0.057772948027338344 +settled_accuracy_p95 = 0.06339667090369672 +settled_accuracy_p95_ci_low = 0.059957475796684534 +settled_accuracy_p95_ci_high = 0.0659843887332 +settled_accuracy_p99 = 0.10129787873575746 +settled_accuracy_p99_ci_low = 0.09433634063815566 +settled_accuracy_p99_ci_high = 0.11048608896984602 +settled_accuracy_mean = 0.0339802712016869 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.06666666666666667 +jitter_p90_per_min_ci_low = 0.0625 +jitter_p90_per_min_ci_high = 0.07692307692307693 +jitter_p95_per_min = 0.08333333333333333 +jitter_p95_per_min_ci_low = 0.08333333333333333 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.10526315789473684 +jitter_mean_per_min = 0.018368096894378835 +bias_mean = 0.0002854845231257668 +bias_p10 = -0.06084208012912198 +bias_p10_ci_low = -0.06560231677320488 +bias_p10_ci_high = -0.05694720523348554 +bias_p50 = -0.0004635668462696483 +bias_p50_ci_low = -0.003881417802206642 +bias_p50_ci_high = 0.00260149633907544 +bias_p90 = 0.060575262346477934 +bias_p90_ci_low = 0.056615856979197805 +bias_p90_ci_high = 0.06801174754101376 +bias_p99 = 0.11366717985051103 +bias_p99_ci_low = 0.10535133894317997 +bias_p99_ci_high = 0.12642007876892417 +variance_mean = 0.01012893751798213 +variance_p10 = 0.004962191683850214 +variance_p10_ci_low = 0.004739955125597084 +variance_p10_ci_high = 0.00522263405954952 +variance_p50 = 0.009260477933099675 +variance_p50_ci_low = 0.008939218729867889 +variance_p50_ci_high = 0.009573472572002075 +variance_p90 = 0.016140990862241727 +variance_p90_ci_low = 0.015352930818326423 +variance_p90_ci_high = 0.016878432336665704 +variance_p99 = 0.024410149165395807 +variance_p99_ci_low = 0.022877085939777136 +variance_p99_ci_high = 0.032040677519471095 +upward_step_magnitude_p50 = 1.0363628713225768 +upward_step_magnitude_p50_ci_low = 1.0340540579354858 +upward_step_magnitude_p50_ci_high = 1.0385629012397088 +upward_step_magnitude_p90 = 1.05865187283058 +upward_step_magnitude_p90_ci_low = 1.057138836363153 +upward_step_magnitude_p90_ci_high = 1.060371470384086 +upward_step_magnitude_p95 = 1.0652743098339787 +upward_step_magnitude_p95_ci_low = 1.0623799739320912 +upward_step_magnitude_p95_ci_high = 1.068475588933535 +upward_step_magnitude_p99 = 1.077677467015085 +upward_step_magnitude_p99_ci_low = 1.0753594478071198 +upward_step_magnitude_p99_ci_high = 1.08139161471083 +upward_step_magnitude_mean = 1.0270459774579865 +fire_decisiveness_mean = 4.105543133982368 +fire_decisiveness_p50 = 3.0088363379658247 + +[cell.spm_20.step_minus_50_at_15min] +shares_per_minute = 20 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.375 +convergence_rate_ci_low = 0.3449937506509061 +convergence_rate_ci_high = 0.4050062493490939 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 1260 +convergence_p50_secs_ci_low = 1140 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1049.44 +settled_accuracy_p10 = 0.2971791929501333 +settled_accuracy_p10_ci_low = 0.29097967601316443 +settled_accuracy_p10_ci_high = 0.3044693631590183 +settled_accuracy_p50 = 0.4317292457950088 +settled_accuracy_p50_ci_low = 0.4250468134664138 +settled_accuracy_p50_ci_high = 0.43700910284775807 +settled_accuracy_p90 = 0.5184181957365603 +settled_accuracy_p90_ci_low = 0.5078317723028427 +settled_accuracy_p90_ci_high = 0.5497195151438199 +settled_accuracy_p95 = 0.5883928775751097 +settled_accuracy_p95_ci_low = 0.5685942860425439 +settled_accuracy_p95_ci_high = 0.598012933354656 +settled_accuracy_p99 = 0.629002330757986 +settled_accuracy_p99_ci_low = 0.6191162554380829 +settled_accuracy_p99_ci_high = 0.6454570217716593 +settled_accuracy_mean = 0.4198575819696191 +jitter_p10_per_min = 0.17647058823529413 +jitter_p10_per_min_ci_low = 0.15789473684210525 +jitter_p10_per_min_ci_high = 0.1875 +jitter_p50_per_min = 0.2222222222222222 +jitter_p50_per_min_ci_low = 0.21052631578947367 +jitter_p50_per_min_ci_high = 0.22727272727272727 +jitter_p90_per_min = 0.26666666666666666 +jitter_p90_per_min_ci_low = 0.25 +jitter_p90_per_min_ci_high = 0.2777777777777778 +jitter_p95_per_min = 0.29411764705882354 +jitter_p95_per_min_ci_low = 0.26666666666666666 +jitter_p95_per_min_ci_high = 0.29411764705882354 +jitter_p99_per_min = 0.3125 +jitter_p99_per_min_ci_low = 0.29411764705882354 +jitter_p99_per_min_ci_high = 0.3157894736842105 +jitter_mean_per_min = 0.22074577165369783 +reaction_rate = 0.998 +reaction_rate_ci_low = 0.995230914663648 +reaction_rate_ci_high = 1 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 108.57715430861724 +fire_decisiveness_mean = 6.199212415958919 +fire_decisiveness_p50 = 5.331176323883874 +step_correction_mean = 0.12250823652248584 +step_correction_p50 = 0.11902952939271927 + +[cell.spm_20.step_minus_25_at_15min] +shares_per_minute = 20 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.968 +convergence_rate_ci_low = 0.9570914069834832 +convergence_rate_ci_high = 0.9789085930165168 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1008.1611570247934 +settled_accuracy_p10 = 0.12856358130833834 +settled_accuracy_p10_ci_low = 0.1209103075724478 +settled_accuracy_p10_ci_high = 0.14715005210779553 +settled_accuracy_p50 = 0.19527372855323755 +settled_accuracy_p50_ci_low = 0.19323084527371504 +settled_accuracy_p50_ci_high = 0.19723456006247742 +settled_accuracy_p90 = 0.2703860844492567 +settled_accuracy_p90_ci_low = 0.2658216974766441 +settled_accuracy_p90_ci_high = 0.2733881770825737 +settled_accuracy_p95 = 0.28109155876978176 +settled_accuracy_p95_ci_low = 0.27826207013305715 +settled_accuracy_p95_ci_high = 0.28282797823990635 +settled_accuracy_p99 = 0.31843209357015656 +settled_accuracy_p99_ci_low = 0.304623863321257 +settled_accuracy_p99_ci_high = 0.3301206679998365 +settled_accuracy_mean = 0.1986704507416021 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.05555555555555555 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.13333333333333333 +jitter_p90_per_min_ci_high = 0.15384615384615385 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.15789473684210525 +jitter_p95_per_min_ci_high = 0.17647058823529413 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.0920490984002488 +reaction_rate = 0.803 +reaction_rate_ci_low = 0.778348295280042 +reaction_rate_ci_high = 0.8276517047199581 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 169.91282689912828 +fire_decisiveness_mean = 4.633427679645438 +fire_decisiveness_p50 = 3.7644192044327127 +step_correction_mean = 0.20142857520696086 +step_correction_p50 = 0.19322548806667328 + +[cell.spm_20.step_minus_10_at_15min] +shares_per_minute = 20 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.88 +convergence_rate_ci_low = 0.859858675316653 +convergence_rate_ci_high = 0.900141324683347 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 929.25 +settled_accuracy_p10 = 0.02110424653708942 +settled_accuracy_p10_ci_low = 0.015762977456268423 +settled_accuracy_p10_ci_high = 0.03783672338732735 +settled_accuracy_p50 = 0.06587562714165829 +settled_accuracy_p50_ci_low = 0.06501439671554299 +settled_accuracy_p50_ci_high = 0.06665006343651814 +settled_accuracy_p90 = 0.11704882058034993 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.1232099362875898 +settled_accuracy_p95 = 0.15176900830621332 +settled_accuracy_p95_ci_low = 0.13102230288542027 +settled_accuracy_p95_ci_high = 0.1581860324829274 +settled_accuracy_p99 = 0.1699195700260494 +settled_accuracy_p99_ci_low = 0.16711643276120536 +settled_accuracy_p99_ci_high = 0.17643606445284465 +settled_accuracy_mean = 0.07195212110614786 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.09523809523809523 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09523809523809523 +jitter_p95_per_min_ci_high = 0.1111111111111111 +jitter_p99_per_min = 0.14285714285714285 +jitter_p99_per_min_ci_low = 0.11764705882352941 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.03213274979234408 +reaction_rate = 0.358 +reaction_rate_ci_low = 0.3282857277120909 +reaction_rate_ci_high = 0.38771427228790906 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 187.0391061452514 +fire_decisiveness_mean = 3.8749330029198568 +fire_decisiveness_p50 = 3.005189726619953 +step_correction_mean = 0.39413013463246754 +step_correction_p50 = 0.4215181767940521 + +[cell.spm_20.step_minus_5_at_15min] +shares_per_minute = 20 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.884 +convergence_rate_ci_low = 0.864152253770264 +convergence_rate_ci_high = 0.9038477462297361 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 829.2760180995475 +settled_accuracy_p10 = 0.0039531359725202275 +settled_accuracy_p10_ci_low = 0.0030999350598113207 +settled_accuracy_p10_ci_high = 0.004486616125921161 +settled_accuracy_p50 = 0.030713466834763725 +settled_accuracy_p50_ci_low = 0.017267464075388483 +settled_accuracy_p50_ci_high = 0.040075012169662805 +settled_accuracy_p90 = 0.09630983894366985 +settled_accuracy_p90_ci_low = 0.09335796723151835 +settled_accuracy_p90_ci_high = 0.09901383170212874 +settled_accuracy_p95 = 0.10505935143308864 +settled_accuracy_p95_ci_low = 0.10189562763141802 +settled_accuracy_p95_ci_high = 0.10775585625507245 +settled_accuracy_p99 = 0.12048718492652966 +settled_accuracy_p99_ci_low = 0.1151489219879227 +settled_accuracy_p99_ci_high = 0.1332587789167683 +settled_accuracy_mean = 0.039323214941287266 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.07692307692307693 +jitter_p90_per_min_ci_low = 0.07142857142857142 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.08333333333333333 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.10526315789473684 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.11764705882352941 +jitter_mean_per_min = 0.02424566128299738 +reaction_rate = 0.266 +reaction_rate_ci_low = 0.2386129711286529 +reaction_rate_ci_high = 0.2933870288713471 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 182.70676691729324 +fire_decisiveness_mean = 3.741540425956374 +fire_decisiveness_p50 = 2.9223626397298865 +step_correction_mean = 1.848934901388068 +step_correction_p50 = 0.8115717172622681 + +[cell.spm_20.step_plus_5_at_15min] +shares_per_minute = 20 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.861 +convergence_rate_ci_low = 0.839558012069773 +convergence_rate_ci_high = 0.882441987930227 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 870.8710801393728 +settled_accuracy_p10 = 0.0030882223422938893 +settled_accuracy_p10_ci_low = 0.0025613857610830015 +settled_accuracy_p10_ci_high = 0.0034550202483437653 +settled_accuracy_p50 = 0.014232065538138383 +settled_accuracy_p50_ci_low = 0.013297654423580219 +settled_accuracy_p50_ci_high = 0.01563604699870602 +settled_accuracy_p90 = 0.08221967762433069 +settled_accuracy_p90_ci_low = 0.07879508006343772 +settled_accuracy_p90_ci_high = 0.08504694233456289 +settled_accuracy_p95 = 0.09005863269960834 +settled_accuracy_p95_ci_low = 0.08821224400682648 +settled_accuracy_p95_ci_high = 0.09173641834723256 +settled_accuracy_p99 = 0.0994386630686086 +settled_accuracy_p99_ci_low = 0.09634897072250947 +settled_accuracy_p99_ci_high = 0.10016522842772613 +settled_accuracy_mean = 0.03023683103482258 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.07692307692307693 +jitter_p90_per_min_ci_low = 0.06666666666666667 +jitter_p90_per_min_ci_high = 0.07692307692307693 +jitter_p95_per_min = 0.08695652173913043 +jitter_p95_per_min_ci_low = 0.07692307692307693 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.10526315789473684 +jitter_mean_per_min = 0.021667849390633466 +reaction_rate = 0.294 +reaction_rate_ci_low = 0.26576212007958105 +reaction_rate_ci_high = 0.3222378799204189 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 184.69387755102042 +fire_decisiveness_mean = 4.350577477984187 +fire_decisiveness_p50 = 3.183079207288934 +step_correction_mean = -1.4592413198785716 +step_correction_p50 = 0.846821129322052 + +[cell.spm_20.step_plus_10_at_15min] +shares_per_minute = 20 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.892 +convergence_rate_ci_low = 0.8727624227720848 +convergence_rate_ci_high = 0.9112375772279152 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 932.286995515695 +settled_accuracy_p10 = 0.01221210525574068 +settled_accuracy_p10_ci_low = 0.008806269334597827 +settled_accuracy_p10_ci_high = 0.015615683878687392 +settled_accuracy_p50 = 0.05006913128244983 +settled_accuracy_p50_ci_low = 0.0488334740484222 +settled_accuracy_p50_ci_high = 0.05094911153048054 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.09542233957732515 +settled_accuracy_p95_ci_low = 0.0914404045517625 +settled_accuracy_p95_ci_high = 0.10330226253878816 +settled_accuracy_p99 = 0.1317286627515355 +settled_accuracy_p99_ci_low = 0.1284084211376576 +settled_accuracy_p99_ci_high = 0.13529372970757558 +settled_accuracy_mean = 0.05180044788456677 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.09523809523809523 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.10526315789473684 +jitter_p99_per_min_ci_high = 0.13333333333333333 +jitter_mean_per_min = 0.031797063579643486 +reaction_rate = 0.365 +reaction_rate_ci_low = 0.33516064947087487 +reaction_rate_ci_high = 0.3948393505291251 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 186.9041095890411 +fire_decisiveness_mean = 5.053256453047373 +fire_decisiveness_p50 = 3.8103376127582678 +step_correction_mean = 0.4456923775885203 +step_correction_p50 = 0.4460392892360687 + +[cell.spm_20.step_plus_25_at_15min] +shares_per_minute = 20 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.968 +convergence_rate_ci_low = 0.9570914069834832 +convergence_rate_ci_high = 0.9789085930165168 +convergence_p10_secs = 660 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 1080 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1024.4628099173553 +settled_accuracy_p10 = 0.0537761029314654 +settled_accuracy_p10_ci_low = 0.04790595653965657 +settled_accuracy_p10_ci_high = 0.05763556043845597 +settled_accuracy_p50 = 0.11071856304142091 +settled_accuracy_p50_ci_low = 0.10893706434268857 +settled_accuracy_p50_ci_high = 0.11213654645554616 +settled_accuracy_p90 = 0.1619589710375331 +settled_accuracy_p90_ci_low = 0.15981320543493738 +settled_accuracy_p90_ci_high = 0.1647034013777825 +settled_accuracy_p95 = 0.16768464547086048 +settled_accuracy_p95_ci_low = 0.16593675489030335 +settled_accuracy_p95_ci_high = 0.1690214003182141 +settled_accuracy_p99 = 0.18107989648270106 +settled_accuracy_p99_ci_low = 0.1725849345865761 +settled_accuracy_p99_ci_high = 0.18562499181271885 +settled_accuracy_mean = 0.10942422228344933 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.08695652173913043 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.125 +jitter_p90_per_min_ci_high = 0.15384615384615385 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.17647058823529413 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08107448214180785 +reaction_rate = 0.782 +reaction_rate_ci_low = 0.7564089741979733 +reaction_rate_ci_high = 0.8075910258020268 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 162.35294117647058 +fire_decisiveness_mean = 6.253858640666134 +fire_decisiveness_p50 = 4.628338115592541 +step_correction_mean = 0.2151977589825535 +step_correction_p50 = 0.20020824670791626 + +[cell.spm_20.step_plus_50_at_15min] +shares_per_minute = 20 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.842 +convergence_rate_ci_low = 0.8193931183574558 +convergence_rate_ci_high = 0.8646068816425442 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 1200 +convergence_p50_secs_ci_low = 1140 +convergence_p50_secs_ci_high = 1200 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1106.7220902612826 +settled_accuracy_p10 = 0.0934687775118378 +settled_accuracy_p10_ci_low = 0.08877965753183803 +settled_accuracy_p10_ci_high = 0.09674494274316514 +settled_accuracy_p50 = 0.15994198572979235 +settled_accuracy_p50_ci_low = 0.15690034360632832 +settled_accuracy_p50_ci_high = 0.1639728124993569 +settled_accuracy_p90 = 0.20184968133579928 +settled_accuracy_p90_ci_low = 0.19920174454411654 +settled_accuracy_p90_ci_high = 0.20735878214771808 +settled_accuracy_p95 = 0.21893219776785178 +settled_accuracy_p95_ci_low = 0.2133824737239719 +settled_accuracy_p95_ci_high = 0.22799985790816657 +settled_accuracy_p99 = 0.25124726296500743 +settled_accuracy_p99_ci_low = 0.24180647754434537 +settled_accuracy_p99_ci_high = 0.2598567037862194 +settled_accuracy_mean = 0.15453555038350023 +jitter_p10_per_min = 0.09090909090909091 +jitter_p10_per_min_ci_low = 0.09090909090909091 +jitter_p10_per_min_ci_high = 0.1 +jitter_p50_per_min = 0.16666666666666666 +jitter_p50_per_min_ci_low = 0.15789473684210525 +jitter_p50_per_min_ci_high = 0.16666666666666666 +jitter_p90_per_min = 0.2 +jitter_p90_per_min_ci_low = 0.2 +jitter_p90_per_min_ci_high = 0.2222222222222222 +jitter_p95_per_min = 0.23529411764705882 +jitter_p95_per_min_ci_low = 0.21428571428571427 +jitter_p95_per_min_ci_high = 0.25 +jitter_p99_per_min = 0.26666666666666666 +jitter_p99_per_min_ci_low = 0.25 +jitter_p99_per_min_ci_high = 0.2727272727272727 +jitter_mean_per_min = 0.15318296456098376 +reaction_rate = 0.981 +reaction_rate_ci_low = 0.9725381099983514 +reaction_rate_ci_high = 0.9894618900016485 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 115.10703363914374 +fire_decisiveness_mean = 8.187039539121931 +fire_decisiveness_p50 = 6.493368605458546 +step_correction_mean = 0.13222100480130203 +step_correction_p50 = 0.12687265872955322 + +[cell.spm_25.cold_start_10gh_to_1ph] +shares_per_minute = 25 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.998 +convergence_rate_ci_low = 0.995230914663648 +convergence_rate_ci_high = 1 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1080 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1260 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1320 +convergence_mean_secs = 712.3647294589179 +settled_accuracy_p10 = 0.04738503261591498 +settled_accuracy_p10_ci_low = 0.039500680517444264 +settled_accuracy_p10_ci_high = 0.05007764160121486 +settled_accuracy_p50 = 0.0946135673589461 +settled_accuracy_p50_ci_low = 0.09179935711049625 +settled_accuracy_p50_ci_high = 0.09778613894581767 +settled_accuracy_p90 = 0.14163762139070912 +settled_accuracy_p90_ci_low = 0.13913848726283806 +settled_accuracy_p90_ci_high = 0.14490884300894402 +settled_accuracy_p95 = 0.15500866006346758 +settled_accuracy_p95_ci_low = 0.14904550054858146 +settled_accuracy_p95_ci_high = 0.15977117487691062 +settled_accuracy_p99 = 0.17532298322258244 +settled_accuracy_p99_ci_low = 0.16929056735914738 +settled_accuracy_p99_ci_high = 0.1842087338026882 +settled_accuracy_mean = 0.09430368962525815 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09523809523809523 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15384615384615385 +jitter_p95_per_min_ci_low = 0.15 +jitter_p95_per_min_ci_high = 0.15789473684210525 +jitter_p99_per_min = 0.17647058823529413 +jitter_p99_per_min_ci_low = 0.17391304347826086 +jitter_p99_per_min_ci_high = 0.19047619047619047 +jitter_mean_per_min = 0.08920265986829143 +bias_mean = -0.0006403785972748944 +bias_p10 = -0.04862288388486183 +bias_p10_ci_low = -0.054301826760874194 +bias_p10_ci_high = -0.046226934934801386 +bias_p50 = -0.0010049729117009554 +bias_p50_ci_low = -0.0045878692906793335 +bias_p50_ci_high = 0.0019394673871031714 +bias_p90 = 0.0505393046749494 +bias_p90_ci_low = 0.04524413267282716 +bias_p90_ci_high = 0.055172991660109395 +bias_p99 = 0.0930983834078432 +bias_p99_ci_low = 0.085787773251536 +bias_p99_ci_high = 0.10257237850901611 +variance_mean = 0.0067443772181682545 +variance_p10 = 0.003460607282275357 +variance_p10_ci_low = 0.0032819995708174626 +variance_p10_ci_high = 0.003657876751059105 +variance_p50 = 0.006090198095382115 +variance_p50_ci_low = 0.0059070187405237005 +variance_p50_ci_high = 0.006312415402214262 +variance_p90 = 0.010855858230187573 +variance_p90_ci_low = 0.010451442458045232 +variance_p90_ci_high = 0.011368716366811828 +variance_p99 = 0.017235403366308324 +variance_p99_ci_low = 0.01543800692386507 +variance_p99_ci_high = 0.01931557395710722 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0 +ramp_target_overshoot_p90_ci_low = 0 +ramp_target_overshoot_p90_ci_high = 0 +ramp_target_overshoot_p99 = 0.0026410693770773097 +ramp_target_overshoot_p99_ci_low = 0 +ramp_target_overshoot_p99_ci_high = 0.009994724572132352 +ramp_target_overshoot_mean = 0.00014964968165903292 + +[cell.spm_25.stable_1ph] +shares_per_minute = 25 +scenario = "stable_1ph" +convergence_rate = 0.862 +convergence_rate_ci_low = 0.840622877424686 +convergence_rate_ci_high = 0.883377122575314 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 840 +convergence_p50_secs_ci_high = 900 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 743.8747099767982 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0.03436356402027996 +settled_accuracy_p50_ci_low = 0.033463030162549146 +settled_accuracy_p50_ci_high = 0.03527798941303972 +settled_accuracy_p90 = 0.04971518662203578 +settled_accuracy_p90_ci_low = 0.04812960547168099 +settled_accuracy_p90_ci_high = 0.05111064835820511 +settled_accuracy_p95 = 0.05487579122190556 +settled_accuracy_p95_ci_low = 0.0530057355933542 +settled_accuracy_p95_ci_high = 0.05751055236568481 +settled_accuracy_p99 = 0.09473503440436626 +settled_accuracy_p99_ci_low = 0.0880249532234435 +settled_accuracy_p99_ci_high = 0.09900094361774903 +settled_accuracy_mean = 0.028097868548631857 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.07142857142857142 +jitter_p90_per_min_ci_low = 0.06666666666666667 +jitter_p90_per_min_ci_high = 0.07692307692307693 +jitter_p95_per_min = 0.08333333333333333 +jitter_p95_per_min_ci_low = 0.07692307692307693 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.10526315789473684 +jitter_mean_per_min = 0.01839546004581539 +bias_mean = -0.0013184477547191053 +bias_p10 = -0.05666973480155427 +bias_p10_ci_low = -0.059144169335106446 +bias_p10_ci_high = -0.05074898808926789 +bias_p50 = -0.0007532864120630059 +bias_p50_ci_low = -0.004925038355983414 +bias_p50_ci_high = 0.0019645766987022393 +bias_p90 = 0.05386598293988813 +bias_p90_ci_low = 0.04954734028689726 +bias_p90_ci_high = 0.059521451841377006 +bias_p99 = 0.10322737869040435 +bias_p99_ci_low = 0.08901433215417524 +bias_p99_ci_high = 0.1100886808682046 +variance_mean = 0.008033742174264204 +variance_p10 = 0.0039408286480617895 +variance_p10_ci_low = 0.00370720134338716 +variance_p10_ci_high = 0.004173459935516567 +variance_p50 = 0.007414384504572912 +variance_p50_ci_low = 0.007116321314722622 +variance_p50_ci_high = 0.0076796410155700896 +variance_p90 = 0.012999171024168874 +variance_p90_ci_low = 0.012353614673870632 +variance_p90_ci_high = 0.013721672772538026 +variance_p99 = 0.02113705183174105 +variance_p99_ci_low = 0.01947752320516906 +variance_p99_ci_high = 0.023041822891777534 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1.0308058546579022 +upward_step_magnitude_p90 = 1.0509699210685663 +upward_step_magnitude_p90_ci_low = 1.0498646801660945 +upward_step_magnitude_p90_ci_high = 1.053247394615762 +upward_step_magnitude_p95 = 1.0584661190278324 +upward_step_magnitude_p95_ci_low = 1.055097958465312 +upward_step_magnitude_p95_ci_high = 1.0607958520930063 +upward_step_magnitude_p99 = 1.070944606262559 +upward_step_magnitude_p99_ci_low = 1.0657424814606076 +upward_step_magnitude_p99_ci_high = 1.0755374027567381 +upward_step_magnitude_mean = 1.021569472926162 +fire_decisiveness_mean = 3.5540562796338153 +fire_decisiveness_p50 = 2.652140156535843 + +[cell.spm_25.step_minus_50_at_15min] +shares_per_minute = 25 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.323 +convergence_rate_ci_low = 0.2940164440828942 +convergence_rate_ci_high = 0.35198355591710584 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1200 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1041.919504643963 +settled_accuracy_p10 = 0.28998928338536833 +settled_accuracy_p10_ci_low = 0.279695454602497 +settled_accuracy_p10_ci_high = 0.2971781192082952 +settled_accuracy_p50 = 0.3729351692797629 +settled_accuracy_p50_ci_low = 0.36594162025361654 +settled_accuracy_p50_ci_high = 0.37806658152341277 +settled_accuracy_p90 = 0.4957379495463474 +settled_accuracy_p90_ci_low = 0.48918342671420034 +settled_accuracy_p90_ci_high = 0.5035147932432915 +settled_accuracy_p95 = 0.5160161010272959 +settled_accuracy_p95_ci_low = 0.5107657718750909 +settled_accuracy_p95_ci_high = 0.5235612849226983 +settled_accuracy_p99 = 0.5683047783994817 +settled_accuracy_p99_ci_low = 0.547308159411203 +settled_accuracy_p99_ci_high = 0.5793051293117362 +settled_accuracy_mean = 0.38342370738763293 +jitter_p10_per_min = 0.19230769230769232 +jitter_p10_per_min_ci_low = 0.18518518518518517 +jitter_p10_per_min_ci_high = 0.2 +jitter_p50_per_min = 0.23809523809523808 +jitter_p50_per_min_ci_low = 0.23529411764705882 +jitter_p50_per_min_ci_high = 0.25 +jitter_p90_per_min = 0.2857142857142857 +jitter_p90_per_min_ci_low = 0.2777777777777778 +jitter_p90_per_min_ci_high = 0.29411764705882354 +jitter_p95_per_min = 0.29411764705882354 +jitter_p95_per_min_ci_low = 0.2857142857142857 +jitter_p95_per_min_ci_high = 0.3125 +jitter_p99_per_min = 0.3333333333333333 +jitter_p99_per_min_ci_low = 0.29411764705882354 +jitter_p99_per_min_ci_high = 0.35294117647058826 +jitter_mean_per_min = 0.24153871625116682 +reaction_rate = 1 +reaction_rate_ci_low = 1 +reaction_rate_ci_high = 1 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 60 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 120 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 180 +reaction_p99_secs_ci_high = 240 +reaction_mean_secs = 98.1 +fire_decisiveness_mean = 5.984274626403599 +fire_decisiveness_p50 = 5.107170939284927 +step_correction_mean = 0.11384145917743445 +step_correction_p50 = 0.11043690145015717 + +[cell.spm_25.step_minus_25_at_15min] +shares_per_minute = 25 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.97 +convergence_rate_ci_low = 0.9594268944959392 +convergence_rate_ci_high = 0.9805731055040607 +convergence_p10_secs = 720 +convergence_p10_secs_ci_low = 660 +convergence_p10_secs_ci_high = 720 +convergence_p50_secs = 1080 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1037.0103092783504 +settled_accuracy_p10 = 0.1260350982934575 +settled_accuracy_p10_ci_low = 0.12246517519753053 +settled_accuracy_p10_ci_high = 0.12949227849891964 +settled_accuracy_p50 = 0.20162410607638548 +settled_accuracy_p50_ci_low = 0.20023710008821682 +settled_accuracy_p50_ci_high = 0.20334755116625813 +settled_accuracy_p90 = 0.25789408270728975 +settled_accuracy_p90_ci_low = 0.2520540904597055 +settled_accuracy_p90_ci_high = 0.26420723718088723 +settled_accuracy_p95 = 0.27844970651504486 +settled_accuracy_p95_ci_low = 0.27153856732956205 +settled_accuracy_p95_ci_high = 0.28182447703628655 +settled_accuracy_p99 = 0.3019788793195626 +settled_accuracy_p99_ci_low = 0.28770312398917275 +settled_accuracy_p99_ci_high = 0.3276422034577886 +settled_accuracy_mean = 0.19735770187397467 +jitter_p10_per_min = 0.06666666666666667 +jitter_p10_per_min_ci_low = 0.0625 +jitter_p10_per_min_ci_high = 0.07692307692307693 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.15384615384615385 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.1875 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.21428571428571427 +jitter_mean_per_min = 0.10321649836496326 +reaction_rate = 0.839 +reaction_rate_ci_low = 0.816220195646143 +reaction_rate_ci_high = 0.8617798043538569 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 167.77115613825984 +fire_decisiveness_mean = 4.205277518327922 +fire_decisiveness_p50 = 3.4050918844719007 +step_correction_mean = 0.18326416590358702 +step_correction_p50 = 0.17698943614959717 + +[cell.spm_25.step_minus_10_at_15min] +shares_per_minute = 25 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.891 +convergence_rate_ci_low = 0.8716844013709127 +convergence_rate_ci_high = 0.9103155986290873 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 1080 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 973.8047138047139 +settled_accuracy_p10 = 0.015158923111509903 +settled_accuracy_p10_ci_low = 0.012828679644278251 +settled_accuracy_p10_ci_high = 0.017010531244955107 +settled_accuracy_p50 = 0.06752173301931363 +settled_accuracy_p50_ci_low = 0.06662225054050608 +settled_accuracy_p50_ci_high = 0.06869792771555083 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.1139615145575903 +settled_accuracy_p95 = 0.1302550994348315 +settled_accuracy_p95_ci_low = 0.11829920785442138 +settled_accuracy_p95_ci_high = 0.1484753052428054 +settled_accuracy_p99 = 0.16307506238328173 +settled_accuracy_p99_ci_low = 0.15825187373541727 +settled_accuracy_p99_ci_high = 0.17134183055831964 +settled_accuracy_mean = 0.06938824222870026 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.047619047619047616 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.05263157894736842 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.08695652173913043 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.13333333333333333 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.13333333333333333 +jitter_mean_per_min = 0.038154096237083344 +reaction_rate = 0.348 +reaction_rate_ci_low = 0.3184763878632712 +reaction_rate_ci_high = 0.37752361213672875 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 192.93103448275863 +fire_decisiveness_mean = 3.643304105542537 +fire_decisiveness_p50 = 2.7903770158339505 +step_correction_mean = 0.3736511620468107 +step_correction_p50 = 0.39819517731666565 + +[cell.spm_25.step_minus_5_at_15min] +shares_per_minute = 25 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.865 +convergence_rate_ci_low = 0.8438197535425104 +convergence_rate_ci_high = 0.8861802464574896 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 820.5086705202312 +settled_accuracy_p10 = 0.005799406800021112 +settled_accuracy_p10_ci_low = 0.004857622185992838 +settled_accuracy_p10_ci_high = 0.007050881164117007 +settled_accuracy_p50 = 0.020089427153786588 +settled_accuracy_p50_ci_low = 0.018305532249941914 +settled_accuracy_p50_ci_high = 0.03519421976514303 +settled_accuracy_p90 = 0.09044671404269944 +settled_accuracy_p90_ci_low = 0.088144244217494 +settled_accuracy_p90_ci_high = 0.09259264361102759 +settled_accuracy_p95 = 0.09929420547448697 +settled_accuracy_p95_ci_low = 0.09577685327663987 +settled_accuracy_p95_ci_high = 0.10180986956650417 +settled_accuracy_p99 = 0.11297014439637798 +settled_accuracy_p99_ci_low = 0.10737142842207348 +settled_accuracy_p99_ci_high = 0.1182778198208927 +settled_accuracy_mean = 0.037520009143759525 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.07142857142857142 +jitter_p90_per_min_ci_low = 0.06666666666666667 +jitter_p90_per_min_ci_high = 0.07692307692307693 +jitter_p95_per_min = 0.08333333333333333 +jitter_p95_per_min_ci_low = 0.07692307692307693 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.09090909090909091 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.01852894146455919 +reaction_rate = 0.249 +reaction_rate_ci_low = 0.22219747477568577 +reaction_rate_ci_high = 0.2758025252243142 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 186.02409638554218 +fire_decisiveness_mean = 3.5496218278260363 +fire_decisiveness_p50 = 2.6932457108473464 +step_correction_mean = 0.4160213809774583 +step_correction_p50 = 0.7526434063911438 + +[cell.spm_25.step_plus_5_at_15min] +shares_per_minute = 25 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.873 +convergence_rate_ci_low = 0.8523621213880883 +convergence_rate_ci_high = 0.8936378786119117 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 830.1030927835052 +settled_accuracy_p10 = 0.003446328051929237 +settled_accuracy_p10_ci_low = 0.003077548836402544 +settled_accuracy_p10_ci_high = 0.004213478298717321 +settled_accuracy_p50 = 0.017330002688189516 +settled_accuracy_p50_ci_low = 0.01601620276542226 +settled_accuracy_p50_ci_high = 0.019646153466607696 +settled_accuracy_p90 = 0.08012415524313932 +settled_accuracy_p90_ci_low = 0.0765982552460921 +settled_accuracy_p90_ci_high = 0.08233689444950854 +settled_accuracy_p95 = 0.08646127773497725 +settled_accuracy_p95_ci_low = 0.08466371873381795 +settled_accuracy_p95_ci_high = 0.08757317583073432 +settled_accuracy_p99 = 0.09739906474523108 +settled_accuracy_p99_ci_low = 0.09351390860078779 +settled_accuracy_p99_ci_high = 0.0988259271345957 +settled_accuracy_mean = 0.031372136001172904 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.07142857142857142 +jitter_p90_per_min_ci_low = 0.06666666666666667 +jitter_p90_per_min_ci_high = 0.07692307692307693 +jitter_p95_per_min = 0.08333333333333333 +jitter_p95_per_min_ci_low = 0.07692307692307693 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.10526315789473684 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.125 +jitter_mean_per_min = 0.020410324205880005 +reaction_rate = 0.288 +reaction_rate_ci_low = 0.25993323799224427 +reaction_rate_ci_high = 0.3160667620077557 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 192.29166666666666 +fire_decisiveness_mean = 3.9103384441806233 +fire_decisiveness_p50 = 2.870149668732955 +step_correction_mean = 1.5439487369731069 +step_correction_p50 = 0.7700216174125671 + +[cell.spm_25.step_plus_10_at_15min] +shares_per_minute = 25 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.885 +convergence_rate_ci_low = 0.8652268151275522 +convergence_rate_ci_high = 0.9047731848724478 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 1080 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 975.0508474576271 +settled_accuracy_p10 = 0.011105480067233331 +settled_accuracy_p10_ci_low = 0.00934277420850127 +settled_accuracy_p10_ci_high = 0.013687707187182596 +settled_accuracy_p50 = 0.05427130540225755 +settled_accuracy_p50_ci_low = 0.053082624373927634 +settled_accuracy_p50_ci_high = 0.05513621665962942 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.09930379432914227 +settled_accuracy_p95_ci_low = 0.09226010883715774 +settled_accuracy_p95_ci_high = 0.10746746577463118 +settled_accuracy_p99 = 0.13100150769217067 +settled_accuracy_p99_ci_low = 0.1266675561641719 +settled_accuracy_p99_ci_high = 0.13308328570129102 +settled_accuracy_mean = 0.05356506903031397 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.09523809523809523 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.125 +jitter_p99_per_min_ci_low = 0.1111111111111111 +jitter_p99_per_min_ci_high = 0.13333333333333333 +jitter_mean_per_min = 0.03191056639288927 +reaction_rate = 0.389 +reaction_rate_ci_low = 0.3587829907767165 +reaction_rate_ci_high = 0.41921700922328353 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 182.62210796915167 +fire_decisiveness_mean = 4.444764444369803 +fire_decisiveness_p50 = 3.2115292040898815 +step_correction_mean = 0.4047088381717015 +step_correction_p50 = 0.4119390845298767 + +[cell.spm_25.step_plus_25_at_15min] +shares_per_minute = 25 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.98 +convergence_rate_ci_low = 0.971322710100498 +convergence_rate_ci_high = 0.988677289899502 +convergence_p10_secs = 660 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1017.5510204081633 +settled_accuracy_p10 = 0.0593142483603426 +settled_accuracy_p10_ci_low = 0.05374593078703338 +settled_accuracy_p10_ci_high = 0.06371583809949422 +settled_accuracy_p50 = 0.11307086287823365 +settled_accuracy_p50_ci_low = 0.11170619074421684 +settled_accuracy_p50_ci_high = 0.11477408580012982 +settled_accuracy_p90 = 0.15632000125413037 +settled_accuracy_p90_ci_low = 0.1540952619425321 +settled_accuracy_p90_ci_high = 0.16082681768916596 +settled_accuracy_p95 = 0.16610860726455046 +settled_accuracy_p95_ci_low = 0.16325755436408396 +settled_accuracy_p95_ci_high = 0.16862884031805947 +settled_accuracy_p99 = 0.18427771429577677 +settled_accuracy_p99_ci_low = 0.17185076363442697 +settled_accuracy_p99_ci_high = 0.18803344834539615 +settled_accuracy_mean = 0.10995177949080161 +jitter_p10_per_min = 0.041666666666666664 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.13333333333333333 +jitter_p90_per_min_ci_low = 0.125 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.15384615384615385 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.0878766360739662 +reaction_rate = 0.845 +reaction_rate_ci_low = 0.8225689153182464 +reaction_rate_ci_high = 0.8674310846817536 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 161.11242603550295 +fire_decisiveness_mean = 5.545515543539765 +fire_decisiveness_p50 = 4.343950218185945 +step_correction_mean = 0.20184463604667482 +step_correction_p50 = 0.19018568098545074 + +[cell.spm_25.step_plus_50_at_15min] +shares_per_minute = 25 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.786 +convergence_rate_ci_low = 0.7605800769788734 +convergence_rate_ci_high = 0.8114199230211266 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 1260 +convergence_p50_secs_ci_low = 1260 +convergence_p50_secs_ci_high = 1260 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1154.5801526717557 +settled_accuracy_p10 = 0.10220975170525859 +settled_accuracy_p10_ci_low = 0.09711681532472949 +settled_accuracy_p10_ci_high = 0.10660922983094556 +settled_accuracy_p50 = 0.15276992728352 +settled_accuracy_p50_ci_low = 0.1486521274270256 +settled_accuracy_p50_ci_high = 0.15670733851527097 +settled_accuracy_p90 = 0.20031154618731728 +settled_accuracy_p90_ci_low = 0.19740385335514343 +settled_accuracy_p90_ci_high = 0.2023303597545104 +settled_accuracy_p95 = 0.20922127680249714 +settled_accuracy_p95_ci_low = 0.20497865446013108 +settled_accuracy_p95_ci_high = 0.2124071582429683 +settled_accuracy_p99 = 0.24181193573189952 +settled_accuracy_p99_ci_low = 0.2243958435096468 +settled_accuracy_p99_ci_high = 0.2558818010694648 +settled_accuracy_mean = 0.1517851563426242 +jitter_p10_per_min = 0.1 +jitter_p10_per_min_ci_low = 0.1 +jitter_p10_per_min_ci_high = 0.1 +jitter_p50_per_min = 0.17391304347826086 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.18181818181818182 +jitter_p90_per_min = 0.25 +jitter_p90_per_min_ci_low = 0.2222222222222222 +jitter_p90_per_min_ci_high = 0.25 +jitter_p95_per_min = 0.25 +jitter_p95_per_min_ci_low = 0.25 +jitter_p95_per_min_ci_high = 0.2727272727272727 +jitter_p99_per_min = 0.2727272727272727 +jitter_p99_per_min_ci_low = 0.2727272727272727 +jitter_p99_per_min_ci_high = 0.2777777777777778 +jitter_mean_per_min = 0.1716211867476448 +reaction_rate = 0.991 +reaction_rate_ci_low = 0.985146519804424 +reaction_rate_ci_high = 0.996853480195576 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 107.34611503531787 +fire_decisiveness_mean = 7.577078479574567 +fire_decisiveness_p50 = 5.918127060699767 +step_correction_mean = 0.12338600582870778 +step_correction_p50 = 0.11716684699058533 + +[cell.spm_30.cold_start_10gh_to_1ph] +shares_per_minute = 30 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 697.4174174174174 +settled_accuracy_p10 = 0.04500300345724739 +settled_accuracy_p10_ci_low = 0.04078668769500582 +settled_accuracy_p10_ci_high = 0.047266182816224855 +settled_accuracy_p50 = 0.09087976433514144 +settled_accuracy_p50_ci_low = 0.08791643818894379 +settled_accuracy_p50_ci_high = 0.09289289606360207 +settled_accuracy_p90 = 0.13401029624470195 +settled_accuracy_p90_ci_low = 0.13220929563810502 +settled_accuracy_p90_ci_high = 0.13639568084661324 +settled_accuracy_p95 = 0.14493816958289363 +settled_accuracy_p95_ci_low = 0.14116812777205745 +settled_accuracy_p95_ci_high = 0.14682923028615014 +settled_accuracy_p99 = 0.1663052966141363 +settled_accuracy_p99_ci_low = 0.15486014814550353 +settled_accuracy_p99_ci_high = 0.17756945247420652 +settled_accuracy_mean = 0.08990680061775062 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.08695652173913043 +jitter_p50_per_min_ci_high = 0.09523809523809523 +jitter_p90_per_min = 0.14285714285714285 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.15 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.15789473684210525 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.1875 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.19047619047619047 +jitter_mean_per_min = 0.08961546490288666 +bias_mean = -0.0001623747763151154 +bias_p10 = -0.04483930727559451 +bias_p10_ci_low = -0.04888294839647235 +bias_p10_ci_high = -0.04294734943277593 +bias_p50 = -0.0006485471342238258 +bias_p50_ci_low = -0.004134510055961413 +bias_p50_ci_high = 0.0021250975714329633 +bias_p90 = 0.04576204003941636 +bias_p90_ci_low = 0.04311060410873884 +bias_p90_ci_high = 0.05046930659684133 +bias_p99 = 0.0918070393095015 +bias_p99_ci_low = 0.07905090503739237 +bias_p99_ci_high = 0.09997681953845922 +variance_mean = 0.005681103259574088 +variance_p10 = 0.0029167812424725228 +variance_p10_ci_low = 0.002732527118215508 +variance_p10_ci_high = 0.0030256345247773857 +variance_p50 = 0.005139393126862792 +variance_p50_ci_low = 0.004967579364962 +variance_p50_ci_high = 0.005309175463515352 +variance_p90 = 0.009256146569821459 +variance_p90_ci_low = 0.008847604487774554 +variance_p90_ci_high = 0.009746289101170211 +variance_p99 = 0.015042525413517133 +variance_p99_ci_low = 0.012917413231451458 +variance_p99_ci_high = 0.01719458546389603 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0 +ramp_target_overshoot_p90_ci_low = 0 +ramp_target_overshoot_p90_ci_high = 0 +ramp_target_overshoot_p99 = 0 +ramp_target_overshoot_p99_ci_low = 0 +ramp_target_overshoot_p99_ci_high = 0.0036109266922221828 +ramp_target_overshoot_mean = 0.00008637186055502655 + +[cell.spm_30.stable_1ph] +shares_per_minute = 30 +scenario = "stable_1ph" +convergence_rate = 0.86 +convergence_rate_ci_low = 0.8384935209762268 +convergence_rate_ci_high = 0.8815064790237732 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 840 +convergence_p50_secs_ci_high = 900 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 734.3720930232558 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0.03248458291270051 +settled_accuracy_p50_ci_low = 0.03173625196050156 +settled_accuracy_p50_ci_high = 0.03313285454737391 +settled_accuracy_p90 = 0.046419805812446424 +settled_accuracy_p90_ci_low = 0.04523177757759944 +settled_accuracy_p90_ci_high = 0.0480877966488652 +settled_accuracy_p95 = 0.053172232687104026 +settled_accuracy_p95_ci_low = 0.05009462014402766 +settled_accuracy_p95_ci_high = 0.05493779981304803 +settled_accuracy_p99 = 0.08409150132664167 +settled_accuracy_p99_ci_low = 0.07476585213729314 +settled_accuracy_p99_ci_high = 0.0895859054203898 +settled_accuracy_mean = 0.026388209012707154 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.06666666666666667 +jitter_p90_per_min_ci_low = 0.058823529411764705 +jitter_p90_per_min_ci_high = 0.07142857142857142 +jitter_p95_per_min = 0.07692307692307693 +jitter_p95_per_min_ci_low = 0.07142857142857142 +jitter_p95_per_min_ci_high = 0.08333333333333333 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.09090909090909091 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.013927810587317823 +bias_mean = -0.0004701409648903405 +bias_p10 = -0.04982551006384141 +bias_p10_ci_low = -0.05731053262790801 +bias_p10_ci_high = -0.04627335660906591 +bias_p50 = -0.0005673771961371645 +bias_p50_ci_low = -0.003629155579148996 +bias_p50_ci_high = 0.0027007044336308647 +bias_p90 = 0.05358425639310571 +bias_p90_ci_low = 0.04932105272659097 +bias_p90_ci_high = 0.05944245411128493 +bias_p99 = 0.09533248343605753 +bias_p99_ci_low = 0.0891596016543522 +bias_p99_ci_high = 0.10323674567512241 +variance_mean = 0.006636215196570759 +variance_p10 = 0.003363040694200243 +variance_p10_ci_low = 0.0032240927645418357 +variance_p10_ci_high = 0.0035195654287881197 +variance_p50 = 0.005936718359058242 +variance_p50_ci_low = 0.005752345422312394 +variance_p50_ci_high = 0.0062353916304888285 +variance_p90 = 0.01065887098663052 +variance_p90_ci_low = 0.010271305004729923 +variance_p90_ci_high = 0.011239698855528387 +variance_p99 = 0.0161491712520227 +variance_p99_ci_low = 0.01525316445019454 +variance_p99_ci_high = 0.01709679488958017 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1.0464434952417465 +upward_step_magnitude_p90_ci_low = 1.0447261122807814 +upward_step_magnitude_p90_ci_high = 1.0479989445117732 +upward_step_magnitude_p95 = 1.0522497542305596 +upward_step_magnitude_p95_ci_low = 1.0502142752500963 +upward_step_magnitude_p95_ci_high = 1.0536364918142955 +upward_step_magnitude_p99 = 1.0607867907961834 +upward_step_magnitude_p99_ci_low = 1.057848273555451 +upward_step_magnitude_p99_ci_high = 1.067061955776466 +upward_step_magnitude_mean = 1.0180660444885645 +fire_decisiveness_mean = 3.2815043647460356 +fire_decisiveness_p50 = 2.3858400768324834 + +[cell.spm_30.step_minus_50_at_15min] +shares_per_minute = 30 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.221 +convergence_rate_ci_low = 0.1952829625656453 +convergence_rate_ci_high = 0.2467170374343547 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 1200 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 973.0316742081448 +settled_accuracy_p10 = 0.2603621959389608 +settled_accuracy_p10_ci_low = 0.251696294000179 +settled_accuracy_p10_ci_high = 0.2685549803803877 +settled_accuracy_p50 = 0.36305822076548266 +settled_accuracy_p50_ci_low = 0.3589910209009888 +settled_accuracy_p50_ci_high = 0.3668381946883199 +settled_accuracy_p90 = 0.44590532241078407 +settled_accuracy_p90_ci_low = 0.4283437377798951 +settled_accuracy_p90_ci_high = 0.46644264832787186 +settled_accuracy_p95 = 0.4872120366996908 +settled_accuracy_p95_ci_low = 0.47701739481910166 +settled_accuracy_p95_ci_high = 0.4952766432092104 +settled_accuracy_p99 = 0.5193506063051061 +settled_accuracy_p99_ci_low = 0.5099411381435313 +settled_accuracy_p99_ci_high = 0.541761343293989 +settled_accuracy_mean = 0.3585128509114158 +jitter_p10_per_min = 0.20833333333333334 +jitter_p10_per_min_ci_low = 0.2 +jitter_p10_per_min_ci_high = 0.2222222222222222 +jitter_p50_per_min = 0.25 +jitter_p50_per_min_ci_low = 0.24 +jitter_p50_per_min_ci_high = 0.2631578947368421 +jitter_p90_per_min = 0.3125 +jitter_p90_per_min_ci_low = 0.29411764705882354 +jitter_p90_per_min_ci_high = 0.3333333333333333 +jitter_p95_per_min = 0.3333333333333333 +jitter_p95_per_min_ci_low = 0.3125 +jitter_p95_per_min_ci_high = 0.35294117647058826 +jitter_p99_per_min = 0.35294117647058826 +jitter_p99_per_min_ci_low = 0.3333333333333333 +jitter_p99_per_min_ci_high = 0.35294117647058826 +jitter_mean_per_min = 0.2562207459966429 +reaction_rate = 1 +reaction_rate_ci_low = 1 +reaction_rate_ci_high = 1 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 60 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 60 +reaction_p90_secs = 120 +reaction_p90_secs_ci_low = 120 +reaction_p90_secs_ci_high = 120 +reaction_p99_secs = 180 +reaction_p99_secs_ci_low = 180 +reaction_p99_secs_ci_high = 240 +reaction_mean_secs = 91.56 +fire_decisiveness_mean = 5.831714546331195 +fire_decisiveness_p50 = 5.012248894573503 +step_correction_mean = 0.1069020573720336 +step_correction_p50 = 0.10310109704732895 + +[cell.spm_30.step_minus_25_at_15min] +shares_per_minute = 30 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.963 +convergence_rate_ci_low = 0.9513004252384969 +convergence_rate_ci_high = 0.974699574761503 +convergence_p10_secs = 720 +convergence_p10_secs_ci_low = 660 +convergence_p10_secs_ci_high = 720 +convergence_p50_secs = 1080 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1053.8317757009345 +settled_accuracy_p10 = 0.12509467942140717 +settled_accuracy_p10_ci_low = 0.12181466661524643 +settled_accuracy_p10_ci_high = 0.12813981120576634 +settled_accuracy_p50 = 0.20091123099040775 +settled_accuracy_p50_ci_low = 0.19822490792887648 +settled_accuracy_p50_ci_high = 0.20353330850007123 +settled_accuracy_p90 = 0.23429815895333794 +settled_accuracy_p90_ci_low = 0.22977985340024065 +settled_accuracy_p90_ci_high = 0.24604426804854862 +settled_accuracy_p95 = 0.2688078629397208 +settled_accuracy_p95_ci_low = 0.2570554903505955 +settled_accuracy_p95_ci_high = 0.2767644687380517 +settled_accuracy_p99 = 0.29492537986524714 +settled_accuracy_p99_ci_low = 0.2854835207027713 +settled_accuracy_p99_ci_high = 0.31424512684514694 +settled_accuracy_mean = 0.1897637875383493 +jitter_p10_per_min = 0.06666666666666667 +jitter_p10_per_min_ci_low = 0.0625 +jitter_p10_per_min_ci_high = 0.07692307692307693 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.09523809523809523 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.18181818181818182 +jitter_p90_per_min_ci_low = 0.18181818181818182 +jitter_p90_per_min_ci_high = 0.18181818181818182 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.18181818181818182 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.23529411764705882 +jitter_mean_per_min = 0.10857967787328779 +reaction_rate = 0.896 +reaction_rate_ci_low = 0.8770797554349845 +reaction_rate_ci_high = 0.9149202445650155 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 164.33035714285714 +fire_decisiveness_mean = 4.036907150446735 +fire_decisiveness_p50 = 3.2471171748686274 +step_correction_mean = 0.17878891845300263 +step_correction_p50 = 0.17016024887561798 + +[cell.spm_30.step_minus_10_at_15min] +shares_per_minute = 30 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.879 +convergence_rate_ci_low = 0.8587864220287451 +convergence_rate_ci_high = 0.8992135779712549 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 1080 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 969.8976109215017 +settled_accuracy_p10 = 0.02846489591228729 +settled_accuracy_p10_ci_low = 0.022897097131506117 +settled_accuracy_p10_ci_high = 0.04388889903806903 +settled_accuracy_p50 = 0.07088082994278233 +settled_accuracy_p50_ci_low = 0.07032658528846936 +settled_accuracy_p50_ci_high = 0.07156459470533427 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.11265095300179806 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.11848636702061621 +settled_accuracy_p99 = 0.15673461687735735 +settled_accuracy_p99_ci_low = 0.15194692136220556 +settled_accuracy_p99_ci_high = 0.16160269389894677 +settled_accuracy_mean = 0.07152916450582328 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.10526315789473684 +jitter_p99_per_min = 0.125 +jitter_p99_per_min_ci_low = 0.11764705882352941 +jitter_p99_per_min_ci_high = 0.13333333333333333 +jitter_mean_per_min = 0.028740424557806968 +reaction_rate = 0.38 +reaction_rate_ci_low = 0.34991543651637935 +reaction_rate_ci_high = 0.41008456348362066 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 194.21052631578948 +fire_decisiveness_mean = 3.297749457722947 +fire_decisiveness_p50 = 2.547118923909718 +step_correction_mean = 0.3599464889811842 +step_correction_p50 = 0.3700215220451355 + +[cell.spm_30.step_minus_5_at_15min] +shares_per_minute = 30 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.845 +convergence_rate_ci_low = 0.8225689153182464 +convergence_rate_ci_high = 0.8674310846817536 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 807.1952662721893 +settled_accuracy_p10 = 0.007413198392241194 +settled_accuracy_p10_ci_low = 0.006616863412197471 +settled_accuracy_p10_ci_high = 0.00863189537403053 +settled_accuracy_p50 = 0.021136396083017983 +settled_accuracy_p50_ci_low = 0.02019892056450856 +settled_accuracy_p50_ci_high = 0.022812987444355226 +settled_accuracy_p90 = 0.08884853409162119 +settled_accuracy_p90_ci_low = 0.0861018035825254 +settled_accuracy_p90_ci_high = 0.09119579025385738 +settled_accuracy_p95 = 0.09504134012022947 +settled_accuracy_p95_ci_low = 0.09296025890741255 +settled_accuracy_p95_ci_high = 0.09639171175852557 +settled_accuracy_p99 = 0.10187796740388233 +settled_accuracy_p99_ci_low = 0.09946904172709115 +settled_accuracy_p99_ci_high = 0.10780558745581326 +settled_accuracy_mean = 0.03668030954564278 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.06666666666666667 +jitter_p90_per_min_ci_low = 0.0625 +jitter_p90_per_min_ci_high = 0.07692307692307693 +jitter_p95_per_min = 0.08333333333333333 +jitter_p95_per_min_ci_low = 0.07692307692307693 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.10526315789473684 +jitter_mean_per_min = 0.017012922583572378 +reaction_rate = 0.257 +reaction_rate_ci_low = 0.22991573590440384 +reaction_rate_ci_high = 0.2840842640955962 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 195.40856031128405 +fire_decisiveness_mean = 3.1552562317069364 +fire_decisiveness_p50 = 2.521652845369104 +step_correction_mean = 0.3160534898826584 +step_correction_p50 = 0.6914119720458984 + +[cell.spm_30.step_plus_5_at_15min] +shares_per_minute = 30 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.82 +convergence_rate_ci_low = 0.7961878148839716 +convergence_rate_ci_high = 0.8438121851160283 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 852.219512195122 +settled_accuracy_p10 = 0.005783058883622849 +settled_accuracy_p10_ci_low = 0.005109605401126371 +settled_accuracy_p10_ci_high = 0.006811230675681457 +settled_accuracy_p50 = 0.017880039764242017 +settled_accuracy_p50_ci_low = 0.017218601965024338 +settled_accuracy_p50_ci_high = 0.019279035994513194 +settled_accuracy_p90 = 0.07650826544791844 +settled_accuracy_p90_ci_low = 0.07015931901242844 +settled_accuracy_p90_ci_high = 0.07860813392731714 +settled_accuracy_p95 = 0.08169277712991085 +settled_accuracy_p95_ci_low = 0.08052968455380083 +settled_accuracy_p95_ci_high = 0.08295902562523416 +settled_accuracy_p99 = 0.09041462927334898 +settled_accuracy_p99_ci_low = 0.08821071008981207 +settled_accuracy_p99_ci_high = 0.0970142433142629 +settled_accuracy_mean = 0.030994296321321845 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.07142857142857142 +jitter_p90_per_min_ci_low = 0.07142857142857142 +jitter_p90_per_min_ci_high = 0.07692307692307693 +jitter_p95_per_min = 0.08333333333333333 +jitter_p95_per_min_ci_low = 0.07692307692307693 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.09523809523809523 +jitter_p99_per_min_ci_high = 0.125 +jitter_mean_per_min = 0.020344730181393204 +reaction_rate = 0.252 +reaction_rate_ci_low = 0.22509040629069255 +reaction_rate_ci_high = 0.27890959370930746 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 182.85714285714286 +fire_decisiveness_mean = 3.363276962703288 +fire_decisiveness_p50 = 2.385126513935713 +step_correction_mean = 0.5909013227810935 +step_correction_p50 = 0.7045004367828369 + +[cell.spm_30.step_plus_10_at_15min] +shares_per_minute = 30 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.902 +convergence_rate_ci_low = 0.883572247190718 +convergence_rate_ci_high = 0.920427752809282 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1080 +convergence_p50_secs_ci_low = 1080 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1003.7694013303769 +settled_accuracy_p10 = 0.012677474732444627 +settled_accuracy_p10_ci_low = 0.011024522372478973 +settled_accuracy_p10_ci_high = 0.014795735561054846 +settled_accuracy_p50 = 0.05615974887130515 +settled_accuracy_p50_ci_low = 0.0554246627642252 +settled_accuracy_p50_ci_high = 0.05700257521119312 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.10073479936920104 +settled_accuracy_p95_ci_low = 0.0950088879591261 +settled_accuracy_p95_ci_high = 0.11026383118289074 +settled_accuracy_p99 = 0.1258420561131387 +settled_accuracy_p99_ci_low = 0.12293843853654596 +settled_accuracy_p99_ci_high = 0.13227395278598486 +settled_accuracy_mean = 0.054837040335539364 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.04 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.09090909090909091 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.125 +jitter_p99_per_min_ci_low = 0.1111111111111111 +jitter_p99_per_min_ci_high = 0.13333333333333333 +jitter_mean_per_min = 0.03534465956414447 +reaction_rate = 0.45 +reaction_rate_ci_low = 0.41916501986379756 +reaction_rate_ci_high = 0.48083498013620246 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 180.53333333333333 +fire_decisiveness_mean = 3.767077975399244 +fire_decisiveness_p50 = 2.898934409919404 +step_correction_mean = 0.3620316716697481 +step_correction_p50 = 0.38709068298339844 + +[cell.spm_30.step_plus_25_at_15min] +shares_per_minute = 30 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.966 +convergence_rate_ci_low = 0.9547673017311066 +convergence_rate_ci_high = 0.9772326982688934 +convergence_p10_secs = 660 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 720 +convergence_p50_secs = 1080 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1042.0496894409937 +settled_accuracy_p10 = 0.06255190199400296 +settled_accuracy_p10_ci_low = 0.05897097310856625 +settled_accuracy_p10_ci_high = 0.06522809604319701 +settled_accuracy_p50 = 0.11559646464071638 +settled_accuracy_p50_ci_low = 0.11440831565775378 +settled_accuracy_p50_ci_high = 0.11684957500226023 +settled_accuracy_p90 = 0.1398364004051872 +settled_accuracy_p90_ci_low = 0.13632021814997297 +settled_accuracy_p90_ci_high = 0.14963424059504193 +settled_accuracy_p95 = 0.161200318772464 +settled_accuracy_p95_ci_low = 0.15597436377040563 +settled_accuracy_p95_ci_high = 0.16367137445177427 +settled_accuracy_p99 = 0.1727702624203471 +settled_accuracy_p99_ci_low = 0.17175477111797777 +settled_accuracy_p99_ci_high = 0.17358066903992242 +settled_accuracy_mean = 0.10897755992391892 +jitter_p10_per_min = 0.058823529411764705 +jitter_p10_per_min_ci_low = 0.05555555555555555 +jitter_p10_per_min_ci_high = 0.06666666666666667 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.15789473684210525 +jitter_p90_per_min_ci_high = 0.17647058823529413 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.18181818181818182 +jitter_p95_per_min_ci_high = 0.1875 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.21428571428571427 +jitter_mean_per_min = 0.09969967143885815 +reaction_rate = 0.867 +reaction_rate_ci_low = 0.845952939929767 +reaction_rate_ci_high = 0.888047060070233 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 158.4083044982699 +fire_decisiveness_mean = 5.051436759476747 +fire_decisiveness_p50 = 3.8381644808430977 +step_correction_mean = 0.18616317405935803 +step_correction_p50 = 0.1750805526971817 + +[cell.spm_30.step_plus_50_at_15min] +shares_per_minute = 30 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.714 +convergence_rate_ci_low = 0.6859916068579435 +convergence_rate_ci_high = 0.7420083931420565 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 1260 +convergence_p50_secs_ci_low = 1260 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1184.6218487394958 +settled_accuracy_p10 = 0.1036964367251555 +settled_accuracy_p10_ci_low = 0.0992773628113639 +settled_accuracy_p10_ci_high = 0.10663231527994554 +settled_accuracy_p50 = 0.14358800311850417 +settled_accuracy_p50_ci_low = 0.140886200279155 +settled_accuracy_p50_ci_high = 0.14701028671501304 +settled_accuracy_p90 = 0.19529099790074522 +settled_accuracy_p90_ci_low = 0.1934704686551948 +settled_accuracy_p90_ci_high = 0.19717944131602805 +settled_accuracy_p95 = 0.20262170170002858 +settled_accuracy_p95_ci_low = 0.19981655121108677 +settled_accuracy_p95_ci_high = 0.20526185386356022 +settled_accuracy_p99 = 0.21679697269232978 +settled_accuracy_p99_ci_low = 0.2125131902470957 +settled_accuracy_p99_ci_high = 0.22439655933752278 +settled_accuracy_mean = 0.1462726889474655 +jitter_p10_per_min = 0.1 +jitter_p10_per_min_ci_low = 0.1 +jitter_p10_per_min_ci_high = 0.12 +jitter_p50_per_min = 0.18181818181818182 +jitter_p50_per_min_ci_low = 0.17647058823529413 +jitter_p50_per_min_ci_high = 0.1875 +jitter_p90_per_min = 0.2222222222222222 +jitter_p90_per_min_ci_low = 0.21052631578947367 +jitter_p90_per_min_ci_high = 0.25 +jitter_p95_per_min = 0.25 +jitter_p95_per_min_ci_low = 0.2222222222222222 +jitter_p95_per_min_ci_high = 0.2727272727272727 +jitter_p99_per_min = 0.2777777777777778 +jitter_p99_per_min_ci_low = 0.25 +jitter_p99_per_min_ci_high = 0.3 +jitter_mean_per_min = 0.1761999835714233 +reaction_rate = 1 +reaction_rate_ci_low = 1 +reaction_rate_ci_high = 1 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 60 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 240 +reaction_mean_secs = 98.7 +fire_decisiveness_mean = 7.279785766021155 +fire_decisiveness_p50 = 5.920347836414564 +step_correction_mean = 0.11604833593219518 +step_correction_p50 = 0.11077713966369629 + +[derived.operational_fitness.spm_6] +score = 0.6530692808100371 +reaction_10_component = 0.322 +reaction_50_component = 0.845 +jitter_component = 0.8968359570698572 +step_safety_component = 0.7521774323444506 +convergence_component = 0.09999999999999998 +overshoot_component = 0.930159334564602 + +[derived.operational_fitness.spm_8] +score = 0.6612680927387465 +reaction_10_component = 0.324 +reaction_50_component = 0.926 +jitter_component = 0.9035545970848831 +step_safety_component = 0.7914153132094874 +convergence_component = 0 +overshoot_component = 0.963256151651539 + +[derived.operational_fitness.spm_10] +score = 0.6730908177730504 +reaction_10_component = 0.333 +reaction_50_component = 0.962 +jitter_component = 0.9073420555909396 +step_safety_component = 0.8183623410283265 +convergence_component = 0 +overshoot_component = 0.9551471861823384 + +[derived.operational_fitness.spm_12] +score = 0.6856145120659428 +reaction_10_component = 0.347 +reaction_50_component = 0.981 +jitter_component = 0.9164837688409497 +step_safety_component = 0.8375323924718647 +convergence_component = 0 +overshoot_component = 0.969604717377391 + +[derived.operational_fitness.spm_15] +score = 0.6851440410590177 +reaction_10_component = 0.316 +reaction_50_component = 0.994 +jitter_component = 0.9151596655350639 +step_safety_component = 0.8491381980236303 +convergence_component = 0 +overshoot_component = 0.9726957516934418 + +[derived.operational_fitness.spm_20] +score = 0.7055560976710282 +reaction_10_component = 0.358 +reaction_50_component = 0.998 +jitter_component = 0.9387730103520705 +step_safety_component = 0.8694513803320425 +convergence_component = 0 +overshoot_component = 1 + +[derived.operational_fitness.spm_25] +score = 0.7073732835101966 +reaction_10_component = 0.348 +reaction_50_component = 1 +jitter_component = 0.9386817998472821 +step_safety_component = 0.8830677619443352 +convergence_component = 0 +overshoot_component = 0.9973589306229227 + +[derived.operational_fitness.spm_30] +score = 0.7192686140619554 +reaction_10_component = 0.38 +reaction_50_component = 1 +jitter_component = 0.9535739647089406 +step_safety_component = 0.8955004915388809 +convergence_component = 0 +overshoot_component = 1 + +[derived.decoupling_score.spm_6] +score = 0.845 +score_ci_low = 0.8225689153182464 +score_ci_high = 0.8674310846817536 + +[derived.decoupling_score.spm_8] +score = 0.926 +score_ci_low = 0.9097752720084434 +score_ci_high = 0.9422247279915567 + +[derived.decoupling_score.spm_10] +score = 0.962 +score_ci_low = 0.9501495346251718 +score_ci_high = 0.9738504653748281 + +[derived.decoupling_score.spm_12] +score = 0.981 +score_ci_low = 0.9725381099983514 +score_ci_high = 0.9894618900016485 + +[derived.decoupling_score.spm_15] +score = 0.994 +score_ci_low = 0.9892134247733896 +score_ci_high = 0.9987865752266104 + +[derived.decoupling_score.spm_20] +score = 0.998 +score_ci_low = 0.995230914663648 +score_ci_high = 1 + +[derived.decoupling_score.spm_25] +score = 1 +score_ci_low = 1 +score_ci_high = 1 + +[derived.decoupling_score.spm_30] +score = 1 +score_ci_low = 1 +score_ci_high = 1 + +[derived.reaction_asymmetry.spm_6] +asymmetry_at_5 = 0.03699999999999998 +asymmetry_at_5_ci_low = -0.01944770024982012 +asymmetry_at_5_ci_high = 0.0934477002498201 +asymmetry_at_10 = 0.02999999999999997 +asymmetry_at_10_ci_low = -0.028561600709753165 +asymmetry_at_10_ci_high = 0.08856160070975311 +asymmetry_at_25 = 0.02100000000000002 +asymmetry_at_25_ci_low = -0.04096446197218634 +asymmetry_at_25_ci_high = 0.08296446197218638 +asymmetry_at_50 = -0.026000000000000023 +asymmetry_at_50_ci_low = -0.07229475879954195 +asymmetry_at_50_ci_high = 0.0202947587995419 +max_abs_asymmetry = 0.03699999999999998 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.09344770024982009 + +[derived.reaction_asymmetry.spm_8] +asymmetry_at_5 = 0.009000000000000008 +asymmetry_at_5_ci_low = -0.04819976848679952 +asymmetry_at_5_ci_high = 0.06619976848679954 +asymmetry_at_10 = 0.032999999999999974 +asymmetry_at_10_ci_low = -0.025702784028323322 +asymmetry_at_10_ci_high = 0.09170278402832327 +asymmetry_at_25 = 0.04299999999999993 +asymmetry_at_25_ci_low = -0.0184200215566358 +asymmetry_at_25_ci_high = 0.10442002155663566 +asymmetry_at_50 = -0.040000000000000036 +asymmetry_at_50_ci_low = -0.07592287425967026 +asymmetry_at_50_ci_high = -0.004077125740329812 +max_abs_asymmetry = 0.04299999999999993 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.10442002155663566 + +[derived.reaction_asymmetry.spm_10] +asymmetry_at_5 = 0.025999999999999968 +asymmetry_at_5_ci_low = -0.029988395513361743 +asymmetry_at_5_ci_high = 0.08198839551336168 +asymmetry_at_10 = 0.061 +asymmetry_at_10_ci_low = 0.0015034570826932825 +asymmetry_at_10_ci_high = 0.12049654291730671 +asymmetry_at_25 = -0.006000000000000005 +asymmetry_at_25_ci_low = -0.06643281491482433 +asymmetry_at_25_ci_high = 0.05443281491482432 +asymmetry_at_50 = -0.06899999999999995 +asymmetry_at_50_ci_low = -0.1000095029706991 +asymmetry_at_50_ci_high = -0.037990497029300796 +max_abs_asymmetry = 0.06899999999999995 +max_abs_asymmetry_ci_low = 0.037990497029300796 +max_abs_asymmetry_ci_high = 0.1000095029706991 + +[derived.reaction_asymmetry.spm_12] +asymmetry_at_5 = 0.0040000000000000036 +asymmetry_at_5_ci_low = -0.05236234329307726 +asymmetry_at_5_ci_high = 0.06036234329307727 +asymmetry_at_10 = 0.04200000000000004 +asymmetry_at_10_ci_low = -0.017720771451175676 +asymmetry_at_10_ci_high = 0.10172077145117575 +asymmetry_at_25 = -0.06600000000000006 +asymmetry_at_25_ci_low = -0.12559672046392556 +asymmetry_at_25_ci_high = -0.006403279536074558 +asymmetry_at_50 = -0.03200000000000003 +asymmetry_at_50_ci_low = -0.05409749040647127 +asymmetry_at_50_ci_high = -0.009902509593528785 +max_abs_asymmetry = 0.06600000000000006 +max_abs_asymmetry_ci_low = 0.006403279536074558 +max_abs_asymmetry_ci_high = 0.12559672046392556 + +[derived.reaction_asymmetry.spm_15] +asymmetry_at_5 = 0.030999999999999972 +asymmetry_at_5_ci_low = -0.025122445684756245 +asymmetry_at_5_ci_high = 0.08712244568475619 +asymmetry_at_10 = 0.03999999999999998 +asymmetry_at_10_ci_low = -0.018492873612184435 +asymmetry_at_10_ci_high = 0.0984928736121844 +asymmetry_at_25 = 0.016000000000000014 +asymmetry_at_25_ci_low = -0.039463650694862795 +asymmetry_at_25_ci_high = 0.07146365069486282 +asymmetry_at_50 = -0.039000000000000035 +asymmetry_at_50_ci_low = -0.05663541797605676 +asymmetry_at_50_ci_high = -0.021364582023943313 +max_abs_asymmetry = 0.03999999999999998 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.0984928736121844 + +[derived.reaction_asymmetry.spm_20] +asymmetry_at_5 = 0.02799999999999997 +asymmetry_at_5_ci_low = -0.027624908791766045 +asymmetry_at_5_ci_high = 0.08362490879176601 +asymmetry_at_10 = 0.007000000000000006 +asymmetry_at_10_ci_low = -0.052553622817034185 +asymmetry_at_10_ci_high = 0.0665536228170342 +asymmetry_at_25 = -0.02100000000000002 +asymmetry_at_25_ci_low = -0.07124273052198482 +asymmetry_at_25_ci_high = 0.029242730521984783 +asymmetry_at_50 = -0.017000000000000015 +asymmetry_at_50_ci_low = -0.02746189000164856 +asymmetry_at_50_ci_high = -0.005769024661999467 +max_abs_asymmetry = 0.02799999999999997 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.083624908791766 + +[derived.reaction_asymmetry.spm_25] +asymmetry_at_5 = 0.03899999999999998 +asymmetry_at_5_ci_low = -0.01586928723206993 +asymmetry_at_5_ci_high = 0.09386928723206991 +asymmetry_at_10 = 0.041000000000000036 +asymmetry_at_10_ci_low = -0.018740621360012255 +asymmetry_at_10_ci_high = 0.10074062136001233 +asymmetry_at_25 = 0.006000000000000005 +asymmetry_at_25_ci_low = -0.03921088903561054 +asymmetry_at_25_ci_high = 0.05121088903561055 +asymmetry_at_50 = -0.009000000000000008 +asymmetry_at_50_ci_low = -0.014853480195575974 +asymmetry_at_50_ci_high = -0.0031465198044240417 +max_abs_asymmetry = 0.041000000000000036 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.10074062136001233 + +[derived.reaction_asymmetry.spm_30] +asymmetry_at_5 = -0.0050000000000000044 +asymmetry_at_5_ci_low = -0.05899385780490363 +asymmetry_at_5_ci_high = 0.04899385780490362 +asymmetry_at_10 = 0.07 +asymmetry_at_10_ci_low = 0.009080456380176904 +asymmetry_at_10_ci_high = 0.1309195436198231 +asymmetry_at_25 = -0.029000000000000026 +asymmetry_at_25_ci_low = -0.06896730463524858 +asymmetry_at_25_ci_high = 0.010967304635248531 +asymmetry_at_50 = 0 +asymmetry_at_50_ci_low = 0 +asymmetry_at_50_ci_high = 0 +max_abs_asymmetry = 0.07 +max_abs_asymmetry_ci_low = 0.009080456380176904 +max_abs_asymmetry_ci_high = 0.1309195436198231 + diff --git a/sv2/channels-sv2/sim/baseline_Parametric.md b/sv2/channels-sv2/sim/baseline_Parametric.md new file mode 100644 index 0000000000..881dd35940 --- /dev/null +++ b/sv2/channels-sv2/sim/baseline_Parametric.md @@ -0,0 +1,227 @@ +# Vardiff baseline characterization — `Parametric` + +*Generated by `cargo run --release --bin generate-baseline` from the vardiff_sim crate. 1000 trials per cell, base seed `0xdeadbeefcafef00d`.* + +## Summary + +Headline per-metric values at each share rate's best and worst cells. ↑ = higher is better; ↓ = lower is better; ↔ = near-zero is better. Where a `(floor: X.X%)` annotation appears, it's the Poisson-noise lower bound on that metric at that share rate — the algorithm cannot do better than this without exotic estimation techniques. + +| Metric | Dir | Best | Worst | +| --- | :-: | --- | --- | +| cold-start convergence rate | ↑ | 100.0% @ SPM=6 | 100.0% @ SPM=6 | +| cold-start p90 time | ↓ | 10m @ SPM=6 | 10m @ SPM=6 | +| settled accuracy p50 (stable) | ↓ | 0.0% @ SPM=6 (floor: 8.7%) | 0.0% @ SPM=6 (floor: 8.7%) | +| settled accuracy p99 (stable) | ↓ | 0.0% @ SPM=12 (floor: 23.5%) | 9.1% @ SPM=6 (floor: 33.3%) | +| stable-load jitter (mean) | ↓ | 0.000/min @ SPM=25 (floor: 0.020/min) | 0.001/min @ SPM=10 (floor: 0.020/min) | +| reaction rate at −50% step | ↑ | 21.4% @ SPM=30 | 3.6% @ SPM=8 | +| reaction rate at +50% step | ↑ | 23.9% @ SPM=30 | 4.0% @ SPM=6 | +| ramp target overshoot p99 (cold start) | ↓ | 23.6% @ SPM=30 (floor: 42.5%) | 69.1% @ SPM=6 (floor: 95.0%) | +| upward step magnitude p95 (stable) | ↓ | 1.000 @ SPM=6 | 1.000 @ SPM=6 | +| operational fitness | ↑ | 0.598 @ SPM=30 | 0.535 @ SPM=6 | +| decoupling score | ↑ | 0.214 @ SPM=30 | 0.036 @ SPM=8 | +| max |reaction asymmetry| | ↓ | 0.003 @ SPM=6 | 0.025 @ SPM=30 | + +## Convergence time (cold start: 10 GH/s → 1 PH/s) + +| share/min | rate | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 100.0% | 10m | 10m | 10m | 15m | 10m15s | +| 8 | 100.0% | 10m | 10m | 10m | 15m | 10m16s | +| 10 | 100.0% | 10m | 10m | 10m | 16m | 10m13s | +| 12 | 100.0% | 10m | 10m | 10m | 16m | 10m16s | +| 15 | 100.0% | 10m | 10m | 10m | 15m | 10m12s | +| 20 | 100.0% | 10m | 10m | 10m | 15m | 10m14s | +| 25 | 100.0% | 10m | 10m | 10m | 15m | 10m11s | +| 30 | 100.0% | 10m | 10m | 10m | 15m | 10m08s | + +## Settled accuracy (stable load, post-convergence) + +`|final_hashrate / true_hashrate - 1|` at trial end. Smaller is better. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.0% | 0.0% | 0.0% | 9.1% | 0.3% | +| 8 | 0.0% | 0.0% | 0.0% | 0.4% | 0.1% | +| 10 | 0.0% | 0.0% | 0.0% | 1.5% | 0.1% | +| 12 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | +| 15 | 0.0% | 0.0% | 0.0% | 0.0% | 0.1% | +| 20 | 0.0% | 0.0% | 0.0% | 0.0% | 0.1% | +| 25 | 0.0% | 0.0% | 0.0% | 0.0% | 0.1% | +| 30 | 0.0% | 0.0% | 0.0% | 0.9% | 0.1% | + +## Steady-state jitter (fires per minute) + +Post-convergence rate of vardiff fires. Smaller is better — ideal is zero under stable load. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | +| 8 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | +| 10 | 0.000 | 0.000 | 0.000 | 0.000 | 0.001 | +| 12 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | +| 15 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | +| 20 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | +| 25 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | +| 30 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | + +## Reaction time to a 50% drop (step at 15 min) + +| share/min | reacted | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 3.7% | 2m | 5m | 5m | 5m | 4m08s | +| 8 | 3.6% | 3m | 4m | 5m | 5m | 4m05s | +| 10 | 6.4% | 3m | 5m | 5m | 5m | 4m15s | +| 12 | 6.3% | 2m | 4m | 5m | 5m | 3m56s | +| 15 | 8.7% | 3m | 4m | 5m | 5m | 4m12s | +| 20 | 14.2% | 3m | 4m | 5m | 5m | 4m12s | +| 25 | 18.4% | 3m | 5m | 5m | 5m | 4m25s | +| 30 | 21.4% | 3m | 5m | 5m | 5m | 4m20s | + +## Reaction sensitivity (P[fire within 5 min of step change]) + +| Δ% | 6 | 8 | 10 | 12 | 15 | 20 | 25 | 30 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| -50% | 0.04 | 0.04 | 0.06 | 0.06 | 0.09 | 0.14 | 0.18 | 0.21 | +| -25% | 0.01 | 0.00 | 0.01 | 0.01 | 0.01 | 0.01 | 0.02 | 0.02 | +| -10% | 0.00 | 0.01 | 0.00 | 0.01 | 0.00 | 0.00 | 0.00 | 0.01 | +| -5% | 0.00 | 0.00 | 0.01 | 0.01 | 0.00 | 0.00 | 0.00 | 0.00 | +| +5% | 0.00 | 0.01 | 0.01 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | +| +10% | 0.01 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | +| +25% | 0.01 | 0.00 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.02 | +| +50% | 0.04 | 0.04 | 0.07 | 0.08 | 0.10 | 0.13 | 0.18 | 0.24 | + +## Estimator bias + +`E[H̃ − H_true] / H_true` averaged over post-settle ticks. Positive = systematic over-estimate. Populated only for algorithms that expose introspection (e.g. ClassicComposed, Parametric, EWMA-60s). + +### Bias — stable load + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | -11.3% | -0.6% | 10.1% | 19.4% | -0.6% | +| 8 | -9.6% | -0.6% | 8.4% | 15.4% | -0.6% | +| 10 | -9.4% | -0.4% | 8.0% | 14.2% | -0.5% | +| 12 | -7.9% | -0.3% | 7.1% | 12.9% | -0.4% | +| 15 | -7.1% | -0.5% | 6.1% | 11.2% | -0.4% | +| 20 | -5.8% | -0.2% | 5.7% | 10.6% | -0.2% | +| 25 | -5.4% | -0.1% | 5.2% | 9.2% | -0.2% | +| 30 | -4.8% | 0.0% | 5.1% | 8.7% | 0.1% | + +### Bias — cold start + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | -14.9% | -0.8% | 14.8% | 28.9% | -0.2% | +| 8 | -12.5% | -1.1% | 12.1% | 22.1% | -0.5% | +| 10 | -11.0% | -0.8% | 10.4% | 21.0% | -0.5% | +| 12 | -9.9% | -0.7% | 10.4% | 19.9% | -0.3% | +| 15 | -9.1% | -0.3% | 8.3% | 16.2% | -0.3% | +| 20 | -7.7% | -0.5% | 8.0% | 13.9% | -0.2% | +| 25 | -7.3% | -0.4% | 7.2% | 13.8% | -0.1% | +| 30 | -6.4% | -0.3% | 6.2% | 12.0% | -0.1% | + +## Estimator variance + +Population variance of `H̃ / H_true` over post-settle ticks (dimensionless). Populated only for algorithms that expose introspection. + +### Variance — stable load + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.000 | 0.001 | 0.003 | 0.009 | 0.001 | +| 8 | 0.000 | 0.001 | 0.002 | 0.006 | 0.001 | +| 10 | 0.000 | 0.001 | 0.002 | 0.005 | 0.001 | +| 12 | 0.000 | 0.001 | 0.001 | 0.003 | 0.001 | +| 15 | 0.000 | 0.000 | 0.001 | 0.002 | 0.001 | +| 20 | 0.000 | 0.000 | 0.001 | 0.002 | 0.000 | +| 25 | 0.000 | 0.000 | 0.001 | 0.001 | 0.000 | +| 30 | 0.000 | 0.000 | 0.001 | 0.001 | 0.000 | + +### Variance — cold start + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.002 | 0.008 | 0.027 | 0.093 | 0.014 | +| 8 | 0.002 | 0.005 | 0.020 | 0.065 | 0.009 | +| 10 | 0.001 | 0.004 | 0.016 | 0.052 | 0.008 | +| 12 | 0.001 | 0.004 | 0.014 | 0.042 | 0.006 | +| 15 | 0.001 | 0.003 | 0.010 | 0.031 | 0.005 | +| 20 | 0.001 | 0.002 | 0.009 | 0.026 | 0.004 | +| 25 | 0.001 | 0.002 | 0.006 | 0.019 | 0.003 | +| 30 | 0.000 | 0.001 | 0.005 | 0.014 | 0.002 | + +## Ramp target overshoot (cold start) + +`max(new_hashrate on fires) / H_true − 1`: how far the algorithm's actual *target* (not its belief) climbs past truth during the cold-start ramp. Reads `new_hashrate` (the actual target the algorithm set), so it's unaffected by estimator-belief noise. Works for any algorithm that fires, including those without introspection. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.0% | 5.0% | 27.9% | 69.1% | 11.0% | +| 8 | 0.0% | 3.3% | 25.5% | 63.1% | 9.2% | +| 10 | 0.0% | 4.3% | 22.0% | 56.1% | 8.3% | +| 12 | 0.0% | 3.3% | 19.7% | 50.1% | 7.5% | +| 15 | 0.0% | 3.7% | 18.1% | 48.7% | 6.7% | +| 20 | 0.0% | 2.4% | 16.1% | 35.8% | 5.8% | +| 25 | 0.0% | 2.0% | 13.4% | 33.8% | 5.0% | +| 30 | 0.0% | 1.7% | 12.2% | 23.6% | 4.3% | + +## Upward step magnitude (stable load) + +`new_hashrate / old_hashrate` for upward difficulty adjustments during steady-state. Per-trial p95 of ratios, then distribution across trials. Values near 1.0 indicate gentle retargeting; values >> 1.0 indicate aggressive jumps. + +| share/min | p50 | p90 | p95 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 1.000 | 1.000 | 1.000 | 1.500 | 1.015 | +| 8 | 1.000 | 1.000 | 1.000 | 1.500 | 1.013 | +| 10 | 1.000 | 1.000 | 1.000 | 1.440 | 1.009 | +| 12 | 1.000 | 1.000 | 1.000 | 1.000 | 1.005 | +| 15 | 1.000 | 1.000 | 1.000 | 1.000 | 1.005 | +| 20 | 1.000 | 1.000 | 1.000 | 1.000 | 1.006 | +| 25 | 1.000 | 1.000 | 1.000 | 1.000 | 1.003 | +| 30 | 1.000 | 1.000 | 1.000 | 1.250 | 1.005 | + +## Operational fitness (per share rate) + +`0.15×react(-10%) + 0.1×react(-50%) + 0.25×jitter + 0.25×step_safety + 0.15×convergence + 0.1×overshoot`. Higher is better. + +| share/min | fitness | react-10% | react-50% | jitter | step-safe | conv | overshoot | +| --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.535 | 0.002 | 0.037 | 0.999 | 1.000 | 0.000 | 0.309 | +| 8 | 0.541 | 0.007 | 0.036 | 0.999 | 1.000 | 0.000 | 0.369 | +| 10 | 0.550 | 0.002 | 0.064 | 0.998 | 1.000 | 0.000 | 0.439 | +| 12 | 0.557 | 0.005 | 0.063 | 1.000 | 1.000 | 0.000 | 0.499 | +| 15 | 0.560 | 0.000 | 0.087 | 0.999 | 1.000 | 0.000 | 0.513 | +| 20 | 0.579 | 0.002 | 0.142 | 0.999 | 1.000 | 0.000 | 0.642 | +| 25 | 0.585 | 0.002 | 0.184 | 1.000 | 1.000 | 0.000 | 0.662 | +| 30 | 0.598 | 0.005 | 0.214 | 0.999 | 1.000 | 0.000 | 0.764 | + +## Decoupling score (per share rate) + +`reaction_rate(Step−50) × clamp(1 − jitter_p50 / J_max, 0, 1)` where `J_max = 0.50` fires/min. Higher is better. Score of 1.0 = perfect decoupling between reactivity and jitter. + +| share/min | decoupling score | +| --- | --- | +| 6 | 0.037 | +| 8 | 0.036 | +| 10 | 0.064 | +| 12 | 0.063 | +| 15 | 0.087 | +| 20 | 0.142 | +| 25 | 0.184 | +| 30 | 0.214 | + +## Reaction asymmetry (per share rate) + +`reaction_rate(+δ%) − reaction_rate(−δ%)`. Positive = responds faster to up-steps; negative = responds faster to down-steps; near zero = symmetric. + +| share/min | δ=5% | δ=10% | δ=25% | δ=50% | +| --- | --- | --- | --- | --- | +| 6 | +0.00 | +0.00 | -0.00 | +0.00 | +| 8 | +0.00 | -0.01 | -0.00 | +0.01 | +| 10 | -0.00 | +0.00 | -0.00 | +0.01 | +| 12 | -0.01 | -0.00 | +0.00 | +0.01 | +| 15 | +0.00 | +0.00 | +0.00 | +0.02 | +| 20 | +0.00 | +0.00 | +0.00 | -0.01 | +| 25 | +0.00 | +0.00 | -0.00 | -0.00 | +| 30 | -0.00 | -0.00 | +0.00 | +0.02 | + diff --git a/sv2/channels-sv2/sim/baseline_Parametric.toml b/sv2/channels-sv2/sim/baseline_Parametric.toml new file mode 100644 index 0000000000..39e0069e04 --- /dev/null +++ b/sv2/channels-sv2/sim/baseline_Parametric.toml @@ -0,0 +1,6503 @@ +# Vardiff baseline characterization. Regenerate with +# `cargo run --release --bin generate-baseline` from the sim crate. + +[meta] +algorithm = "Parametric" +trial_count = 1000 +base_seed = 16045690984503111693 +quiet_window_secs = 300 +settle_buffer_secs = 120 +min_settled_window_secs = 600 +react_window_secs = 300 +step_event_at_secs = 900 +trial_duration_secs = 1800 + +[cell.spm_6.cold_start_10gh_to_1ph] +shares_per_minute = 6 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 780 +convergence_p95_secs_ci_low = 660 +convergence_p95_secs_ci_high = 780 +convergence_p99_secs = 900 +convergence_p99_secs_ci_low = 900 +convergence_p99_secs_ci_high = 960 +convergence_mean_secs = 615.24 +settled_accuracy_p10 = 0.016955524472220596 +settled_accuracy_p10_ci_low = 0.015849973032302622 +settled_accuracy_p10_ci_high = 0.01695700086724794 +settled_accuracy_p50 = 0.11302696481166796 +settled_accuracy_p50_ci_low = 0.08256604971921311 +settled_accuracy_p50_ci_high = 0.114264116735602 +settled_accuracy_p90 = 0.24659575183437044 +settled_accuracy_p90_ci_low = 0.24249110522327766 +settled_accuracy_p90_ci_high = 0.25479309967860897 +settled_accuracy_p95 = 0.3122000359569297 +settled_accuracy_p95_ci_low = 0.2793962832828931 +settled_accuracy_p95_ci_high = 0.320405973735872 +settled_accuracy_p99 = 0.47622873143911404 +settled_accuracy_p99_ci_low = 0.39421324284731907 +settled_accuracy_p99_ci_high = 0.5819335151133527 +settled_accuracy_mean = 0.12120507153771479 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05555555555555555 +jitter_p90_per_min_ci_low = 0.05555555555555555 +jitter_p90_per_min_ci_high = 0.05555555555555555 +jitter_p95_per_min = 0.05555555555555555 +jitter_p95_per_min_ci_low = 0.05555555555555555 +jitter_p95_per_min_ci_high = 0.058823529411764705 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.1111111111111111 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.01148222115567019 +bias_mean = -0.002355400587136866 +bias_p10 = -0.14867047148735238 +bias_p10_ci_low = -0.15904022512071372 +bias_p10_ci_high = -0.13829181356723605 +bias_p50 = -0.0075204595767650855 +bias_p50_ci_low = -0.015038351356437397 +bias_p50_ci_high = -0.0007188913527928228 +bias_p90 = 0.14783143760620926 +bias_p90_ci_low = 0.13411880774715615 +bias_p90_ci_high = 0.15880648141231551 +bias_p99 = 0.2885386581622734 +bias_p99_ci_low = 0.2624764360024664 +bias_p99_ci_high = 0.3488296756135134 +variance_mean = 0.01357121509160696 +variance_p10 = 0.0024066655841311377 +variance_p10_ci_low = 0.0022815253402038867 +variance_p10_ci_high = 0.002649464828841177 +variance_p50 = 0.007972796919908678 +variance_p50_ci_low = 0.007251433306411953 +variance_p50_ci_high = 0.008558654907068327 +variance_p90 = 0.027417260946836906 +variance_p90_ci_low = 0.024805226123732347 +variance_p90_ci_high = 0.031766400650774546 +variance_p99 = 0.09278834856384276 +variance_p99_ci_low = 0.06764098156133914 +variance_p99_ci_high = 0.11133267615296046 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.04976001534377095 +ramp_target_overshoot_p50_ci_low = 0.04976001534377095 +ramp_target_overshoot_p50_ci_high = 0.0596036107522091 +ramp_target_overshoot_p90 = 0.2794013835566236 +ramp_target_overshoot_p90_ci_low = 0.2793962832828931 +ramp_target_overshoot_p90_ci_high = 0.3122000359569297 +ramp_target_overshoot_p99 = 0.6912845918516013 +ramp_target_overshoot_p99_ci_low = 0.5819335151133527 +ramp_target_overshoot_p99_ci_high = 0.9136269985942707 +ramp_target_overshoot_mean = 0.10994251823733737 + +[cell.spm_6.stable_1ph] +shares_per_minute = 6 +scenario = "stable_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 240 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 660 +convergence_mean_secs = 8.4 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0 +settled_accuracy_p90_ci_low = 0 +settled_accuracy_p90_ci_high = 0 +settled_accuracy_p95 = 0 +settled_accuracy_p95_ci_low = 0 +settled_accuracy_p95_ci_high = 0 +settled_accuracy_p99 = 0.09143710345791178 +settled_accuracy_p99_ci_low = 0 +settled_accuracy_p99_ci_high = 0.2753623023065116 +settled_accuracy_mean = 0.002847158218074417 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00023072091699542684 +bias_mean = -0.006419681201880487 +bias_p10 = -0.11250178849539944 +bias_p10_ci_low = -0.11914633963579646 +bias_p10_ci_high = -0.1060746736092365 +bias_p50 = -0.006456045871014241 +bias_p50_ci_low = -0.013724048962218094 +bias_p50_ci_high = 0.0006224559139703072 +bias_p90 = 0.10077645698387636 +bias_p90_ci_low = 0.09125509008819409 +bias_p90_ci_high = 0.1158237973961612 +bias_p99 = 0.19420497009030296 +bias_p99_ci_low = 0.1686422462758368 +bias_p99_ci_high = 0.2114909421452039 +variance_mean = 0.001495030352734932 +variance_p10 = 0.00037917110598894617 +variance_p10_ci_low = 0.0003491381976423614 +variance_p10_ci_high = 0.0003993215788194896 +variance_p50 = 0.0009829697569413217 +variance_p50_ci_low = 0.0009167601480943759 +variance_p50_ci_high = 0.0010490447303939082 +variance_p90 = 0.002799626090352352 +variance_p90_ci_low = 0.0026060278475426284 +variance_p90_ci_high = 0.003061691211990694 +variance_p99 = 0.008890098044508266 +variance_p99_ci_low = 0.006014301092951525 +variance_p99_ci_high = 0.015390012514056754 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1 +upward_step_magnitude_p95 = 1 +upward_step_magnitude_p95_ci_low = 1 +upward_step_magnitude_p95_ci_high = 1 +upward_step_magnitude_p99 = 1.5000015099494597 +upward_step_magnitude_p99_ci_low = 1 +upward_step_magnitude_p99_ci_high = 1.7777777181254535 +upward_step_magnitude_mean = 1.0148108859242035 +fire_decisiveness_mean = 60.20930856049209 +fire_decisiveness_p50 = 3.7275917525541757 + +[cell.spm_6.step_minus_50_at_15min] +shares_per_minute = 6 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.635 +convergence_rate_ci_low = 0.6051606494708749 +convergence_rate_ci_high = 0.6648393505291251 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 447.3070866141732 +settled_accuracy_p10 = 0.42424271504750544 +settled_accuracy_p10_ci_low = 0.41666733216290996 +settled_accuracy_p10_ci_high = 0.43055578018383933 +settled_accuracy_p50 = 0.4880951893614196 +settled_accuracy_p50_ci_low = 0.48275882664444736 +settled_accuracy_p50_ci_high = 0.4942535014553564 +settled_accuracy_p90 = 1 +settled_accuracy_p90_ci_low = 1 +settled_accuracy_p90_ci_high = 1 +settled_accuracy_p95 = 1 +settled_accuracy_p95_ci_low = 1 +settled_accuracy_p95_ci_high = 1 +settled_accuracy_p99 = 1 +settled_accuracy_p99_ci_low = 1 +settled_accuracy_p99_ci_high = 1 +settled_accuracy_mean = 0.6779595201675882 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.09090909090909091 +jitter_p99_per_min_ci_low = 0.047619047619047616 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.002014206250224656 +reaction_rate = 0.037 +reaction_rate_ci_low = 0.02530042523849691 +reaction_rate_ci_high = 0.048699574761503085 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 248.1081081081081 +fire_decisiveness_mean = 5.315787026551852 +fire_decisiveness_p50 = 0.9955706905360096 +step_correction_mean = 0.6182302832603455 +step_correction_p50 = 0.5999995470046997 + +[cell.spm_6.step_minus_25_at_15min] +shares_per_minute = 6 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.978 +convergence_rate_ci_low = 0.9689084728675541 +convergence_rate_ci_high = 0.9870915271324459 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 1260 +convergence_p99_secs_ci_low = 1080 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 33.92638036809816 +settled_accuracy_p10 = 0.33333330350717194 +settled_accuracy_p10_ci_low = 0.33333330350717194 +settled_accuracy_p10_ci_high = 0.33333330350717194 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.33333330350717194 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.33333330350717194 +settled_accuracy_mean = 0.31882172221744737 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.05 +jitter_mean_per_min = 0.0005751067535964561 +reaction_rate = 0.014 +reaction_rate_ci_low = 0.006717868004492091 +reaction_rate_ci_high = 0.021282131995507908 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 188.57142857142858 +fire_decisiveness_mean = 5.634867926235704 +fire_decisiveness_p50 = 1.0889514442899895 +step_correction_mean = 1.1635254621505737 +step_correction_p50 = 1.228068470954895 + +[cell.spm_6.step_minus_10_at_15min] +shares_per_minute = 6 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 660 +convergence_mean_secs = 8.048048048048049 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.11111110282606607 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.11111110282606607 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.11111110282606607 +settled_accuracy_p99 = 0.11111110282606607 +settled_accuracy_p99_ci_low = 0.11111110282606607 +settled_accuracy_p99_ci_high = 0.18143776267994027 +settled_accuracy_mean = 0.11181952181951725 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00026583926743388117 +reaction_rate = 0.002 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.00476908533635206 +reaction_p10_secs = 240 +reaction_p10_secs_ci_low = 240 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 240 +reaction_mean_secs = 240 +fire_decisiveness_mean = 5.215962746731774 +fire_decisiveness_p50 = 1.680109328540432 +step_correction_mean = 1.9786606431007385 +step_correction_p50 = 2.9824564456939697 + +[cell.spm_6.step_minus_5_at_15min] +shares_per_minute = 6 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.997 +convergence_rate_ci_low = 0.9936102764714508 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 420 +convergence_mean_secs = 5.777331995987964 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.05263157522942574 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.05263157522942574 +settled_accuracy_p95 = 0.05263157522942574 +settled_accuracy_p95_ci_low = 0.05263157522942574 +settled_accuracy_p95_ci_high = 0.05263157522942574 +settled_accuracy_p99 = 0.05263157522942574 +settled_accuracy_p99_ci_low = 0.05263157522942574 +settled_accuracy_p99_ci_high = 0.14034964283602624 +settled_accuracy_mean = 0.05389993185271469 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00026384510544440626 +reaction_rate = 0.003 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.006389723528549194 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 180 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 180 +reaction_p99_secs_ci_high = 240 +reaction_mean_secs = 200 +fire_decisiveness_mean = 5.127244390343758 +fire_decisiveness_p50 = 2.0126087621506485 +step_correction_mean = -1.2146288553873699 +step_correction_p50 = 1.0626617670059204 + +[cell.spm_6.step_plus_5_at_15min] +shares_per_minute = 6 +scenario = "step_plus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 480 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 960 +convergence_mean_secs = 10.68 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.047618983705838724 +settled_accuracy_p90_ci_low = 0.047618983705838724 +settled_accuracy_p90_ci_high = 0.047618983705838724 +settled_accuracy_p95 = 0.047618983705838724 +settled_accuracy_p95_ci_low = 0.047618983705838724 +settled_accuracy_p95_ci_high = 0.047618983705838724 +settled_accuracy_p99 = 0.08730039425502056 +settled_accuracy_p99_ci_low = 0.047618983705838724 +settled_accuracy_p99_ci_high = 0.22354565173513508 +settled_accuracy_mean = 0.049378774730097545 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.000143348320550119 +reaction_rate = 0.004 +reaction_rate_ci_low = 0.00008784785571930992 +reaction_rate_ci_high = 0.00791215214428069 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 300 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 225 +fire_decisiveness_mean = 14.619695741429558 +fire_decisiveness_p50 = 2.610283885410162 +step_correction_mean = 5.082992404699326 +step_correction_p50 = 6.315797328948975 + +[cell.spm_6.step_plus_10_at_15min] +shares_per_minute = 6 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.996 +convergence_rate_ci_low = 0.9920878478557194 +convergence_rate_ci_high = 0.9999121521442806 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 720 +convergence_p99_secs_ci_low = 240 +convergence_p99_secs_ci_high = 1020 +convergence_mean_secs = 15.060240963855422 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.09090908536290365 +settled_accuracy_p95_ci_low = 0.09090908536290365 +settled_accuracy_p95_ci_high = 0.09090908536290365 +settled_accuracy_p99 = 0.17768725401931773 +settled_accuracy_p99_ci_low = 0.09090908536290365 +settled_accuracy_p99_ci_high = 0.20265236198497538 +settled_accuracy_mean = 0.09245395993246994 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00018732101272922631 +reaction_rate = 0.005 +reaction_rate_ci_low = 0.0006282772274536896 +reaction_rate_ci_high = 0.00937172277254631 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 120 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 120 +reaction_p99_secs_ci_high = 240 +reaction_mean_secs = 132 +fire_decisiveness_mean = 21.088895147072364 +fire_decisiveness_p50 = 1.7456071859106324 +step_correction_mean = 2.7380192995071413 +step_correction_p50 = 3.1372556686401367 + +[cell.spm_6.step_plus_25_at_15min] +shares_per_minute = 6 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.971 +convergence_rate_ci_low = 0.9605992493347836 +convergence_rate_ci_high = 0.9814007506652164 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 40.90628218331617 +settled_accuracy_p10 = 0.20000003221225382 +settled_accuracy_p10_ci_low = 0.20000003221225382 +settled_accuracy_p10_ci_high = 0.20000003221225382 +settled_accuracy_p50 = 0.20000003221225382 +settled_accuracy_p50_ci_low = 0.20000003221225382 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.20000003221225382 +settled_accuracy_mean = 0.18955851355910253 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.0002846406080997311 +reaction_rate = 0.011 +reaction_rate_ci_low = 0.004535267491999379 +reaction_rate_ci_high = 0.01746473250800062 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 180 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 169.0909090909091 +fire_decisiveness_mean = 5.974843206571879 +fire_decisiveness_p50 = 1.6138814046992351 +step_correction_mean = 1.3252735354683616 +step_correction_p50 = 1.294121503829956 + +[cell.spm_6.step_plus_50_at_15min] +shares_per_minute = 6 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.705 +convergence_rate_ci_low = 0.6767341768207611 +convergence_rate_ci_high = 0.7332658231792388 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 403.3191489361702 +settled_accuracy_p10 = 0.13888832467733392 +settled_accuracy_p10_ci_low = 0.13450262623825915 +settled_accuracy_p10_ci_high = 0.14009565786863498 +settled_accuracy_p50 = 0.33333334824641403 +settled_accuracy_p50_ci_low = 0.16475082792204743 +settled_accuracy_p50_ci_high = 0.33333334824641403 +settled_accuracy_p90 = 0.33333334824641403 +settled_accuracy_p90_ci_low = 0.33333334824641403 +settled_accuracy_p90_ci_high = 0.33333334824641403 +settled_accuracy_p95 = 0.33333334824641403 +settled_accuracy_p95_ci_low = 0.33333334824641403 +settled_accuracy_p95_ci_high = 0.33333334824641403 +settled_accuracy_p99 = 0.4879259075198703 +settled_accuracy_p99_ci_low = 0.33333334824641403 +settled_accuracy_p99_ci_high = 0.6169431447446021 +settled_accuracy_mean = 0.2451656100450689 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.09090909090909091 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.0016830350943221007 +reaction_rate = 0.04 +reaction_rate_ci_low = 0.027854324226293543 +reaction_rate_ci_high = 0.05214567577370646 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 205.5 +fire_decisiveness_mean = 2.919730891574039 +fire_decisiveness_p50 = 1.6130058018001634 +step_correction_mean = 0.6859324917197227 +step_correction_p50 = 0.6296310424804688 + +[cell.spm_8.cold_start_10gh_to_1ph] +shares_per_minute = 8 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 780 +convergence_p95_secs_ci_low = 660 +convergence_p95_secs_ci_high = 780 +convergence_p99_secs = 900 +convergence_p99_secs_ci_low = 900 +convergence_p99_secs_ci_high = 960 +convergence_mean_secs = 616.02 +settled_accuracy_p10 = 0.015849973032302622 +settled_accuracy_p10_ci_low = 0.015849973032302622 +settled_accuracy_p10_ci_high = 0.015849973032302622 +settled_accuracy_p50 = 0.08257007625110546 +settled_accuracy_p50_ci_low = 0.08257007625110546 +settled_accuracy_p50_ci_high = 0.08966032915153388 +settled_accuracy_p90 = 0.20559344335652763 +settled_accuracy_p90_ci_low = 0.18807541237894143 +settled_accuracy_p90_ci_high = 0.21268000526938802 +settled_accuracy_p95 = 0.2372822493495641 +settled_accuracy_p95_ci_low = 0.23018750015518918 +settled_accuracy_p95_ci_high = 0.25479189171904126 +settled_accuracy_p99 = 0.34552200328551574 +settled_accuracy_p99_ci_low = 0.3040051040318268 +settled_accuracy_p99_ci_high = 0.39934438665550953 +settled_accuracy_mean = 0.10173103907809614 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05555555555555555 +jitter_p90_per_min_ci_low = 0.05555555555555555 +jitter_p90_per_min_ci_high = 0.05555555555555555 +jitter_p95_per_min = 0.05555555555555555 +jitter_p95_per_min_ci_low = 0.05555555555555555 +jitter_p95_per_min_ci_high = 0.058823529411764705 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.1111111111111111 +jitter_p99_per_min_ci_high = 0.15384615384615385 +jitter_mean_per_min = 0.010459016259669827 +bias_mean = -0.0052531854639945265 +bias_p10 = -0.12533993686447445 +bias_p10_ci_low = -0.1305484324695449 +bias_p10_ci_high = -0.11586973518018955 +bias_p50 = -0.011212337220251709 +bias_p50_ci_low = -0.017910095094356468 +bias_p50_ci_high = -0.0031226602516337327 +bias_p90 = 0.12148807875122157 +bias_p90_ci_low = 0.10852296394185232 +bias_p90_ci_high = 0.12941584322117414 +bias_p99 = 0.2212483944954639 +bias_p99_ci_low = 0.19252033625539577 +bias_p99_ci_high = 0.24084066512104588 +variance_mean = 0.009485622610079035 +variance_p10 = 0.0018504453719469483 +variance_p10_ci_low = 0.0017022769504479156 +variance_p10_ci_high = 0.0019617659778570686 +variance_p50 = 0.005432070222966929 +variance_p50_ci_low = 0.005028900272921443 +variance_p50_ci_high = 0.0058881548483944715 +variance_p90 = 0.019888384968813903 +variance_p90_ci_low = 0.018235439441532632 +variance_p90_ci_high = 0.023156455016694947 +variance_p99 = 0.06478445161987656 +variance_p99_ci_low = 0.05149065835153027 +variance_p99_ci_high = 0.07326179411508334 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.03335854165994179 +ramp_target_overshoot_p50_ci_low = 0.03335854165994179 +ramp_target_overshoot_p50_ci_high = 0.0579679663886592 +ramp_target_overshoot_p90 = 0.25479189171904126 +ramp_target_overshoot_p90_ci_low = 0.23018750015518918 +ramp_target_overshoot_p90_ci_high = 0.2794017862098128 +ramp_target_overshoot_p99 = 0.631027810517583 +ramp_target_overshoot_p99_ci_low = 0.49654245061844504 +ramp_target_overshoot_p99_ci_high = 0.771471766528796 +ramp_target_overshoot_mean = 0.09232471409442541 + +[cell.spm_8.stable_1ph] +shares_per_minute = 8 +scenario = "stable_1ph" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 120 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 300 +convergence_mean_secs = 5.045045045045045 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0 +settled_accuracy_p90_ci_low = 0 +settled_accuracy_p90_ci_high = 0 +settled_accuracy_p95 = 0 +settled_accuracy_p95_ci_low = 0 +settled_accuracy_p95_ci_high = 0 +settled_accuracy_p99 = 0.004464283017947324 +settled_accuracy_p99_ci_low = 0 +settled_accuracy_p99_ci_high = 0.11328291802229362 +settled_accuracy_mean = 0.0013345282961508835 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.038461538461538464 +jitter_mean_per_min = 0.0003983628057702132 +bias_mean = -0.006405442706956298 +bias_p10 = -0.09576451264788237 +bias_p10_ci_low = -0.1045868842031839 +bias_p10_ci_high = -0.08835380432154882 +bias_p50 = -0.006065627687456172 +bias_p50_ci_low = -0.011405105668576677 +bias_p50_ci_high = 0.0002013548509831941 +bias_p90 = 0.08366029508142281 +bias_p90_ci_low = 0.07520313703285124 +bias_p90_ci_high = 0.09011814582769757 +bias_p99 = 0.1542003302540266 +bias_p99_ci_low = 0.13866409116500528 +bias_p99_ci_high = 0.16414203175881817 +variance_mean = 0.001110002593571743 +variance_p10 = 0.0002615179921008639 +variance_p10_ci_low = 0.0002455669508718694 +variance_p10_ci_high = 0.00027648898219080446 +variance_p50 = 0.0007346145333623572 +variance_p50_ci_low = 0.0006931601562399094 +variance_p50_ci_high = 0.0007719245531169471 +variance_p90 = 0.002000710305891398 +variance_p90_ci_low = 0.0018470896719651778 +variance_p90_ci_high = 0.0021667505904724702 +variance_p99 = 0.006056646067820618 +variance_p99_ci_low = 0.003944813563492057 +variance_p99_ci_high = 0.010790995572713659 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1 +upward_step_magnitude_p95 = 1 +upward_step_magnitude_p95_ci_low = 1 +upward_step_magnitude_p95_ci_high = 1 +upward_step_magnitude_p99 = 1.5 +upward_step_magnitude_p99_ci_low = 1 +upward_step_magnitude_p99_ci_high = 1.8125005158993988 +upward_step_magnitude_mean = 1.0125312881734527 +fire_decisiveness_mean = 16.79793392796576 +fire_decisiveness_p50 = 4.149806094939713 + +[cell.spm_8.step_minus_50_at_15min] +shares_per_minute = 8 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.536 +convergence_rate_ci_low = 0.5050901102169548 +convergence_rate_ci_high = 0.5669098897830452 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 1140 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 1260 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 716.8656716417911 +settled_accuracy_p10 = 0.4270832319709853 +settled_accuracy_p10_ci_low = 0.3019699605956878 +settled_accuracy_p10_ci_high = 0.45652275014007304 +settled_accuracy_p50 = 0.5300002462895341 +settled_accuracy_p50_ci_low = 0.5277780033381292 +settled_accuracy_p50_ci_high = 0.5344828500275918 +settled_accuracy_p90 = 1 +settled_accuracy_p90_ci_low = 1 +settled_accuracy_p90_ci_high = 1 +settled_accuracy_p95 = 1 +settled_accuracy_p95_ci_low = 1 +settled_accuracy_p95_ci_high = 1 +settled_accuracy_p99 = 1 +settled_accuracy_p99_ci_low = 1 +settled_accuracy_p99_ci_high = 1 +settled_accuracy_mean = 0.6080347874739418 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.125 +jitter_p99_per_min_ci_low = 0.08695652173913043 +jitter_p99_per_min_ci_high = 0.14285714285714285 +jitter_mean_per_min = 0.004278268757038706 +reaction_rate = 0.036 +reaction_rate_ci_low = 0.024453620203717528 +reaction_rate_ci_high = 0.04754637979628247 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 245 +fire_decisiveness_mean = 2.8983698580649166 +fire_decisiveness_p50 = 0.936671174562477 +step_correction_mean = 0.5732016348176532 +step_correction_p50 = 0.5375000238418579 + +[cell.spm_8.step_minus_25_at_15min] +shares_per_minute = 8 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.947 +convergence_rate_ci_low = 0.9331142610711565 +convergence_rate_ci_high = 0.9608857389288434 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1200 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 32.69271383315734 +settled_accuracy_p10 = 0.33333330350717194 +settled_accuracy_p10_ci_low = 0.33333330350717194 +settled_accuracy_p10_ci_high = 0.33333330350717194 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.33333330350717194 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.33333330350717194 +settled_accuracy_mean = 0.3098779523314134 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.0001465122064767854 +reaction_rate = 0.004 +reaction_rate_ci_low = 0.00008784785571930992 +reaction_rate_ci_high = 0.00791215214428069 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 180 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 210 +fire_decisiveness_mean = 7.177071105473759 +fire_decisiveness_p50 = 1.0348927758576103 +step_correction_mean = 1.117368906736374 +step_correction_p50 = 1.1052613258361816 + +[cell.spm_8.step_minus_10_at_15min] +shares_per_minute = 8 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.998 +convergence_rate_ci_low = 0.995230914663648 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 960 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 1140 +convergence_mean_secs = 16.112224448897795 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.11111110282606607 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.11111110282606607 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.11111110282606607 +settled_accuracy_p99 = 0.14999986951054145 +settled_accuracy_p99_ci_low = 0.11111110282606607 +settled_accuracy_p99_ci_high = 0.18152217071824017 +settled_accuracy_mean = 0.11184744581798264 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.041666666666666664 +jitter_mean_per_min = 0.0004689027370478983 +reaction_rate = 0.007 +reaction_rate_ci_low = 0.001832509158208406 +reaction_rate_ci_high = 0.012167490841791594 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 180 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 180 +fire_decisiveness_mean = 6.012071782986949 +fire_decisiveness_p50 = 1.0677426300798132 +step_correction_mean = 1.5806262578283037 +step_correction_p50 = 2.697368621826172 + +[cell.spm_8.step_minus_5_at_15min] +shares_per_minute = 8 +scenario = "step_minus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 420 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 720 +convergence_mean_secs = 9.3 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.05263157522942574 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.05263157522942574 +settled_accuracy_p95 = 0.05263157522942574 +settled_accuracy_p95_ci_low = 0.05263157522942574 +settled_accuracy_p95_ci_high = 0.05263157522942574 +settled_accuracy_p99 = 0.05263157522942574 +settled_accuracy_p99_ci_low = 0.05263157522942574 +settled_accuracy_p99_ci_high = 0.184867261844591 +settled_accuracy_mean = 0.05416614720873463 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.0003364649072480398 +reaction_rate = 0.003 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.006389723528549194 +reaction_p10_secs = 240 +reaction_p10_secs_ci_low = 240 +reaction_p10_secs_ci_high = 300 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 260 +fire_decisiveness_mean = 3.393518951486591 +fire_decisiveness_p50 = 1.462654938049198 +step_correction_mean = 0.37037020921707153 +step_correction_p50 = 0.966390073299408 + +[cell.spm_8.step_plus_5_at_15min] +shares_per_minute = 8 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 480 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 900 +convergence_mean_secs = 11.29129129129129 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.047618983705838724 +settled_accuracy_p90_ci_low = 0.047618983705838724 +settled_accuracy_p90_ci_high = 0.047618983705838724 +settled_accuracy_p95 = 0.047618983705838724 +settled_accuracy_p95_ci_low = 0.047618983705838724 +settled_accuracy_p95_ci_high = 0.047618983705838724 +settled_accuracy_p99 = 0.13143259284767728 +settled_accuracy_p99_ci_low = 0.047618983705838724 +settled_accuracy_p99_ci_high = 0.19047631830260836 +settled_accuracy_mean = 0.049441390692626 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.04 +jitter_mean_per_min = 0.00027882772921752365 +reaction_rate = 0.005 +reaction_rate_ci_low = 0.0006282772274536896 +reaction_rate_ci_high = 0.00937172277254631 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 180 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 192 +fire_decisiveness_mean = 14.152358318468393 +fire_decisiveness_p50 = 1.5213084399055958 +step_correction_mean = 2.9759635448455812 +step_correction_p50 = 1.9438848495483398 + +[cell.spm_8.step_plus_10_at_15min] +shares_per_minute = 8 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.996 +convergence_rate_ci_low = 0.9920878478557194 +convergence_rate_ci_high = 0.9999121521442806 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 420 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 960 +convergence_mean_secs = 13.012048192771084 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.09090908536290365 +settled_accuracy_p95_ci_low = 0.09090908536290365 +settled_accuracy_p95_ci_high = 0.09090908536290365 +settled_accuracy_p99 = 0.12689401808047052 +settled_accuracy_p99_ci_low = 0.09090908536290365 +settled_accuracy_p99_ci_high = 0.1789778185067581 +settled_accuracy_mean = 0.09199981355937162 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00027976235583834406 +reaction_rate = 0.001 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.0029590197548774234 +reaction_p10_secs = 60 +reaction_p50_secs = 60 +reaction_p90_secs = 60 +reaction_p99_secs = 60 +reaction_mean_secs = 60 +fire_decisiveness_mean = 16.149121305990686 +fire_decisiveness_p50 = 1.913787435400458 +step_correction_mean = 2.9687561988830566 +step_correction_p50 = 2.9687561988830566 + +[cell.spm_8.step_plus_25_at_15min] +shares_per_minute = 8 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.94 +convergence_rate_ci_low = 0.9252804130492733 +convergence_rate_ci_high = 0.9547195869507266 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 44.680851063829785 +settled_accuracy_p10 = 0.20000003221225382 +settled_accuracy_p10_ci_low = 0.023332623947920905 +settled_accuracy_p10_ci_high = 0.20000003221225382 +settled_accuracy_p50 = 0.20000003221225382 +settled_accuracy_p50_ci_low = 0.20000003221225382 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.20000003221225382 +settled_accuracy_mean = 0.1835145923120505 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.0003631726469705729 +reaction_rate = 0.002 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.00476908533635206 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 60 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 180 +reaction_p99_secs_ci_low = 60 +reaction_p99_secs_ci_high = 180 +reaction_mean_secs = 120 +fire_decisiveness_mean = 1.9534702218377107 +fire_decisiveness_p50 = 0.7171119964673345 +step_correction_mean = 1.4707756638526917 +step_correction_p50 = 1.8582102060317993 + +[cell.spm_8.step_plus_50_at_15min] +shares_per_minute = 8 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.628 +convergence_rate_ci_low = 0.598042376168995 +convergence_rate_ci_high = 0.657957623831005 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 640.7006369426751 +settled_accuracy_p10 = 0.15624920867465275 +settled_accuracy_p10_ci_low = 0.15476153939142645 +settled_accuracy_p10_ci_high = 0.15872928382942142 +settled_accuracy_p50 = 0.17816007360858044 +settled_accuracy_p50_ci_low = 0.17628084647720077 +settled_accuracy_p50_ci_high = 0.17901164034552652 +settled_accuracy_p90 = 0.33333334824641403 +settled_accuracy_p90_ci_low = 0.33333334824641403 +settled_accuracy_p90_ci_high = 0.33333334824641403 +settled_accuracy_p95 = 0.33333334824641403 +settled_accuracy_p95_ci_low = 0.33333334824641403 +settled_accuracy_p95_ci_high = 0.33333334824641403 +settled_accuracy_p99 = 0.4981096327973005 +settled_accuracy_p99_ci_low = 0.4415099279510295 +settled_accuracy_p99_ci_high = 0.5687514646509431 +settled_accuracy_mean = 0.23510758069773657 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.09090909090909091 +jitter_mean_per_min = 0.0008028263046622899 +reaction_rate = 0.042 +reaction_rate_ci_low = 0.029567356773396898 +reaction_rate_ci_high = 0.05443264322660311 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 241.42857142857142 +fire_decisiveness_mean = 2.9771617109285518 +fire_decisiveness_p50 = 1.4350721598904244 +step_correction_mean = 0.5470970095623107 +step_correction_p50 = 0.5416706204414368 + +[cell.spm_10.cold_start_10gh_to_1ph] +shares_per_minute = 10 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 660 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 780 +convergence_p99_secs = 960 +convergence_p99_secs_ci_low = 900 +convergence_p99_secs_ci_high = 1020 +convergence_mean_secs = 613.44 +settled_accuracy_p10 = 0.015849973032302622 +settled_accuracy_p10_ci_low = 0.015849973032302622 +settled_accuracy_p10_ci_high = 0.015849973032302622 +settled_accuracy_p50 = 0.08257403567413313 +settled_accuracy_p50_ci_low = 0.07489483537557917 +settled_accuracy_p50_ci_high = 0.08257403567413313 +settled_accuracy_p90 = 0.18097992498705295 +settled_accuracy_p90_ci_low = 0.17331320693736552 +settled_accuracy_p90_ci_high = 0.19299442506526843 +settled_accuracy_p95 = 0.22034840104069753 +settled_accuracy_p95_ci_low = 0.20067100811809224 +settled_accuracy_p95_ci_high = 0.22166709023545206 +settled_accuracy_p99 = 0.2914120584295412 +settled_accuracy_p99_ci_low = 0.25971204525607106 +settled_accuracy_p99_ci_high = 0.31876449090107806 +settled_accuracy_mean = 0.09151595959536325 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05555555555555555 +jitter_p90_per_min_ci_low = 0.05555555555555555 +jitter_p90_per_min_ci_high = 0.05555555555555555 +jitter_p95_per_min = 0.05555555555555555 +jitter_p95_per_min_ci_low = 0.05555555555555555 +jitter_p95_per_min_ci_high = 0.05555555555555555 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.1111111111111111 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.010290647133528693 +bias_mean = -0.005086889758649998 +bias_p10 = -0.11008984644322609 +bias_p10_ci_low = -0.1189157747683659 +bias_p10_ci_high = -0.10022875681332906 +bias_p50 = -0.007887018792838037 +bias_p50_ci_low = -0.013938433529123209 +bias_p50_ci_high = -0.0012760044246499331 +bias_p90 = 0.10394676452956991 +bias_p90_ci_low = 0.09182948899082428 +bias_p90_ci_high = 0.1188680109168039 +bias_p99 = 0.21008150057286776 +bias_p99_ci_low = 0.18139104448940166 +bias_p99_ci_high = 0.21743978627959895 +variance_mean = 0.00757499288984425 +variance_p10 = 0.0014721208020289736 +variance_p10_ci_low = 0.0013576668518477482 +variance_p10_ci_high = 0.0016141546833802953 +variance_p50 = 0.004350314371045948 +variance_p50_ci_low = 0.004109679438732505 +variance_p50_ci_high = 0.0046251972138286815 +variance_p90 = 0.016271347460991223 +variance_p90_ci_low = 0.01500531868905599 +variance_p90_ci_high = 0.017964743518299398 +variance_p99 = 0.051898518144778014 +variance_p99_ci_low = 0.040051181426277886 +variance_p99_ci_high = 0.05794650356802113 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.04320401611659652 +ramp_target_overshoot_p50_ci_low = 0.023521455811396086 +ramp_target_overshoot_p50_ci_high = 0.04320401611659652 +ramp_target_overshoot_p90 = 0.22034840104069753 +ramp_target_overshoot_p90_ci_low = 0.20067100811809224 +ramp_target_overshoot_p90_ci_high = 0.24003022314838418 +ramp_target_overshoot_p99 = 0.5608727400502551 +ramp_target_overshoot_p99_ci_low = 0.4762251075604109 +ramp_target_overshoot_p99_ci_high = 0.777387949838271 +ramp_target_overshoot_mean = 0.08261131337350158 + +[cell.spm_10.stable_1ph] +shares_per_minute = 10 +scenario = "stable_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 180 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 480 +convergence_mean_secs = 5.94 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0 +settled_accuracy_p90_ci_low = 0 +settled_accuracy_p90_ci_high = 0 +settled_accuracy_p95 = 0 +settled_accuracy_p95_ci_low = 0 +settled_accuracy_p95_ci_high = 0 +settled_accuracy_p99 = 0.015480136077987483 +settled_accuracy_p99_ci_low = 0 +settled_accuracy_p99_ci_high = 0.09091036597752344 +settled_accuracy_mean = 0.0009526275167418163 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.04 +jitter_mean_per_min = 0.0005143333706720435 +bias_mean = -0.005105255881880965 +bias_p10 = -0.09445959843065425 +bias_p10_ci_low = -0.0989772683166309 +bias_p10_ci_high = -0.08863852251088637 +bias_p50 = -0.004155903655673823 +bias_p50_ci_low = -0.00957084025727575 +bias_p50_ci_high = -0.0009205111071899898 +bias_p90 = 0.08044312788782029 +bias_p90_ci_low = 0.07408139469627126 +bias_p90_ci_high = 0.08867554894406868 +bias_p99 = 0.1423499113504257 +bias_p99_ci_low = 0.13041398868888557 +bias_p99_ci_high = 0.1527000268106979 +variance_mean = 0.0011196750053840954 +variance_p10 = 0.0002269741344474837 +variance_p10_ci_low = 0.00021314771029023536 +variance_p10_ci_high = 0.0002442858414515928 +variance_p50 = 0.0006140673107482962 +variance_p50_ci_low = 0.0005673894868535515 +variance_p50_ci_high = 0.0006475382406687809 +variance_p90 = 0.0017471398471947716 +variance_p90_ci_low = 0.0016371992787123676 +variance_p90_ci_high = 0.0019426259709062108 +variance_p99 = 0.004526542375613511 +variance_p99_ci_low = 0.0035825979895938178 +variance_p99_ci_high = 0.011258419679593228 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1 +upward_step_magnitude_p95 = 1 +upward_step_magnitude_p95_ci_low = 1 +upward_step_magnitude_p95_ci_high = 1 +upward_step_magnitude_p99 = 1.440002292438824 +upward_step_magnitude_p99_ci_low = 1 +upward_step_magnitude_p99_ci_high = 1.666671332330024 +upward_step_magnitude_mean = 1.0089150199622607 +fire_decisiveness_mean = 6.347487356369707 +fire_decisiveness_p50 = 2.739935630370418 + +[cell.spm_10.step_minus_50_at_15min] +shares_per_minute = 10 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.47 +convergence_rate_ci_low = 0.439065511803167 +convergence_rate_ci_high = 0.500934488196833 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1320 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 972.5106382978723 +settled_accuracy_p10 = 0.12191942627826113 +settled_accuracy_p10_ci_low = 0.0958323314539048 +settled_accuracy_p10_ci_high = 0.140349802273796 +settled_accuracy_p50 = 0.5555566442104747 +settled_accuracy_p50_ci_low = 0.5520017534204213 +settled_accuracy_p50_ci_high = 0.5583342801275686 +settled_accuracy_p90 = 1 +settled_accuracy_p90_ci_low = 1 +settled_accuracy_p90_ci_high = 1 +settled_accuracy_p95 = 1 +settled_accuracy_p95_ci_low = 1 +settled_accuracy_p95_ci_high = 1 +settled_accuracy_p99 = 1 +settled_accuracy_p99_ci_low = 1 +settled_accuracy_p99_ci_high = 1 +settled_accuracy_mean = 0.5163458774453894 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.041666666666666664 +jitter_p95_per_min = 0.08333333333333333 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.13636363636363635 +jitter_p99_per_min = 0.15 +jitter_p99_per_min_ci_low = 0.09090909090909091 +jitter_p99_per_min_ci_high = 0.15384615384615385 +jitter_mean_per_min = 0.007349259935466832 +reaction_rate = 0.064 +reaction_rate_ci_low = 0.04883005582080145 +reaction_rate_ci_high = 0.07916994417919855 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 255 +fire_decisiveness_mean = 3.839655005862926 +fire_decisiveness_p50 = 1.080288622791148 +step_correction_mean = 0.5087880836799741 +step_correction_p50 = 0.4999999701976776 + +[cell.spm_10.step_minus_25_at_15min] +shares_per_minute = 10 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.932 +convergence_rate_ci_low = 0.9163966272363954 +convergence_rate_ci_high = 0.9476033727636047 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 360 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 47.1244635193133 +settled_accuracy_p10 = 0.10116670101149161 +settled_accuracy_p10_ci_low = 0.05777849440101801 +settled_accuracy_p10_ci_high = 0.33333330350717194 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.33333330350717194 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.33333330350717194 +settled_accuracy_mean = 0.3027372278187556 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.043478260869565216 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.05 +jitter_mean_per_min = 0.0006136402440890205 +reaction_rate = 0.012 +reaction_rate_ci_low = 0.005251221621656257 +reaction_rate_ci_high = 0.018748778378343742 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 180 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 155 +fire_decisiveness_mean = 2.859321675277985 +fire_decisiveness_p50 = 0.8554157258031267 +step_correction_mean = 0.9489519198735555 +step_correction_p50 = 1.0117626190185547 + +[cell.spm_10.step_minus_10_at_15min] +shares_per_minute = 10 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.998 +convergence_rate_ci_low = 0.995230914663648 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 360 +convergence_mean_secs = 7.875751503006012 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.11111110282606607 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.11111110282606607 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.11111110282606607 +settled_accuracy_p99 = 0.11111110282606607 +settled_accuracy_p99_ci_low = 0.11111110282606607 +settled_accuracy_p99_ci_high = 0.1342587397178967 +settled_accuracy_mean = 0.11155655290098779 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00015149170078747543 +reaction_rate = 0.002 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.00476908533635206 +reaction_p10_secs = 300 +reaction_p10_secs_ci_low = 300 +reaction_p10_secs_ci_high = 300 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 300 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 300 +fire_decisiveness_mean = 5.298705338480485 +fire_decisiveness_p50 = 3.5698548751726307 +step_correction_mean = 1.8017807006835938 +step_correction_p50 = 2.3499929904937744 + +[cell.spm_10.step_minus_5_at_15min] +shares_per_minute = 10 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 300 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 540 +convergence_mean_secs = 8.588588588588589 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.05263157522942574 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.05263157522942574 +settled_accuracy_p95 = 0.05263157522942574 +settled_accuracy_p95_ci_low = 0.05263157522942574 +settled_accuracy_p95_ci_high = 0.05263157522942574 +settled_accuracy_p99 = 0.05263157522942574 +settled_accuracy_p99_ci_low = 0.05263157522942574 +settled_accuracy_p99_ci_high = 0.17408809472493947 +settled_accuracy_mean = 0.05403931498661812 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.05 +jitter_mean_per_min = 0.0007464695492164628 +reaction_rate = 0.008 +reaction_rate_ci_low = 0.0024785022321837345 +reaction_rate_ci_high = 0.013521497767816266 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 120 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 180 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 142.5 +fire_decisiveness_mean = 5.262881117122835 +fire_decisiveness_p50 = 2.57729023600767 +step_correction_mean = 1.372624285519123 +step_correction_p50 = 1.3633729219436646 + +[cell.spm_10.step_plus_5_at_15min] +shares_per_minute = 10 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 240 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 600 +convergence_mean_secs = 7.627627627627628 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.047618983705838724 +settled_accuracy_p90_ci_low = 0.047618983705838724 +settled_accuracy_p90_ci_high = 0.047618983705838724 +settled_accuracy_p95 = 0.047618983705838724 +settled_accuracy_p95_ci_low = 0.047618983705838724 +settled_accuracy_p95_ci_high = 0.047618983705838724 +settled_accuracy_p99 = 0.047618983705838724 +settled_accuracy_p99_ci_low = 0.047618983705838724 +settled_accuracy_p99_ci_high = 0.13741736181868358 +settled_accuracy_mean = 0.04853338282772216 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.041666666666666664 +jitter_mean_per_min = 0.00041341732929654583 +reaction_rate = 0.005 +reaction_rate_ci_low = 0.0006282772274536896 +reaction_rate_ci_high = 0.00937172277254631 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 216 +fire_decisiveness_mean = 6.890899648913396 +fire_decisiveness_p50 = 1.8247406515550395 +step_correction_mean = 0.07018495798110962 +step_correction_p50 = 1.1000096797943115 + +[cell.spm_10.step_plus_10_at_15min] +shares_per_minute = 10 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.993 +convergence_rate_ci_low = 0.9878325091582084 +convergence_rate_ci_high = 0.9981674908417916 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 720 +convergence_p99_secs_ci_low = 60 +convergence_p99_secs_ci_high = 1260 +convergence_mean_secs = 16.61631419939577 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.09090908536290365 +settled_accuracy_p95_ci_low = 0.09090908536290365 +settled_accuracy_p95_ci_high = 0.09090908536290365 +settled_accuracy_p99 = 0.12000230366432096 +settled_accuracy_p99_ci_low = 0.09697090714774692 +settled_accuracy_p99_ci_high = 0.13636368905241492 +settled_accuracy_mean = 0.09158133139962285 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00026636779038043807 +reaction_rate = 0.004 +reaction_rate_ci_low = 0.00008784785571930992 +reaction_rate_ci_high = 0.00791215214428069 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 180 +reaction_p99_secs_ci_high = 240 +reaction_mean_secs = 195 +fire_decisiveness_mean = 12.815871702391663 +fire_decisiveness_p50 = 2.06804266392146 +step_correction_mean = 2.4732935428619385 +step_correction_p50 = 2.5789597034454346 + +[cell.spm_10.step_plus_25_at_15min] +shares_per_minute = 10 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.94 +convergence_rate_ci_low = 0.9252804130492733 +convergence_rate_ci_high = 0.9547195869507266 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 660 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 69.82978723404256 +settled_accuracy_p10 = 0.03733153259676081 +settled_accuracy_p10_ci_low = 0.034284897628383604 +settled_accuracy_p10_ci_high = 0.20000003221225382 +settled_accuracy_p50 = 0.20000003221225382 +settled_accuracy_p50_ci_low = 0.20000003221225382 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.20000003221225382 +settled_accuracy_mean = 0.18108861778936644 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.0002502291177720905 +reaction_rate = 0.011 +reaction_rate_ci_low = 0.004535267491999379 +reaction_rate_ci_high = 0.01746473250800062 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 180 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 174.54545454545453 +fire_decisiveness_mean = 1.911748407468942 +fire_decisiveness_p50 = 0.7354026688812318 +step_correction_mean = 0.9780175685882568 +step_correction_p50 = 1 + +[cell.spm_10.step_plus_50_at_15min] +shares_per_minute = 10 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.586 +convergence_rate_ci_low = 0.5554715292489125 +convergence_rate_ci_high = 0.6165284707510874 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 1260 +convergence_p50_secs_ci_low = 1200 +convergence_p50_secs_ci_high = 1260 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 844.3003412969283 +settled_accuracy_p10 = 0.16666665175358597 +settled_accuracy_p10_ci_low = 0.1652162055199098 +settled_accuracy_p10_ci_high = 0.168253910590056 +settled_accuracy_p50 = 0.18717861006090708 +settled_accuracy_p50_ci_low = 0.1861101474775434 +settled_accuracy_p50_ci_high = 0.18809424339275216 +settled_accuracy_p90 = 0.33333334824641403 +settled_accuracy_p90_ci_low = 0.33333334824641403 +settled_accuracy_p90_ci_high = 0.33333334824641403 +settled_accuracy_p95 = 0.33333334824641403 +settled_accuracy_p95_ci_low = 0.33333334824641403 +settled_accuracy_p95_ci_high = 0.33333334824641403 +settled_accuracy_p99 = 0.6190496472266009 +settled_accuracy_p99_ci_low = 0.43066616463271634 +settled_accuracy_p99_ci_high = 0.6900032221202268 +settled_accuracy_mean = 0.22666159429542423 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.08333333333333333 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.0013183430917509938 +reaction_rate = 0.07 +reaction_rate_ci_low = 0.05418582408090766 +reaction_rate_ci_high = 0.08581417591909235 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 242.57142857142858 +fire_decisiveness_mean = 2.600646893364238 +fire_decisiveness_p50 = 1.3080279850292094 +step_correction_mean = 0.5107222007853645 +step_correction_p50 = 0.5052662491798401 + +[cell.spm_12.cold_start_10gh_to_1ph] +shares_per_minute = 12 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 720 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 780 +convergence_p99_secs = 960 +convergence_p99_secs_ci_low = 900 +convergence_p99_secs_ci_high = 1080 +convergence_mean_secs = 615.72 +settled_accuracy_p10 = 0.015849973032302622 +settled_accuracy_p10_ci_low = 0.015849973032302622 +settled_accuracy_p10_ci_high = 0.015849973032302622 +settled_accuracy_p50 = 0.06617048161549288 +settled_accuracy_p50_ci_low = 0.06617048161549288 +settled_accuracy_p50_ci_high = 0.08145264654210504 +settled_accuracy_p90 = 0.1742697095884005 +settled_accuracy_p90_ci_low = 0.16347209455692746 +settled_accuracy_p90_ci_high = 0.18098475682532378 +settled_accuracy_p95 = 0.20422146972306388 +settled_accuracy_p95_ci_low = 0.19627108250155811 +settled_accuracy_p95_ci_high = 0.22352936123567813 +settled_accuracy_p99 = 0.2861497167905238 +settled_accuracy_p99_ci_low = 0.26162760069500623 +settled_accuracy_p99_ci_high = 0.318577458494677 +settled_accuracy_mean = 0.08411889040055358 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05555555555555555 +jitter_p90_per_min_ci_low = 0.05555555555555555 +jitter_p90_per_min_ci_high = 0.05555555555555555 +jitter_p95_per_min = 0.05555555555555555 +jitter_p95_per_min_ci_low = 0.05555555555555555 +jitter_p95_per_min_ci_high = 0.05555555555555555 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.07692307692307693 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.009854431716143246 +bias_mean = -0.0029748239415707286 +bias_p10 = -0.09900066811819842 +bias_p10_ci_low = -0.10880344014452085 +bias_p10_ci_high = -0.09203214010251318 +bias_p50 = -0.006816014290147557 +bias_p50_ci_low = -0.013929621075551735 +bias_p50_ci_high = 0.0009766670989066208 +bias_p90 = 0.10365851429471273 +bias_p90_ci_low = 0.09169764126362191 +bias_p90_ci_high = 0.11349452993346593 +bias_p99 = 0.19853464685349717 +bias_p99_ci_low = 0.17352026604186288 +bias_p99_ci_high = 0.21992153921146781 +variance_mean = 0.00638215552129271 +variance_p10 = 0.0012568021035259027 +variance_p10_ci_low = 0.001202797147041742 +variance_p10_ci_high = 0.001336906776176819 +variance_p50 = 0.0036264764885444415 +variance_p50_ci_low = 0.003363846445764646 +variance_p50_ci_high = 0.003922559573327783 +variance_p90 = 0.013735943638895801 +variance_p90_ci_low = 0.012456906329950978 +variance_p90_ci_high = 0.015767521906199036 +variance_p99 = 0.042085422824843496 +variance_p99_ci_low = 0.032656574237751985 +variance_p99_ci_high = 0.0482187480579809 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.03335854165994179 +ramp_target_overshoot_p50_ci_low = 0.019006908253658805 +ramp_target_overshoot_p50_ci_high = 0.03980186510299433 +ramp_target_overshoot_p90 = 0.1973938138108835 +ramp_target_overshoot_p90_ci_low = 0.18098475682532378 +ramp_target_overshoot_p90_ci_high = 0.21657070881926588 +ramp_target_overshoot_p99 = 0.5008402365426425 +ramp_target_overshoot_p99_ci_low = 0.39421324284731907 +ramp_target_overshoot_p99_ci_high = 0.625910222700097 +ramp_target_overshoot_mean = 0.07481541324196142 + +[cell.spm_12.stable_1ph] +shares_per_minute = 12 +scenario = "stable_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 2.16 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0 +settled_accuracy_p90_ci_low = 0 +settled_accuracy_p90_ci_high = 0 +settled_accuracy_p95 = 0 +settled_accuracy_p95_ci_low = 0 +settled_accuracy_p95_ci_high = 0 +settled_accuracy_p99 = 0 +settled_accuracy_p99_ci_low = 0 +settled_accuracy_p99_ci_high = 0 +settled_accuracy_mean = 0.00037006478891141447 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00013090909090909093 +bias_mean = -0.004221122794956791 +bias_p10 = -0.07941821657916101 +bias_p10_ci_low = -0.08712269925954445 +bias_p10_ci_high = -0.07389550667261854 +bias_p50 = -0.0031376184644093716 +bias_p50_ci_low = -0.006836514282343502 +bias_p50_ci_high = -0.000014357765037304909 +bias_p90 = 0.07122014466559104 +bias_p90_ci_low = 0.06699926196849253 +bias_p90_ci_high = 0.0793612517490204 +bias_p99 = 0.12892343722323665 +bias_p99_ci_low = 0.11316653359037629 +bias_p99_ci_high = 0.14761788307000126 +variance_mean = 0.0007153977402483466 +variance_p10 = 0.0001858926868224804 +variance_p10_ci_low = 0.0001748762567301157 +variance_p10_ci_high = 0.00019527603690997416 +variance_p50 = 0.0005009169530885105 +variance_p50_ci_low = 0.000470179926803924 +variance_p50_ci_high = 0.0005352545972456917 +variance_p90 = 0.0014029045077737308 +variance_p90_ci_low = 0.001312288041430943 +variance_p90_ci_high = 0.001508825576087259 +variance_p99 = 0.0030995025714842936 +variance_p99_ci_low = 0.002722632838322635 +variance_p99_ci_high = 0.003931738600366747 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1 +upward_step_magnitude_p95 = 1 +upward_step_magnitude_p95_ci_low = 1 +upward_step_magnitude_p95_ci_high = 1 +upward_step_magnitude_p99 = 1 +upward_step_magnitude_p99_ci_low = 1 +upward_step_magnitude_p99_ci_high = 1 +upward_step_magnitude_mean = 1.0054917017107206 +fire_decisiveness_mean = 17.044278210646873 +fire_decisiveness_p50 = 4.243921053980955 + +[cell.spm_12.step_minus_50_at_15min] +shares_per_minute = 12 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.392 +convergence_rate_ci_low = 0.36174125617941155 +convergence_rate_ci_high = 0.4222587438205885 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 1380 +convergence_p50_secs_ci_low = 1320 +convergence_p50_secs_ci_high = 1380 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1091.1734693877552 +settled_accuracy_p10 = 0.058332703069244096 +settled_accuracy_p10_ci_low = 0.04948043981271 +settled_accuracy_p10_ci_high = 0.07055456953991701 +settled_accuracy_p50 = 0.5694448237959444 +settled_accuracy_p50_ci_low = 0.562499995805696 +settled_accuracy_p50_ci_high = 0.5733339167330653 +settled_accuracy_p90 = 0.6166685267007048 +settled_accuracy_p90_ci_low = 0.6149427551316304 +settled_accuracy_p90_ci_high = 0.622223127446244 +settled_accuracy_p95 = 1 +settled_accuracy_p95_ci_low = 1 +settled_accuracy_p95_ci_high = 1 +settled_accuracy_p99 = 1 +settled_accuracy_p99_ci_low = 1 +settled_accuracy_p99_ci_high = 1 +settled_accuracy_mean = 0.43933135689896874 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.08333333333333333 +jitter_p95_per_min_ci_high = 0.1111111111111111 +jitter_p99_per_min = 0.13636363636363635 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.13636363636363635 +jitter_mean_per_min = 0.015270115660608019 +reaction_rate = 0.063 +reaction_rate_ci_low = 0.04794099971445647 +reaction_rate_ci_high = 0.07805900028554352 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 236.1904761904762 +fire_decisiveness_mean = 4.506806741940789 +fire_decisiveness_p50 = 1.1624215575144135 +step_correction_mean = 0.49486707079978215 +step_correction_p50 = 0.4722211956977844 + +[cell.spm_12.step_minus_25_at_15min] +shares_per_minute = 12 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.91 +convergence_rate_ci_low = 0.892262270720298 +convergence_rate_ci_high = 0.9277377292797021 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 54.527472527472526 +settled_accuracy_p10 = 0.07539716591216927 +settled_accuracy_p10_ci_low = 0.07037098048107393 +settled_accuracy_p10_ci_high = 0.08046021647887658 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.33333330350717194 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.33333330350717194 +settled_accuracy_mean = 0.3004105769921667 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00017592441765759898 +reaction_rate = 0.006 +reaction_rate_ci_low = 0.0012134247733896417 +reaction_rate_ci_high = 0.010786575226610359 +reaction_p10_secs = 240 +reaction_p10_secs_ci_low = 240 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 260 +fire_decisiveness_mean = 3.8321198489583694 +fire_decisiveness_p50 = 0.6777777777777843 +step_correction_mean = 2.460488051176071 +step_correction_p50 = 0.9298218488693237 + +[cell.spm_12.step_minus_10_at_15min] +shares_per_minute = 12 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.995 +convergence_rate_ci_low = 0.9906282772274537 +convergence_rate_ci_high = 0.9993717227725463 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 360 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 840 +convergence_mean_secs = 11.457286432160805 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.11111110282606607 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.11111110282606607 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.11111110282606607 +settled_accuracy_p99 = 0.12036906892788746 +settled_accuracy_p99_ci_low = 0.11111110282606607 +settled_accuracy_p99_ci_high = 0.14784135017069888 +settled_accuracy_mean = 0.1112341481965072 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.041666666666666664 +jitter_mean_per_min = 0.00046403715988805325 +reaction_rate = 0.005 +reaction_rate_ci_low = 0.0006282772274536896 +reaction_rate_ci_high = 0.00937172277254631 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 216 +fire_decisiveness_mean = 6.633033991957446 +fire_decisiveness_p50 = 1.0773203186737241 +step_correction_mean = 1.4850279927253722 +step_correction_p50 = 1.3425214290618896 + +[cell.spm_12.step_minus_5_at_15min] +shares_per_minute = 12 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 240 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 540 +convergence_mean_secs = 6.906906906906907 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.05263157522942574 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.05263157522942574 +settled_accuracy_p95 = 0.05263157522942574 +settled_accuracy_p95_ci_low = 0.05263157522942574 +settled_accuracy_p95_ci_high = 0.05263157522942574 +settled_accuracy_p99 = 0.05263157522942574 +settled_accuracy_p99_ci_low = 0.05263157522942574 +settled_accuracy_p99_ci_high = 0.07536127704072237 +settled_accuracy_mean = 0.05320041016938136 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.038461538461538464 +jitter_mean_per_min = 0.00030650792353731143 +reaction_rate = 0.006 +reaction_rate_ci_low = 0.0012134247733896417 +reaction_rate_ci_high = 0.010786575226610359 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 180 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 180 +fire_decisiveness_mean = 12.692809334990686 +fire_decisiveness_p50 = 1.7454246088431447 +step_correction_mean = 0.5956955055395762 +step_correction_p50 = 0.9903377294540405 + +[cell.spm_12.step_plus_5_at_15min] +shares_per_minute = 12 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.997 +convergence_rate_ci_low = 0.9936102764714508 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 480 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 780 +convergence_mean_secs = 10.531594784353059 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.047618983705838724 +settled_accuracy_p90_ci_low = 0.047618983705838724 +settled_accuracy_p90_ci_high = 0.047618983705838724 +settled_accuracy_p95 = 0.047618983705838724 +settled_accuracy_p95_ci_low = 0.047618983705838724 +settled_accuracy_p95_ci_high = 0.047618983705838724 +settled_accuracy_p99 = 0.1347633019046519 +settled_accuracy_p99_ci_low = 0.047618983705838724 +settled_accuracy_p99_ci_high = 0.15873280047612792 +settled_accuracy_mean = 0.049266900410054215 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.045454545454545456 +jitter_mean_per_min = 0.0003698978837691584 +reaction_rate = 0.001 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.0029590197548774234 +reaction_p10_secs = 120 +reaction_p50_secs = 120 +reaction_p90_secs = 120 +reaction_p99_secs = 120 +reaction_mean_secs = 120 +fire_decisiveness_mean = 14.820829258685736 +fire_decisiveness_p50 = 2.5772573740700153 +step_correction_mean = 5.196094989776611 +step_correction_p50 = 5.196094989776611 + +[cell.spm_12.step_plus_10_at_15min] +shares_per_minute = 12 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.996 +convergence_rate_ci_low = 0.9920878478557194 +convergence_rate_ci_high = 0.9999121521442806 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 720 +convergence_p99_secs_ci_low = 240 +convergence_p99_secs_ci_high = 1080 +convergence_mean_secs = 15.843373493975903 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.09090908536290365 +settled_accuracy_p95_ci_low = 0.09090908536290365 +settled_accuracy_p95_ci_high = 0.09090908536290365 +settled_accuracy_p99 = 0.10458642117999717 +settled_accuracy_p99_ci_low = 0.09090908536290365 +settled_accuracy_p99_ci_high = 0.11517430887172486 +settled_accuracy_mean = 0.09095613880480552 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.037037037037037035 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.041666666666666664 +jitter_mean_per_min = 0.000548465064105831 +reaction_rate = 0.004 +reaction_rate_ci_low = 0.00008784785571930992 +reaction_rate_ci_high = 0.00791215214428069 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 120 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 120 +reaction_p99_secs_ci_high = 240 +reaction_mean_secs = 165 +fire_decisiveness_mean = 7.038739036694666 +fire_decisiveness_p50 = 1.4147561268814535 +step_correction_mean = 1.512540653347969 +step_correction_p50 = 2.352969169616699 + +[cell.spm_12.step_plus_25_at_15min] +shares_per_minute = 12 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.916 +convergence_rate_ci_low = 0.8988073250946806 +convergence_rate_ci_high = 0.9331926749053194 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 180 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 780 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 57.18340611353712 +settled_accuracy_p10 = 0.04666481839912395 +settled_accuracy_p10_ci_low = 0.042221352729977735 +settled_accuracy_p10_ci_high = 0.04888724916586373 +settled_accuracy_p50 = 0.20000003221225382 +settled_accuracy_p50_ci_low = 0.20000003221225382 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.20000003221225382 +settled_accuracy_mean = 0.1809914950523042 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.0002310007823792285 +reaction_rate = 0.009 +reaction_rate_ci_low = 0.0031465198044240373 +reaction_rate_ci_high = 0.01485348019557596 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 220 +fire_decisiveness_mean = 3.0706839347131334 +fire_decisiveness_p50 = 0.9263812759785104 +step_correction_mean = 0.8775989082124498 +step_correction_p50 = 0.9298357963562012 + +[cell.spm_12.step_plus_50_at_15min] +shares_per_minute = 12 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.568 +convergence_rate_ci_low = 0.5372976150502928 +convergence_rate_ci_high = 0.5987023849497071 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1260 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 972.9929577464789 +settled_accuracy_p10 = 0.170781677777061 +settled_accuracy_p10_ci_low = 0.16666665175358597 +settled_accuracy_p10_ci_high = 0.17391145620775328 +settled_accuracy_p50 = 0.19444426300196205 +settled_accuracy_p50_ci_low = 0.19333311918149376 +settled_accuracy_p50_ci_high = 0.19642701673990326 +settled_accuracy_p90 = 0.33333334824641403 +settled_accuracy_p90_ci_low = 0.33333334824641403 +settled_accuracy_p90_ci_high = 0.33333334824641403 +settled_accuracy_p95 = 0.33333334824641403 +settled_accuracy_p95_ci_low = 0.33333334824641403 +settled_accuracy_p95_ci_high = 0.33333334824641403 +settled_accuracy_p99 = 0.5420138618278612 +settled_accuracy_p99_ci_low = 0.4392345795687871 +settled_accuracy_p99_ci_high = 0.5912721254567093 +settled_accuracy_mean = 0.2188381041620822 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0.05263157894736842 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.09523809523809523 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.08695652173913043 +jitter_p99_per_min_ci_high = 0.10526315789473684 +jitter_mean_per_min = 0.0049020284424193756 +reaction_rate = 0.077 +reaction_rate_ci_low = 0.060476490881171754 +reaction_rate_ci_high = 0.09352350911882824 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 242.33766233766235 +fire_decisiveness_mean = 3.5786307586194694 +fire_decisiveness_p50 = 1.284592296985707 +step_correction_mean = 0.48399175568060443 +step_correction_p50 = 0.466668963432312 + +[cell.spm_15.cold_start_10gh_to_1ph] +shares_per_minute = 15 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 720 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 780 +convergence_p99_secs = 900 +convergence_p99_secs_ci_low = 900 +convergence_p99_secs_ci_high = 900 +convergence_mean_secs = 612.48 +settled_accuracy_p10 = 0.010395028951099894 +settled_accuracy_p10_ci_low = 0.010395028951099894 +settled_accuracy_p10_ci_high = 0.015849973032302622 +settled_accuracy_p50 = 0.06833756107997224 +settled_accuracy_p50_ci_low = 0.06288308676082344 +settled_accuracy_p50_ci_high = 0.06833756107997224 +settled_accuracy_p90 = 0.15474988828051717 +settled_accuracy_p90_ci_low = 0.1470636415511516 +settled_accuracy_p90_ci_high = 0.16523470889281722 +settled_accuracy_p95 = 0.18630192640694232 +settled_accuracy_p95_ci_low = 0.17223510302318057 +settled_accuracy_p95_ci_high = 0.1941031977307004 +settled_accuracy_p99 = 0.25971204525607106 +settled_accuracy_p99_ci_low = 0.2326895199642498 +settled_accuracy_p99_ci_high = 0.2990793133501477 +settled_accuracy_mean = 0.07851719339184361 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05555555555555555 +jitter_p90_per_min_ci_low = 0.05555555555555555 +jitter_p90_per_min_ci_high = 0.05555555555555555 +jitter_p95_per_min = 0.05555555555555555 +jitter_p95_per_min_ci_low = 0.05555555555555555 +jitter_p95_per_min_ci_high = 0.05555555555555555 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.06666666666666667 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.008007896107160796 +bias_mean = -0.0032014382743663214 +bias_p10 = -0.09129666579600566 +bias_p10_ci_low = -0.09833133666211434 +bias_p10_ci_high = -0.08713797888846238 +bias_p50 = -0.0034568094180185372 +bias_p50_ci_low = -0.008811319784870595 +bias_p50_ci_high = 0.0032454412179871855 +bias_p90 = 0.0831869091486086 +bias_p90_ci_low = 0.07668054222507614 +bias_p90_ci_high = 0.09348134897535484 +bias_p99 = 0.1616718780644358 +bias_p99_ci_low = 0.1382754566644346 +bias_p99_ci_high = 0.17641578397817462 +variance_mean = 0.004864544978307247 +variance_p10 = 0.0009867028732830567 +variance_p10_ci_low = 0.0008902138203687454 +variance_p10_ci_high = 0.0010642235746407124 +variance_p50 = 0.0028370134561123157 +variance_p50_ci_low = 0.0026624556603700588 +variance_p50_ci_high = 0.003094486740085051 +variance_p90 = 0.010143752106176296 +variance_p90_ci_low = 0.009108543747488457 +variance_p90_ci_high = 0.010975273262141764 +variance_p99 = 0.03129644035159742 +variance_p99_ci_low = 0.02508567568703504 +variance_p99_ci_high = 0.043853357612780905 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.036639561172448154 +ramp_target_overshoot_p50_ci_low = 0.023517026626314497 +ramp_target_overshoot_p50_ci_high = 0.036642983724556766 +ramp_target_overshoot_p90 = 0.1809917361472706 +ramp_target_overshoot_p90_ci_low = 0.16787061088729938 +ramp_target_overshoot_p90_ci_high = 0.1941031977307004 +ramp_target_overshoot_p99 = 0.48716506049427966 +ramp_target_overshoot_p99_ci_low = 0.3384559766853066 +ramp_target_overshoot_p99_ci_high = 0.5644958134470193 +ramp_target_overshoot_mean = 0.06718370756479977 + +[cell.spm_15.stable_1ph] +shares_per_minute = 15 +scenario = "stable_1ph" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 180 +convergence_mean_secs = 3.3033033033033035 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0 +settled_accuracy_p90_ci_low = 0 +settled_accuracy_p90_ci_high = 0 +settled_accuracy_p95 = 0 +settled_accuracy_p95_ci_low = 0 +settled_accuracy_p95_ci_high = 0 +settled_accuracy_p99 = 0 +settled_accuracy_p99_ci_low = 0 +settled_accuracy_p99_ci_high = 0.06666661745349911 +settled_accuracy_mean = 0.0008632126047091232 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00017671707050464564 +bias_mean = -0.004376181292182537 +bias_p10 = -0.07087403952512228 +bias_p10_ci_low = -0.07474752435309182 +bias_p10_ci_high = -0.06567162963448213 +bias_p50 = -0.00465466027145557 +bias_p50_ci_low = -0.008802302472658974 +bias_p50_ci_high = -0.002334078108693043 +bias_p90 = 0.06145551873088065 +bias_p90_ci_low = 0.057466973988063566 +bias_p90_ci_high = 0.06894118412723184 +bias_p99 = 0.11204936878478976 +bias_p99_ci_low = 0.100586316377418 +bias_p99_ci_high = 0.12349339053090173 +variance_mean = 0.0005466254767216501 +variance_p10 = 0.00013806558652255588 +variance_p10_ci_low = 0.00012980378983089004 +variance_p10_ci_high = 0.00014507508132236336 +variance_p50 = 0.0003921641539693109 +variance_p50_ci_low = 0.0003652731446009115 +variance_p50_ci_high = 0.000425652676336732 +variance_p90 = 0.0010701447758105823 +variance_p90_ci_low = 0.0009776377236066624 +variance_p90_ci_high = 0.0011706783384775863 +variance_p99 = 0.002190179215695167 +variance_p99_ci_low = 0.0019124334585252074 +variance_p99_ci_high = 0.002341978260531684 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1 +upward_step_magnitude_p95 = 1 +upward_step_magnitude_p95_ci_low = 1 +upward_step_magnitude_p95_ci_high = 1 +upward_step_magnitude_p99 = 1 +upward_step_magnitude_p99_ci_low = 1 +upward_step_magnitude_p99_ci_high = 1.4666681341138452 +upward_step_magnitude_mean = 1.0046844627551963 +fire_decisiveness_mean = 6.637801498612827 +fire_decisiveness_p50 = 4.244373232912729 + +[cell.spm_15.step_minus_50_at_15min] +shares_per_minute = 15 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.378 +convergence_rate_ci_low = 0.34794635420452286 +convergence_rate_ci_high = 0.40805364579547715 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 1080 +convergence_p50_secs = 1380 +convergence_p50_secs_ci_low = 1380 +convergence_p50_secs_ci_high = 1380 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1230.1587301587301 +settled_accuracy_p10 = 0.024613317042880056 +settled_accuracy_p10_ci_low = 0.018837257043260003 +settled_accuracy_p10_ci_high = 0.03039810119493369 +settled_accuracy_p50 = 0.17370237124476406 +settled_accuracy_p50_ci_low = 0.15033023265771028 +settled_accuracy_p50_ci_high = 0.1939384454674371 +settled_accuracy_p90 = 0.6321867806139401 +settled_accuracy_p90_ci_low = 0.6285716260632308 +settled_accuracy_p90_ci_high = 0.638095581948279 +settled_accuracy_p95 = 0.6459787260871821 +settled_accuracy_p95_ci_low = 0.6413825741497592 +settled_accuracy_p95_ci_high = 0.6533366762495889 +settled_accuracy_p99 = 1 +settled_accuracy_p99_ci_low = 1 +settled_accuracy_p99_ci_high = 1 +settled_accuracy_mean = 0.30470460160788854 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.045454545454545456 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.09090909090909091 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09523809523809523 +jitter_p95_per_min_ci_high = 0.11538461538461539 +jitter_p99_per_min = 0.11538461538461539 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.15 +jitter_mean_per_min = 0.034751115765608534 +reaction_rate = 0.087 +reaction_rate_ci_low = 0.0695316821187614 +reaction_rate_ci_high = 0.10446831788123859 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 180 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 251.72413793103448 +fire_decisiveness_mean = 4.792233313739902 +fire_decisiveness_p50 = 1.5659658795941915 +step_correction_mean = 0.4318966971731734 +step_correction_p50 = 0.42666488885879517 + +[cell.spm_15.step_minus_25_at_15min] +shares_per_minute = 15 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.894 +convergence_rate_ci_low = 0.8749200266666853 +convergence_rate_ci_high = 0.9130799733333147 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 900 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 72.68456375838926 +settled_accuracy_p10 = 0.09206369686980098 +settled_accuracy_p10_ci_low = 0.08889087928806627 +settled_accuracy_p10_ci_high = 0.09523928828455519 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.33333330350717194 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.33333330350717194 +settled_accuracy_mean = 0.29347559111947724 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.047619047619047616 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.08 +jitter_mean_per_min = 0.0009507424630297979 +reaction_rate = 0.015 +reaction_rate_ci_low = 0.007466100611237232 +reaction_rate_ci_high = 0.022533899388762768 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 216 +fire_decisiveness_mean = 3.1641665933399348 +fire_decisiveness_p50 = 0.5232037417512991 +step_correction_mean = 0.7945964336395264 +step_correction_p50 = 0.8280654549598694 + +[cell.spm_15.step_minus_10_at_15min] +shares_per_minute = 15 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 300 +convergence_mean_secs = 3.6036036036036037 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.11111110282606607 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.11111110282606607 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.11111110282606607 +settled_accuracy_p99 = 0.11111110282606607 +settled_accuracy_p99_ci_low = 0.11111110282606607 +settled_accuracy_p99_ci_high = 0.11111110282606607 +settled_accuracy_mean = 0.11138547257130434 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.000250464330798913 +reaction_rate = 0 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0 +fire_decisiveness_mean = 2.9449556235671523 +fire_decisiveness_p50 = 2.1548156786675605 + +[cell.spm_15.step_minus_5_at_15min] +shares_per_minute = 15 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 120 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 300 +convergence_mean_secs = 4.564564564564565 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.05263157522942574 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.05263157522942574 +settled_accuracy_p95 = 0.05263157522942574 +settled_accuracy_p95_ci_low = 0.05263157522942574 +settled_accuracy_p95_ci_high = 0.05263157522942574 +settled_accuracy_p99 = 0.05263157522942574 +settled_accuracy_p99_ci_low = 0.05263157522942574 +settled_accuracy_p99_ci_high = 0.11812544737771402 +settled_accuracy_mean = 0.05340319125962915 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.038461538461538464 +jitter_mean_per_min = 0.0003246148415230541 +reaction_rate = 0.003 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.006389723528549194 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 120 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 180 +reaction_p99_secs_ci_low = 120 +reaction_p99_secs_ci_high = 180 +reaction_mean_secs = 160 +fire_decisiveness_mean = 7.083900722404835 +fire_decisiveness_p50 = 4.588188817497574 +step_correction_mean = 2.170171598593394 +step_correction_p50 = 1.3467129468917847 + +[cell.spm_15.step_plus_5_at_15min] +shares_per_minute = 15 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 300 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 540 +convergence_mean_secs = 7.807807807807808 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.047618983705838724 +settled_accuracy_p90_ci_low = 0.047618983705838724 +settled_accuracy_p90_ci_high = 0.047618983705838724 +settled_accuracy_p95 = 0.047618983705838724 +settled_accuracy_p95_ci_low = 0.047618983705838724 +settled_accuracy_p95_ci_high = 0.047618983705838724 +settled_accuracy_p99 = 0.05056039740722007 +settled_accuracy_p99_ci_low = 0.047618983705838724 +settled_accuracy_p99_ci_high = 0.13708654704926126 +settled_accuracy_mean = 0.04838083816804785 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.037037037037037035 +jitter_mean_per_min = 0.00026548264741104127 +reaction_rate = 0.004 +reaction_rate_ci_low = 0.00008784785571930992 +reaction_rate_ci_high = 0.00791215214428069 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 120 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 120 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 180 +fire_decisiveness_mean = 4.562777613636014 +fire_decisiveness_p50 = 2.450385709444312 +step_correction_mean = 2.0163042545318604 +step_correction_p50 = 1.5874812602996826 + +[cell.spm_15.step_plus_10_at_15min] +shares_per_minute = 15 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.993 +convergence_rate_ci_low = 0.9878325091582084 +convergence_rate_ci_high = 0.9981674908417916 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 300 +convergence_mean_secs = 5.921450151057402 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.09090908536290365 +settled_accuracy_p95_ci_low = 0.09090908536290365 +settled_accuracy_p95_ci_high = 0.09090908536290365 +settled_accuracy_p99 = 0.09090908536290365 +settled_accuracy_p99_ci_low = 0.09090908536290365 +settled_accuracy_p99_ci_high = 0.09090908536290365 +settled_accuracy_mean = 0.09060938253926262 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00009993321536339128 +reaction_rate = 0.001 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.0029590197548774234 +reaction_p10_secs = 120 +reaction_p50_secs = 120 +reaction_p90_secs = 120 +reaction_p99_secs = 120 +reaction_mean_secs = 120 +fire_decisiveness_mean = 5.129410690115154 +fire_decisiveness_p50 = 1.735410206265044 +step_correction_mean = 2.1568729877471924 +step_correction_p50 = 2.1568729877471924 + +[cell.spm_15.step_plus_25_at_15min] +shares_per_minute = 15 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.867 +convergence_rate_ci_low = 0.845952939929767 +convergence_rate_ci_high = 0.888047060070233 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 360 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 107.82006920415225 +settled_accuracy_p10 = 0.04952290430834605 +settled_accuracy_p10_ci_low = 0.046665784766739216 +settled_accuracy_p10_ci_high = 0.051427507503844505 +settled_accuracy_p50 = 0.20000003221225382 +settled_accuracy_p50_ci_low = 0.20000003221225382 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.20000003221225382 +settled_accuracy_mean = 0.1685072335300352 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00020430003895253814 +reaction_rate = 0.015 +reaction_rate_ci_low = 0.007466100611237232 +reaction_rate_ci_high = 0.022533899388762768 +reaction_p10_secs = 240 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 300 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 276 +fire_decisiveness_mean = 2.00185998416639 +fire_decisiveness_p50 = 0.764421518726639 +step_correction_mean = 0.8922890305519104 +step_correction_p50 = 0.8666681051254272 + +[cell.spm_15.step_plus_50_at_15min] +shares_per_minute = 15 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.582 +convergence_rate_ci_low = 0.5514292773785113 +convergence_rate_ci_high = 0.6125707226214886 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 1380 +convergence_p50_secs_ci_low = 1320 +convergence_p50_secs_ci_high = 1380 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1191.958762886598 +settled_accuracy_p10 = 0.11434580803590166 +settled_accuracy_p10_ci_low = 0.1062983815758074 +settled_accuracy_p10_ci_high = 0.1231338479121673 +settled_accuracy_p50 = 0.20193137519214388 +settled_accuracy_p50_ci_low = 0.20153230115129284 +settled_accuracy_p50_ci_high = 0.20341653907780433 +settled_accuracy_p90 = 0.30245696286222334 +settled_accuracy_p90_ci_low = 0.2606647839797005 +settled_accuracy_p90_ci_high = 0.33333334824641403 +settled_accuracy_p95 = 0.33333334824641403 +settled_accuracy_p95_ci_low = 0.33333334824641403 +settled_accuracy_p95_ci_high = 0.33333334824641403 +settled_accuracy_p99 = 0.4844508316175089 +settled_accuracy_p99_ci_low = 0.430774388859714 +settled_accuracy_p99_ci_high = 0.5301468673000969 +settled_accuracy_mean = 0.2038818594094369 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.045454545454545456 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.045454545454545456 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.09090909090909091 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.010494180225622901 +reaction_rate = 0.105 +reaction_rate_ci_low = 0.0859996221090211 +reaction_rate_ci_high = 0.1240003778909789 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 250.28571428571428 +fire_decisiveness_mean = 2.896596103958774 +fire_decisiveness_p50 = 1.2942489127445072 +step_correction_mean = 0.4384670947279249 +step_correction_p50 = 0.43137454986572266 + +[cell.spm_20.cold_start_10gh_to_1ph] +shares_per_minute = 20 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 720 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 780 +convergence_p99_secs = 900 +convergence_p99_secs_ci_low = 900 +convergence_p99_secs_ci_high = 960 +convergence_mean_secs = 614.04 +settled_accuracy_p10 = 0.013681954043715194 +settled_accuracy_p10_ci_low = 0.009407320677898845 +settled_accuracy_p10_ci_high = 0.013681954043715194 +settled_accuracy_p50 = 0.05872750452129205 +settled_accuracy_p50_ci_low = 0.05521603316681167 +settled_accuracy_p50_ci_high = 0.06289261621963549 +settled_accuracy_p90 = 0.13802917772648726 +settled_accuracy_p90_ci_low = 0.1317923482606489 +settled_accuracy_p90_ci_high = 0.1440884371358715 +settled_accuracy_p95 = 0.16346974574665696 +settled_accuracy_p95_ci_low = 0.151456587845739 +settled_accuracy_p95_ci_high = 0.1733073684661215 +settled_accuracy_p99 = 0.22034840104069753 +settled_accuracy_p99_ci_low = 0.1908400962851149 +settled_accuracy_p99_ci_high = 0.24987294614157918 +settled_accuracy_mean = 0.06819235917255037 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05555555555555555 +jitter_p90_per_min_ci_low = 0.05555555555555555 +jitter_p90_per_min_ci_high = 0.05555555555555555 +jitter_p95_per_min = 0.05555555555555555 +jitter_p95_per_min_ci_low = 0.05555555555555555 +jitter_p95_per_min_ci_high = 0.058823529411764705 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.07692307692307693 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.008930366119908582 +bias_mean = -0.001932980301616131 +bias_p10 = -0.0774586271287325 +bias_p10_ci_low = -0.08376477651993905 +bias_p10_ci_high = -0.07338928684465382 +bias_p50 = -0.004980724585645942 +bias_p50_ci_low = -0.008349448320450367 +bias_p50_ci_high = -0.0011181926308327682 +bias_p90 = 0.07988350706364424 +bias_p90_ci_low = 0.07087755744245983 +bias_p90_ci_high = 0.08482567584039787 +bias_p99 = 0.1394566044746093 +bias_p99_ci_low = 0.12681596455894661 +bias_p99_ci_high = 0.16286155223249488 +variance_mean = 0.003780007220474501 +variance_p10 = 0.0007670602766720265 +variance_p10_ci_low = 0.0007027429369646521 +variance_p10_ci_high = 0.0008022101737119282 +variance_p50 = 0.0022715824254971916 +variance_p50_ci_low = 0.0021013944876134465 +variance_p50_ci_high = 0.002438118674785547 +variance_p90 = 0.008700691592881171 +variance_p90_ci_low = 0.007727959427678358 +variance_p90_ci_high = 0.009585895530270866 +variance_p99 = 0.025977205763508447 +variance_p99_ci_low = 0.01833578177645141 +variance_p99_ci_high = 0.029880395614093672 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.023521455811396086 +ramp_target_overshoot_p50_ci_low = 0.013681954043715194 +ramp_target_overshoot_p50_ci_high = 0.03337297006588957 +ramp_target_overshoot_p90 = 0.16130749812044853 +ramp_target_overshoot_p90_ci_low = 0.151456587845739 +ramp_target_overshoot_p90_ci_high = 0.17301772660532966 +ramp_target_overshoot_p99 = 0.3576523332645021 +ramp_target_overshoot_p99_ci_low = 0.29908897702668935 +ramp_target_overshoot_p99_ci_high = 0.48903994796110184 +ramp_target_overshoot_mean = 0.05781710170100167 + +[cell.spm_20.stable_1ph] +shares_per_minute = 20 +scenario = "stable_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 240 +convergence_mean_secs = 3.42 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0 +settled_accuracy_p90_ci_low = 0 +settled_accuracy_p90_ci_high = 0 +settled_accuracy_p95 = 0 +settled_accuracy_p95_ci_low = 0 +settled_accuracy_p95_ci_high = 0 +settled_accuracy_p99 = 0 +settled_accuracy_p99_ci_low = 0 +settled_accuracy_p99_ci_high = 0.046559794904571516 +settled_accuracy_mean = 0.000606165519586024 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.0001692857142857143 +bias_mean = -0.001936587706858971 +bias_p10 = -0.05828722091908776 +bias_p10_ci_low = -0.06314777825206477 +bias_p10_ci_high = -0.05465512314602092 +bias_p50 = -0.002377098423122163 +bias_p50_ci_low = -0.005171613985754463 +bias_p50_ci_high = 0.0009366914077154255 +bias_p90 = 0.05726212947610699 +bias_p90_ci_low = 0.05227672493014753 +bias_p90_ci_high = 0.061822134459681925 +bias_p99 = 0.10642463574341272 +bias_p99_ci_low = 0.09694482689531443 +bias_p99_ci_high = 0.11790665170317938 +variance_mean = 0.0004174206781047197 +variance_p10 = 0.00011557347194866613 +variance_p10_ci_low = 0.00010805468851076645 +variance_p10_ci_high = 0.00012378156501337143 +variance_p50 = 0.0003144518219340077 +variance_p50_ci_low = 0.0002883737129980835 +variance_p50_ci_high = 0.0003333930044964399 +variance_p90 = 0.0008422688084913072 +variance_p90_ci_low = 0.0007844476924044594 +variance_p90_ci_high = 0.000926840362956012 +variance_p99 = 0.0017198424822453488 +variance_p99_ci_low = 0.0014783902873440054 +variance_p99_ci_high = 0.0018881408321533145 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1 +upward_step_magnitude_p95 = 1 +upward_step_magnitude_p95_ci_low = 1 +upward_step_magnitude_p95_ci_high = 1 +upward_step_magnitude_p99 = 1 +upward_step_magnitude_p99_ci_low = 1 +upward_step_magnitude_p99_ci_high = 1.5500030926000512 +upward_step_magnitude_mean = 1.0057631318424922 +fire_decisiveness_mean = 4.397482219631548 +fire_decisiveness_p50 = 3.0198637370312724 + +[cell.spm_20.step_minus_50_at_15min] +shares_per_minute = 20 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.39 +convergence_rate_ci_low = 0.35976894576763824 +convergence_rate_ci_high = 0.4202310542323618 +convergence_p10_secs = 1260 +convergence_p10_secs_ci_low = 1200 +convergence_p10_secs_ci_high = 1260 +convergence_p50_secs = 1440 +convergence_p50_secs_ci_low = 1440 +convergence_p50_secs_ci_high = 1440 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1374.4615384615386 +settled_accuracy_p10 = 0.021988353793372273 +settled_accuracy_p10_ci_low = 0.018399573026558147 +settled_accuracy_p10_ci_high = 0.024747333446031528 +settled_accuracy_p50 = 0.09873948748020367 +settled_accuracy_p50_ci_low = 0.0917523137962204 +settled_accuracy_p50_ci_high = 0.1106856036251136 +settled_accuracy_p90 = 0.6416676526077398 +settled_accuracy_p90_ci_low = 0.6230779601669965 +settled_accuracy_p90_ci_high = 0.6464292950059394 +settled_accuracy_p95 = 0.6576967392003885 +settled_accuracy_p95_ci_low = 0.6521779745886915 +settled_accuracy_p95_ci_high = 0.6615389901498279 +settled_accuracy_p99 = 0.6785752465864907 +settled_accuracy_p99_ci_low = 0.6724178740166622 +settled_accuracy_p99_ci_high = 0.6827604238354315 +settled_accuracy_mean = 0.17070841990097296 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.08695652173913043 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.08 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.15 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.15 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.0862709705753184 +reaction_rate = 0.142 +reaction_rate_ci_low = 0.12036564820476471 +reaction_rate_ci_high = 0.16363435179523528 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 252.25352112676057 +fire_decisiveness_mean = 5.012264213742199 +fire_decisiveness_p50 = 1.5797421988009255 +step_correction_mean = 0.3913321297773173 +step_correction_p50 = 0.37999844551086426 + +[cell.spm_20.step_minus_25_at_15min] +shares_per_minute = 20 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.865 +convergence_rate_ci_low = 0.8438197535425104 +convergence_rate_ci_high = 0.8861802464574896 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 300 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 107.79190751445087 +settled_accuracy_p10 = 0.10952381250642573 +settled_accuracy_p10_ci_low = 0.10714386377580776 +settled_accuracy_p10_ci_high = 0.11333470116109967 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.33333330350717194 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.33333330350717194 +settled_accuracy_mean = 0.2860965939030634 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.043478260869565216 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.08695652173913043 +jitter_mean_per_min = 0.0011861369449760809 +reaction_rate = 0.014 +reaction_rate_ci_low = 0.006717868004492091 +reaction_rate_ci_high = 0.021282131995507908 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 214.28571428571428 +fire_decisiveness_mean = 2.006161426593333 +fire_decisiveness_p50 = 0.5666491433613299 +step_correction_mean = 0.6855235589402062 +step_correction_p50 = 0.7299957871437073 + +[cell.spm_20.step_minus_10_at_15min] +shares_per_minute = 20 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.996 +convergence_rate_ci_low = 0.9920878478557194 +convergence_rate_ci_high = 0.9999121521442806 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 240 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 780 +convergence_mean_secs = 10.662650602409638 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.11111110282606607 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.11111110282606607 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.11111110282606607 +settled_accuracy_p99 = 0.11111110282606607 +settled_accuracy_p99_ci_low = 0.11111110282606607 +settled_accuracy_p99_ci_high = 0.11563185419182465 +settled_accuracy_mean = 0.1106968204938562 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.04 +jitter_mean_per_min = 0.0003126292390405293 +reaction_rate = 0.002 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.00476908533635206 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 60 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 180 +reaction_p99_secs_ci_low = 60 +reaction_p99_secs_ci_high = 180 +reaction_mean_secs = 120 +fire_decisiveness_mean = 5.607815556151394 +fire_decisiveness_p50 = 1.8247406515550395 +step_correction_mean = 1.3006916642189026 +step_correction_p50 = 1.8888884782791138 + +[cell.spm_20.step_minus_5_at_15min] +shares_per_minute = 20 +scenario = "step_minus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 360 +convergence_mean_secs = 2.94 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.05263157522942574 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.05263157522942574 +settled_accuracy_p95 = 0.05263157522942574 +settled_accuracy_p95_ci_low = 0.05263157522942574 +settled_accuracy_p95_ci_high = 0.05263157522942574 +settled_accuracy_p99 = 0.05263157522942574 +settled_accuracy_p99_ci_low = 0.05263157522942574 +settled_accuracy_p99_ci_high = 0.05263157522942574 +settled_accuracy_mean = 0.052700397701260726 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00009523809523809523 +reaction_rate = 0.001 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.0029590197548774234 +reaction_p10_secs = 120 +reaction_p50_secs = 120 +reaction_p90_secs = 120 +reaction_p99_secs = 120 +reaction_mean_secs = 120 +fire_decisiveness_mean = 19.357810177839642 +fire_decisiveness_p50 = 4.898887557428111 +step_correction_mean = 0.9493262767791748 +step_correction_p50 = 0.9493262767791748 + +[cell.spm_20.step_plus_5_at_15min] +shares_per_minute = 20 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 180 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 300 +convergence_mean_secs = 5.345345345345345 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.047618983705838724 +settled_accuracy_p90_ci_low = 0.047618983705838724 +settled_accuracy_p90_ci_high = 0.047618983705838724 +settled_accuracy_p95 = 0.047618983705838724 +settled_accuracy_p95_ci_low = 0.047618983705838724 +settled_accuracy_p95_ci_high = 0.047618983705838724 +settled_accuracy_p99 = 0.047618983705838724 +settled_accuracy_p99_ci_low = 0.047618983705838724 +settled_accuracy_p99_ci_high = 0.0869001058274913 +settled_accuracy_mean = 0.04802905053476805 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00020428817501223182 +reaction_rate = 0.001 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.0029590197548774234 +reaction_p10_secs = 120 +reaction_p50_secs = 120 +reaction_p90_secs = 120 +reaction_p99_secs = 120 +reaction_mean_secs = 120 +fire_decisiveness_mean = 13.275417159963274 +fire_decisiveness_p50 = 3.0198637370312724 +step_correction_mean = 1.2658623456954956 +step_correction_p50 = 1.2658623456954956 + +[cell.spm_20.step_plus_10_at_15min] +shares_per_minute = 20 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.998 +convergence_rate_ci_low = 0.995230914663648 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 180 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 480 +convergence_mean_secs = 7.515030060120241 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.09090908536290365 +settled_accuracy_p95_ci_low = 0.09090908536290365 +settled_accuracy_p95_ci_high = 0.09090908536290365 +settled_accuracy_p99 = 0.09090908536290365 +settled_accuracy_p99_ci_low = 0.09090908536290365 +settled_accuracy_p99_ci_high = 0.09090908536290365 +settled_accuracy_mean = 0.09075405064535344 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00012608497030607582 +reaction_rate = 0.002 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.00476908533635206 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 120 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 180 +reaction_p99_secs_ci_low = 120 +reaction_p99_secs_ci_high = 180 +reaction_mean_secs = 150 +fire_decisiveness_mean = 5.102764462826337 +fire_decisiveness_p50 = 1.9611116679955138 +step_correction_mean = 0.6779317259788513 +step_correction_p50 = 0.8014469146728516 + +[cell.spm_20.step_plus_25_at_15min] +shares_per_minute = 20 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.837 +convergence_rate_ci_low = 0.8141064784360291 +convergence_rate_ci_high = 0.8598935215639708 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 149.9641577060932 +settled_accuracy_p10 = 0.06260623332881643 +settled_accuracy_p10_ci_low = 0.06086752324060429 +settled_accuracy_p10_ci_high = 0.06399909118494496 +settled_accuracy_p50 = 0.20000003221225382 +settled_accuracy_p50_ci_low = 0.20000003221225382 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.20000003221225382 +settled_accuracy_mean = 0.16573148251744313 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00021354243724416828 +reaction_rate = 0.014 +reaction_rate_ci_low = 0.006717868004492091 +reaction_rate_ci_high = 0.021282131995507908 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 222.85714285714286 +fire_decisiveness_mean = 1.0701384595300911 +fire_decisiveness_p50 = 0.5971918901454139 +step_correction_mean = 0.7579173403126853 +step_correction_p50 = 0.7500109672546387 + +[cell.spm_20.step_plus_50_at_15min] +shares_per_minute = 20 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.587 +convergence_rate_ci_low = 0.5564824160589341 +convergence_rate_ci_high = 0.6175175839410658 +convergence_p10_secs = 1140 +convergence_p10_secs_ci_low = 1140 +convergence_p10_secs_ci_high = 1200 +convergence_p50_secs = 1380 +convergence_p50_secs_ci_low = 1320 +convergence_p50_secs_ci_high = 1380 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1294.2419080068144 +settled_accuracy_p10 = 0.0290680699517738 +settled_accuracy_p10_ci_low = 0.025811500508551077 +settled_accuracy_p10_ci_high = 0.03718842137673217 +settled_accuracy_p50 = 0.20512539917470418 +settled_accuracy_p50_ci_low = 0.20133222725996036 +settled_accuracy_p50_ci_high = 0.20701634798755286 +settled_accuracy_p90 = 0.2250052814675474 +settled_accuracy_p90_ci_low = 0.2233311390226319 +settled_accuracy_p90_ci_high = 0.228885963340128 +settled_accuracy_p95 = 0.3273154280324102 +settled_accuracy_p95_ci_low = 0.23813088035822894 +settled_accuracy_p95_ci_high = 0.33333334824641403 +settled_accuracy_p99 = 0.38409847429341304 +settled_accuracy_p99_ci_low = 0.3469285749629716 +settled_accuracy_p99_ci_high = 0.39847113482251184 +settled_accuracy_mean = 0.16448625230194566 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.08333333333333333 +jitter_p95_per_min_ci_high = 0.12 +jitter_p99_per_min = 0.12 +jitter_p99_per_min_ci_low = 0.09090909090909091 +jitter_p99_per_min_ci_high = 0.12 +jitter_mean_per_min = 0.02656515640705364 +reaction_rate = 0.132 +reaction_rate_ci_low = 0.11102012484307879 +reaction_rate_ci_high = 0.1529798751569212 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 180 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 253.1818181818182 +fire_decisiveness_mean = 2.7067954056405616 +fire_decisiveness_p50 = 1.3589826433526255 +step_correction_mean = 0.39545979802355624 +step_correction_p50 = 0.3833356201648712 + +[cell.spm_25.cold_start_10gh_to_1ph] +shares_per_minute = 25 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 720 +convergence_p99_secs = 900 +convergence_p99_secs_ci_low = 900 +convergence_p99_secs_ci_high = 960 +convergence_mean_secs = 611.46 +settled_accuracy_p10 = 0.007975821481292611 +settled_accuracy_p10_ci_low = 0.007975821481292611 +settled_accuracy_p10_ci_high = 0.01565649817487369 +settled_accuracy_p50 = 0.055011619564408365 +settled_accuracy_p50_ci_low = 0.04732785586304311 +settled_accuracy_p50_ci_high = 0.05521603316681167 +settled_accuracy_p90 = 0.12586871586717296 +settled_accuracy_p90_ci_low = 0.11819454873348456 +settled_accuracy_p90_ci_high = 0.1337589064368876 +settled_accuracy_p95 = 0.14951204137717866 +settled_accuracy_p95_ci_low = 0.1416225890049776 +settled_accuracy_p95_ci_high = 0.1573696841474299 +settled_accuracy_p99 = 0.20120009440875108 +settled_accuracy_p99_ci_low = 0.18097992498705295 +settled_accuracy_p99_ci_high = 0.21836197864045626 +settled_accuracy_mean = 0.06225192090737082 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05555555555555555 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.05555555555555555 +jitter_p95_per_min = 0.05555555555555555 +jitter_p95_per_min_ci_low = 0.05555555555555555 +jitter_p95_per_min_ci_high = 0.05555555555555555 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.0625 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.006922904553623494 +bias_mean = -0.0010973870919750548 +bias_p10 = -0.07275060471356633 +bias_p10_ci_low = -0.07725730406615897 +bias_p10_ci_high = -0.06691493438171131 +bias_p50 = -0.003795373641302886 +bias_p50_ci_low = -0.007175163274720323 +bias_p50_ci_high = 0.0010505186386766123 +bias_p90 = 0.07179285878250835 +bias_p90_ci_low = 0.06369788727765645 +bias_p90_ci_high = 0.08009377679751899 +bias_p99 = 0.1376323594764476 +bias_p99_ci_low = 0.1198023782385674 +bias_p99_ci_high = 0.1491357231193349 +variance_mean = 0.0028184465279132566 +variance_p10 = 0.0005533121121012325 +variance_p10_ci_low = 0.0005189254431217118 +variance_p10_ci_high = 0.00058622418056379 +variance_p50 = 0.0017106448234726927 +variance_p50_ci_low = 0.0015524682758424305 +variance_p50_ci_high = 0.001859279637657549 +variance_p90 = 0.006301858773252532 +variance_p90_ci_low = 0.005581348038887431 +variance_p90_ci_high = 0.006843516493965443 +variance_p99 = 0.019186937397569073 +variance_p99_ci_low = 0.013917492243985871 +variance_p99_ci_high = 0.02169081081129343 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.02002823806816134 +ramp_target_overshoot_p50_ci_low = 0.01565649817487369 +ramp_target_overshoot_p50_ci_high = 0.023534743366641075 +ramp_target_overshoot_p90 = 0.1337589064368876 +ramp_target_overshoot_p90_ci_low = 0.12586871586717296 +ramp_target_overshoot_p90_ci_high = 0.14951204137717866 +ramp_target_overshoot_p99 = 0.33797574564827526 +ramp_target_overshoot_p99_ci_low = 0.246028413490734 +ramp_target_overshoot_p99_ci_high = 0.41088872202642457 +ramp_target_overshoot_mean = 0.049654009241293415 + +[cell.spm_25.stable_1ph] +shares_per_minute = 25 +scenario = "stable_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 120 +convergence_mean_secs = 1.98 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0 +settled_accuracy_p90_ci_low = 0 +settled_accuracy_p90_ci_high = 0 +settled_accuracy_p95 = 0 +settled_accuracy_p95_ci_low = 0 +settled_accuracy_p95_ci_high = 0 +settled_accuracy_p99 = 0 +settled_accuracy_p99_ci_low = 0 +settled_accuracy_p99_ci_high = 0.008001054414484843 +settled_accuracy_mean = 0.0005565010001569677 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00003846153846153846 +bias_mean = -0.0015462301226058812 +bias_p10 = -0.054330273855489296 +bias_p10_ci_low = -0.056913166910812836 +bias_p10_ci_high = -0.05096802082807684 +bias_p50 = -0.001491522778166854 +bias_p50_ci_low = -0.004158089991850476 +bias_p50_ci_high = 0.0012721792193521736 +bias_p90 = 0.052014820222821286 +bias_p90_ci_low = 0.04759448291522916 +bias_p90_ci_high = 0.05672633936305189 +bias_p99 = 0.09193362428887958 +bias_p99_ci_low = 0.08303855970473852 +bias_p99_ci_high = 0.09482881727700349 +variance_mean = 0.0003232101193238649 +variance_p10 = 0.00008963136963088998 +variance_p10_ci_low = 0.00008475939727137264 +variance_p10_ci_high = 0.00009581449694523495 +variance_p50 = 0.00022923585799278616 +variance_p50_ci_low = 0.00021640568907452978 +variance_p50_ci_high = 0.00024484118195921043 +variance_p90 = 0.0006738257052304604 +variance_p90_ci_low = 0.000609125313831941 +variance_p90_ci_high = 0.0007394984218308696 +variance_p99 = 0.0013223648000144376 +variance_p99_ci_low = 0.0011906683412192809 +variance_p99_ci_high = 0.0014035245986015147 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1 +upward_step_magnitude_p95 = 1 +upward_step_magnitude_p95_ci_low = 1 +upward_step_magnitude_p95_ci_high = 1 +upward_step_magnitude_p99 = 1 +upward_step_magnitude_p99_ci_low = 1 +upward_step_magnitude_p99_ci_high = 1.2061574262569206 +upward_step_magnitude_mean = 1.003066176444901 +fire_decisiveness_mean = 3.4439517526853187 +fire_decisiveness_p50 = 1.569804394784292 + +[cell.spm_25.step_minus_50_at_15min] +shares_per_minute = 25 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.501 +convergence_rate_ci_low = 0.470009740911054 +convergence_rate_ci_high = 0.531990259088946 +convergence_p10_secs = 1260 +convergence_p10_secs_ci_low = 1260 +convergence_p10_secs_ci_high = 1320 +convergence_p50_secs = 1440 +convergence_p50_secs_ci_low = 1440 +convergence_p50_secs_ci_high = 1440 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1399.5209580838323 +settled_accuracy_p10 = 0.020589469505094327 +settled_accuracy_p10_ci_low = 0.017021492486390732 +settled_accuracy_p10_ci_high = 0.024253076656241768 +settled_accuracy_p50 = 0.08479822478261934 +settled_accuracy_p50_ci_low = 0.07935656825666138 +settled_accuracy_p50_ci_high = 0.09055757467488612 +settled_accuracy_p90 = 0.1966346783314401 +settled_accuracy_p90_ci_low = 0.18246967467836905 +settled_accuracy_p90_ci_high = 0.2058157079169871 +settled_accuracy_p95 = 0.23919216764384998 +settled_accuracy_p95_ci_low = 0.22226885542676844 +settled_accuracy_p95_ci_high = 0.27150985080961143 +settled_accuracy_p99 = 0.6833363521137716 +settled_accuracy_p99_ci_low = 0.6707739752627329 +settled_accuracy_p99_ci_high = 0.6892307921510277 +settled_accuracy_mean = 0.10912840220973384 +jitter_p10_per_min = 0.1 +jitter_p10_per_min_ci_low = 0.08 +jitter_p10_per_min_ci_high = 0.13043478260869565 +jitter_p50_per_min = 0.13043478260869565 +jitter_p50_per_min_ci_low = 0.1 +jitter_p50_per_min_ci_high = 0.15 +jitter_p90_per_min = 0.15 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.15789473684210525 +jitter_p95_per_min = 0.15789473684210525 +jitter_p95_per_min_ci_low = 0.13333333333333333 +jitter_p95_per_min_ci_high = 0.15789473684210525 +jitter_p99_per_min = 0.15789473684210525 +jitter_p99_per_min_ci_low = 0.13333333333333333 +jitter_p99_per_min_ci_high = 0.15789473684210525 +jitter_mean_per_min = 0.11895785659801678 +reaction_rate = 0.184 +reaction_rate_ci_low = 0.15998348088502415 +reaction_rate_ci_high = 0.20801651911497585 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 180 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 265.4347826086956 +fire_decisiveness_mean = 4.718714207372039 +fire_decisiveness_p50 = 1.7398197068808727 +step_correction_mean = 0.3587500854678776 +step_correction_p50 = 0.3555505573749542 + +[cell.spm_25.step_minus_25_at_15min] +shares_per_minute = 25 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.788 +convergence_rate_ci_low = 0.7626669715667471 +convergence_rate_ci_high = 0.813333028433253 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 360 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 168.88324873096445 +settled_accuracy_p10 = 0.12213374689095824 +settled_accuracy_p10_ci_low = 0.1200011166914865 +settled_accuracy_p10_ci_high = 0.1242704931007168 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.33333330350717194 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.33333330350717194 +settled_accuracy_mean = 0.2673555494690321 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.043478260869565216 +jitter_mean_per_min = 0.0005802663225780935 +reaction_rate = 0.016 +reaction_rate_ci_low = 0.008222972907337922 +reaction_rate_ci_high = 0.02377702709266208 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 180 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 251.25 +fire_decisiveness_mean = 2.4836321715122707 +fire_decisiveness_p50 = 0.5361774460756479 +step_correction_mean = 0.7084406018257141 +step_correction_p50 = 0.7073672413825989 + +[cell.spm_25.step_minus_10_at_15min] +shares_per_minute = 25 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.996 +convergence_rate_ci_low = 0.9920878478557194 +convergence_rate_ci_high = 0.9999121521442806 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 60 +convergence_mean_secs = 4.698795180722891 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.11111110282606607 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.11111110282606607 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.11111110282606607 +settled_accuracy_p99 = 0.11111110282606607 +settled_accuracy_p99_ci_low = 0.11111110282606607 +settled_accuracy_p99_ci_high = 0.11111110282606607 +settled_accuracy_mean = 0.11074989890795446 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00007444630560208449 +reaction_rate = 0.002 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.00476908533635206 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 180 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 180 +reaction_p99_secs_ci_high = 240 +reaction_mean_secs = 210 +fire_decisiveness_mean = 1.805944162508518 +fire_decisiveness_p50 = 1.2939335010796107 +step_correction_mean = 1.6551880836486816 +step_correction_p50 = 1.799973964691162 + +[cell.spm_25.step_minus_5_at_15min] +shares_per_minute = 25 +scenario = "step_minus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 120 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 240 +convergence_mean_secs = 3.54 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.05263157522942574 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.05263157522942574 +settled_accuracy_p95 = 0.05263157522942574 +settled_accuracy_p95_ci_low = 0.05263157522942574 +settled_accuracy_p95_ci_high = 0.05263157522942574 +settled_accuracy_p99 = 0.05263157522942574 +settled_accuracy_p99_ci_low = 0.05263157522942574 +settled_accuracy_p99_ci_high = 0.06050810735129586 +settled_accuracy_mean = 0.05269341025563391 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.04 +jitter_mean_per_min = 0.00031784062342885873 +reaction_rate = 0.001 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.0029590197548774234 +reaction_p10_secs = 120 +reaction_p50_secs = 120 +reaction_p90_secs = 120 +reaction_p99_secs = 120 +reaction_mean_secs = 120 +fire_decisiveness_mean = 19.260736343472242 +fire_decisiveness_p50 = 1.9218015414433154 +step_correction_mean = 1.3642882108688354 +step_correction_p50 = 1.3642882108688354 + +[cell.spm_25.step_plus_5_at_15min] +shares_per_minute = 25 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 120 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 420 +convergence_mean_secs = 5.945945945945946 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.047618983705838724 +settled_accuracy_p90_ci_low = 0.047618983705838724 +settled_accuracy_p90_ci_high = 0.047618983705838724 +settled_accuracy_p95 = 0.047618983705838724 +settled_accuracy_p95_ci_low = 0.047618983705838724 +settled_accuracy_p95_ci_high = 0.047618983705838724 +settled_accuracy_p99 = 0.047618983705838724 +settled_accuracy_p99_ci_low = 0.047618983705838724 +settled_accuracy_p99_ci_high = 0.06285410314492612 +settled_accuracy_mean = 0.04776515321466168 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00014848410270834066 +reaction_rate = 0.004 +reaction_rate_ci_low = 0.00008784785571930992 +reaction_rate_ci_high = 0.00791215214428069 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 60 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 60 +reaction_p99_secs_ci_high = 240 +reaction_mean_secs = 135 +fire_decisiveness_mean = 12.645147913071071 +fire_decisiveness_p50 = 2.7399326939787656 +step_correction_mean = 1.54925899207592 +step_correction_p50 = 0.9920263886451721 + +[cell.spm_25.step_plus_10_at_15min] +shares_per_minute = 25 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.995 +convergence_rate_ci_low = 0.9906282772274537 +convergence_rate_ci_high = 0.9993717227725463 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 300 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 660 +convergence_mean_secs = 9.527638190954773 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.09090908536290365 +settled_accuracy_p95_ci_low = 0.09090908536290365 +settled_accuracy_p95_ci_high = 0.09090908536290365 +settled_accuracy_p99 = 0.09090908536290365 +settled_accuracy_p99_ci_low = 0.09090908536290365 +settled_accuracy_p99_ci_high = 0.09090908536290365 +settled_accuracy_mean = 0.09044006443183267 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.038461538461538464 +jitter_mean_per_min = 0.0002580332550060098 +reaction_rate = 0.002 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.00476908533635206 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 180 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 180 +reaction_p99_secs_ci_high = 240 +reaction_mean_secs = 210 +fire_decisiveness_mean = 5.359398782535087 +fire_decisiveness_p50 = 1.4799993289113544 +step_correction_mean = 0.6907075047492981 +step_correction_p50 = 0.8649364709854126 + +[cell.spm_25.step_plus_25_at_15min] +shares_per_minute = 25 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.79 +convergence_rate_ci_low = 0.7647547739166393 +convergence_rate_ci_high = 0.8152452260833608 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 180 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 158.20253164556962 +settled_accuracy_p10 = 0.07313996245769194 +settled_accuracy_p10_ci_low = 0.07081187549835044 +settled_accuracy_p10_ci_high = 0.07333226961312866 +settled_accuracy_p50 = 0.20000003221225382 +settled_accuracy_p50_ci_low = 0.20000003221225382 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.21989372962709153 +settled_accuracy_mean = 0.16363033346339909 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.045454545454545456 +jitter_mean_per_min = 0.0004122685824813484 +reaction_rate = 0.013 +reaction_rate_ci_low = 0.0059792044895183 +reaction_rate_ci_high = 0.0200207955104817 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 226.15384615384616 +fire_decisiveness_mean = 1.152602806680642 +fire_decisiveness_p50 = 0.5672598340316863 +step_correction_mean = 0.7184880650960482 +step_correction_p50 = 0.707382321357727 + +[cell.spm_25.step_plus_50_at_15min] +shares_per_minute = 25 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.609 +convergence_rate_ci_low = 0.5787550342965974 +convergence_rate_ci_high = 0.6392449657034026 +convergence_p10_secs = 1200 +convergence_p10_secs_ci_low = 1200 +convergence_p10_secs_ci_high = 1200 +convergence_p50_secs = 1380 +convergence_p50_secs_ci_low = 1320 +convergence_p50_secs_ci_high = 1380 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1333.103448275862 +settled_accuracy_p10 = 0.012561794959873751 +settled_accuracy_p10_ci_low = 0.009624753184785284 +settled_accuracy_p10_ci_high = 0.015282835673389616 +settled_accuracy_p50 = 0.12128692251369033 +settled_accuracy_p50_ci_low = 0.10674935313766598 +settled_accuracy_p50_ci_high = 0.1356533195488745 +settled_accuracy_p90 = 0.228885963340128 +settled_accuracy_p90_ci_low = 0.22769115713665633 +settled_accuracy_p90_ci_high = 0.229865842223841 +settled_accuracy_p95 = 0.2389773468215588 +settled_accuracy_p95_ci_low = 0.23179231399503453 +settled_accuracy_p95_ci_high = 0.259864577892855 +settled_accuracy_p99 = 0.33333334824641403 +settled_accuracy_p99_ci_low = 0.3108883414992889 +settled_accuracy_p99_ci_high = 0.37985075167743076 +settled_accuracy_mean = 0.12988244280915578 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.07692307692307693 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.08 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.13043478260869565 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.13043478260869565 +jitter_p99_per_min = 0.13043478260869565 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.13043478260869565 +jitter_mean_per_min = 0.0738768296920471 +reaction_rate = 0.18 +reaction_rate_ci_low = 0.15618781488397168 +reaction_rate_ci_high = 0.2038121851160283 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 258 +fire_decisiveness_mean = 3.1376914836168988 +fire_decisiveness_p50 = 1.5670025418583933 +step_correction_mean = 0.3658837303519249 +step_correction_p50 = 0.3578997254371643 + +[cell.spm_30.cold_start_10gh_to_1ph] +shares_per_minute = 30 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 900 +convergence_p99_secs_ci_low = 840 +convergence_p99_secs_ci_high = 900 +convergence_mean_secs = 608.34 +settled_accuracy_p10 = 0.010395028951099894 +settled_accuracy_p10_ci_low = 0.009286524721127454 +settled_accuracy_p10_ci_high = 0.010395028951099894 +settled_accuracy_p50 = 0.04864788723509528 +settled_accuracy_p50_ci_low = 0.04322247105443666 +settled_accuracy_p50_ci_high = 0.04976001534377095 +settled_accuracy_p90 = 0.11425613078068209 +settled_accuracy_p90_ci_low = 0.10769093763902016 +settled_accuracy_p90_ci_high = 0.11909870646991871 +settled_accuracy_p95 = 0.13393761734404452 +settled_accuracy_p95_ci_low = 0.12737188733146365 +settled_accuracy_p95_ci_high = 0.14600117400248203 +settled_accuracy_p99 = 0.18754706428579615 +settled_accuracy_p99_ci_low = 0.1678879249744365 +settled_accuracy_p99_ci_high = 0.22692842524149626 +settled_accuracy_mean = 0.0569765343787644 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05555555555555555 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.05555555555555555 +jitter_p95_per_min = 0.05555555555555555 +jitter_p95_per_min_ci_low = 0.05555555555555555 +jitter_p95_per_min_ci_high = 0.05555555555555555 +jitter_p99_per_min = 0.07692307692307693 +jitter_p99_per_min_ci_low = 0.0625 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.00698261599511598 +bias_mean = -0.001436731699524691 +bias_p10 = -0.06432114849800524 +bias_p10_ci_low = -0.06856966945129486 +bias_p10_ci_high = -0.05918660332997932 +bias_p50 = -0.0033064113877470766 +bias_p50_ci_low = -0.007618491500162478 +bias_p50_ci_high = 0.001379959588383752 +bias_p90 = 0.06196208469930632 +bias_p90_ci_low = 0.05697321168464659 +bias_p90_ci_high = 0.06786091506914337 +bias_p99 = 0.12024036247913837 +bias_p99_ci_low = 0.10697425734672268 +bias_p99_ci_high = 0.13689675448425584 +variance_mean = 0.0022579412841631087 +variance_p10 = 0.0004784920137316025 +variance_p10_ci_low = 0.0004415592101453041 +variance_p10_ci_high = 0.0005066655825645211 +variance_p50 = 0.0013697773112800074 +variance_p50_ci_low = 0.0012813856542260287 +variance_p50_ci_high = 0.0014831159905573823 +variance_p90 = 0.004737839036086885 +variance_p90_ci_low = 0.004357168946277395 +variance_p90_ci_high = 0.0054604149858585894 +variance_p99 = 0.013985537667630618 +variance_p99_ci_low = 0.010922128283019649 +variance_p99_ci_high = 0.016939702352708575 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.01697277145049303 +ramp_target_overshoot_p50_ci_low = 0.010395028951099894 +ramp_target_overshoot_p50_ci_high = 0.023530314181559486 +ramp_target_overshoot_p90 = 0.1219539873436708 +ramp_target_overshoot_p90_ci_low = 0.10883890188153789 +ramp_target_overshoot_p90_ci_high = 0.12851528817116997 +ramp_target_overshoot_p99 = 0.236259778684359 +ramp_target_overshoot_p99_ci_low = 0.21198354946973597 +ramp_target_overshoot_p99_ci_high = 0.36634373657193553 +ramp_target_overshoot_mean = 0.042506542275464305 + +[cell.spm_30.stable_1ph] +shares_per_minute = 30 +scenario = "stable_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 180 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 480 +convergence_mean_secs = 5.04 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0 +settled_accuracy_p90_ci_low = 0 +settled_accuracy_p90_ci_high = 0 +settled_accuracy_p95 = 0 +settled_accuracy_p95_ci_low = 0 +settled_accuracy_p95_ci_high = 0 +settled_accuracy_p99 = 0.008723414235978 +settled_accuracy_p99_ci_low = 0 +settled_accuracy_p99_ci_high = 0.06083036080208781 +settled_accuracy_mean = 0.0007267709542900716 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.038461538461538464 +jitter_mean_per_min = 0.0003023943447856491 +bias_mean = 0.0006590360873293864 +bias_p10 = -0.04770217145107722 +bias_p10_ci_low = -0.05267577896500109 +bias_p10_ci_high = -0.04481525757765135 +bias_p50 = 0.00032722635716632756 +bias_p50_ci_low = -0.0020445139529025533 +bias_p50_ci_high = 0.0030075190997392405 +bias_p90 = 0.05114609949908564 +bias_p90_ci_low = 0.04690469208547257 +bias_p90_ci_high = 0.05942239209273341 +bias_p99 = 0.08663495202964741 +bias_p99_ci_low = 0.08019487453642742 +bias_p99_ci_high = 0.09043991870658162 +variance_mean = 0.0003027008150149333 +variance_p10 = 0.00007147137195092963 +variance_p10_ci_low = 0.00006694526788702897 +variance_p10_ci_high = 0.0000770642023625119 +variance_p50 = 0.00019018613530973972 +variance_p50_ci_low = 0.00017832631004449285 +variance_p50_ci_high = 0.00019993565112689726 +variance_p90 = 0.0006452894590977295 +variance_p90_ci_low = 0.000591042987805417 +variance_p90_ci_high = 0.0007058293056034007 +variance_p99 = 0.0013859114106223346 +variance_p99_ci_low = 0.0012115188658448572 +variance_p99_ci_high = 0.0018331338071010768 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1 +upward_step_magnitude_p95 = 1 +upward_step_magnitude_p95_ci_low = 1 +upward_step_magnitude_p95_ci_high = 1 +upward_step_magnitude_p99 = 1.2500000503316486 +upward_step_magnitude_p99_ci_low = 1 +upward_step_magnitude_p99_ci_high = 1.3666709712167486 +upward_step_magnitude_mean = 1.0054919268149103 +fire_decisiveness_mean = 4.090276145605385 +fire_decisiveness_p50 = 1.8801927657785384 + +[cell.spm_30.step_minus_50_at_15min] +shares_per_minute = 30 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.585 +convergence_rate_ci_low = 0.5544607721119214 +convergence_rate_ci_high = 0.6155392278880786 +convergence_p10_secs = 1260 +convergence_p10_secs_ci_low = 1260 +convergence_p10_secs_ci_high = 1320 +convergence_p50_secs = 1440 +convergence_p50_secs_ci_low = 1440 +convergence_p50_secs_ci_high = 1440 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1392 +settled_accuracy_p10 = 0.012001682285024629 +settled_accuracy_p10_ci_low = 0.010004254030944404 +settled_accuracy_p10_ci_high = 0.013635380491493265 +settled_accuracy_p50 = 0.07444037414265914 +settled_accuracy_p50_ci_low = 0.06822454975152614 +settled_accuracy_p50_ci_high = 0.07816947954592268 +settled_accuracy_p90 = 0.18160537960766954 +settled_accuracy_p90_ci_low = 0.169325665295476 +settled_accuracy_p90_ci_high = 0.1915515844704987 +settled_accuracy_p95 = 0.22322777399693883 +settled_accuracy_p95_ci_low = 0.20604119370296048 +settled_accuracy_p95_ci_high = 0.2291212745100868 +settled_accuracy_p99 = 0.2966641995210977 +settled_accuracy_p99_ci_low = 0.2726876784969976 +settled_accuracy_p99_ci_high = 0.33788850412394034 +settled_accuracy_mean = 0.08810494725880758 +jitter_p10_per_min = 0.08333333333333333 +jitter_p10_per_min_ci_low = 0.08 +jitter_p10_per_min_ci_high = 0.10526315789473684 +jitter_p50_per_min = 0.11538461538461539 +jitter_p50_per_min_ci_low = 0.10526315789473684 +jitter_p50_per_min_ci_high = 0.15 +jitter_p90_per_min = 0.15 +jitter_p90_per_min_ci_low = 0.11538461538461539 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.12 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.12 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.12008710587657956 +reaction_rate = 0.214 +reaction_rate_ci_low = 0.18858007697887344 +reaction_rate_ci_high = 0.23941992302112655 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 300 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 259.9065420560748 +fire_decisiveness_mean = 4.645073396243558 +fire_decisiveness_p50 = 2.1176877345853278 +step_correction_mean = 0.3394164199305472 +step_correction_p50 = 0.3333333432674408 + +[cell.spm_30.step_minus_25_at_15min] +shares_per_minute = 30 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.725 +convergence_rate_ci_low = 0.6973247583569718 +convergence_rate_ci_high = 0.7526752416430281 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 209.3793103448276 +settled_accuracy_p10 = 0.1325108351733839 +settled_accuracy_p10_ci_low = 0.13066695204337986 +settled_accuracy_p10_ci_high = 0.13422569032874487 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.33333330350717194 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.33333330350717194 +settled_accuracy_mean = 0.2571863393466172 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.045454545454545456 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.08 +jitter_mean_per_min = 0.0011135439263622625 +reaction_rate = 0.016 +reaction_rate_ci_low = 0.008222972907337922 +reaction_rate_ci_high = 0.02377702709266208 +reaction_p10_secs = 240 +reaction_p10_secs_ci_low = 180 +reaction_p10_secs_ci_high = 300 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 270 +fire_decisiveness_mean = 1.5080504812826132 +fire_decisiveness_p50 = 0.4691840525133095 +step_correction_mean = 0.6635136045515537 +step_correction_p50 = 0.6666667461395264 + +[cell.spm_30.step_minus_10_at_15min] +shares_per_minute = 30 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.995 +convergence_rate_ci_low = 0.9906282772274537 +convergence_rate_ci_high = 0.9993717227725463 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 180 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 480 +convergence_mean_secs = 6.633165829145729 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.11111110282606607 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.11111110282606607 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.11111110282606607 +settled_accuracy_p99 = 0.11111110282606607 +settled_accuracy_p99_ci_low = 0.11111110282606607 +settled_accuracy_p99_ci_high = 0.11111110282606607 +settled_accuracy_mean = 0.11031185399795675 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.04 +jitter_mean_per_min = 0.0004906842066962913 +reaction_rate = 0.005 +reaction_rate_ci_low = 0.0006282772274536896 +reaction_rate_ci_high = 0.00937172277254631 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 240 +reaction_mean_secs = 180 +fire_decisiveness_mean = 4.694529708818398 +fire_decisiveness_p50 = 0.9105865848993346 +step_correction_mean = 1.1601262927055358 +step_correction_p50 = 1.124861717224121 + +[cell.spm_30.step_minus_5_at_15min] +shares_per_minute = 30 +scenario = "step_minus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 300 +convergence_mean_secs = 3.6 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.05263157522942574 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.05263157522942574 +settled_accuracy_p95 = 0.05263157522942574 +settled_accuracy_p95_ci_low = 0.05263157522942574 +settled_accuracy_p95_ci_high = 0.05263157522942574 +settled_accuracy_p99 = 0.05263157522942574 +settled_accuracy_p99_ci_low = 0.05263157522942574 +settled_accuracy_p99_ci_high = 0.06297276870618984 +settled_accuracy_mean = 0.05290157679694829 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.0001821843927107085 +reaction_rate = 0.002 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.00476908533635206 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 180 +reaction_p10_secs_ci_high = 300 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 180 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 240 +fire_decisiveness_mean = 7.190577371550679 +fire_decisiveness_p50 = 2.84640189664718 +step_correction_mean = 2.115028440952301 +step_correction_p50 = 3.1333224773406982 + +[cell.spm_30.step_plus_5_at_15min] +shares_per_minute = 30 +scenario = "step_plus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 240 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 540 +convergence_mean_secs = 7.14 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.047618983705838724 +settled_accuracy_p90_ci_low = 0.047618983705838724 +settled_accuracy_p90_ci_high = 0.047618983705838724 +settled_accuracy_p95 = 0.047618983705838724 +settled_accuracy_p95_ci_low = 0.047618983705838724 +settled_accuracy_p95_ci_high = 0.047618983705838724 +settled_accuracy_p99 = 0.047618983705838724 +settled_accuracy_p99_ci_low = 0.047618983705838724 +settled_accuracy_p99_ci_high = 0.06531584821328718 +settled_accuracy_mean = 0.04769924949275264 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00003853861569292431 +reaction_rate = 0.001 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.0029590197548774234 +reaction_p10_secs = 240 +reaction_p50_secs = 240 +reaction_p90_secs = 240 +reaction_p99_secs = 240 +reaction_mean_secs = 240 +fire_decisiveness_mean = 5.693454152702147 +fire_decisiveness_p50 = 2.300726897860514 +step_correction_mean = 1.3249332904815674 +step_correction_p50 = 1.3249332904815674 + +[cell.spm_30.step_plus_10_at_15min] +shares_per_minute = 30 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.995 +convergence_rate_ci_low = 0.9906282772274537 +convergence_rate_ci_high = 0.9993717227725463 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 180 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 300 +convergence_mean_secs = 4.522613065326633 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.09090908536290365 +settled_accuracy_p95_ci_low = 0.09090908536290365 +settled_accuracy_p95_ci_high = 0.09090908536290365 +settled_accuracy_p99 = 0.09090908536290365 +settled_accuracy_p99_ci_low = 0.09090908536290365 +settled_accuracy_p99_ci_high = 0.09090908536290365 +settled_accuracy_mean = 0.09034717026623473 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00012971107276067473 +reaction_rate = 0.001 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.0029590197548774234 +reaction_p10_secs = 300 +reaction_p50_secs = 300 +reaction_p90_secs = 300 +reaction_p99_secs = 300 +reaction_mean_secs = 300 +fire_decisiveness_mean = 9.519483932977941 +fire_decisiveness_p50 = 4.401113768073692 +step_correction_mean = 0.9279052019119263 +step_correction_p50 = 0.9279052019119263 + +[cell.spm_30.step_plus_25_at_15min] +shares_per_minute = 30 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.732 +convergence_rate_ci_low = 0.7045476827644732 +convergence_rate_ci_high = 0.7594523172355268 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 264.0983606557377 +settled_accuracy_p10 = 0.07752802305022988 +settled_accuracy_p10_ci_low = 0.07586039466882899 +settled_accuracy_p10_ci_high = 0.07839947189083563 +settled_accuracy_p50 = 0.20000003221225382 +settled_accuracy_p50_ci_low = 0.20000003221225382 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.2865664378809234 +settled_accuracy_mean = 0.15227615796073266 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.08333333333333333 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.0014709638026491306 +reaction_rate = 0.017 +reaction_rate_ci_low = 0.008987698358149516 +reaction_rate_ci_high = 0.025012301641850487 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 232.94117647058823 +fire_decisiveness_mean = 1.0008489839180292 +fire_decisiveness_p50 = 0.5034432129583077 +step_correction_mean = 0.6295088196502012 +step_correction_p50 = 0.6518656015396118 + +[cell.spm_30.step_plus_50_at_15min] +shares_per_minute = 30 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.654 +convergence_rate_ci_low = 0.6245162313399389 +convergence_rate_ci_high = 0.6834837686600611 +convergence_p10_secs = 1200 +convergence_p10_secs_ci_low = 1140 +convergence_p10_secs_ci_high = 1200 +convergence_p50_secs = 1380 +convergence_p50_secs_ci_low = 1380 +convergence_p50_secs_ci_high = 1380 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1337.1559633027523 +settled_accuracy_p10 = 0.009847733568148831 +settled_accuracy_p10_ci_low = 0.007415708359554296 +settled_accuracy_p10_ci_high = 0.012312418423584104 +settled_accuracy_p50 = 0.06996456920449412 +settled_accuracy_p50_ci_low = 0.060070038388954305 +settled_accuracy_p50_ci_high = 0.07893675580185211 +settled_accuracy_p90 = 0.23068340713667868 +settled_accuracy_p90_ci_low = 0.22962550301448537 +settled_accuracy_p90_ci_high = 0.2325388329911825 +settled_accuracy_p95 = 0.23809526792139957 +settled_accuracy_p95_ci_low = 0.2351846222992373 +settled_accuracy_p95_ci_high = 0.24148041794684283 +settled_accuracy_p99 = 0.3131576948230701 +settled_accuracy_p99_ci_low = 0.2859263497225406 +settled_accuracy_p99_ci_high = 0.33481802000040983 +settled_accuracy_mean = 0.10211645132625463 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.09523809523809523 +jitter_p50_per_min_ci_low = 0.08695652173913043 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.12 +jitter_p95_per_min = 0.11764705882352941 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.12 +jitter_p99_per_min = 0.12 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.12 +jitter_mean_per_min = 0.07975472949897505 +reaction_rate = 0.239 +reaction_rate_ci_low = 0.21256694557187913 +reaction_rate_ci_high = 0.2654330544281209 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 180 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 257.32217573221754 +fire_decisiveness_mean = 3.2822293427174833 +fire_decisiveness_p50 = 1.7306993560684845 +step_correction_mean = 0.34580366494266557 +step_correction_p50 = 0.33684447407722473 + +[derived.operational_fitness.spm_6] +score = 0.5346792733840103 +reaction_10_component = 0.002 +reaction_50_component = 0.037 +jitter_component = 0.9992309302766819 +step_safety_component = 1 +convergence_component = 0 +overshoot_component = 0.3087154081483987 + +[derived.operational_fitness.spm_8] +score = 0.5412152499434333 +reaction_10_component = 0.007 +reaction_50_component = 0.036 +jitter_component = 0.998672123980766 +step_safety_component = 1 +convergence_component = 0 +overshoot_component = 0.36897218948241695 + +[derived.operational_fitness.spm_10] +score = 0.5501841148527478 +reaction_10_component = 0.002 +reaction_50_component = 0.064 +jitter_component = 0.9982855554310932 +step_safety_component = 1 +convergence_component = 0 +overshoot_component = 0.4391272599497449 + +[derived.operational_fitness.spm_12] +score = 0.5568568854366448 +reaction_10_component = 0.005 +reaction_50_component = 0.063 +jitter_component = 0.9995636363636363 +step_safety_component = 1 +convergence_component = 0 +overshoot_component = 0.49915976345735746 + +[derived.operational_fitness.spm_15] +score = 0.5598362297251515 +reaction_10_component = 0 +reaction_50_component = 0.087 +jitter_component = 0.9994109430983178 +step_safety_component = 1 +convergence_component = 0 +overshoot_component = 0.5128349395057203 + +[derived.operational_fitness.spm_20] +score = 0.5785936952449783 +reaction_10_component = 0.002 +reaction_50_component = 0.142 +jitter_component = 0.9994357142857143 +step_safety_component = 1 +convergence_component = 0 +overshoot_component = 0.6423476667354979 + +[derived.operational_fitness.spm_25] +score = 0.5848703741531213 +reaction_10_component = 0.002 +reaction_50_component = 0.184 +jitter_component = 0.9998717948717949 +step_safety_component = 1 +convergence_component = 0 +overshoot_component = 0.6620242543517247 + +[derived.operational_fitness.spm_30] +score = 0.5982720268442427 +reaction_10_component = 0.005 +reaction_50_component = 0.214 +jitter_component = 0.9989920188507145 +step_safety_component = 1 +convergence_component = 0 +overshoot_component = 0.763740221315641 + +[derived.decoupling_score.spm_6] +score = 0.037 +score_ci_low = 0.02530042523849691 +score_ci_high = 0.048699574761503085 + +[derived.decoupling_score.spm_8] +score = 0.036 +score_ci_low = 0.024453620203717528 +score_ci_high = 0.04754637979628247 + +[derived.decoupling_score.spm_10] +score = 0.064 +score_ci_low = 0.04883005582080145 +score_ci_high = 0.07916994417919855 + +[derived.decoupling_score.spm_12] +score = 0.063 +score_ci_low = 0.04794099971445647 +score_ci_high = 0.07805900028554352 + +[derived.decoupling_score.spm_15] +score = 0.087 +score_ci_low = 0.0695316821187614 +score_ci_high = 0.10446831788123859 + +[derived.decoupling_score.spm_20] +score = 0.142 +score_ci_low = 0.12036564820476471 +score_ci_high = 0.16363435179523528 + +[derived.decoupling_score.spm_25] +score = 0.184 +score_ci_low = 0.15998348088502415 +score_ci_high = 0.20801651911497585 + +[derived.decoupling_score.spm_30] +score = 0.214 +score_ci_low = 0.18858007697887344 +score_ci_high = 0.23941992302112655 + +[derived.reaction_asymmetry.spm_6] +asymmetry_at_5 = 0.001 +asymmetry_at_5_ci_low = -0.006301875672829884 +asymmetry_at_5_ci_high = 0.00791215214428069 +asymmetry_at_10 = 0.003 +asymmetry_at_10_ci_low = -0.0041408081088983705 +asymmetry_at_10_ci_high = 0.00937172277254631 +asymmetry_at_25 = -0.003000000000000001 +asymmetry_at_25_ci_low = -0.01674686450350853 +asymmetry_at_25_ci_high = 0.01074686450350853 +asymmetry_at_50 = 0.0030000000000000027 +asymmetry_at_50_ci_low = -0.020845250535209543 +asymmetry_at_50_ci_high = 0.02684525053520955 +max_abs_asymmetry = 0.0030000000000000027 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.02684525053520955 + +[derived.reaction_asymmetry.spm_8] +asymmetry_at_5 = 0.002 +asymmetry_at_5_ci_low = -0.005761446301095504 +asymmetry_at_5_ci_high = 0.00937172277254631 +asymmetry_at_10 = -0.006 +asymmetry_at_10_ci_low = -0.012167490841791594 +asymmetry_at_10_ci_high = 0.0011265105966690174 +asymmetry_at_25 = -0.002 +asymmetry_at_25_ci_low = -0.00791215214428069 +asymmetry_at_25_ci_high = 0.00468123748063275 +asymmetry_at_50 = 0.006000000000000005 +asymmetry_at_50_ci_low = -0.017979023022885572 +asymmetry_at_50_ci_high = 0.02997902302288558 +max_abs_asymmetry = 0.006000000000000005 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.029979023022885583 + +[derived.reaction_asymmetry.spm_10] +asymmetry_at_5 = -0.003 +asymmetry_at_5_ci_low = -0.012893220540362576 +asymmetry_at_5_ci_high = 0.006893220540362576 +asymmetry_at_10 = 0.002 +asymmetry_at_10_ci_low = -0.00468123748063275 +asymmetry_at_10_ci_high = 0.00791215214428069 +asymmetry_at_25 = -0.0010000000000000009 +asymmetry_at_25_ci_low = -0.014213510886344365 +asymmetry_at_25_ci_high = 0.012213510886344363 +asymmetry_at_50 = 0.006000000000000005 +asymmetry_at_50_ci_low = -0.024984120098290888 +asymmetry_at_50_ci_high = 0.0369841200982909 +max_abs_asymmetry = 0.006000000000000005 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.0369841200982909 + +[derived.reaction_asymmetry.spm_12] +asymmetry_at_5 = -0.005 +asymmetry_at_5_ci_low = -0.010786575226610359 +asymmetry_at_5_ci_high = 0.0017455949814877817 +asymmetry_at_10 = -0.001 +asymmetry_at_10_ci_low = -0.009283874916827 +asymmetry_at_10_ci_high = 0.007283874916827001 +asymmetry_at_25 = 0.002999999999999999 +asymmetry_at_25_ci_low = -0.007640055422186321 +asymmetry_at_25_ci_high = 0.013640055422186319 +asymmetry_at_50 = 0.013999999999999999 +asymmetry_at_50_ci_low = -0.01758250940437177 +asymmetry_at_50_ci_high = 0.04558250940437177 +max_abs_asymmetry = 0.013999999999999999 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.045582509404371765 + +[derived.reaction_asymmetry.spm_15] +asymmetry_at_5 = 0.001 +asymmetry_at_5_ci_low = -0.006301875672829884 +asymmetry_at_5_ci_high = 0.00791215214428069 +asymmetry_at_10 = 0.001 +asymmetry_at_10_ci_low = 0 +asymmetry_at_10_ci_high = 0.0029590197548774234 +asymmetry_at_25 = 0 +asymmetry_at_25_ci_low = -0.015067798777525537 +asymmetry_at_25_ci_high = 0.015067798777525537 +asymmetry_at_50 = 0.018000000000000002 +asymmetry_at_50_ci_low = -0.01846869577221749 +asymmetry_at_50_ci_high = 0.054468695772217496 +max_abs_asymmetry = 0.018000000000000002 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.054468695772217496 + +[derived.reaction_asymmetry.spm_20] +asymmetry_at_5 = 0 +asymmetry_at_5_ci_low = -0.0029590197548774234 +asymmetry_at_5_ci_high = 0.0029590197548774234 +asymmetry_at_10 = 0 +asymmetry_at_10_ci_low = -0.00476908533635206 +asymmetry_at_10_ci_high = 0.00476908533635206 +asymmetry_at_25 = 0 +asymmetry_at_25_ci_low = -0.014564263991015817 +asymmetry_at_25_ci_high = 0.014564263991015817 +asymmetry_at_50 = -0.009999999999999981 +asymmetry_at_50_ci_low = -0.05261422695215649 +asymmetry_at_50_ci_high = 0.0326142269521565 +max_abs_asymmetry = 0.009999999999999981 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.05261422695215648 + +[derived.reaction_asymmetry.spm_25] +asymmetry_at_5 = 0.003 +asymmetry_at_5_ci_low = -0.0028711718991581135 +asymmetry_at_5_ci_high = 0.00791215214428069 +asymmetry_at_10 = 0 +asymmetry_at_10_ci_low = -0.00476908533635206 +asymmetry_at_10_ci_high = 0.00476908533635206 +asymmetry_at_25 = -0.003000000000000001 +asymmetry_at_25_ci_low = -0.01779782260314378 +asymmetry_at_25_ci_high = 0.011797822603143777 +asymmetry_at_50 = -0.0040000000000000036 +asymmetry_at_50_ci_low = -0.05182870423100416 +asymmetry_at_50_ci_high = 0.043828704231004156 +max_abs_asymmetry = 0.0040000000000000036 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.05182870423100416 + +[derived.reaction_asymmetry.spm_30] +asymmetry_at_5 = -0.001 +asymmetry_at_5_ci_low = -0.00476908533635206 +asymmetry_at_5_ci_high = 0.0029590197548774234 +asymmetry_at_10 = -0.004 +asymmetry_at_10_ci_low = -0.00937172277254631 +asymmetry_at_10_ci_high = 0.002330742527423734 +asymmetry_at_25 = 0.0010000000000000009 +asymmetry_at_25_ci_low = -0.014789328734512563 +asymmetry_at_25_ci_high = 0.016789328734512565 +asymmetry_at_50 = 0.024999999999999994 +asymmetry_at_50_ci_low = -0.026852977449247417 +asymmetry_at_50_ci_high = 0.07685297744924743 +max_abs_asymmetry = 0.024999999999999994 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.07685297744924742 + diff --git a/sv2/channels-sv2/sim/baseline_ParametricStrict.md b/sv2/channels-sv2/sim/baseline_ParametricStrict.md new file mode 100644 index 0000000000..ead677b90c --- /dev/null +++ b/sv2/channels-sv2/sim/baseline_ParametricStrict.md @@ -0,0 +1,227 @@ +# Vardiff baseline characterization — `ParametricStrict` + +*Generated by `cargo run --release --bin generate-baseline` from the vardiff_sim crate. 1000 trials per cell, base seed `0xdeadbeefcafef00d`.* + +## Summary + +Headline per-metric values at each share rate's best and worst cells. ↑ = higher is better; ↓ = lower is better; ↔ = near-zero is better. Where a `(floor: X.X%)` annotation appears, it's the Poisson-noise lower bound on that metric at that share rate — the algorithm cannot do better than this without exotic estimation techniques. + +| Metric | Dir | Best | Worst | +| --- | :-: | --- | --- | +| cold-start convergence rate | ↑ | 100.0% @ SPM=6 | 100.0% @ SPM=6 | +| cold-start p90 time | ↓ | 10m @ SPM=6 | 10m @ SPM=6 | +| settled accuracy p50 (stable) | ↓ | 0.0% @ SPM=6 (floor: 8.7%) | 0.0% @ SPM=6 (floor: 8.7%) | +| settled accuracy p99 (stable) | ↓ | 0.0% @ SPM=6 (floor: 33.3%) | 0.0% @ SPM=6 (floor: 33.3%) | +| stable-load jitter (mean) | ↓ | 0.000/min @ SPM=8 (floor: 0.020/min) | 0.000/min @ SPM=10 (floor: 0.020/min) | +| reaction rate at −50% step | ↑ | 12.6% @ SPM=30 | 0.7% @ SPM=8 | +| reaction rate at +50% step | ↑ | 14.5% @ SPM=30 | 1.6% @ SPM=6 | +| ramp target overshoot p99 (cold start) | ↓ | 22.0% @ SPM=30 (floor: 42.5%) | 70.9% @ SPM=6 (floor: 95.0%) | +| upward step magnitude p95 (stable) | ↓ | 1.000 @ SPM=6 | 1.000 @ SPM=6 | +| operational fitness | ↑ | 0.591 @ SPM=30 | 0.530 @ SPM=6 | +| decoupling score | ↑ | 0.126 @ SPM=30 | 0.007 @ SPM=8 | +| max |reaction asymmetry| | ↓ | 0.001 @ SPM=10 | 0.025 @ SPM=20 | + +## Convergence time (cold start: 10 GH/s → 1 PH/s) + +| share/min | rate | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 100.0% | 10m | 10m | 10m | 14m | 10m08s | +| 8 | 100.0% | 10m | 10m | 10m | 14m | 10m08s | +| 10 | 100.0% | 10m | 10m | 10m | 14m | 10m06s | +| 12 | 100.0% | 10m | 10m | 10m | 14m | 10m07s | +| 15 | 100.0% | 10m | 10m | 10m | 14m | 10m08s | +| 20 | 100.0% | 10m | 10m | 10m | 14m | 10m06s | +| 25 | 100.0% | 10m | 10m | 10m | 13m | 10m04s | +| 30 | 100.0% | 10m | 10m | 10m | 12m | 10m03s | + +## Settled accuracy (stable load, post-convergence) + +`|final_hashrate / true_hashrate - 1|` at trial end. Smaller is better. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | +| 8 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | +| 10 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | +| 12 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | +| 15 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | +| 20 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | +| 25 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | +| 30 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | + +## Steady-state jitter (fires per minute) + +Post-convergence rate of vardiff fires. Smaller is better — ideal is zero under stable load. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | +| 8 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | +| 10 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | +| 12 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | +| 15 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | +| 20 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | +| 25 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | +| 30 | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 | + +## Reaction time to a 50% drop (step at 15 min) + +| share/min | reacted | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 1.0% | 2m | 4m | 5m | 5m | 3m54s | +| 8 | 0.7% | 3m | 4m | 5m | 5m | 3m51s | +| 10 | 2.3% | 3m | 5m | 5m | 5m | 4m21s | +| 12 | 3.9% | 3m | 5m | 5m | 5m | 4m25s | +| 15 | 3.0% | 4m | 5m | 5m | 5m | 4m24s | +| 20 | 5.4% | 3m | 5m | 5m | 5m | 4m26s | +| 25 | 7.2% | 4m | 5m | 5m | 5m | 4m36s | +| 30 | 12.6% | 4m | 5m | 5m | 5m | 4m34s | + +## Reaction sensitivity (P[fire within 5 min of step change]) + +| Δ% | 6 | 8 | 10 | 12 | 15 | 20 | 25 | 30 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| -50% | 0.01 | 0.01 | 0.02 | 0.04 | 0.03 | 0.05 | 0.07 | 0.13 | +| -25% | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | +| -10% | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | +| -5% | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | +| +5% | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | +| +10% | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | +| +25% | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.01 | 0.01 | 0.01 | +| +50% | 0.02 | 0.02 | 0.02 | 0.04 | 0.04 | 0.08 | 0.08 | 0.14 | + +## Estimator bias + +`E[H̃ − H_true] / H_true` averaged over post-settle ticks. Positive = systematic over-estimate. Populated only for algorithms that expose introspection (e.g. ClassicComposed, Parametric, EWMA-60s). + +### Bias — stable load + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | -11.1% | -0.4% | 11.0% | 18.1% | -0.4% | +| 8 | -9.2% | -1.2% | 8.5% | 15.8% | -0.7% | +| 10 | -8.9% | -0.7% | 8.3% | 14.3% | -0.6% | +| 12 | -8.2% | -0.3% | 7.4% | 13.7% | -0.4% | +| 15 | -7.4% | -0.4% | 6.6% | 11.4% | -0.4% | +| 20 | -5.7% | -0.3% | 5.5% | 10.5% | -0.2% | +| 25 | -5.5% | -0.2% | 5.4% | 9.7% | -0.1% | +| 30 | -5.0% | -0.1% | 5.0% | 9.3% | -0.1% | + +### Bias — cold start + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | -14.9% | 0.0% | 14.6% | 26.9% | -0.0% | +| 8 | -12.5% | -0.4% | 11.5% | 22.1% | -0.3% | +| 10 | -10.8% | -0.0% | 10.9% | 19.7% | -0.0% | +| 12 | -10.3% | -0.3% | 9.7% | 19.3% | -0.2% | +| 15 | -9.3% | -0.5% | 9.5% | 18.7% | -0.1% | +| 20 | -8.3% | -0.3% | 7.7% | 15.2% | -0.3% | +| 25 | -7.0% | 0.1% | 7.5% | 13.3% | 0.1% | +| 30 | -6.7% | -0.0% | 6.8% | 12.9% | -0.0% | + +## Estimator variance + +Population variance of `H̃ / H_true` over post-settle ticks (dimensionless). Populated only for algorithms that expose introspection. + +### Variance — stable load + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.000 | 0.001 | 0.003 | 0.006 | 0.001 | +| 8 | 0.000 | 0.001 | 0.002 | 0.004 | 0.001 | +| 10 | 0.000 | 0.001 | 0.002 | 0.004 | 0.001 | +| 12 | 0.000 | 0.000 | 0.001 | 0.003 | 0.001 | +| 15 | 0.000 | 0.000 | 0.001 | 0.002 | 0.001 | +| 20 | 0.000 | 0.000 | 0.001 | 0.002 | 0.000 | +| 25 | 0.000 | 0.000 | 0.001 | 0.002 | 0.000 | +| 30 | 0.000 | 0.000 | 0.001 | 0.001 | 0.000 | + +### Variance — cold start + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.002 | 0.007 | 0.024 | 0.071 | 0.011 | +| 8 | 0.002 | 0.005 | 0.017 | 0.051 | 0.008 | +| 10 | 0.001 | 0.005 | 0.014 | 0.040 | 0.007 | +| 12 | 0.001 | 0.004 | 0.012 | 0.034 | 0.006 | +| 15 | 0.001 | 0.003 | 0.010 | 0.029 | 0.005 | +| 20 | 0.001 | 0.002 | 0.007 | 0.024 | 0.003 | +| 25 | 0.001 | 0.002 | 0.005 | 0.014 | 0.002 | +| 30 | 0.000 | 0.001 | 0.004 | 0.011 | 0.002 | + +## Ramp target overshoot (cold start) + +`max(new_hashrate on fires) / H_true − 1`: how far the algorithm's actual *target* (not its belief) climbs past truth during the cold-start ramp. Reads `new_hashrate` (the actual target the algorithm set), so it's unaffected by estimator-belief noise. Works for any algorithm that fires, including those without introspection. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.0% | 5.0% | 27.9% | 70.9% | 10.1% | +| 8 | 0.0% | 3.3% | 23.0% | 53.6% | 8.3% | +| 10 | 0.0% | 2.4% | 20.1% | 39.7% | 7.2% | +| 12 | 0.0% | 3.3% | 18.1% | 44.3% | 6.8% | +| 15 | 0.0% | 2.4% | 16.8% | 42.2% | 6.2% | +| 20 | 0.0% | 1.4% | 14.2% | 42.1% | 5.2% | +| 25 | 0.0% | 1.6% | 12.6% | 22.8% | 4.3% | +| 30 | 0.0% | 1.0% | 11.5% | 22.0% | 3.8% | + +## Upward step magnitude (stable load) + +`new_hashrate / old_hashrate` for upward difficulty adjustments during steady-state. Per-trial p95 of ratios, then distribution across trials. Values near 1.0 indicate gentle retargeting; values >> 1.0 indicate aggressive jumps. + +| share/min | p50 | p90 | p95 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 1.000 | 1.000 | 1.000 | 1.000 | 1.002 | +| 8 | 1.000 | 1.000 | 1.000 | 1.000 | 1.001 | +| 10 | 1.000 | 1.000 | 1.000 | 1.000 | 1.001 | +| 12 | 1.000 | 1.000 | 1.000 | 1.000 | 1.001 | +| 15 | 1.000 | 1.000 | 1.000 | 1.000 | 1.002 | +| 20 | 1.000 | 1.000 | 1.000 | 1.000 | 1.001 | +| 25 | 1.000 | 1.000 | 1.000 | 1.000 | 1.001 | +| 30 | 1.000 | 1.000 | 1.000 | 1.000 | 1.002 | + +## Operational fitness (per share rate) + +`0.15×react(-10%) + 0.1×react(-50%) + 0.25×jitter + 0.25×step_safety + 0.15×convergence + 0.1×overshoot`. Higher is better. + +| share/min | fitness | react-10% | react-50% | jitter | step-safe | conv | overshoot | +| --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.530 | 0.001 | 0.010 | 1.000 | 1.000 | 0.000 | 0.291 | +| 8 | 0.547 | 0.002 | 0.007 | 1.000 | 1.000 | 0.000 | 0.464 | +| 10 | 0.562 | 0.000 | 0.023 | 0.999 | 1.000 | 0.000 | 0.603 | +| 12 | 0.559 | 0.000 | 0.039 | 1.000 | 1.000 | 0.000 | 0.557 | +| 15 | 0.561 | 0.001 | 0.030 | 1.000 | 1.000 | 0.000 | 0.578 | +| 20 | 0.563 | 0.000 | 0.054 | 1.000 | 1.000 | 0.000 | 0.579 | +| 25 | 0.585 | 0.001 | 0.072 | 1.000 | 1.000 | 0.000 | 0.772 | +| 30 | 0.591 | 0.001 | 0.126 | 0.999 | 1.000 | 0.000 | 0.780 | + +## Decoupling score (per share rate) + +`reaction_rate(Step−50) × clamp(1 − jitter_p50 / J_max, 0, 1)` where `J_max = 0.50` fires/min. Higher is better. Score of 1.0 = perfect decoupling between reactivity and jitter. + +| share/min | decoupling score | +| --- | --- | +| 6 | 0.010 | +| 8 | 0.007 | +| 10 | 0.023 | +| 12 | 0.039 | +| 15 | 0.030 | +| 20 | 0.054 | +| 25 | 0.072 | +| 30 | 0.126 | + +## Reaction asymmetry (per share rate) + +`reaction_rate(+δ%) − reaction_rate(−δ%)`. Positive = responds faster to up-steps; negative = responds faster to down-steps; near zero = symmetric. + +| share/min | δ=5% | δ=10% | δ=25% | δ=50% | +| --- | --- | --- | --- | --- | +| 6 | +0.00 | +0.00 | -0.00 | +0.01 | +| 8 | +0.00 | -0.00 | +0.00 | +0.01 | +| 10 | +0.00 | +0.00 | +0.00 | -0.00 | +| 12 | +0.00 | +0.00 | +0.00 | -0.00 | +| 15 | +0.00 | +0.00 | +0.00 | +0.01 | +| 20 | +0.00 | +0.00 | +0.00 | +0.03 | +| 25 | +0.00 | -0.00 | +0.01 | +0.01 | +| 30 | +0.00 | -0.00 | +0.00 | +0.02 | + diff --git a/sv2/channels-sv2/sim/baseline_ParametricStrict.toml b/sv2/channels-sv2/sim/baseline_ParametricStrict.toml new file mode 100644 index 0000000000..91b97f9547 --- /dev/null +++ b/sv2/channels-sv2/sim/baseline_ParametricStrict.toml @@ -0,0 +1,6243 @@ +# Vardiff baseline characterization. Regenerate with +# `cargo run --release --bin generate-baseline` from the sim crate. + +[meta] +algorithm = "ParametricStrict" +trial_count = 1000 +base_seed = 16045690984503111693 +quiet_window_secs = 300 +settle_buffer_secs = 120 +min_settled_window_secs = 600 +react_window_secs = 300 +step_event_at_secs = 900 +trial_duration_secs = 1800 + +[cell.spm_6.cold_start_10gh_to_1ph] +shares_per_minute = 6 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 660 +convergence_p99_secs = 840 +convergence_p99_secs_ci_low = 780 +convergence_p99_secs_ci_high = 900 +convergence_mean_secs = 607.68 +settled_accuracy_p10 = 0.01695700086724794 +settled_accuracy_p10_ci_low = 0.01695700086724794 +settled_accuracy_p10_ci_high = 0.01695700086724794 +settled_accuracy_p50 = 0.114264116735602 +settled_accuracy_p50_ci_low = 0.09294061046652669 +settled_accuracy_p50_ci_high = 0.114264116735602 +settled_accuracy_p90 = 0.24659575183437044 +settled_accuracy_p90_ci_low = 0.24548335529023546 +settled_accuracy_p90_ci_high = 0.2757518692670995 +settled_accuracy_p95 = 0.3122000359569297 +settled_accuracy_p95_ci_low = 0.2793962832828931 +settled_accuracy_p95_ci_high = 0.3233951367950457 +settled_accuracy_p99 = 0.44342672359556423 +settled_accuracy_p99_ci_low = 0.40104895182328404 +settled_accuracy_p99_ci_high = 0.46853429742823405 +settled_accuracy_mean = 0.12540664301258178 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05555555555555555 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.05555555555555555 +jitter_p95_per_min = 0.05555555555555555 +jitter_p95_per_min_ci_low = 0.05555555555555555 +jitter_p95_per_min_ci_high = 0.05555555555555555 +jitter_p99_per_min = 0.07142857142857142 +jitter_p99_per_min_ci_low = 0.058823529411764705 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.006919443971920737 +bias_mean = -0.00009520907553162508 +bias_p10 = -0.14933410045594503 +bias_p10_ci_low = -0.1585729072421022 +bias_p10_ci_high = -0.13986946174335357 +bias_p50 = 0.00009269058756032549 +bias_p50_ci_low = -0.010976209381127729 +bias_p50_ci_high = 0.01041006840092245 +bias_p90 = 0.14627784266008043 +bias_p90_ci_low = 0.13474945447468648 +bias_p90_ci_high = 0.16473939955346256 +bias_p99 = 0.2685979795025438 +bias_p99_ci_low = 0.23126515196754763 +bias_p99_ci_high = 0.2938594940071413 +variance_mean = 0.011412926769684705 +variance_p10 = 0.002346923358867225 +variance_p10_ci_low = 0.00219100578060277 +variance_p10_ci_high = 0.0025452171102670076 +variance_p50 = 0.00738810648394769 +variance_p50_ci_low = 0.006899714454390221 +variance_p50_ci_high = 0.007919370892548128 +variance_p90 = 0.023557495027613715 +variance_p90_ci_low = 0.02188436256676444 +variance_p90_ci_high = 0.026698190764412832 +variance_p99 = 0.07149481890040256 +variance_p99_ci_low = 0.05169637057103941 +variance_p99_ci_high = 0.08449814785225673 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.04976001534377095 +ramp_target_overshoot_p50_ci_low = 0.01695700086724794 +ramp_target_overshoot_p50_ci_high = 0.04976001534377095 +ramp_target_overshoot_p90 = 0.2793962832828931 +ramp_target_overshoot_p90_ci_low = 0.24659575183437044 +ramp_target_overshoot_p90_ci_high = 0.2793962832828931 +ramp_target_overshoot_p99 = 0.7085938471505677 +ramp_target_overshoot_p99_ci_low = 0.47622873143911404 +ramp_target_overshoot_p99_ci_high = 0.9819740220241899 +ramp_target_overshoot_mean = 0.10082979104782516 + +[cell.spm_6.stable_1ph] +shares_per_minute = 6 +scenario = "stable_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 1.38 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0 +settled_accuracy_p90_ci_low = 0 +settled_accuracy_p90_ci_high = 0 +settled_accuracy_p95 = 0 +settled_accuracy_p95_ci_low = 0 +settled_accuracy_p95_ci_high = 0 +settled_accuracy_p99 = 0 +settled_accuracy_p99_ci_low = 0 +settled_accuracy_p99_ci_high = 0 +settled_accuracy_mean = 0.000275278617552015 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00005 +bias_mean = -0.0035246250911166203 +bias_p10 = -0.11126997349224561 +bias_p10_ci_low = -0.12014734606037887 +bias_p10_ci_high = -0.10404287502020462 +bias_p50 = -0.004399522963344937 +bias_p50_ci_low = -0.012890789975499578 +bias_p50_ci_high = 0.0029156505957736076 +bias_p90 = 0.1100415951693824 +bias_p90_ci_low = 0.10176659530439484 +bias_p90_ci_high = 0.11775842941294798 +bias_p99 = 0.18057962767217653 +bias_p99_ci_low = 0.16346864728050028 +bias_p99_ci_high = 0.19374307743360963 +variance_mean = 0.0013642553630030627 +variance_p10 = 0.0003602116279130655 +variance_p10_ci_low = 0.00033767869644096995 +variance_p10_ci_high = 0.00038317401190702014 +variance_p50 = 0.0009585542300693645 +variance_p50_ci_low = 0.0009078665612993108 +variance_p50_ci_high = 0.0010158314394131784 +variance_p90 = 0.002817823334980619 +variance_p90_ci_low = 0.0025662067905922728 +variance_p90_ci_high = 0.003063161888820509 +variance_p99 = 0.0057511891643119185 +variance_p99_ci_low = 0.005110313613708946 +variance_p99_ci_high = 0.0068584156494802245 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1 +upward_step_magnitude_p95 = 1 +upward_step_magnitude_p95_ci_low = 1 +upward_step_magnitude_p95_ci_high = 1 +upward_step_magnitude_p99 = 1 +upward_step_magnitude_p99_ci_low = 1 +upward_step_magnitude_p99_ci_high = 1 +upward_step_magnitude_mean = 1.0018000046223758 +fire_decisiveness_mean = 5.7818569192343165 +fire_decisiveness_p50 = 1.8946516945214427 + +[cell.spm_6.step_minus_50_at_15min] +shares_per_minute = 6 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.737 +convergence_rate_ci_low = 0.7097122523904958 +convergence_rate_ci_high = 0.7642877476095041 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 229.00949796472185 +settled_accuracy_p10 = 0.38271655477046385 +settled_accuracy_p10_ci_low = 0.3750003774873649 +settled_accuracy_p10_ci_high = 0.3888898992501322 +settled_accuracy_p50 = 1 +settled_accuracy_p50_ci_low = 1 +settled_accuracy_p50_ci_high = 1 +settled_accuracy_p90 = 1 +settled_accuracy_p90_ci_low = 1 +settled_accuracy_p90_ci_high = 1 +settled_accuracy_p95 = 1 +settled_accuracy_p95_ci_low = 1 +settled_accuracy_p95_ci_high = 1 +settled_accuracy_p99 = 1 +settled_accuracy_p99_ci_low = 1 +settled_accuracy_p99_ci_high = 1 +settled_accuracy_mean = 0.7698375334311199 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00006742179072276159 +reaction_rate = 0.01 +reaction_rate_ci_low = 0.003833003972759509 +reaction_rate_ci_high = 0.01616699602724049 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 234 +fire_decisiveness_mean = 1.1433123111882395 +fire_decisiveness_p50 = 0.7507293030937205 +step_correction_mean = 0.7000359654426574 +step_correction_p50 = 0.6842105984687805 + +[cell.spm_6.step_minus_25_at_15min] +shares_per_minute = 6 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.981 +convergence_rate_ci_low = 0.9725381099983514 +convergence_rate_ci_high = 0.9894618900016485 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 300 +convergence_mean_secs = 5.504587155963303 +settled_accuracy_p10 = 0.33333330350717194 +settled_accuracy_p10_ci_low = 0.33333330350717194 +settled_accuracy_p10_ci_high = 0.33333330350717194 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.33333330350717194 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.33333330350717194 +settled_accuracy_mean = 0.326971347736568 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.0002985240508580066 +reaction_rate = 0.004 +reaction_rate_ci_low = 0.00008784785571930992 +reaction_rate_ci_high = 0.00791215214428069 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 120 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 120 +reaction_p99_secs_ci_high = 240 +reaction_mean_secs = 150 +fire_decisiveness_mean = 1.5965767632932826 +fire_decisiveness_p50 = 0.7884400273656169 +step_correction_mean = 1.042637512087822 +step_correction_p50 = 1.2986102104187012 + +[cell.spm_6.step_minus_10_at_15min] +shares_per_minute = 6 +scenario = "step_minus_10_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 0.36 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.11111110282606607 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.11111110282606607 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.11111110282606607 +settled_accuracy_p99 = 0.11111110282606607 +settled_accuracy_p99_ci_low = 0.11111110282606607 +settled_accuracy_p99_ci_high = 0.11111110282606607 +settled_accuracy_mean = 0.11153677524756857 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00008 +reaction_rate = 0.001 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.0029590197548774234 +reaction_p10_secs = 240 +reaction_p50_secs = 240 +reaction_p90_secs = 240 +reaction_p99_secs = 240 +reaction_mean_secs = 240 +fire_decisiveness_mean = 4.714583439695845 +fire_decisiveness_p50 = 4.8450575123548845 +step_correction_mean = 0.7361876964569092 +step_correction_p50 = 0.7361876964569092 + +[cell.spm_6.step_minus_5_at_15min] +shares_per_minute = 6 +scenario = "step_minus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 0.9 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.05263157522942574 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.05263157522942574 +settled_accuracy_p95 = 0.05263157522942574 +settled_accuracy_p95_ci_low = 0.05263157522942574 +settled_accuracy_p95_ci_high = 0.05263157522942574 +settled_accuracy_p99 = 0.05263157522942574 +settled_accuracy_p99_ci_low = 0.05263157522942574 +settled_accuracy_p99_ci_high = 0.05263157522942574 +settled_accuracy_mean = 0.05256210611070081 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00009761904761904762 +reaction_rate = 0 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0 +fire_decisiveness_mean = 2.1452023272022203 +fire_decisiveness_p50 = 1.7105339553307317 + +[cell.spm_6.step_plus_5_at_15min] +shares_per_minute = 6 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.998 +convergence_rate_ci_low = 0.995230914663648 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 0.6613226452905812 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.047618983705838724 +settled_accuracy_p90_ci_low = 0.047618983705838724 +settled_accuracy_p90_ci_high = 0.047618983705838724 +settled_accuracy_p95 = 0.047618983705838724 +settled_accuracy_p95_ci_low = 0.047618983705838724 +settled_accuracy_p95_ci_high = 0.047618983705838724 +settled_accuracy_p99 = 0.047618983705838724 +settled_accuracy_p99_ci_low = 0.047618983705838724 +settled_accuracy_p99_ci_high = 0.047618983705838724 +settled_accuracy_mean = 0.04840622737072929 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.000041750167000668 +reaction_rate = 0.001 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.0029590197548774234 +reaction_p10_secs = 60 +reaction_p50_secs = 60 +reaction_p90_secs = 60 +reaction_p99_secs = 60 +reaction_mean_secs = 60 +fire_decisiveness_mean = 2.3552273086495483 +fire_decisiveness_p50 = 2.0706287105158694 +step_correction_mean = 1.0416643619537354 +step_correction_p50 = 1.0416643619537354 + +[cell.spm_6.step_plus_10_at_15min] +shares_per_minute = 6 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 2.6426426426426426 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.09090908536290365 +settled_accuracy_p95_ci_low = 0.09090908536290365 +settled_accuracy_p95_ci_high = 0.09090908536290365 +settled_accuracy_p99 = 0.09090908536290365 +settled_accuracy_p99_ci_low = 0.09090908536290365 +settled_accuracy_p99_ci_high = 0.09090908536290365 +settled_accuracy_mean = 0.09126096508527173 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0 +reaction_rate = 0.002 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.00476908533635206 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 60 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 60 +reaction_p99_secs_ci_high = 240 +reaction_mean_secs = 150 +fire_decisiveness_mean = 9.773511105181916 +fire_decisiveness_p50 = 5.227743514044015 +step_correction_mean = 2.253027707338333 +step_correction_p50 = 3.5087852478027344 + +[cell.spm_6.step_plus_25_at_15min] +shares_per_minute = 6 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.982 +convergence_rate_ci_low = 0.9737596042813467 +convergence_rate_ci_high = 0.9902403957186533 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 1260 +convergence_mean_secs = 11.670061099796333 +settled_accuracy_p10 = 0.20000003221225382 +settled_accuracy_p10_ci_low = 0.20000003221225382 +settled_accuracy_p10_ci_high = 0.20000003221225382 +settled_accuracy_p50 = 0.20000003221225382 +settled_accuracy_p50_ci_low = 0.20000003221225382 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.20000003221225382 +settled_accuracy_mean = 0.19571108808054088 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.000078976465013426 +reaction_rate = 0.002 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.00476908533635206 +reaction_p10_secs = 240 +reaction_p10_secs_ci_low = 240 +reaction_p10_secs_ci_high = 300 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 270 +fire_decisiveness_mean = 1.7097027604580446 +fire_decisiveness_p50 = 1.2504390909153784 +step_correction_mean = 1.175139456987381 +step_correction_p50 = 1.4035136699676514 + +[cell.spm_6.step_plus_50_at_15min] +shares_per_minute = 6 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.753 +convergence_rate_ci_low = 0.7262698105955083 +convergence_rate_ci_high = 0.7797301894044917 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 234.0239043824701 +settled_accuracy_p10 = 0.12121131319429157 +settled_accuracy_p10_ci_low = 0.1187731139702668 +settled_accuracy_p10_ci_high = 0.12444408136063845 +settled_accuracy_p50 = 0.33333334824641403 +settled_accuracy_p50_ci_low = 0.33333334824641403 +settled_accuracy_p50_ci_high = 0.33333334824641403 +settled_accuracy_p90 = 0.33333334824641403 +settled_accuracy_p90_ci_low = 0.33333334824641403 +settled_accuracy_p90_ci_high = 0.33333334824641403 +settled_accuracy_p95 = 0.33333334824641403 +settled_accuracy_p95_ci_low = 0.33333334824641403 +settled_accuracy_p95_ci_high = 0.33333334824641403 +settled_accuracy_p99 = 0.33333334824641403 +settled_accuracy_p99_ci_low = 0.33333334824641403 +settled_accuracy_p99_ci_high = 0.5181656982261158 +settled_accuracy_mean = 0.26055532745501364 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.045454545454545456 +jitter_mean_per_min = 0.0002473348061583356 +reaction_rate = 0.016 +reaction_rate_ci_low = 0.008222972907337922 +reaction_rate_ci_high = 0.02377702709266208 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 232.5 +fire_decisiveness_mean = 1.8860970589253436 +fire_decisiveness_p50 = 1.0854482512177341 +step_correction_mean = 0.7253522537648678 +step_correction_p50 = 0.7037036418914795 + +[cell.spm_8.cold_start_10gh_to_1ph] +shares_per_minute = 8 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 840 +convergence_p99_secs_ci_low = 780 +convergence_p99_secs_ci_high = 900 +convergence_mean_secs = 607.5 +settled_accuracy_p10 = 0.015849973032302622 +settled_accuracy_p10_ci_low = 0.015849973032302622 +settled_accuracy_p10_ci_high = 0.015849973032302622 +settled_accuracy_p50 = 0.08966032915153388 +settled_accuracy_p50_ci_low = 0.08966032915153388 +settled_accuracy_p50_ci_high = 0.10717151502490307 +settled_accuracy_p90 = 0.21268000526938802 +settled_accuracy_p90_ci_low = 0.20559344335652763 +settled_accuracy_p90_ci_high = 0.23018750015518918 +settled_accuracy_p95 = 0.25479189171904126 +settled_accuracy_p95_ci_low = 0.2372822493495641 +settled_accuracy_p95_ci_high = 0.2794017862098128 +settled_accuracy_p99 = 0.37782096307797763 +settled_accuracy_p99_ci_low = 0.32860385845102935 +settled_accuracy_p99_ci_high = 0.40242038858582907 +settled_accuracy_mean = 0.11041006704108508 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05555555555555555 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.05555555555555555 +jitter_p95_per_min = 0.05555555555555555 +jitter_p95_per_min_ci_low = 0.05555555555555555 +jitter_p95_per_min_ci_high = 0.05555555555555555 +jitter_p99_per_min = 0.058823529411764705 +jitter_p99_per_min_ci_low = 0.05555555555555555 +jitter_p99_per_min_ci_high = 0.07692307692307693 +jitter_mean_per_min = 0.006069266853580567 +bias_mean = -0.0033897571877294108 +bias_p10 = -0.12477468242769456 +bias_p10_ci_low = -0.13632199884502816 +bias_p10_ci_high = -0.11768031116219031 +bias_p50 = -0.0038354588259051883 +bias_p50_ci_low = -0.009347791582710976 +bias_p50_ci_high = 0.0031396811789928315 +bias_p90 = 0.11471726404758872 +bias_p90_ci_low = 0.10542970443712407 +bias_p90_ci_high = 0.13073562028594882 +bias_p99 = 0.22129063775987867 +bias_p99_ci_low = 0.2115522584554247 +bias_p99_ci_high = 0.24925147213626334 +variance_mean = 0.00808010186428341 +variance_p10 = 0.0016137229607593269 +variance_p10_ci_low = 0.0014858555015346258 +variance_p10_ci_high = 0.0017564654994027095 +variance_p50 = 0.005155369084999606 +variance_p50_ci_low = 0.004786899699169009 +variance_p50_ci_high = 0.005464293195843656 +variance_p90 = 0.01701952858897642 +variance_p90_ci_low = 0.015379625024597263 +variance_p90_ci_high = 0.019984960627369285 +variance_p99 = 0.05124654693989422 +variance_p99_ci_low = 0.03583616943516275 +variance_p99_ci_high = 0.07564647298927633 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.03335854165994179 +ramp_target_overshoot_p50_ci_low = 0.031680685820386856 +ramp_target_overshoot_p50_ci_high = 0.03335854165994179 +ramp_target_overshoot_p90 = 0.23018750015518918 +ramp_target_overshoot_p90_ci_low = 0.20559344335652763 +ramp_target_overshoot_p90_ci_high = 0.25479189171904126 +ramp_target_overshoot_p99 = 0.536199763226503 +ramp_target_overshoot_p99_ci_low = 0.40241582518301766 +ramp_target_overshoot_p99_ci_high = 0.753019781478772 +ramp_target_overshoot_mean = 0.08273272411458417 + +[cell.spm_8.stable_1ph] +shares_per_minute = 8 +scenario = "stable_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 2.04 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0 +settled_accuracy_p90_ci_low = 0 +settled_accuracy_p90_ci_high = 0 +settled_accuracy_p95 = 0 +settled_accuracy_p95_ci_low = 0 +settled_accuracy_p95_ci_high = 0 +settled_accuracy_p99 = 0 +settled_accuracy_p99_ci_low = 0 +settled_accuracy_p99_ci_high = 0 +settled_accuracy_mean = 0.00034166807539358834 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0 +bias_mean = -0.007003799965300472 +bias_p10 = -0.09176955371040166 +bias_p10_ci_low = -0.09828084077334293 +bias_p10_ci_high = -0.08640082332828754 +bias_p50 = -0.011906440677587752 +bias_p50_ci_low = -0.016506039891437778 +bias_p50_ci_high = -0.004402641759538775 +bias_p90 = 0.08533030977992428 +bias_p90_ci_low = 0.07954023815572772 +bias_p90_ci_high = 0.0947726718814234 +bias_p99 = 0.15803582793243245 +bias_p99_ci_low = 0.1354761763723963 +bias_p99_ci_high = 0.1742030740176272 +variance_mean = 0.0010106743293918255 +variance_p10 = 0.00027479237845658535 +variance_p10_ci_low = 0.0002531444897715224 +variance_p10_ci_high = 0.0002861754685852639 +variance_p50 = 0.0007081204298470882 +variance_p50_ci_low = 0.0006630453184743143 +variance_p50_ci_high = 0.0007551576667538064 +variance_p90 = 0.002079515314528897 +variance_p90_ci_low = 0.001967772053513451 +variance_p90_ci_high = 0.0022766066458817435 +variance_p99 = 0.004329562629939207 +variance_p99_ci_low = 0.00385959385641814 +variance_p99_ci_high = 0.005897631944328266 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1 +upward_step_magnitude_p95 = 1 +upward_step_magnitude_p95_ci_low = 1 +upward_step_magnitude_p95_ci_high = 1 +upward_step_magnitude_p99 = 1 +upward_step_magnitude_p99_ci_low = 1 +upward_step_magnitude_p99_ci_high = 1 +upward_step_magnitude_mean = 1.0010416687106907 +fire_decisiveness_mean = 2.7457167591265197 +fire_decisiveness_p50 = 0.8339776531485583 + +[cell.spm_8.step_minus_50_at_15min] +shares_per_minute = 8 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.597 +convergence_rate_ci_low = 0.5665984476448981 +convergence_rate_ci_high = 0.6274015523551019 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 412.0603015075377 +settled_accuracy_p10 = 0.44230775038267156 +settled_accuracy_p10_ci_low = 0.43750033973862834 +settled_accuracy_p10_ci_high = 0.44565352994978036 +settled_accuracy_p50 = 0.49166752845633965 +settled_accuracy_p50_ci_low = 0.4913797656437642 +settled_accuracy_p50_ci_high = 0.5000000335544323 +settled_accuracy_p90 = 1 +settled_accuracy_p90_ci_low = 1 +settled_accuracy_p90_ci_high = 1 +settled_accuracy_p95 = 1 +settled_accuracy_p95_ci_low = 1 +settled_accuracy_p95_ci_high = 1 +settled_accuracy_p99 = 1 +settled_accuracy_p99_ci_low = 1 +settled_accuracy_p99_ci_high = 1 +settled_accuracy_mean = 0.6882938914289966 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.058823529411764705 +jitter_mean_per_min = 0.0004760042124266587 +reaction_rate = 0.007 +reaction_rate_ci_low = 0.001832509158208406 +reaction_rate_ci_high = 0.012167490841791594 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 300 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 231.42857142857142 +fire_decisiveness_mean = 1.227008009484898 +fire_decisiveness_p50 = 0.6930993515114992 +step_correction_mean = 0.65655289377485 +step_correction_p50 = 0.6315779089927673 + +[cell.spm_8.step_minus_25_at_15min] +shares_per_minute = 8 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.974 +convergence_rate_ci_low = 0.9641367004303834 +convergence_rate_ci_high = 0.9838632995696166 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 360 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 14.784394250513348 +settled_accuracy_p10 = 0.33333330350717194 +settled_accuracy_p10_ci_low = 0.33333330350717194 +settled_accuracy_p10_ci_high = 0.33333330350717194 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.33333330350717194 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.33333330350717194 +settled_accuracy_mean = 0.32209154803236595 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00017244317762452478 +reaction_rate = 0.002 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.00476908533635206 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 60 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 180 +reaction_p99_secs_ci_low = 60 +reaction_p99_secs_ci_high = 180 +reaction_mean_secs = 120 +fire_decisiveness_mean = 1.0557818618004164 +fire_decisiveness_p50 = 0.6570631441114045 +step_correction_mean = 1.0374996066093445 +step_correction_p50 = 1.2499998807907104 + +[cell.spm_8.step_minus_10_at_15min] +shares_per_minute = 8 +scenario = "step_minus_10_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 2.34 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.11111110282606607 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.11111110282606607 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.11111110282606607 +settled_accuracy_p99 = 0.11111110282606607 +settled_accuracy_p99_ci_low = 0.11111110282606607 +settled_accuracy_p99_ci_high = 0.11111110282606607 +settled_accuracy_mean = 0.11167125514827726 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0 +reaction_rate = 0.002 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.00476908533635206 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 300 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 120 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 120 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 210 +fire_decisiveness_mean = 7.9985904305100775 +fire_decisiveness_p50 = 0.5252022116386961 +step_correction_mean = 3.049628973007202 +step_correction_p50 = 3.161763906478882 + +[cell.spm_8.step_minus_5_at_15min] +shares_per_minute = 8 +scenario = "step_minus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 2.58 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.05263157522942574 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.05263157522942574 +settled_accuracy_p95 = 0.05263157522942574 +settled_accuracy_p95_ci_low = 0.05263157522942574 +settled_accuracy_p95_ci_high = 0.05263157522942574 +settled_accuracy_p99 = 0.05263157522942574 +settled_accuracy_p99_ci_low = 0.05263157522942574 +settled_accuracy_p99_ci_high = 0.05263157522942574 +settled_accuracy_mean = 0.052916590392144656 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.000266984126984127 +reaction_rate = 0.001 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.0029590197548774234 +reaction_p10_secs = 240 +reaction_p50_secs = 240 +reaction_p90_secs = 240 +reaction_p99_secs = 240 +reaction_mean_secs = 240 +fire_decisiveness_mean = 1.844956562618652 +fire_decisiveness_p50 = 1.6865783533000567 +step_correction_mean = 0.7567805051803589 +step_correction_p50 = 0.7567805051803589 + +[cell.spm_8.step_plus_5_at_15min] +shares_per_minute = 8 +scenario = "step_plus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 1.26 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.047618983705838724 +settled_accuracy_p90_ci_low = 0.047618983705838724 +settled_accuracy_p90_ci_high = 0.047618983705838724 +settled_accuracy_p95 = 0.047618983705838724 +settled_accuracy_p95_ci_low = 0.047618983705838724 +settled_accuracy_p95_ci_high = 0.047618983705838724 +settled_accuracy_p99 = 0.047618983705838724 +settled_accuracy_p99_ci_low = 0.047618983705838724 +settled_accuracy_p99_ci_high = 0.047618983705838724 +settled_accuracy_mean = 0.04777176126524616 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00004 +reaction_rate = 0.001 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.0029590197548774234 +reaction_p10_secs = 180 +reaction_p50_secs = 180 +reaction_p90_secs = 180 +reaction_p99_secs = 180 +reaction_mean_secs = 180 +fire_decisiveness_mean = 4.030485660476087 +fire_decisiveness_p50 = 6.679591708115865 +step_correction_mean = 1.3043508529663086 +step_correction_p50 = 1.3043508529663086 + +[cell.spm_8.step_plus_10_at_15min] +shares_per_minute = 8 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.998 +convergence_rate_ci_low = 0.995230914663648 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 2.8256513026052104 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.09090908536290365 +settled_accuracy_p95_ci_low = 0.09090908536290365 +settled_accuracy_p95_ci_high = 0.09090908536290365 +settled_accuracy_p99 = 0.09090908536290365 +settled_accuracy_p99_ci_low = 0.09090908536290365 +settled_accuracy_p99_ci_high = 0.09090908536290365 +settled_accuracy_mean = 0.09112122569827949 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00004360908813396712 +reaction_rate = 0.001 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.0029590197548774234 +reaction_p10_secs = 120 +reaction_p50_secs = 120 +reaction_p90_secs = 120 +reaction_p99_secs = 120 +reaction_mean_secs = 120 +fire_decisiveness_mean = 2.4533150226657523 +fire_decisiveness_p50 = 0.9027747273778459 +step_correction_mean = 3.1617746353149414 +step_correction_p50 = 3.1617746353149414 + +[cell.spm_8.step_plus_25_at_15min] +shares_per_minute = 8 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.97 +convergence_rate_ci_low = 0.9594268944959392 +convergence_rate_ci_high = 0.9805731055040607 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 900 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 16.762886597938145 +settled_accuracy_p10 = 0.20000003221225382 +settled_accuracy_p10_ci_low = 0.20000003221225382 +settled_accuracy_p10_ci_high = 0.20000003221225382 +settled_accuracy_p50 = 0.20000003221225382 +settled_accuracy_p50_ci_low = 0.20000003221225382 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.20000003221225382 +settled_accuracy_mean = 0.19217583515099765 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00008818342151675484 +reaction_rate = 0.002 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.00476908533635206 +reaction_p10_secs = 300 +reaction_p10_secs_ci_low = 300 +reaction_p10_secs_ci_high = 300 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 300 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 300 +fire_decisiveness_mean = 1.5120450691711123 +fire_decisiveness_p50 = 0.8814481129081742 +step_correction_mean = 0.9976688921451569 +step_correction_p50 = 1.1750011444091797 + +[cell.spm_8.step_plus_50_at_15min] +shares_per_minute = 8 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.677 +convergence_rate_ci_low = 0.6480164440828943 +convergence_rate_ci_high = 0.7059835559171058 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 391.63958641063516 +settled_accuracy_p10 = 0.14080343268099638 +settled_accuracy_p10_ci_low = 0.13888868259127185 +settled_accuracy_p10_ci_high = 0.14235973196183094 +settled_accuracy_p50 = 0.32754798261361473 +settled_accuracy_p50_ci_low = 0.16666665175358597 +settled_accuracy_p50_ci_high = 0.33333334824641403 +settled_accuracy_p90 = 0.33333334824641403 +settled_accuracy_p90_ci_low = 0.33333334824641403 +settled_accuracy_p90_ci_high = 0.33333334824641403 +settled_accuracy_p95 = 0.33333334824641403 +settled_accuracy_p95_ci_low = 0.33333334824641403 +settled_accuracy_p95_ci_high = 0.33333334824641403 +settled_accuracy_p99 = 0.4463905318878503 +settled_accuracy_p99_ci_low = 0.33333334824641403 +settled_accuracy_p99_ci_high = 0.8950929193796171 +settled_accuracy_mean = 0.24760594395729793 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0 +reaction_rate = 0.018 +reaction_rate_ci_low = 0.009759604281346677 +reaction_rate_ci_high = 0.02624039571865332 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 300 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 266.6666666666667 +fire_decisiveness_mean = 2.6215180429335394 +fire_decisiveness_p50 = 1.2081392159366935 +step_correction_mean = 0.6242064171367221 +step_correction_p50 = 0.6250026822090149 + +[cell.spm_10.cold_start_10gh_to_1ph] +shares_per_minute = 10 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 840 +convergence_p99_secs_ci_low = 840 +convergence_p99_secs_ci_high = 900 +convergence_mean_secs = 606.36 +settled_accuracy_p10 = 0.015849973032302622 +settled_accuracy_p10_ci_low = 0.015849973032302622 +settled_accuracy_p10_ci_high = 0.015849973032302622 +settled_accuracy_p50 = 0.08257403567413313 +settled_accuracy_p50_ci_low = 0.07489483537557917 +settled_accuracy_p50_ci_high = 0.08257403567413313 +settled_accuracy_p90 = 0.20067100811809224 +settled_accuracy_p90_ci_low = 0.18097992498705295 +settled_accuracy_p90_ci_high = 0.20067100811809224 +settled_accuracy_p95 = 0.23236223003026413 +settled_accuracy_p95_ci_low = 0.22034840104069753 +settled_accuracy_p95_ci_high = 0.24003022314838418 +settled_accuracy_p99 = 0.2990793133501477 +settled_accuracy_p99_ci_low = 0.27940460478213747 +settled_accuracy_p99_ci_high = 0.33844846049244093 +settled_accuracy_mean = 0.0955547056366952 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05555555555555555 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.05555555555555555 +jitter_p95_per_min = 0.05555555555555555 +jitter_p95_per_min_ci_low = 0.05555555555555555 +jitter_p95_per_min_ci_high = 0.05555555555555555 +jitter_p99_per_min = 0.058823529411764705 +jitter_p99_per_min_ci_low = 0.05555555555555555 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.006312027003783956 +bias_mean = -0.0002805912908396858 +bias_p10 = -0.10829827286612098 +bias_p10_ci_low = -0.11512052828070173 +bias_p10_ci_high = -0.1014674133886544 +bias_p50 = -0.00007935446668957556 +bias_p50_ci_low = -0.006305234591416985 +bias_p50_ci_high = 0.006183877039407941 +bias_p90 = 0.1091181524644111 +bias_p90_ci_low = 0.10230337792224098 +bias_p90_ci_high = 0.11743910424160908 +bias_p99 = 0.19716555536917738 +bias_p99_ci_low = 0.18660016173448354 +bias_p99_ci_high = 0.22184768725491644 +variance_mean = 0.006820191100554015 +variance_p10 = 0.001489736774836851 +variance_p10_ci_low = 0.0014180064297722597 +variance_p10_ci_high = 0.0015670138376461037 +variance_p50 = 0.004500057172698498 +variance_p50_ci_low = 0.004100483531278567 +variance_p50_ci_high = 0.004735324939315669 +variance_p90 = 0.014224646283834864 +variance_p90_ci_low = 0.012964931048255869 +variance_p90_ci_high = 0.016258944250068727 +variance_p99 = 0.04022054035533286 +variance_p99_ci_low = 0.032794510519629526 +variance_p99_ci_high = 0.046619844601135496 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.023521455811396086 +ramp_target_overshoot_p50_ci_low = 0.023521455811396086 +ramp_target_overshoot_p50_ci_high = 0.04320401611659652 +ramp_target_overshoot_p90 = 0.20067100811809224 +ramp_target_overshoot_p90_ci_low = 0.18097992498705295 +ramp_target_overshoot_p90_ci_high = 0.22034840104069753 +ramp_target_overshoot_p99 = 0.3974936583800417 +ramp_target_overshoot_p99_ci_low = 0.34238949569097343 +ramp_target_overshoot_p99_ci_high = 0.5844900944295548 +ramp_target_overshoot_mean = 0.07233357313567719 + +[cell.spm_10.stable_1ph] +shares_per_minute = 10 +scenario = "stable_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 1.62 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0 +settled_accuracy_p90_ci_low = 0 +settled_accuracy_p90_ci_high = 0 +settled_accuracy_p95 = 0 +settled_accuracy_p95_ci_low = 0 +settled_accuracy_p95_ci_high = 0 +settled_accuracy_p99 = 0 +settled_accuracy_p99_ci_low = 0 +settled_accuracy_p99_ci_high = 0 +settled_accuracy_mean = 0.00025322651033701327 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00020757575757575757 +bias_mean = -0.005536190814789185 +bias_p10 = -0.08854137006682335 +bias_p10_ci_low = -0.09649544121180609 +bias_p10_ci_high = -0.08232826181869494 +bias_p50 = -0.0070035447149669125 +bias_p50_ci_low = -0.01289319529849845 +bias_p50_ci_high = -0.0013227263227836305 +bias_p90 = 0.08339678682543063 +bias_p90_ci_low = 0.07597273443112394 +bias_p90_ci_high = 0.08826793676292104 +bias_p99 = 0.142511876829774 +bias_p99_ci_low = 0.13146071744271964 +bias_p99_ci_high = 0.161744514580547 +variance_mean = 0.0008942815318286444 +variance_p10 = 0.0002253715203168423 +variance_p10_ci_low = 0.00020923974775969545 +variance_p10_ci_high = 0.00024117092322552234 +variance_p50 = 0.0006073670880735715 +variance_p50_ci_low = 0.0005742737816384701 +variance_p50_ci_high = 0.0006498977768203861 +variance_p90 = 0.0018866599648538521 +variance_p90_ci_low = 0.001631698952667218 +variance_p90_ci_high = 0.002044760330098757 +variance_p99 = 0.004014196284527765 +variance_p99_ci_low = 0.0032591561641475576 +variance_p99_ci_high = 0.004854335784035757 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1 +upward_step_magnitude_p95 = 1 +upward_step_magnitude_p95_ci_low = 1 +upward_step_magnitude_p95_ci_high = 1 +upward_step_magnitude_p99 = 1 +upward_step_magnitude_p99_ci_low = 1 +upward_step_magnitude_p99_ci_high = 1 +upward_step_magnitude_mean = 1.0012057717516105 +fire_decisiveness_mean = 2.33425509294129 +fire_decisiveness_p50 = 1.3805767664489323 + +[cell.spm_10.step_minus_50_at_15min] +shares_per_minute = 10 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.531 +convergence_rate_ci_low = 0.5000692996781515 +convergence_rate_ci_high = 0.5619307003218486 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 609.9435028248588 +settled_accuracy_p10 = 0.472728735700527 +settled_accuracy_p10_ci_low = 0.4666681341138452 +settled_accuracy_p10_ci_high = 0.47826213004476625 +settled_accuracy_p50 = 0.524138555378336 +settled_accuracy_p50_ci_low = 0.5214293705034125 +settled_accuracy_p50_ci_high = 0.525927409280391 +settled_accuracy_p90 = 1 +settled_accuracy_p90_ci_low = 1 +settled_accuracy_p90_ci_high = 1 +settled_accuracy_p95 = 1 +settled_accuracy_p95_ci_low = 1 +settled_accuracy_p95_ci_high = 1 +settled_accuracy_p99 = 1 +settled_accuracy_p99_ci_low = 1 +settled_accuracy_p99_ci_high = 1 +settled_accuracy_mean = 0.6394871760998998 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.08333333333333333 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.0016335743135458029 +reaction_rate = 0.023 +reaction_rate_ci_low = 0.013708897073005811 +reaction_rate_ci_high = 0.03229110292699419 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 180 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 260.8695652173913 +fire_decisiveness_mean = 1.5316362028125166 +fire_decisiveness_p50 = 0.8178325607967771 +step_correction_mean = 0.5533951313599296 +step_correction_p50 = 0.547366738319397 + +[cell.spm_10.step_minus_25_at_15min] +shares_per_minute = 10 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.98 +convergence_rate_ci_low = 0.971322710100498 +convergence_rate_ci_high = 0.988677289899502 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 1140 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 17.816326530612244 +settled_accuracy_p10 = 0.33333330350717194 +settled_accuracy_p10_ci_low = 0.33333330350717194 +settled_accuracy_p10_ci_high = 0.33333330350717194 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.33333330350717194 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.33333330350717194 +settled_accuracy_mean = 0.3227893831272772 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00008427932576539388 +reaction_rate = 0.004 +reaction_rate_ci_low = 0.00008784785571930992 +reaction_rate_ci_high = 0.00791215214428069 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 180 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 210 +fire_decisiveness_mean = 1.325489385601184 +fire_decisiveness_p50 = 0.5127512365666007 +step_correction_mean = 1.1418891549110413 +step_correction_p50 = 1.1529406309127808 + +[cell.spm_10.step_minus_10_at_15min] +shares_per_minute = 10 +scenario = "step_minus_10_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 2.16 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.11111110282606607 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.11111110282606607 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.11111110282606607 +settled_accuracy_p99 = 0.11111110282606607 +settled_accuracy_p99_ci_low = 0.11111110282606607 +settled_accuracy_p99_ci_high = 0.11111110282606607 +settled_accuracy_mean = 0.11123729642246584 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00004170837504170837 +reaction_rate = 0 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0 +fire_decisiveness_mean = 57.5716791452365 +fire_decisiveness_p50 = 5.2277453679644665 + +[cell.spm_10.step_minus_5_at_15min] +shares_per_minute = 10 +scenario = "step_minus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 2.94 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.05263157522942574 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.05263157522942574 +settled_accuracy_p95 = 0.05263157522942574 +settled_accuracy_p95_ci_low = 0.05263157522942574 +settled_accuracy_p95_ci_high = 0.05263157522942574 +settled_accuracy_p99 = 0.05263157522942574 +settled_accuracy_p99_ci_low = 0.05263157522942574 +settled_accuracy_p99_ci_high = 0.05263157522942574 +settled_accuracy_mean = 0.053177367740260856 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00010427093760427093 +reaction_rate = 0 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0 +fire_decisiveness_mean = 15.072460186065584 +fire_decisiveness_p50 = 1.894397718073293 + +[cell.spm_10.step_plus_5_at_15min] +shares_per_minute = 10 +scenario = "step_plus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 1.74 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.047618983705838724 +settled_accuracy_p90_ci_low = 0.047618983705838724 +settled_accuracy_p90_ci_high = 0.047618983705838724 +settled_accuracy_p95 = 0.047618983705838724 +settled_accuracy_p95_ci_low = 0.047618983705838724 +settled_accuracy_p95_ci_high = 0.047618983705838724 +settled_accuracy_p99 = 0.047618983705838724 +settled_accuracy_p99_ci_low = 0.047618983705838724 +settled_accuracy_p99_ci_high = 0.047618983705838724 +settled_accuracy_mean = 0.04790341602040809 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00004 +reaction_rate = 0.001 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.0029590197548774234 +reaction_p10_secs = 60 +reaction_p50_secs = 60 +reaction_p90_secs = 60 +reaction_p99_secs = 60 +reaction_mean_secs = 60 +fire_decisiveness_mean = 4.365568128340281 +fire_decisiveness_p50 = 4.500138244261628 +step_correction_mean = 1.221821904182434 +step_correction_p50 = 1.221821904182434 + +[cell.spm_10.step_plus_10_at_15min] +shares_per_minute = 10 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.998 +convergence_rate_ci_low = 0.995230914663648 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 1.0821643286573146 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.09090908536290365 +settled_accuracy_p95_ci_low = 0.09090908536290365 +settled_accuracy_p95_ci_high = 0.09090908536290365 +settled_accuracy_p99 = 0.09090908536290365 +settled_accuracy_p99_ci_low = 0.09090908536290365 +settled_accuracy_p99_ci_high = 0.09090908536290365 +settled_accuracy_mean = 0.09111128962069384 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.000047714476572192 +reaction_rate = 0 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0 +fire_decisiveness_mean = 2.7146166144519808 +fire_decisiveness_p50 = 1.3158230953411874 + +[cell.spm_10.step_plus_25_at_15min] +shares_per_minute = 10 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.972 +convergence_rate_ci_low = 0.9617748845678887 +convergence_rate_ci_high = 0.9822251154321112 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 420 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 25.061728395061728 +settled_accuracy_p10 = 0.20000003221225382 +settled_accuracy_p10_ci_low = 0.20000003221225382 +settled_accuracy_p10_ci_high = 0.20000003221225382 +settled_accuracy_p50 = 0.20000003221225382 +settled_accuracy_p50_ci_low = 0.20000003221225382 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.20000003221225382 +settled_accuracy_mean = 0.19134917583874647 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0 +reaction_rate = 0.004 +reaction_rate_ci_low = 0.00008784785571930992 +reaction_rate_ci_high = 0.00791215214428069 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 180 +reaction_p99_secs_ci_high = 240 +reaction_mean_secs = 165 +fire_decisiveness_mean = 1.249179363812394 +fire_decisiveness_p50 = 0.8675152697926478 +step_correction_mean = 1.1671462953090668 +step_correction_p50 = 1.1777809858322144 + +[cell.spm_10.step_plus_50_at_15min] +shares_per_minute = 10 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.627 +convergence_rate_ci_low = 0.597026030733318 +convergence_rate_ci_high = 0.6569739692666821 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 566.9856459330143 +settled_accuracy_p10 = 0.15555521354890367 +settled_accuracy_p10_ci_low = 0.15362185193440403 +settled_accuracy_p10_ci_high = 0.1571423829068893 +settled_accuracy_p50 = 0.17555526544642475 +settled_accuracy_p50_ci_low = 0.17471157281611427 +settled_accuracy_p50_ci_high = 0.17701063299674813 +settled_accuracy_p90 = 0.33333334824641403 +settled_accuracy_p90_ci_low = 0.33333334824641403 +settled_accuracy_p90_ci_high = 0.33333334824641403 +settled_accuracy_p95 = 0.33333334824641403 +settled_accuracy_p95_ci_low = 0.33333334824641403 +settled_accuracy_p95_ci_high = 0.33333334824641403 +settled_accuracy_p99 = 0.4722250283669165 +settled_accuracy_p99_ci_low = 0.33333334824641403 +settled_accuracy_p99_ci_high = 0.5441355756522244 +settled_accuracy_mean = 0.23638699538496744 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00022163120567375886 +reaction_rate = 0.022 +reaction_rate_ci_low = 0.012908472867554099 +reaction_rate_ci_high = 0.0310915271324459 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 180 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 261.8181818181818 +fire_decisiveness_mean = 1.6228675761104927 +fire_decisiveness_p50 = 1.036861827774672 +step_correction_mean = 0.6045678095384077 +step_correction_p50 = 0.566669225692749 + +[cell.spm_12.cold_start_10gh_to_1ph] +shares_per_minute = 12 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 840 +convergence_p99_secs_ci_low = 780 +convergence_p99_secs_ci_high = 900 +convergence_mean_secs = 607.2 +settled_accuracy_p10 = 0.015849973032302622 +settled_accuracy_p10_ci_low = 0.015849973032302622 +settled_accuracy_p10_ci_high = 0.01695700086724794 +settled_accuracy_p50 = 0.08145264654210504 +settled_accuracy_p50_ci_low = 0.07442587862784655 +settled_accuracy_p50_ci_high = 0.08256604971921311 +settled_accuracy_p90 = 0.17987497752691883 +settled_accuracy_p90_ci_low = 0.1645781157588997 +settled_accuracy_p90_ci_high = 0.18594980619295365 +settled_accuracy_p95 = 0.21378622779795475 +settled_accuracy_p95_ci_low = 0.2055861955991214 +settled_accuracy_p95_ci_high = 0.23018750015518918 +settled_accuracy_p99 = 0.3122000359569297 +settled_accuracy_p99_ci_low = 0.262993802966091 +settled_accuracy_p99_ci_high = 0.32860385845102935 +settled_accuracy_mean = 0.09200217546807295 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.05555555555555555 +jitter_p95_per_min = 0.05555555555555555 +jitter_p95_per_min_ci_low = 0.05555555555555555 +jitter_p95_per_min_ci_high = 0.05555555555555555 +jitter_p99_per_min = 0.0625 +jitter_p99_per_min_ci_low = 0.05555555555555555 +jitter_p99_per_min_ci_high = 0.06666666666666667 +jitter_mean_per_min = 0.005425207390648557 +bias_mean = -0.001593217550208619 +bias_p10 = -0.1025842497140076 +bias_p10_ci_low = -0.10962770301130087 +bias_p10_ci_high = -0.0959043816504598 +bias_p50 = -0.0027139001556922156 +bias_p50_ci_low = -0.007665577198984697 +bias_p50_ci_high = 0.003915275990557839 +bias_p90 = 0.09674877717670173 +bias_p90_ci_low = 0.08821735080698889 +bias_p90_ci_high = 0.10691025314986141 +bias_p99 = 0.19286768467588744 +bias_p99_ci_low = 0.17128372890223997 +bias_p99_ci_high = 0.22029550512699542 +variance_mean = 0.0056698241507034935 +variance_p10 = 0.0012210136207687341 +variance_p10_ci_low = 0.001138959755074169 +variance_p10_ci_high = 0.0013567054310066233 +variance_p50 = 0.003639296825454165 +variance_p50_ci_low = 0.0035037859261963893 +variance_p50_ci_high = 0.003920423784338901 +variance_p90 = 0.012257981292608196 +variance_p90_ci_low = 0.01135656068345117 +variance_p90_ci_high = 0.013434920840100844 +variance_p99 = 0.034071720332883804 +variance_p99_ci_low = 0.025634964945617966 +variance_p99_ci_high = 0.04011256331515642 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.03335854165994179 +ramp_target_overshoot_p50_ci_low = 0.01695700086724794 +ramp_target_overshoot_p50_ci_high = 0.03335854165994179 +ramp_target_overshoot_p90 = 0.18098475682532378 +ramp_target_overshoot_p90_ci_low = 0.1645781157588997 +ramp_target_overshoot_p90_ci_high = 0.1973938138108835 +ramp_target_overshoot_p99 = 0.44342672359556423 +ramp_target_overshoot_p99_ci_low = 0.32860385845102935 +ramp_target_overshoot_p99_ci_high = 0.5377383010625816 +ramp_target_overshoot_mean = 0.06830469343965881 + +[cell.spm_12.stable_1ph] +shares_per_minute = 12 +scenario = "stable_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 1.14 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0 +settled_accuracy_p90_ci_low = 0 +settled_accuracy_p90_ci_high = 0 +settled_accuracy_p95 = 0 +settled_accuracy_p95_ci_low = 0 +settled_accuracy_p95_ci_high = 0 +settled_accuracy_p99 = 0 +settled_accuracy_p99_ci_low = 0 +settled_accuracy_p99_ci_high = 0 +settled_accuracy_mean = 0.00013199756716943055 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00011011904761904761 +bias_mean = -0.0038251815553517173 +bias_p10 = -0.08151055442839938 +bias_p10_ci_low = -0.08852904676000538 +bias_p10_ci_high = -0.07716241213122854 +bias_p50 = -0.0032946249518480664 +bias_p50_ci_low = -0.0076010325991589375 +bias_p50_ci_high = 0.0016397980490810155 +bias_p90 = 0.07387679389545555 +bias_p90_ci_low = 0.06847235806518347 +bias_p90_ci_high = 0.07813803374466134 +bias_p99 = 0.13660137304949452 +bias_p99_ci_low = 0.11688099513291544 +bias_p99_ci_high = 0.15581973074023173 +variance_mean = 0.0007091649009017887 +variance_p10 = 0.00018089426597594745 +variance_p10_ci_low = 0.00016595524929479075 +variance_p10_ci_high = 0.00019342591553907058 +variance_p50 = 0.0004932883625324299 +variance_p50_ci_low = 0.000467254002730768 +variance_p50_ci_high = 0.0005196638546337625 +variance_p90 = 0.0014554751204540741 +variance_p90_ci_low = 0.0013054101063190717 +variance_p90_ci_high = 0.0015989004595186546 +variance_p99 = 0.0029924925145120543 +variance_p99_ci_low = 0.0027664709647640777 +variance_p99_ci_high = 0.0037610589362108925 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1 +upward_step_magnitude_p95 = 1 +upward_step_magnitude_p95_ci_low = 1 +upward_step_magnitude_p95_ci_high = 1 +upward_step_magnitude_p99 = 1 +upward_step_magnitude_p99_ci_low = 1 +upward_step_magnitude_p99_ci_high = 1 +upward_step_magnitude_mean = 1.0010416719878403 +fire_decisiveness_mean = 3.8538405521713996 +fire_decisiveness_p50 = 2.9861066371867864 + +[cell.spm_12.step_minus_50_at_15min] +shares_per_minute = 12 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.458 +convergence_rate_ci_low = 0.42711920633144285 +convergence_rate_ci_high = 0.4888807936685572 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1260 +convergence_p50_secs_ci_high = 1380 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 901.8340611353711 +settled_accuracy_p10 = 0.2142351189950904 +settled_accuracy_p10_ci_low = 0.1749983776431917 +settled_accuracy_p10_ci_high = 0.24999924502527016 +settled_accuracy_p50 = 0.543209821033408 +settled_accuracy_p50_ci_low = 0.5416681961895453 +settled_accuracy_p50_ci_high = 0.545977390620771 +settled_accuracy_p90 = 1 +settled_accuracy_p90_ci_low = 1 +settled_accuracy_p90_ci_high = 1 +settled_accuracy_p95 = 1 +settled_accuracy_p95_ci_low = 1 +settled_accuracy_p95_ci_high = 1 +settled_accuracy_p99 = 1 +settled_accuracy_p99_ci_low = 1 +settled_accuracy_p99_ci_high = 1 +settled_accuracy_mean = 0.5588761839429833 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.07692307692307693 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.09523809523809523 +jitter_mean_per_min = 0.0018585831838843886 +reaction_rate = 0.039 +reaction_rate_ci_low = 0.0270008614309193 +reaction_rate_ci_high = 0.0509991385690807 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 264.61538461538464 +fire_decisiveness_mean = 2.3552605837749296 +fire_decisiveness_p50 = 0.9027067656996728 +step_correction_mean = 0.5305117949461325 +step_correction_p50 = 0.5087713599205017 + +[cell.spm_12.step_minus_25_at_15min] +shares_per_minute = 12 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.964 +convergence_rate_ci_low = 0.9524536202037175 +convergence_rate_ci_high = 0.9755463797962824 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 21.90871369294606 +settled_accuracy_p10 = 0.33333330350717194 +settled_accuracy_p10_ci_low = 0.33333330350717194 +settled_accuracy_p10_ci_high = 0.33333330350717194 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.33333330350717194 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.33333330350717194 +settled_accuracy_mean = 0.3180339152984162 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.000162406015037594 +reaction_rate = 0.002 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.00476908533635206 +reaction_p10_secs = 300 +reaction_p10_secs_ci_low = 300 +reaction_p10_secs_ci_high = 300 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 300 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 300 +fire_decisiveness_mean = 0.9629694676339471 +fire_decisiveness_p50 = 0.438559559298362 +step_correction_mean = 0.9833315014839172 +step_correction_p50 = 0.9833315014839172 + +[cell.spm_12.step_minus_10_at_15min] +shares_per_minute = 12 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 4.444444444444445 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.11111110282606607 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.11111110282606607 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.11111110282606607 +settled_accuracy_p99 = 0.11111110282606607 +settled_accuracy_p99_ci_low = 0.11111110282606607 +settled_accuracy_p99_ci_high = 0.11111110282606607 +settled_accuracy_mean = 0.1114297375036791 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00004183400267737617 +reaction_rate = 0 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0 +fire_decisiveness_mean = 1.0454937366796118 +fire_decisiveness_p50 = 0.9032881536529551 + +[cell.spm_12.step_minus_5_at_15min] +shares_per_minute = 12 +scenario = "step_minus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 0.84 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.05263157522942574 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.05263157522942574 +settled_accuracy_p95 = 0.05263157522942574 +settled_accuracy_p95_ci_low = 0.05263157522942574 +settled_accuracy_p95_ci_high = 0.05263157522942574 +settled_accuracy_p99 = 0.05263157522942574 +settled_accuracy_p99_ci_low = 0.05263157522942574 +settled_accuracy_p99_ci_high = 0.05263157522942574 +settled_accuracy_mean = 0.052795056591493444 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0 +reaction_rate = 0 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0 +fire_decisiveness_mean = 6.6919106348096165 +fire_decisiveness_p50 = 13.05610592256916 + +[cell.spm_12.step_plus_5_at_15min] +shares_per_minute = 12 +scenario = "step_plus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 1.56 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.047618983705838724 +settled_accuracy_p90_ci_low = 0.047618983705838724 +settled_accuracy_p90_ci_high = 0.047618983705838724 +settled_accuracy_p95 = 0.047618983705838724 +settled_accuracy_p95_ci_low = 0.047618983705838724 +settled_accuracy_p95_ci_high = 0.047618983705838724 +settled_accuracy_p99 = 0.047618983705838724 +settled_accuracy_p99_ci_low = 0.047618983705838724 +settled_accuracy_p99_ci_high = 0.047618983705838724 +settled_accuracy_mean = 0.04794071084782261 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00010096153846153846 +reaction_rate = 0 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0 +fire_decisiveness_mean = 0.9155971859171551 +fire_decisiveness_p50 = 0.7449644700885649 + +[cell.spm_12.step_plus_10_at_15min] +shares_per_minute = 12 +scenario = "step_plus_10_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 240 +convergence_mean_secs = 5.16 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.09090908536290365 +settled_accuracy_p95_ci_low = 0.09090908536290365 +settled_accuracy_p95_ci_high = 0.09090908536290365 +settled_accuracy_p99 = 0.09090908536290365 +settled_accuracy_p99_ci_low = 0.09090908536290365 +settled_accuracy_p99_ci_high = 0.09090908536290365 +settled_accuracy_mean = 0.09097258920095228 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00008183032732130928 +reaction_rate = 0.003 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.006389723528549194 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 120 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 120 +reaction_p99_secs_ci_high = 240 +reaction_mean_secs = 180 +fire_decisiveness_mean = 7.4073646770856385 +fire_decisiveness_p50 = 1.2081392159366935 +step_correction_mean = 2.084250549475352 +step_correction_p50 = 2.6315903663635254 + +[cell.spm_12.step_plus_25_at_15min] +shares_per_minute = 12 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.951 +convergence_rate_ci_low = 0.9376203617986135 +convergence_rate_ci_high = 0.9643796382013864 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1080 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 27.19242902208202 +settled_accuracy_p10 = 0.20000003221225382 +settled_accuracy_p10_ci_low = 0.20000003221225382 +settled_accuracy_p10_ci_high = 0.20000003221225382 +settled_accuracy_p50 = 0.20000003221225382 +settled_accuracy_p50_ci_low = 0.20000003221225382 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.20000003221225382 +settled_accuracy_mean = 0.18776749791103392 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00005629045876723895 +reaction_rate = 0.002 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.00476908533635206 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 180 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 180 +reaction_p99_secs_ci_low = 180 +reaction_p99_secs_ci_high = 180 +reaction_mean_secs = 180 +fire_decisiveness_mean = 0.9049775869948731 +fire_decisiveness_p50 = 0.6122108668995843 +step_correction_mean = 1.1203790307044983 +step_correction_p50 = 1.1666768789291382 + +[cell.spm_12.step_plus_50_at_15min] +shares_per_minute = 12 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.584 +convergence_rate_ci_low = 0.5534501445109801 +convergence_rate_ci_high = 0.6145498554890199 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 1140 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 1260 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 722.7739726027397 +settled_accuracy_p10 = 0.16666665175358597 +settled_accuracy_p10_ci_low = 0.16424930101644875 +settled_accuracy_p10_ci_high = 0.16872412002608117 +settled_accuracy_p50 = 0.18333282479727975 +settled_accuracy_p50_ci_low = 0.1822208756704511 +settled_accuracy_p50_ci_high = 0.18452360446894922 +settled_accuracy_p90 = 0.33333334824641403 +settled_accuracy_p90_ci_low = 0.33333334824641403 +settled_accuracy_p90_ci_high = 0.33333334824641403 +settled_accuracy_p95 = 0.33333334824641403 +settled_accuracy_p95_ci_low = 0.33333334824641403 +settled_accuracy_p95_ci_high = 0.33333334824641403 +settled_accuracy_p99 = 0.4284236101150416 +settled_accuracy_p99_ci_low = 0.35480295003405105 +settled_accuracy_p99_ci_high = 0.620691577417098 +settled_accuracy_mean = 0.22794374841119744 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.0002955082742316785 +reaction_rate = 0.036 +reaction_rate_ci_low = 0.024453620203717528 +reaction_rate_ci_high = 0.04754637979628247 +reaction_p10_secs = 240 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 260 +fire_decisiveness_mean = 1.5913867609268226 +fire_decisiveness_p50 = 1.018568270214029 +step_correction_mean = 0.5325159761640761 +step_correction_p50 = 0.5263180136680603 + +[cell.spm_15.cold_start_10gh_to_1ph] +shares_per_minute = 15 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 840 +convergence_p99_secs_ci_low = 780 +convergence_p99_secs_ci_high = 900 +convergence_mean_secs = 607.8 +settled_accuracy_p10 = 0.015433159872576319 +settled_accuracy_p10_ci_low = 0.010395028951099894 +settled_accuracy_p10_ci_high = 0.015849973032302622 +settled_accuracy_p50 = 0.06833756107997224 +settled_accuracy_p50_ci_low = 0.06288308676082344 +settled_accuracy_p50_ci_high = 0.07601474811257991 +settled_accuracy_p90 = 0.16051386868446027 +settled_accuracy_p90_ci_low = 0.15474988828051717 +settled_accuracy_p90_ci_high = 0.17331320693736552 +settled_accuracy_p95 = 0.1941031977307004 +settled_accuracy_p95_ci_low = 0.1809917361472706 +settled_accuracy_p95_ci_high = 0.20723130231261844 +settled_accuracy_p99 = 0.2466076972123179 +settled_accuracy_p99_ci_low = 0.23348321650910298 +settled_accuracy_p99_ci_high = 0.26444912580972724 +settled_accuracy_mean = 0.08080417948641708 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.05555555555555555 +jitter_p95_per_min = 0.05555555555555555 +jitter_p95_per_min_ci_low = 0.05555555555555555 +jitter_p95_per_min_ci_high = 0.05555555555555555 +jitter_p99_per_min = 0.07142857142857142 +jitter_p99_per_min_ci_low = 0.058823529411764705 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.005829262610308351 +bias_mean = -0.0011236913440220496 +bias_p10 = -0.09262741339416442 +bias_p10_ci_low = -0.10090465964010242 +bias_p10_ci_high = -0.0817157874653631 +bias_p50 = -0.004607539252178155 +bias_p50_ci_low = -0.00996673311138925 +bias_p50_ci_high = 0.000506233956146794 +bias_p90 = 0.09519053759071454 +bias_p90_ci_low = 0.08797344893567617 +bias_p90_ci_high = 0.10043016817704056 +bias_p99 = 0.18698484387611777 +bias_p99_ci_low = 0.1621517594289606 +bias_p99_ci_high = 0.22091239453722677 +variance_mean = 0.004534359260098958 +variance_p10 = 0.0009778055655557216 +variance_p10_ci_low = 0.0009400656962053138 +variance_p10_ci_high = 0.0010612596905245264 +variance_p50 = 0.0027333224531820976 +variance_p50_ci_low = 0.0025229589765678345 +variance_p50_ci_high = 0.0029414262527401045 +variance_p90 = 0.00955977537182701 +variance_p90_ci_low = 0.008627035680530692 +variance_p90_ci_high = 0.010743332417686866 +variance_p99 = 0.028681988081118985 +variance_p99_ci_low = 0.021556074705726055 +variance_p99_ci_high = 0.035971691505834014 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.023517026626314497 +ramp_target_overshoot_p50_ci_low = 0.010395028951099894 +ramp_target_overshoot_p50_ci_high = 0.023517026626314497 +ramp_target_overshoot_p90 = 0.16787061088729938 +ramp_target_overshoot_p90_ci_low = 0.15474988828051717 +ramp_target_overshoot_p90_ci_high = 0.1809917361472706 +ramp_target_overshoot_p99 = 0.4215606421539906 +ramp_target_overshoot_p99_ci_low = 0.3122000359569297 +ramp_target_overshoot_p99_ci_high = 0.4959102851113413 +ramp_target_overshoot_mean = 0.06150982483848066 + +[cell.spm_15.stable_1ph] +shares_per_minute = 15 +scenario = "stable_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 1.74 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0 +settled_accuracy_p90_ci_low = 0 +settled_accuracy_p90_ci_high = 0 +settled_accuracy_p95 = 0 +settled_accuracy_p95_ci_low = 0 +settled_accuracy_p95_ci_high = 0 +settled_accuracy_p99 = 0 +settled_accuracy_p99_ci_low = 0 +settled_accuracy_p99_ci_high = 0 +settled_accuracy_mean = 0.000252469924994435 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.0001302521008403361 +bias_mean = -0.004236146272869535 +bias_p10 = -0.07435156439011345 +bias_p10_ci_low = -0.07958420859040163 +bias_p10_ci_high = -0.06997153125394584 +bias_p50 = -0.004131797445002332 +bias_p50_ci_low = -0.008208608005355035 +bias_p50_ci_high = 0.00011593586213640717 +bias_p90 = 0.06630721062960339 +bias_p90_ci_low = 0.0611158737016673 +bias_p90_ci_high = 0.07143960831395338 +bias_p99 = 0.11371368629386802 +bias_p99_ci_low = 0.10570760931065425 +bias_p99_ci_high = 0.1283216331794196 +variance_mean = 0.000549252547308238 +variance_p10 = 0.00014115805103149208 +variance_p10_ci_low = 0.0001323235019510277 +variance_p10_ci_high = 0.00015312344298116853 +variance_p50 = 0.0003706713214873845 +variance_p50_ci_low = 0.00034964635613563103 +variance_p50_ci_high = 0.0003906178684243454 +variance_p90 = 0.0011291028101963118 +variance_p90_ci_low = 0.001038224205165389 +variance_p90_ci_high = 0.0012403092972645582 +variance_p99 = 0.0024984290290909392 +variance_p99_ci_low = 0.002122334253529546 +variance_p99_ci_high = 0.0030492944107409457 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1 +upward_step_magnitude_p95 = 1 +upward_step_magnitude_p95_ci_low = 1 +upward_step_magnitude_p95_ci_high = 1 +upward_step_magnitude_p99 = 1 +upward_step_magnitude_p99_ci_low = 1 +upward_step_magnitude_p99_ci_high = 1 +upward_step_magnitude_mean = 1.0021952437442068 +fire_decisiveness_mean = 4.092974504284904 +fire_decisiveness_p50 = 1.5073722782895516 + +[cell.spm_15.step_minus_50_at_15min] +shares_per_minute = 15 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.415 +convergence_rate_ci_low = 0.38446077211192137 +convergence_rate_ci_high = 0.4455392278880786 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 1380 +convergence_p50_secs_ci_low = 1380 +convergence_p50_secs_ci_high = 1380 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1148.0963855421687 +settled_accuracy_p10 = 0.08622073139133257 +settled_accuracy_p10_ci_low = 0.07407348997839835 +settled_accuracy_p10_ci_high = 0.09928434435410771 +settled_accuracy_p50 = 0.5692335650893243 +settled_accuracy_p50_ci_low = 0.5654321163297276 +settled_accuracy_p50_ci_high = 0.5710147685807838 +settled_accuracy_p90 = 0.6047628772013134 +settled_accuracy_p90_ci_low = 0.6044474655364103 +settled_accuracy_p90_ci_high = 0.6091982362985005 +settled_accuracy_p95 = 1 +settled_accuracy_p95_ci_low = 1 +settled_accuracy_p95_ci_high = 1 +settled_accuracy_p99 = 1 +settled_accuracy_p99_ci_low = 1 +settled_accuracy_p99_ci_high = 1 +settled_accuracy_mean = 0.47860106457476626 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.09523809523809523 +jitter_p99_per_min = 0.09523809523809523 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.003952991452991453 +reaction_rate = 0.03 +reaction_rate_ci_low = 0.019426894495939234 +reaction_rate_ci_high = 0.040573105504060764 +reaction_p10_secs = 240 +reaction_p10_secs_ci_low = 180 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 264 +fire_decisiveness_mean = 2.6759298421225193 +fire_decisiveness_p50 = 0.968855422164367 +step_correction_mean = 0.47365534007549287 +step_correction_p50 = 0.4701731503009796 + +[cell.spm_15.step_minus_25_at_15min] +shares_per_minute = 15 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.942 +convergence_rate_ci_low = 0.9275124309285512 +convergence_rate_ci_high = 0.9564875690714487 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 19.10828025477707 +settled_accuracy_p10 = 0.33333330350717194 +settled_accuracy_p10_ci_low = 0.33333330350717194 +settled_accuracy_p10_ci_high = 0.33333330350717194 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.33333330350717194 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.33333330350717194 +settled_accuracy_mean = 0.31407593672117595 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00011947431302270011 +reaction_rate = 0.001 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.0029590197548774234 +reaction_p10_secs = 240 +reaction_p50_secs = 240 +reaction_p90_secs = 240 +reaction_p99_secs = 240 +reaction_mean_secs = 240 +fire_decisiveness_mean = 0.5490746566498673 +fire_decisiveness_p50 = 0.30221609117531756 +step_correction_mean = 0.7425785660743713 +step_correction_p50 = 0.7425785660743713 + +[cell.spm_15.step_minus_10_at_15min] +shares_per_minute = 15 +scenario = "step_minus_10_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 3.48 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.11111110282606607 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.11111110282606607 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.11111110282606607 +settled_accuracy_p99 = 0.11111110282606607 +settled_accuracy_p99_ci_low = 0.11111110282606607 +settled_accuracy_p99_ci_high = 0.11111110282606607 +settled_accuracy_mean = 0.11122227462513384 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00009127566874639968 +reaction_rate = 0.001 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.0029590197548774234 +reaction_p10_secs = 240 +reaction_p50_secs = 240 +reaction_p90_secs = 240 +reaction_p99_secs = 240 +reaction_mean_secs = 240 +fire_decisiveness_mean = 8.65540396604996 +fire_decisiveness_p50 = 2.5008165908058757 +step_correction_mean = 2.3508660793304443 +step_correction_p50 = 2.3508660793304443 + +[cell.spm_15.step_minus_5_at_15min] +shares_per_minute = 15 +scenario = "step_minus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 0.96 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.05263157522942574 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.05263157522942574 +settled_accuracy_p95 = 0.05263157522942574 +settled_accuracy_p95_ci_low = 0.05263157522942574 +settled_accuracy_p95_ci_high = 0.05263157522942574 +settled_accuracy_p99 = 0.05263157522942574 +settled_accuracy_p99_ci_low = 0.05263157522942574 +settled_accuracy_p99_ci_high = 0.05263157522942574 +settled_accuracy_mean = 0.05266643461127756 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00017307359307359307 +reaction_rate = 0 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0 +fire_decisiveness_mean = 2.824046397866791 +fire_decisiveness_p50 = 2.501192400449156 + +[cell.spm_15.step_plus_5_at_15min] +shares_per_minute = 15 +scenario = "step_plus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 1.8 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.047618983705838724 +settled_accuracy_p90_ci_low = 0.047618983705838724 +settled_accuracy_p90_ci_high = 0.047618983705838724 +settled_accuracy_p95 = 0.047618983705838724 +settled_accuracy_p95_ci_low = 0.047618983705838724 +settled_accuracy_p95_ci_high = 0.047618983705838724 +settled_accuracy_p99 = 0.047618983705838724 +settled_accuracy_p99_ci_low = 0.047618983705838724 +settled_accuracy_p99_ci_high = 0.047618983705838724 +settled_accuracy_mean = 0.04786408945599488 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00004545454545454546 +reaction_rate = 0.001 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.0029590197548774234 +reaction_p10_secs = 180 +reaction_p50_secs = 180 +reaction_p90_secs = 180 +reaction_p99_secs = 180 +reaction_mean_secs = 180 +fire_decisiveness_mean = 3.4275779419085195 +fire_decisiveness_p50 = 3.6922612131624817 +step_correction_mean = 4.740768909454346 +step_correction_p50 = 4.740768909454346 + +[cell.spm_15.step_plus_10_at_15min] +shares_per_minute = 15 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 3.3033033033033035 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.09090908536290365 +settled_accuracy_p95_ci_low = 0.09090908536290365 +settled_accuracy_p95_ci_high = 0.09090908536290365 +settled_accuracy_p99 = 0.09090908536290365 +settled_accuracy_p99_ci_low = 0.09090908536290365 +settled_accuracy_p99_ci_high = 0.09090908536290365 +settled_accuracy_mean = 0.09090313091530436 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00014129268638286672 +reaction_rate = 0.003 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.006389723528549194 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 120 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 120 +reaction_p99_secs_ci_high = 240 +reaction_mean_secs = 200 +fire_decisiveness_mean = 2.4198538475333953 +fire_decisiveness_p50 = 2.3594031233544825 +step_correction_mean = 1.255434234937032 +step_correction_p50 = 0.7306007146835327 + +[cell.spm_15.step_plus_25_at_15min] +shares_per_minute = 15 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.93 +convergence_rate_ci_low = 0.9141858240809078 +convergence_rate_ci_high = 0.9458141759190923 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 43.16129032258065 +settled_accuracy_p10 = 0.20000003221225382 +settled_accuracy_p10_ci_low = 0.04177564251098387 +settled_accuracy_p10_ci_high = 0.20000003221225382 +settled_accuracy_p50 = 0.20000003221225382 +settled_accuracy_p50_ci_low = 0.20000003221225382 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.20000003221225382 +settled_accuracy_mean = 0.18354214640555147 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0 +reaction_rate = 0.001 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.0029590197548774234 +reaction_p10_secs = 180 +reaction_p50_secs = 180 +reaction_p90_secs = 180 +reaction_p99_secs = 180 +reaction_mean_secs = 180 +fire_decisiveness_mean = 0.9969378950789576 +fire_decisiveness_p50 = 0.7081917955729402 +step_correction_mean = 0.9777864217758179 +step_correction_p50 = 0.9777864217758179 + +[cell.spm_15.step_plus_50_at_15min] +shares_per_minute = 15 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.531 +convergence_rate_ci_low = 0.5000692996781515 +convergence_rate_ci_high = 0.5619307003218486 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1320 +convergence_p50_secs_ci_high = 1380 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1012.7683615819209 +settled_accuracy_p10 = 0.17407162269500065 +settled_accuracy_p10_ci_low = 0.17171663846155705 +settled_accuracy_p10_ci_high = 0.17575650255805564 +settled_accuracy_p50 = 0.19259205837289994 +settled_accuracy_p50_ci_low = 0.19145120769557922 +settled_accuracy_p50_ci_high = 0.1931612310127775 +settled_accuracy_p90 = 0.33333334824641403 +settled_accuracy_p90_ci_low = 0.33333334824641403 +settled_accuracy_p90_ci_high = 0.33333334824641403 +settled_accuracy_p95 = 0.33333334824641403 +settled_accuracy_p95_ci_low = 0.33333334824641403 +settled_accuracy_p95_ci_high = 0.33333334824641403 +settled_accuracy_p99 = 0.5165706547614946 +settled_accuracy_p99_ci_low = 0.3655981712745253 +settled_accuracy_p99_ci_high = 0.5565861488558699 +settled_accuracy_mean = 0.21539669641856113 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.0019736842105263163 +reaction_rate = 0.045 +reaction_rate_ci_low = 0.03215115725055365 +reaction_rate_ci_high = 0.05784884274944635 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 180 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 256 +fire_decisiveness_mean = 1.855627359215126 +fire_decisiveness_p50 = 1.0616467095162605 +step_correction_mean = 0.4814775519900852 +step_correction_p50 = 0.47719433903694153 + +[cell.spm_20.cold_start_10gh_to_1ph] +shares_per_minute = 20 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 840 +convergence_p99_secs_ci_low = 780 +convergence_p99_secs_ci_high = 900 +convergence_mean_secs = 605.94 +settled_accuracy_p10 = 0.013681954043715194 +settled_accuracy_p10_ci_low = 0.01118570559703369 +settled_accuracy_p10_ci_high = 0.013681954043715194 +settled_accuracy_p50 = 0.06289261621963549 +settled_accuracy_p50_ci_low = 0.05521603316681167 +settled_accuracy_p50_ci_high = 0.06504426064519397 +settled_accuracy_p90 = 0.1416170860780579 +settled_accuracy_p90_ci_low = 0.13393761734404452 +settled_accuracy_p90_ci_high = 0.151456587845739 +settled_accuracy_p95 = 0.16346974574665696 +settled_accuracy_p95_ci_low = 0.15362561346729964 +settled_accuracy_p95_ci_high = 0.18097992498705295 +settled_accuracy_p99 = 0.22034840104069753 +settled_accuracy_p99_ci_low = 0.20067100811809224 +settled_accuracy_p99_ci_high = 0.23236223003026413 +settled_accuracy_mean = 0.069158114860983 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.05555555555555555 +jitter_p95_per_min = 0.05555555555555555 +jitter_p95_per_min_ci_low = 0.05555555555555555 +jitter_p95_per_min_ci_high = 0.05555555555555555 +jitter_p99_per_min = 0.06666666666666667 +jitter_p99_per_min_ci_low = 0.058823529411764705 +jitter_p99_per_min_ci_high = 0.08333333333333333 +jitter_mean_per_min = 0.005453685448538379 +bias_mean = -0.003492750497763229 +bias_p10 = -0.08273183333976813 +bias_p10_ci_low = -0.08887276776974838 +bias_p10_ci_high = -0.07861824358941949 +bias_p50 = -0.0033029464510923173 +bias_p50_ci_low = -0.008606390503821535 +bias_p50_ci_high = 0.0015331090821150057 +bias_p90 = 0.07734461976344979 +bias_p90_ci_low = 0.07030704025785571 +bias_p90_ci_high = 0.0837152713699359 +bias_p99 = 0.15158679317177476 +bias_p99_ci_low = 0.13022744723681173 +bias_p99_ci_high = 0.17301414511117272 +variance_mean = 0.0033680465222994025 +variance_p10 = 0.00073423613945395 +variance_p10_ci_low = 0.0006748065449507536 +variance_p10_ci_high = 0.0007753291893065105 +variance_p50 = 0.0020841715244368487 +variance_p50_ci_low = 0.0019263109902631134 +variance_p50_ci_high = 0.0022165958507001844 +variance_p90 = 0.0069884485653654085 +variance_p90_ci_low = 0.006426107898223078 +variance_p90_ci_high = 0.00789137660947457 +variance_p99 = 0.024469798009289032 +variance_p99_ci_low = 0.018556116587865414 +variance_p99_ci_high = 0.028004034558304622 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.013681954043715194 +ramp_target_overshoot_p50_ci_low = 0.013681954043715194 +ramp_target_overshoot_p50_ci_high = 0.023521455811396086 +ramp_target_overshoot_p90 = 0.1416170860780579 +ramp_target_overshoot_p90_ci_low = 0.1317923482606489 +ramp_target_overshoot_p90_ci_high = 0.151456587845739 +ramp_target_overshoot_p99 = 0.4211259109273431 +ramp_target_overshoot_p99_ci_low = 0.28466043686126197 +ramp_target_overshoot_p99_ci_high = 0.4968951748122177 +ramp_target_overshoot_mean = 0.05226606913380775 + +[cell.spm_20.stable_1ph] +shares_per_minute = 20 +scenario = "stable_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 0.24 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0 +settled_accuracy_p90_ci_low = 0 +settled_accuracy_p90_ci_high = 0 +settled_accuracy_p95 = 0 +settled_accuracy_p95_ci_low = 0 +settled_accuracy_p95_ci_high = 0 +settled_accuracy_p99 = 0 +settled_accuracy_p99_ci_low = 0 +settled_accuracy_p99_ci_high = 0 +settled_accuracy_mean = 0.00009999636941041035 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0 +bias_mean = -0.0019951556688841436 +bias_p10 = -0.0569668434065747 +bias_p10_ci_low = -0.06345896205848094 +bias_p10_ci_high = -0.0547350356759026 +bias_p50 = -0.0031085709220559144 +bias_p50_ci_low = -0.0057188726506117995 +bias_p50_ci_high = 0.0004128396085166919 +bias_p90 = 0.054516840031881786 +bias_p90_ci_low = 0.05105868490452028 +bias_p90_ci_high = 0.0586962000018515 +bias_p99 = 0.1053307082652998 +bias_p99_ci_low = 0.09306309827310204 +bias_p99_ci_high = 0.11594102245491227 +variance_mean = 0.00042084875028404033 +variance_p10 = 0.00011298302601139296 +variance_p10_ci_low = 0.00010457897542131303 +variance_p10_ci_high = 0.00012112623447615081 +variance_p50 = 0.0003062608338824335 +variance_p50_ci_low = 0.0002853000264984631 +variance_p50_ci_high = 0.00032332524902823153 +variance_p90 = 0.0008675205564033502 +variance_p90_ci_low = 0.000793366158096364 +variance_p90_ci_high = 0.0009466932340301413 +variance_p99 = 0.0017919333714282362 +variance_p99_ci_low = 0.0016064281666083046 +variance_p99_ci_high = 0.0020570221309757055 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1 +upward_step_magnitude_p95 = 1 +upward_step_magnitude_p95_ci_low = 1 +upward_step_magnitude_p95_ci_high = 1 +upward_step_magnitude_p99 = 1 +upward_step_magnitude_p99_ci_low = 1 +upward_step_magnitude_p99_ci_high = 1 +upward_step_magnitude_mean = 1.0008000072611791 +fire_decisiveness_mean = 5.427759998758365 +fire_decisiveness_p50 = 5.436833204592496 + +[cell.spm_20.step_minus_50_at_15min] +shares_per_minute = 20 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.34 +convergence_rate_ci_low = 0.31063922616823597 +convergence_rate_ci_high = 0.3693607738317641 +convergence_p10_secs = 1200 +convergence_p10_secs_ci_low = 1200 +convergence_p10_secs_ci_high = 1260 +convergence_p50_secs = 1440 +convergence_p50_secs_ci_low = 1380 +convergence_p50_secs_ci_high = 1440 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1350.3529411764705 +settled_accuracy_p10 = 0.023199064824546256 +settled_accuracy_p10_ci_low = 0.020602018862825533 +settled_accuracy_p10_ci_high = 0.0265408178597627 +settled_accuracy_p50 = 0.15419536773007148 +settled_accuracy_p50_ci_low = 0.13999701097115858 +settled_accuracy_p50_ci_high = 0.17333307116136787 +settled_accuracy_p90 = 0.629633288305522 +settled_accuracy_p90_ci_low = 0.6269245060837878 +settled_accuracy_p90_ci_high = 0.6310376084118545 +settled_accuracy_p95 = 0.6366701896583762 +settled_accuracy_p95_ci_low = 0.6344855276713002 +settled_accuracy_p95_ci_high = 0.6379345206725839 +settled_accuracy_p99 = 0.7271097198399508 +settled_accuracy_p99_ci_low = 0.6500016341008596 +settled_accuracy_p99_ci_high = 1 +settled_accuracy_mean = 0.29177990543824067 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.09090909090909091 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.09090909090909091 +jitter_mean_per_min = 0.020979020979020976 +reaction_rate = 0.054 +reaction_rate_ci_low = 0.03999127791695474 +reaction_rate_ci_high = 0.06800872208304526 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 265.55555555555554 +fire_decisiveness_mean = 3.375336401731456 +fire_decisiveness_p50 = 1.2834117597942516 +step_correction_mean = 0.43614024530958245 +step_correction_p50 = 0.4249984323978424 + +[cell.spm_20.step_minus_25_at_15min] +shares_per_minute = 20 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.906 +convergence_rate_ci_low = 0.8879122687326465 +convergence_rate_ci_high = 0.9240877312673536 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 43.11258278145695 +settled_accuracy_p10 = 0.097779135066967 +settled_accuracy_p10_ci_low = 0.09555720533996848 +settled_accuracy_p10_ci_high = 0.10222290504247944 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.33333330350717194 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.33333330350717194 +settled_accuracy_mean = 0.30346684790832185 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.000059876654092569307 +reaction_rate = 0.003 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.006389723528549194 +reaction_p10_secs = 240 +reaction_p10_secs_ci_low = 240 +reaction_p10_secs_ci_high = 300 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 260 +fire_decisiveness_mean = 0.5374825316410674 +fire_decisiveness_p50 = 0.38795650296960105 +step_correction_mean = 0.7770135402679443 +step_correction_p50 = 0.8199959993362427 + +[cell.spm_20.step_minus_10_at_15min] +shares_per_minute = 20 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 3.7837837837837838 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.11111110282606607 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.11111110282606607 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.11111110282606607 +settled_accuracy_p99 = 0.11111110282606607 +settled_accuracy_p99_ci_low = 0.11111110282606607 +settled_accuracy_p99_ci_high = 0.11111110282606607 +settled_accuracy_mean = 0.11111847779200117 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00011953732025454417 +reaction_rate = 0 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0 +fire_decisiveness_mean = 1.0068710711289648 +fire_decisiveness_p50 = 0.48046245445466695 + +[cell.spm_20.step_minus_5_at_15min] +shares_per_minute = 20 +scenario = "step_minus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 0.54 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.05263157522942574 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.05263157522942574 +settled_accuracy_p95 = 0.05263157522942574 +settled_accuracy_p95_ci_low = 0.05263157522942574 +settled_accuracy_p95_ci_high = 0.05263157522942574 +settled_accuracy_p99 = 0.05263157522942574 +settled_accuracy_p99_ci_low = 0.05263157522942574 +settled_accuracy_p99_ci_high = 0.05263157522942574 +settled_accuracy_mean = 0.05295327216819559 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00004 +reaction_rate = 0.001 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.0029590197548774234 +reaction_p10_secs = 120 +reaction_p50_secs = 120 +reaction_p90_secs = 120 +reaction_p99_secs = 120 +reaction_mean_secs = 120 +fire_decisiveness_mean = 11.136548610467631 +fire_decisiveness_p50 = 3.770308696871247 +step_correction_mean = 0.725109875202179 +step_correction_p50 = 0.725109875202179 + +[cell.spm_20.step_plus_5_at_15min] +shares_per_minute = 20 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 180 +convergence_mean_secs = 2.8828828828828827 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.047618983705838724 +settled_accuracy_p90_ci_low = 0.047618983705838724 +settled_accuracy_p90_ci_high = 0.047618983705838724 +settled_accuracy_p95 = 0.047618983705838724 +settled_accuracy_p95_ci_low = 0.047618983705838724 +settled_accuracy_p95_ci_high = 0.047618983705838724 +settled_accuracy_p99 = 0.047618983705838724 +settled_accuracy_p99_ci_low = 0.047618983705838724 +settled_accuracy_p99_ci_high = 0.047618983705838724 +settled_accuracy_mean = 0.04786823934065071 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.000043521782652217434 +reaction_rate = 0.002 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.00476908533635206 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 120 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 180 +reaction_p99_secs_ci_low = 120 +reaction_p99_secs_ci_high = 180 +reaction_mean_secs = 150 +fire_decisiveness_mean = 5.206581956074247 +fire_decisiveness_p50 = 1.202482119311039 +step_correction_mean = 1.0964857935905457 +step_correction_p50 = 1.0967700481414795 + +[cell.spm_20.step_plus_10_at_15min] +shares_per_minute = 20 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.998 +convergence_rate_ci_low = 0.995230914663648 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 0.18036072144288579 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.09090908536290365 +settled_accuracy_p95_ci_low = 0.09090908536290365 +settled_accuracy_p95_ci_high = 0.09090908536290365 +settled_accuracy_p99 = 0.09090908536290365 +settled_accuracy_p99_ci_low = 0.09090908536290365 +settled_accuracy_p99_ci_high = 0.09090908536290365 +settled_accuracy_mean = 0.09079147341601376 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.000040080160320641287 +reaction_rate = 0 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0 +fire_decisiveness_mean = 1.4143305556614818 +fire_decisiveness_p50 = 1.1620933364359374 + +[cell.spm_20.step_plus_25_at_15min] +shares_per_minute = 20 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.888 +convergence_rate_ci_low = 0.8684533847022049 +convergence_rate_ci_high = 0.9075466152977951 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 43.648648648648646 +settled_accuracy_p10 = 0.056548182122929225 +settled_accuracy_p10_ci_low = 0.05466408739571016 +settled_accuracy_p10_ci_high = 0.057929550941854036 +settled_accuracy_p50 = 0.20000003221225382 +settled_accuracy_p50_ci_low = 0.20000003221225382 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.20000003221225382 +settled_accuracy_mean = 0.17881509081815375 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.000089473910612122 +reaction_rate = 0.005 +reaction_rate_ci_low = 0.0006282772274536896 +reaction_rate_ci_high = 0.00937172277254631 +reaction_p10_secs = 240 +reaction_p10_secs_ci_low = 240 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 264 +fire_decisiveness_mean = 1.0137465650232123 +fire_decisiveness_p50 = 0.4839841178809863 +step_correction_mean = 0.8355834245681762 +step_correction_p50 = 0.8210582733154297 + +[cell.spm_20.step_plus_50_at_15min] +shares_per_minute = 20 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.575 +convergence_rate_ci_low = 0.5443603035263075 +convergence_rate_ci_high = 0.6056396964736924 +convergence_p10_secs = 1140 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 1140 +convergence_p50_secs = 1380 +convergence_p50_secs_ci_low = 1380 +convergence_p50_secs_ci_high = 1380 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1264.486956521739 +settled_accuracy_p10 = 0.11335402851375065 +settled_accuracy_p10_ci_low = 0.10088269630170221 +settled_accuracy_p10_ci_high = 0.1260936172223177 +settled_accuracy_p50 = 0.20144702815556836 +settled_accuracy_p50_ci_low = 0.19999998210430314 +settled_accuracy_p50_ci_high = 0.20256139320147848 +settled_accuracy_p90 = 0.21666624462648143 +settled_accuracy_p90_ci_low = 0.21428432736920455 +settled_accuracy_p90_ci_high = 0.24827102961370984 +settled_accuracy_p95 = 0.33333334824641403 +settled_accuracy_p95_ci_low = 0.2885352738949831 +settled_accuracy_p95_ci_high = 0.33333334824641403 +settled_accuracy_p99 = 0.42072362861024426 +settled_accuracy_p99_ci_low = 0.3526137694323781 +settled_accuracy_p99_ci_high = 0.4427353357961987 +settled_accuracy_mean = 0.19615718631684312 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.06666666666666667 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.0071616789008093346 +reaction_rate = 0.079 +reaction_rate_ci_low = 0.062281418289818966 +reaction_rate_ci_high = 0.09571858171018104 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 259.746835443038 +fire_decisiveness_mean = 1.9521084262401887 +fire_decisiveness_p50 = 1.1713952877339544 +step_correction_mean = 0.4363489464113984 +step_correction_p50 = 0.4315812289714813 + +[cell.spm_25.cold_start_10gh_to_1ph] +shares_per_minute = 25 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 780 +convergence_p99_secs_ci_low = 600 +convergence_p99_secs_ci_high = 840 +convergence_mean_secs = 603.84 +settled_accuracy_p10 = 0.007975821481292611 +settled_accuracy_p10_ci_low = 0.007975821481292611 +settled_accuracy_p10_ci_high = 0.01565649817487369 +settled_accuracy_p50 = 0.055011619564408365 +settled_accuracy_p50_ci_low = 0.04732785586304311 +settled_accuracy_p50_ci_high = 0.05521603316681167 +settled_accuracy_p90 = 0.12586871586717296 +settled_accuracy_p90_ci_low = 0.11819454873348456 +settled_accuracy_p90_ci_high = 0.1337589064368876 +settled_accuracy_p95 = 0.14951204137717866 +settled_accuracy_p95_ci_low = 0.1416225890049776 +settled_accuracy_p95_ci_high = 0.1573696841474299 +settled_accuracy_p99 = 0.19674715278896726 +settled_accuracy_p99_ci_low = 0.18097992498705295 +settled_accuracy_p99_ci_high = 0.2168918918465481 +settled_accuracy_mean = 0.06281016358389785 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0.05555555555555555 +jitter_p95_per_min_ci_low = 0.05555555555555555 +jitter_p95_per_min_ci_high = 0.05555555555555555 +jitter_p99_per_min = 0.05555555555555555 +jitter_p99_per_min_ci_low = 0.05555555555555555 +jitter_p99_per_min_ci_high = 0.0625 +jitter_mean_per_min = 0.004716609700269822 +bias_mean = 0.0006495810098640174 +bias_p10 = -0.06992961293771885 +bias_p10_ci_low = -0.07664698426059412 +bias_p10_ci_high = -0.06481173196045456 +bias_p50 = 0.0008027915620661733 +bias_p50_ci_low = -0.003735975231799235 +bias_p50_ci_high = 0.004367257727523098 +bias_p90 = 0.07487944625325009 +bias_p90_ci_low = 0.06804487106389685 +bias_p90_ci_high = 0.07956783049532708 +bias_p99 = 0.13290976384146738 +bias_p99_ci_low = 0.12134554305427682 +bias_p99_ci_high = 0.15703354643941755 +variance_mean = 0.0024230024389598976 +variance_p10 = 0.0005646920315128023 +variance_p10_ci_low = 0.0005218114791486651 +variance_p10_ci_high = 0.0005978886419100947 +variance_p50 = 0.001573506531202579 +variance_p50_ci_low = 0.001474921443946996 +variance_p50_ci_high = 0.0016861983653794258 +variance_p90 = 0.005117803864960183 +variance_p90_ci_low = 0.004699070046921899 +variance_p90_ci_high = 0.005735827345134318 +variance_p99 = 0.013623617338117212 +variance_p99_ci_low = 0.010412260870319085 +variance_p99_ci_high = 0.01871593172035958 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.01565649817487369 +ramp_target_overshoot_p50_ci_low = 0.0077695959395378544 +ramp_target_overshoot_p50_ci_high = 0.0224110725332074 +ramp_target_overshoot_p90 = 0.12586871586717296 +ramp_target_overshoot_p90_ci_low = 0.11800818741573216 +ramp_target_overshoot_p90_ci_high = 0.1337589064368876 +ramp_target_overshoot_p99 = 0.22823637701787125 +ramp_target_overshoot_p99_ci_low = 0.2046206332513285 +ramp_target_overshoot_p99_ci_high = 0.2754596772694422 +ramp_target_overshoot_mean = 0.043208379937643836 + +[cell.spm_25.stable_1ph] +shares_per_minute = 25 +scenario = "stable_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 2.28 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0 +settled_accuracy_p90_ci_low = 0 +settled_accuracy_p90_ci_high = 0 +settled_accuracy_p95 = 0 +settled_accuracy_p95_ci_low = 0 +settled_accuracy_p95_ci_high = 0 +settled_accuracy_p99 = 0 +settled_accuracy_p99_ci_low = 0 +settled_accuracy_p99_ci_high = 0 +settled_accuracy_mean = 0.0001746798789705044 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0 +bias_mean = -0.0013301684733791788 +bias_p10 = -0.05532250667900093 +bias_p10_ci_low = -0.05907815893639005 +bias_p10_ci_high = -0.05099428511856083 +bias_p50 = -0.002101634193046047 +bias_p50_ci_low = -0.006017054997470191 +bias_p50_ci_high = 0.0010310817921820787 +bias_p90 = 0.05419360488615266 +bias_p90_ci_low = 0.051095125018146316 +bias_p90_ci_high = 0.060044346456239926 +bias_p99 = 0.09665687688432639 +bias_p99_ci_low = 0.0894946161718893 +bias_p99_ci_high = 0.10420587538889016 +variance_mean = 0.0003328439966153187 +variance_p10 = 0.00008235822699393472 +variance_p10_ci_low = 0.00007605065528829686 +variance_p10_ci_high = 0.00008953108136374451 +variance_p50 = 0.00022817065559891 +variance_p50_ci_low = 0.00021499930466967594 +variance_p50_ci_high = 0.00024032983772025193 +variance_p90 = 0.0006763345800332862 +variance_p90_ci_low = 0.0006250058410241843 +variance_p90_ci_high = 0.0007652008374036016 +variance_p99 = 0.001578600830933916 +variance_p99_ci_low = 0.0012973105874622155 +variance_p99_ci_high = 0.0018355568774602218 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1 +upward_step_magnitude_p95 = 1 +upward_step_magnitude_p95_ci_low = 1 +upward_step_magnitude_p95_ci_high = 1 +upward_step_magnitude_p99 = 1 +upward_step_magnitude_p99_ci_low = 1 +upward_step_magnitude_p99_ci_high = 1 +upward_step_magnitude_mean = 1.0013160098137017 +fire_decisiveness_mean = 1.3214329675193572 +fire_decisiveness_p50 = 1.000171261823155 + +[cell.spm_25.step_minus_50_at_15min] +shares_per_minute = 25 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.34 +convergence_rate_ci_low = 0.31063922616823597 +convergence_rate_ci_high = 0.3693607738317641 +convergence_p10_secs = 1260 +convergence_p10_secs_ci_low = 1200 +convergence_p10_secs_ci_high = 1260 +convergence_p50_secs = 1440 +convergence_p50_secs_ci_low = 1440 +convergence_p50_secs_ci_high = 1440 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1392.1764705882354 +settled_accuracy_p10 = 0.017935179681636937 +settled_accuracy_p10_ci_low = 0.01470053239475766 +settled_accuracy_p10_ci_high = 0.021083659186019066 +settled_accuracy_p50 = 0.08533073362538668 +settled_accuracy_p50_ci_low = 0.08021891717027962 +settled_accuracy_p50_ci_high = 0.09091338587644282 +settled_accuracy_p90 = 0.6385215890224929 +settled_accuracy_p90_ci_low = 0.6333363554692149 +settled_accuracy_p90_ci_high = 0.6457180752560152 +settled_accuracy_p95 = 0.6544022308060427 +settled_accuracy_p95_ci_low = 0.6506700383949948 +settled_accuracy_p95_ci_high = 0.6562975193677862 +settled_accuracy_p99 = 0.668572804494898 +settled_accuracy_p99_ci_low = 0.6651864911734058 +settled_accuracy_p99_ci_high = 0.6717282633212271 +settled_accuracy_mean = 0.17318288494433423 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.1 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.042857142857142864 +reaction_rate = 0.072 +reaction_rate_ci_low = 0.05597875330693644 +reaction_rate_ci_high = 0.08802124669306355 +reaction_p10_secs = 240 +reaction_p10_secs_ci_low = 180 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 300 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 275.8333333333333 +fire_decisiveness_mean = 3.3491813617198036 +fire_decisiveness_p50 = 1.4637158529220358 +step_correction_mean = 0.39041871660285526 +step_correction_p50 = 0.3879959285259247 + +[cell.spm_25.step_minus_25_at_15min] +shares_per_minute = 25 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.879 +convergence_rate_ci_low = 0.8587864220287451 +convergence_rate_ci_high = 0.8992135779712549 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 63.41296928327645 +settled_accuracy_p10 = 0.10933537081807754 +settled_accuracy_p10_ci_low = 0.10814834924275707 +settled_accuracy_p10_ci_high = 0.11428755754249487 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.33333330350717194 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.33333330350717194 +settled_accuracy_mean = 0.2968088346760645 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.0000496031746031746 +reaction_rate = 0.002 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.00476908533635206 +reaction_p10_secs = 240 +reaction_p10_secs_ci_low = 240 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 240 +reaction_mean_secs = 240 +fire_decisiveness_mean = 0.47824853657059013 +fire_decisiveness_p50 = 0.3787855196210508 +step_correction_mean = 0.7621003985404968 +step_correction_p50 = 0.7663159370422363 + +[cell.spm_25.step_minus_10_at_15min] +shares_per_minute = 25 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 0.960960960960961 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.11111110282606607 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.11111110282606607 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.11111110282606607 +settled_accuracy_p99 = 0.11111110282606607 +settled_accuracy_p99_ci_low = 0.11111110282606607 +settled_accuracy_p99_ci_high = 0.11111110282606607 +settled_accuracy_mean = 0.11113574065257616 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.000052684263210578996 +reaction_rate = 0.001 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.0029590197548774234 +reaction_p10_secs = 180 +reaction_p50_secs = 180 +reaction_p90_secs = 180 +reaction_p99_secs = 180 +reaction_mean_secs = 180 +fire_decisiveness_mean = 16.454459834644062 +fire_decisiveness_p50 = 5.025601981939204 +step_correction_mean = 225.396728515625 +step_correction_p50 = 225.396728515625 + +[cell.spm_25.step_minus_5_at_15min] +shares_per_minute = 25 +scenario = "step_minus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 0 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.05263157522942574 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.05263157522942574 +settled_accuracy_p95 = 0.05263157522942574 +settled_accuracy_p95_ci_low = 0.05263157522942574 +settled_accuracy_p95_ci_high = 0.05263157522942574 +settled_accuracy_p99 = 0.05263157522942574 +settled_accuracy_p99_ci_low = 0.05263157522942574 +settled_accuracy_p99_ci_high = 0.05263157522942574 +settled_accuracy_mean = 0.0526315752294265 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0 +reaction_rate = 0 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0 + +[cell.spm_25.step_plus_5_at_15min] +shares_per_minute = 25 +scenario = "step_plus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 1.38 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.047618983705838724 +settled_accuracy_p90_ci_low = 0.047618983705838724 +settled_accuracy_p90_ci_high = 0.047618983705838724 +settled_accuracy_p95 = 0.047618983705838724 +settled_accuracy_p95_ci_low = 0.047618983705838724 +settled_accuracy_p95_ci_high = 0.047618983705838724 +settled_accuracy_p99 = 0.047618983705838724 +settled_accuracy_p99_ci_low = 0.047618983705838724 +settled_accuracy_p99_ci_high = 0.047618983705838724 +settled_accuracy_mean = 0.04763514697289769 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.000165273132664437 +reaction_rate = 0.001 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.0029590197548774234 +reaction_p10_secs = 60 +reaction_p50_secs = 60 +reaction_p90_secs = 60 +reaction_p99_secs = 60 +reaction_mean_secs = 60 +fire_decisiveness_mean = 1.9189399838134633 +fire_decisiveness_p50 = 1.5735964842503805 +step_correction_mean = -4.04998254776001 +step_correction_p50 = -4.04998254776001 + +[cell.spm_25.step_plus_10_at_15min] +shares_per_minute = 25 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.997 +convergence_rate_ci_low = 0.9936102764714508 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 0 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.09090908536290365 +settled_accuracy_p95_ci_low = 0.09090908536290365 +settled_accuracy_p95_ci_high = 0.09090908536290365 +settled_accuracy_p99 = 0.09090908536290365 +settled_accuracy_p99_ci_low = 0.09090908536290365 +settled_accuracy_p99_ci_high = 0.09090908536290365 +settled_accuracy_mean = 0.09082068047535392 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0 +reaction_rate = 0 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0 +fire_decisiveness_mean = 0.059104423355790914 +fire_decisiveness_p50 = 0.07928010325124646 + +[cell.spm_25.step_plus_25_at_15min] +shares_per_minute = 25 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.858 +convergence_rate_ci_low = 0.8363656482047647 +convergence_rate_ci_high = 0.8796343517952353 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 85.94405594405595 +settled_accuracy_p10 = 0.0625184012500073 +settled_accuracy_p10_ci_low = 0.06096405262795079 +settled_accuracy_p10_ci_high = 0.0642727879684225 +settled_accuracy_p50 = 0.20000003221225382 +settled_accuracy_p50_ci_low = 0.20000003221225382 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.20000003221225382 +settled_accuracy_mean = 0.17353265136054824 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00016181593437464886 +reaction_rate = 0.007 +reaction_rate_ci_low = 0.001832509158208406 +reaction_rate_ci_high = 0.012167490841791594 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 180 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 188.57142857142858 +fire_decisiveness_mean = 1.0533132037138744 +fire_decisiveness_p50 = 0.5407743452099858 +step_correction_mean = 0.8675651720591954 +step_correction_p50 = 0.808896541595459 + +[cell.spm_25.step_plus_50_at_15min] +shares_per_minute = 25 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.573 +convergence_rate_ci_low = 0.5423417529268224 +convergence_rate_ci_high = 0.6036582470731775 +convergence_p10_secs = 1200 +convergence_p10_secs_ci_low = 1140 +convergence_p10_secs_ci_high = 1200 +convergence_p50_secs = 1380 +convergence_p50_secs_ci_low = 1380 +convergence_p50_secs_ci_high = 1380 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1301.151832460733 +settled_accuracy_p10 = 0.041606063634771706 +settled_accuracy_p10_ci_low = 0.03438989229564293 +settled_accuracy_p10_ci_high = 0.04725466140401946 +settled_accuracy_p50 = 0.20666407119409302 +settled_accuracy_p50_ci_low = 0.2054339209892455 +settled_accuracy_p50_ci_high = 0.20790120072073126 +settled_accuracy_p90 = 0.22190342032401766 +settled_accuracy_p90_ci_low = 0.22094868489444808 +settled_accuracy_p90_ci_high = 0.22482498232128845 +settled_accuracy_p95 = 0.3277169179923427 +settled_accuracy_p95_ci_low = 0.23704479051341942 +settled_accuracy_p95_ci_high = 0.33333334824641403 +settled_accuracy_p99 = 0.4030815137361554 +settled_accuracy_p99_ci_low = 0.35579669808286085 +settled_accuracy_p99_ci_high = 0.42154486214094633 +settled_accuracy_mean = 0.1748694512490343 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.024960127591706537 +reaction_rate = 0.084 +reaction_rate_ci_low = 0.06680732509468058 +reaction_rate_ci_high = 0.10119267490531943 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 255 +fire_decisiveness_mean = 2.0548207032105292 +fire_decisiveness_p50 = 1.240812167609807 +step_correction_mean = 0.39856369367667605 +step_correction_p50 = 0.3960106074810028 + +[cell.spm_30.cold_start_10gh_to_1ph] +shares_per_minute = 30 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 600 +convergence_p90_secs = 600 +convergence_p90_secs_ci_low = 600 +convergence_p90_secs_ci_high = 600 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 600 +convergence_p99_secs = 720 +convergence_p99_secs_ci_low = 600 +convergence_p99_secs_ci_high = 840 +convergence_mean_secs = 603.24 +settled_accuracy_p10 = 0.010395028951099894 +settled_accuracy_p10_ci_low = 0.009286524721127454 +settled_accuracy_p10_ci_high = 0.010395028951099894 +settled_accuracy_p50 = 0.04976001534377095 +settled_accuracy_p50_ci_low = 0.04864788723509528 +settled_accuracy_p50_ci_high = 0.055200866563350326 +settled_accuracy_p90 = 0.12082367273261463 +settled_accuracy_p90_ci_low = 0.11425613078068209 +settled_accuracy_p90_ci_high = 0.12737188733146365 +settled_accuracy_p95 = 0.14163909778573625 +settled_accuracy_p95_ci_low = 0.13353999731967203 +settled_accuracy_p95_ci_high = 0.14819885510934339 +settled_accuracy_p99 = 0.17987497752691883 +settled_accuracy_p99_ci_low = 0.16130749812044853 +settled_accuracy_p99_ci_high = 0.20840866023795068 +settled_accuracy_mean = 0.05891130979659935 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0.05555555555555555 +jitter_p95_per_min_ci_low = 0.05555555555555555 +jitter_p95_per_min_ci_high = 0.05555555555555555 +jitter_p99_per_min = 0.05555555555555555 +jitter_p99_per_min_ci_low = 0.05555555555555555 +jitter_p99_per_min_ci_high = 0.07142857142857142 +jitter_mean_per_min = 0.004718650793650785 +bias_mean = -0.0001614883635753736 +bias_p10 = -0.0671221877487123 +bias_p10_ci_low = -0.07327247503522852 +bias_p10_ci_high = -0.061834719137868394 +bias_p50 = -0.00009984033070344505 +bias_p50_ci_low = -0.004009133036151023 +bias_p50_ci_high = 0.004321097424627021 +bias_p90 = 0.06795635093908381 +bias_p90_ci_low = 0.06122150658702295 +bias_p90_ci_high = 0.07271626616702445 +bias_p99 = 0.12862899178053802 +bias_p99_ci_low = 0.11501661196946862 +bias_p99_ci_high = 0.13173174542362312 +variance_mean = 0.0019885140504561725 +variance_p10 = 0.00044430255632621273 +variance_p10_ci_low = 0.0004087780898170425 +variance_p10_ci_high = 0.0004863583938863461 +variance_p50 = 0.0013102850309307898 +variance_p50_ci_low = 0.001223706105621627 +variance_p50_ci_high = 0.0014242303115849534 +variance_p90 = 0.00404932295339368 +variance_p90_ci_low = 0.00375326588851274 +variance_p90_ci_high = 0.004622262710426704 +variance_p99 = 0.010939561691893421 +variance_p99_ci_low = 0.009317835424238197 +variance_p99_ci_high = 0.012165571553084132 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.010395028951099894 +ramp_target_overshoot_p50_ci_low = 0.003850572448683698 +ramp_target_overshoot_p50_ci_high = 0.01697277145049303 +ramp_target_overshoot_p90 = 0.11537369470741243 +ramp_target_overshoot_p90_ci_low = 0.10225679730592807 +ramp_target_overshoot_p90_ci_high = 0.12851528817116997 +ramp_target_overshoot_p99 = 0.22034840104069753 +ramp_target_overshoot_p99_ci_low = 0.18754706428579615 +ramp_target_overshoot_p99_ci_high = 0.25481323233807074 +ramp_target_overshoot_mean = 0.03813694456425237 + +[cell.spm_30.stable_1ph] +shares_per_minute = 30 +scenario = "stable_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 1.86 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0 +settled_accuracy_p90_ci_low = 0 +settled_accuracy_p90_ci_high = 0 +settled_accuracy_p95 = 0 +settled_accuracy_p95_ci_low = 0 +settled_accuracy_p95_ci_high = 0 +settled_accuracy_p99 = 0 +settled_accuracy_p99_ci_low = 0 +settled_accuracy_p99_ci_high = 0 +settled_accuracy_mean = 0.00042273477885380894 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00017846153846153847 +bias_mean = -0.0006334228305396695 +bias_p10 = -0.04975052120541408 +bias_p10_ci_low = -0.054284311347142324 +bias_p10_ci_high = -0.0460430495809583 +bias_p50 = -0.0014331945784556476 +bias_p50_ci_low = -0.004866915014912351 +bias_p50_ci_high = 0.0016628022615503798 +bias_p90 = 0.04960151833312289 +bias_p90_ci_low = 0.04677380507465157 +bias_p90_ci_high = 0.05228959923606659 +bias_p99 = 0.09319505196167002 +bias_p99_ci_low = 0.0800275191556162 +bias_p99_ci_high = 0.10177359581861477 +variance_mean = 0.00030780367687757905 +variance_p10 = 0.00007437501438929804 +variance_p10_ci_low = 0.00006712630518241196 +variance_p10_ci_high = 0.00008140327610726455 +variance_p50 = 0.000205926158985222 +variance_p50_ci_low = 0.00019179282708237702 +variance_p50_ci_high = 0.00021896615826480972 +variance_p90 = 0.0005865136392525238 +variance_p90_ci_low = 0.0005460515462335658 +variance_p90_ci_high = 0.0006511583620527398 +variance_p99 = 0.001424536753563946 +variance_p99_ci_low = 0.001141034964063818 +variance_p99_ci_high = 0.0018647872096682087 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1 +upward_step_magnitude_p95 = 1 +upward_step_magnitude_p95_ci_low = 1 +upward_step_magnitude_p95_ci_high = 1 +upward_step_magnitude_p99 = 1 +upward_step_magnitude_p99_ci_low = 1 +upward_step_magnitude_p99_ci_high = 1 +upward_step_magnitude_mean = 1.002297621239521 +fire_decisiveness_mean = 2.2806232933324266 +fire_decisiveness_p50 = 0.5993349654767925 + +[cell.spm_30.step_minus_50_at_15min] +shares_per_minute = 30 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.379 +convergence_rate_ci_low = 0.34893082750722926 +convergence_rate_ci_high = 0.40906917249277075 +convergence_p10_secs = 1320 +convergence_p10_secs_ci_low = 1260 +convergence_p10_secs_ci_high = 1320 +convergence_p50_secs = 1440 +convergence_p50_secs_ci_low = 1440 +convergence_p50_secs_ci_high = 1440 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1411.3456464379947 +settled_accuracy_p10 = 0.013392849053842193 +settled_accuracy_p10_ci_low = 0.011076989235939472 +settled_accuracy_p10_ci_high = 0.014981047449926788 +settled_accuracy_p50 = 0.08651822498931461 +settled_accuracy_p50_ci_low = 0.08081236086235166 +settled_accuracy_p50_ci_high = 0.09107538667624626 +settled_accuracy_p90 = 0.20030204357902048 +settled_accuracy_p90_ci_low = 0.19304220657705795 +settled_accuracy_p90_ci_high = 0.21724112637934723 +settled_accuracy_p95 = 0.2938246892305908 +settled_accuracy_p95_ci_low = 0.24184739699141566 +settled_accuracy_p95_ci_high = 0.6400029501056999 +settled_accuracy_p99 = 0.6765442638999739 +settled_accuracy_p99_ci_low = 0.6693375771189909 +settled_accuracy_p99_ci_high = 0.680954792717158 +settled_accuracy_mean = 0.11262513155854102 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.09090909090909091 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.2 +jitter_p90_per_min = 0.2 +jitter_p90_per_min_ci_low = 0.09090909090909091 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.09090909090909091 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.09557312252964427 +reaction_rate = 0.126 +reaction_rate_ci_low = 0.10543176336192137 +reaction_rate_ci_high = 0.14656823663807864 +reaction_p10_secs = 240 +reaction_p10_secs_ci_low = 180 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 300 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 273.8095238095238 +fire_decisiveness_mean = 3.78464804752581 +fire_decisiveness_p50 = 1.6224071020801816 +step_correction_mean = 0.36779700054062736 +step_correction_p50 = 0.3649110198020935 + +[cell.spm_30.step_minus_25_at_15min] +shares_per_minute = 30 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.854 +convergence_rate_ci_low = 0.8321142499694436 +convergence_rate_ci_high = 0.8758857500305564 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 84.23887587822014 +settled_accuracy_p10 = 0.1214848489213951 +settled_accuracy_p10_ci_low = 0.12030695415149295 +settled_accuracy_p10_ci_high = 0.12381012629798605 +settled_accuracy_p50 = 0.33333330350717194 +settled_accuracy_p50_ci_low = 0.33333330350717194 +settled_accuracy_p50_ci_high = 0.33333330350717194 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.33333330350717194 +settled_accuracy_mean = 0.29101195602562197 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.0001310873697319263 +reaction_rate = 0.004 +reaction_rate_ci_low = 0.00008784785571930992 +reaction_rate_ci_high = 0.00791215214428069 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 180 +reaction_p10_secs_ci_high = 300 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 255 +fire_decisiveness_mean = 0.4579510639845081 +fire_decisiveness_p50 = 0.36788056900088506 +step_correction_mean = 0.7078607976436615 +step_correction_p50 = 0.7066534161567688 + +[cell.spm_30.step_minus_10_at_15min] +shares_per_minute = 30 +scenario = "step_minus_10_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 180 +convergence_mean_secs = 3.54 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.11111110282606607 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.11111110282606607 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.11111110282606607 +settled_accuracy_p99 = 0.11111110282606607 +settled_accuracy_p99_ci_low = 0.11111110282606607 +settled_accuracy_p99_ci_high = 0.11111110282606607 +settled_accuracy_mean = 0.111071484213201 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00012539571897418026 +reaction_rate = 0.001 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0.0029590197548774234 +reaction_p10_secs = 60 +reaction_p50_secs = 60 +reaction_p90_secs = 60 +reaction_p99_secs = 60 +reaction_mean_secs = 60 +fire_decisiveness_mean = 6.626147754943413 +fire_decisiveness_p50 = 1.4776599914355764 +step_correction_mean = 2.937786817550659 +step_correction_p50 = 2.937786817550659 + +[cell.spm_30.step_minus_5_at_15min] +shares_per_minute = 30 +scenario = "step_minus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 1.08 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.05263157522942574 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.05263157522942574 +settled_accuracy_p95 = 0.05263157522942574 +settled_accuracy_p95_ci_low = 0.05263157522942574 +settled_accuracy_p95_ci_high = 0.05263157522942574 +settled_accuracy_p99 = 0.05263157522942574 +settled_accuracy_p99_ci_low = 0.05263157522942574 +settled_accuracy_p99_ci_high = 0.05263157522942574 +settled_accuracy_mean = 0.05275180400990371 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.000041666666666666665 +reaction_rate = 0 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0 +fire_decisiveness_mean = 8.916000826692137 +fire_decisiveness_p50 = 3.932665838151749 + +[cell.spm_30.step_plus_5_at_15min] +shares_per_minute = 30 +scenario = "step_plus_5_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 1.68 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.047618983705838724 +settled_accuracy_p90_ci_low = 0.047618983705838724 +settled_accuracy_p90_ci_high = 0.047618983705838724 +settled_accuracy_p95 = 0.047618983705838724 +settled_accuracy_p95_ci_low = 0.047618983705838724 +settled_accuracy_p95_ci_high = 0.047618983705838724 +settled_accuracy_p99 = 0.047618983705838724 +settled_accuracy_p99_ci_low = 0.047618983705838724 +settled_accuracy_p99_ci_high = 0.047618983705838724 +settled_accuracy_mean = 0.047693897592376466 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00005263157894736842 +reaction_rate = 0 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0 +fire_decisiveness_mean = 4.969265232707938 +fire_decisiveness_p50 = 2.8216047604276753 + +[cell.spm_30.step_plus_10_at_15min] +shares_per_minute = 30 +scenario = "step_plus_10_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 0 +convergence_p99_secs = 0 +convergence_p99_secs_ci_low = 0 +convergence_p99_secs_ci_high = 0 +convergence_mean_secs = 2.28 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.09090908536290365 +settled_accuracy_p95_ci_low = 0.09090908536290365 +settled_accuracy_p95_ci_high = 0.09090908536290365 +settled_accuracy_p99 = 0.09090908536290365 +settled_accuracy_p99_ci_low = 0.09090908536290365 +settled_accuracy_p99_ci_high = 0.09090908536290365 +settled_accuracy_mean = 0.090781189775514 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.000043521782652217434 +reaction_rate = 0 +reaction_rate_ci_low = 0 +reaction_rate_ci_high = 0 +fire_decisiveness_mean = 4.376608796014528 +fire_decisiveness_p50 = 2.104183486896005 + +[cell.spm_30.step_plus_25_at_15min] +shares_per_minute = 30 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.813 +convergence_rate_ci_low = 0.7888330330906007 +convergence_rate_ci_high = 0.8371669669093992 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 104.87084870848709 +settled_accuracy_p10 = 0.06986483523539533 +settled_accuracy_p10_ci_low = 0.06879839488486594 +settled_accuracy_p10_ci_high = 0.0709288059797969 +settled_accuracy_p50 = 0.20000003221225382 +settled_accuracy_p50_ci_low = 0.20000003221225382 +settled_accuracy_p50_ci_high = 0.20000003221225382 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.20000003221225382 +settled_accuracy_mean = 0.1683757556726311 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.0001753788969452661 +reaction_rate = 0.006 +reaction_rate_ci_low = 0.0012134247733896417 +reaction_rate_ci_high = 0.010786575226610359 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 200 +fire_decisiveness_mean = 0.6381268199033793 +fire_decisiveness_p50 = 0.42340668127940795 +step_correction_mean = 1.5561971366405487 +step_correction_p50 = 0.7450991272926331 + +[cell.spm_30.step_plus_50_at_15min] +shares_per_minute = 30 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.614 +convergence_rate_ci_low = 0.5838259289057641 +convergence_rate_ci_high = 0.6441740710942359 +convergence_p10_secs = 1200 +convergence_p10_secs_ci_low = 1200 +convergence_p10_secs_ci_high = 1200 +convergence_p50_secs = 1380 +convergence_p50_secs_ci_low = 1380 +convergence_p50_secs_ci_high = 1380 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1345.114006514658 +settled_accuracy_p10 = 0.014281660910366645 +settled_accuracy_p10_ci_low = 0.012358499843099446 +settled_accuracy_p10_ci_high = 0.017699291625681735 +settled_accuracy_p50 = 0.15514674426718056 +settled_accuracy_p50_ci_low = 0.13238592320902764 +settled_accuracy_p50_ci_high = 0.1805788560014696 +settled_accuracy_p90 = 0.2239309133042069 +settled_accuracy_p90_ci_low = 0.2230762148203035 +settled_accuracy_p90_ci_high = 0.22468906450333936 +settled_accuracy_p95 = 0.2273488124549755 +settled_accuracy_p95_ci_low = 0.22551316134554522 +settled_accuracy_p95_ci_high = 0.2300868540805454 +settled_accuracy_p99 = 0.34282884976034533 +settled_accuracy_p99_ci_low = 0.30335613215292123 +settled_accuracy_p99_ci_high = 0.3626821569432932 +settled_accuracy_mean = 0.13686293408361613 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.05263157894736842 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.08695652173913043 +jitter_p90_per_min_ci_high = 0.12 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.08695652173913043 +jitter_p95_per_min_ci_high = 0.12 +jitter_p99_per_min = 0.12 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.12 +jitter_mean_per_min = 0.046632341723874905 +reaction_rate = 0.145 +reaction_rate_ci_low = 0.12317656397356272 +reaction_rate_ci_high = 0.16682343602643726 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 180 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 300 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 269.7931034482759 +fire_decisiveness_mean = 2.2442313112140475 +fire_decisiveness_p50 = 1.3237293994484673 +step_correction_mean = 0.3745687264820625 +step_correction_p50 = 0.36843341588974 + +[derived.operational_fitness.spm_6] +score = 0.5302489486182765 +reaction_10_component = 0.001 +reaction_50_component = 0.01 +jitter_component = 0.9998333333333334 +step_safety_component = 1 +convergence_component = 0 +overshoot_component = 0.2914061528494323 + +[derived.operational_fitness.spm_8] +score = 0.5473800236773497 +reaction_10_component = 0.002 +reaction_50_component = 0.007 +jitter_component = 1 +step_safety_component = 1 +convergence_component = 0 +overshoot_component = 0.463800236773497 + +[derived.operational_fitness.spm_10] +score = 0.5623776543640161 +reaction_10_component = 0 +reaction_50_component = 0.023 +jitter_component = 0.9993080808080808 +step_safety_component = 1 +convergence_component = 0 +overshoot_component = 0.6025063416199583 + +[derived.operational_fitness.spm_12] +score = 0.5594655617674277 +reaction_10_component = 0 +reaction_50_component = 0.039 +jitter_component = 0.9996329365079365 +step_safety_component = 1 +convergence_component = 0 +overshoot_component = 0.5565732764044358 + +[derived.operational_fitness.spm_15] +score = 0.560885392367234 +reaction_10_component = 0.001 +reaction_50_component = 0.03 +jitter_component = 0.9995658263305323 +step_safety_component = 1 +convergence_component = 0 +overshoot_component = 0.5784393578460094 + +[derived.operational_fitness.spm_20] +score = 0.5632874089072658 +reaction_10_component = 0 +reaction_50_component = 0.054 +jitter_component = 1 +step_safety_component = 1 +convergence_component = 0 +overshoot_component = 0.5788740890726569 + +[derived.operational_fitness.spm_25] +score = 0.5845263622982129 +reaction_10_component = 0.001 +reaction_50_component = 0.072 +jitter_component = 1 +step_safety_component = 1 +convergence_component = 0 +overshoot_component = 0.7717636229821287 + +[derived.operational_fitness.spm_30] +score = 0.5905664419472122 +reaction_10_component = 0.001 +reaction_50_component = 0.126 +jitter_component = 0.9994051282051282 +step_safety_component = 1 +convergence_component = 0 +overshoot_component = 0.7796515989593025 + +[derived.decoupling_score.spm_6] +score = 0.01 +score_ci_low = 0.003833003972759509 +score_ci_high = 0.01616699602724049 + +[derived.decoupling_score.spm_8] +score = 0.007 +score_ci_low = 0.001832509158208406 +score_ci_high = 0.012167490841791594 + +[derived.decoupling_score.spm_10] +score = 0.023 +score_ci_low = 0.013708897073005811 +score_ci_high = 0.03229110292699419 + +[derived.decoupling_score.spm_12] +score = 0.039 +score_ci_low = 0.0270008614309193 +score_ci_high = 0.0509991385690807 + +[derived.decoupling_score.spm_15] +score = 0.03 +score_ci_low = 0.019426894495939234 +score_ci_high = 0.040573105504060764 + +[derived.decoupling_score.spm_20] +score = 0.054 +score_ci_low = 0.03999127791695474 +score_ci_high = 0.06800872208304526 + +[derived.decoupling_score.spm_25] +score = 0.072 +score_ci_low = 0.05597875330693644 +score_ci_high = 0.08802124669306355 + +[derived.decoupling_score.spm_30] +score = 0.126 +score_ci_low = 0.10543176336192137 +score_ci_high = 0.14656823663807864 + +[derived.reaction_asymmetry.spm_6] +asymmetry_at_5 = 0.001 +asymmetry_at_5_ci_low = 0 +asymmetry_at_5_ci_high = 0.0029590197548774234 +asymmetry_at_10 = 0.001 +asymmetry_at_10_ci_low = -0.0029590197548774234 +asymmetry_at_10_ci_high = 0.00476908533635206 +asymmetry_at_25 = -0.002 +asymmetry_at_25_ci_low = -0.00791215214428069 +asymmetry_at_25_ci_high = 0.00468123748063275 +asymmetry_at_50 = 0.006 +asymmetry_at_50_ci_low = -0.007944023119902568 +asymmetry_at_50_ci_high = 0.01994402311990257 +max_abs_asymmetry = 0.006 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.01994402311990257 + +[derived.reaction_asymmetry.spm_8] +asymmetry_at_5 = 0 +asymmetry_at_5_ci_low = -0.0029590197548774234 +asymmetry_at_5_ci_high = 0.0029590197548774234 +asymmetry_at_10 = -0.001 +asymmetry_at_10_ci_low = -0.00476908533635206 +asymmetry_at_10_ci_high = 0.0029590197548774234 +asymmetry_at_25 = 0 +asymmetry_at_25_ci_low = -0.00476908533635206 +asymmetry_at_25_ci_high = 0.00476908533635206 +asymmetry_at_50 = 0.011 +asymmetry_at_50_ci_low = -0.0024078865604449176 +asymmetry_at_50_ci_high = 0.024407886560444916 +max_abs_asymmetry = 0.011 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.024407886560444916 + +[derived.reaction_asymmetry.spm_10] +asymmetry_at_5 = 0.001 +asymmetry_at_5_ci_low = 0 +asymmetry_at_5_ci_high = 0.0029590197548774234 +asymmetry_at_10 = 0 +asymmetry_at_10_ci_low = 0 +asymmetry_at_10_ci_high = 0 +asymmetry_at_25 = 0 +asymmetry_at_25_ci_low = -0.00782430428856138 +asymmetry_at_25_ci_high = 0.00782430428856138 +asymmetry_at_50 = -0.0010000000000000009 +asymmetry_at_50_ci_low = -0.019382630059440093 +asymmetry_at_50_ci_high = 0.017382630059440088 +max_abs_asymmetry = 0.0010000000000000009 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.01938263005944009 + +[derived.reaction_asymmetry.spm_12] +asymmetry_at_5 = 0 +asymmetry_at_5_ci_low = 0 +asymmetry_at_5_ci_high = 0 +asymmetry_at_10 = 0.003 +asymmetry_at_10_ci_low = 0 +asymmetry_at_10_ci_high = 0.006389723528549194 +asymmetry_at_25 = 0 +asymmetry_at_25_ci_low = -0.00476908533635206 +asymmetry_at_25_ci_high = 0.00476908533635206 +asymmetry_at_50 = -0.0030000000000000027 +asymmetry_at_50_ci_low = -0.02654551836536317 +asymmetry_at_50_ci_high = 0.02054551836536317 +max_abs_asymmetry = 0.0030000000000000027 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.026545518365363174 + +[derived.reaction_asymmetry.spm_15] +asymmetry_at_5 = 0.001 +asymmetry_at_5_ci_low = 0 +asymmetry_at_5_ci_high = 0.0029590197548774234 +asymmetry_at_10 = 0.002 +asymmetry_at_10_ci_low = -0.0029590197548774234 +asymmetry_at_10_ci_high = 0.006389723528549194 +asymmetry_at_25 = 0 +asymmetry_at_25_ci_low = -0.0029590197548774234 +asymmetry_at_25_ci_high = 0.0029590197548774234 +asymmetry_at_50 = 0.015 +asymmetry_at_50_ci_low = -0.008421948253507117 +asymmetry_at_50_ci_high = 0.038421948253507116 +max_abs_asymmetry = 0.015 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.038421948253507116 + +[derived.reaction_asymmetry.spm_20] +asymmetry_at_5 = 0.001 +asymmetry_at_5_ci_low = -0.0029590197548774234 +asymmetry_at_5_ci_high = 0.00476908533635206 +asymmetry_at_10 = 0 +asymmetry_at_10_ci_low = 0 +asymmetry_at_10_ci_high = 0 +asymmetry_at_25 = 0.002 +asymmetry_at_25_ci_low = -0.005761446301095504 +asymmetry_at_25_ci_high = 0.00937172277254631 +asymmetry_at_50 = 0.025 +asymmetry_at_50_ci_low = -0.005727303793226293 +asymmetry_at_50_ci_high = 0.055727303793226296 +max_abs_asymmetry = 0.025 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.055727303793226296 + +[derived.reaction_asymmetry.spm_25] +asymmetry_at_5 = 0.001 +asymmetry_at_5_ci_low = 0 +asymmetry_at_5_ci_high = 0.0029590197548774234 +asymmetry_at_10 = -0.001 +asymmetry_at_10_ci_low = -0.0029590197548774234 +asymmetry_at_10_ci_high = 0 +asymmetry_at_25 = 0.005 +asymmetry_at_25_ci_low = -0.002936576178143654 +asymmetry_at_25_ci_high = 0.012167490841791594 +asymmetry_at_50 = 0.01200000000000001 +asymmetry_at_50_ci_low = -0.021213921598382965 +asymmetry_at_50_ci_high = 0.045213921598382986 +max_abs_asymmetry = 0.01200000000000001 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.045213921598382986 + +[derived.reaction_asymmetry.spm_30] +asymmetry_at_5 = 0 +asymmetry_at_5_ci_low = 0 +asymmetry_at_5_ci_high = 0 +asymmetry_at_10 = -0.001 +asymmetry_at_10_ci_low = -0.0029590197548774234 +asymmetry_at_10_ci_high = 0 +asymmetry_at_25 = 0.002 +asymmetry_at_25_ci_low = -0.006698727370891049 +asymmetry_at_25_ci_high = 0.010698727370891049 +asymmetry_at_50 = 0.01899999999999999 +asymmetry_at_50_ci_low = -0.023391672664515917 +asymmetry_at_50_ci_high = 0.061391672664515895 +max_abs_asymmetry = 0.01899999999999999 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.061391672664515895 + diff --git a/sv2/channels-sv2/sim/baseline_SlidingWindow-10t.md b/sv2/channels-sv2/sim/baseline_SlidingWindow-10t.md new file mode 100644 index 0000000000..2aa2ce5bcd --- /dev/null +++ b/sv2/channels-sv2/sim/baseline_SlidingWindow-10t.md @@ -0,0 +1,227 @@ +# Vardiff baseline characterization — `SlidingWindow-10t` + +*Generated by `cargo run --release --bin generate-baseline` from the vardiff_sim crate. 1000 trials per cell, base seed `0xdeadbeefcafef00d`.* + +## Summary + +Headline per-metric values at each share rate's best and worst cells. ↑ = higher is better; ↓ = lower is better; ↔ = near-zero is better. Where a `(floor: X.X%)` annotation appears, it's the Poisson-noise lower bound on that metric at that share rate — the algorithm cannot do better than this without exotic estimation techniques. + +| Metric | Dir | Best | Worst | +| --- | :-: | --- | --- | +| cold-start convergence rate | ↑ | 100.0% @ SPM=6 | 100.0% @ SPM=6 | +| cold-start p90 time | ↓ | 1m @ SPM=6 | 6m @ SPM=20 | +| settled accuracy p50 (stable) | ↓ | 0.0% @ SPM=6 (floor: 8.7%) | 0.0% @ SPM=6 (floor: 8.7%) | +| settled accuracy p99 (stable) | ↓ | 16.3% @ SPM=30 (floor: 14.9%) | 41.7% @ SPM=6 (floor: 33.3%) | +| stable-load jitter (mean) | ↓ | 0.001/min @ SPM=30 (floor: 0.020/min) | 0.003/min @ SPM=6 (floor: 0.020/min) | +| reaction rate at −50% step | ↑ | 97.2% @ SPM=30 | 40.5% @ SPM=6 | +| reaction rate at +50% step | ↑ | 93.5% @ SPM=30 | 39.2% @ SPM=6 | +| ramp target overshoot p99 (cold start) | ↓ | 45.6% @ SPM=25 (floor: 46.5%) | 100.0% @ SPM=30 (floor: 42.5%) | +| upward step magnitude p95 (stable) | ↓ | 1.147 @ SPM=30 | 1.476 @ SPM=6 | +| operational fitness | ↑ | 0.707 @ SPM=25 | 0.485 @ SPM=6 | +| decoupling score | ↑ | 0.972 @ SPM=30 | 0.405 @ SPM=6 | +| max |reaction asymmetry| | ↓ | 0.034 @ SPM=10 | 0.108 @ SPM=12 | + +## Convergence time (cold start: 10 GH/s → 1 PH/s) + +| share/min | rate | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 100.0% | 1m | 1m | 1m | 1m | 1m01s | +| 8 | 100.0% | 1m | 1m | 1m | 5m | 1m04s | +| 10 | 100.0% | 1m | 1m | 1m | 6m | 1m07s | +| 12 | 100.0% | 1m | 1m | 1m | 8m | 1m15s | +| 15 | 100.0% | 1m | 1m | 1m | 10m | 1m35s | +| 20 | 100.0% | 1m | 1m | 6m | 9m | 2m23s | +| 25 | 100.0% | 1m | 1m | 1m | 9m | 1m30s | +| 30 | 100.0% | 1m | 2m | 4m | 9m | 2m19s | + +## Settled accuracy (stable load, post-convergence) + +`|final_hashrate / true_hashrate - 1|` at trial end. Smaller is better. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.0% | 0.0% | 28.3% | 41.7% | 6.1% | +| 8 | 0.0% | 0.0% | 25.0% | 32.5% | 4.3% | +| 10 | 0.0% | 0.0% | 22.0% | 30.0% | 3.7% | +| 12 | 0.0% | 0.0% | 20.0% | 27.0% | 3.0% | +| 15 | 0.0% | 0.0% | 18.0% | 24.0% | 2.5% | +| 20 | 0.0% | 0.0% | 6.7% | 20.0% | 1.8% | +| 25 | 0.0% | 0.0% | 3.0% | 18.7% | 1.5% | +| 30 | 0.0% | 0.0% | 0.0% | 16.3% | 0.9% | + +## Steady-state jitter (fires per minute) + +Post-convergence rate of vardiff fires. Smaller is better — ideal is zero under stable load. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.000 | 0.000 | 0.000 | 0.100 | 0.003 | +| 8 | 0.000 | 0.000 | 0.000 | 0.071 | 0.002 | +| 10 | 0.000 | 0.000 | 0.000 | 0.083 | 0.002 | +| 12 | 0.000 | 0.000 | 0.000 | 0.071 | 0.001 | +| 15 | 0.000 | 0.000 | 0.000 | 0.045 | 0.001 | +| 20 | 0.000 | 0.000 | 0.000 | 0.062 | 0.001 | +| 25 | 0.000 | 0.000 | 0.000 | 0.043 | 0.001 | +| 30 | 0.000 | 0.000 | 0.000 | 0.000 | 0.001 | + +## Reaction time to a 50% drop (step at 15 min) + +| share/min | reacted | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 40.5% | 3m | 4m | 5m | 5m | 4m04s | +| 8 | 51.5% | 3m | 4m | 5m | 5m | 4m06s | +| 10 | 59.5% | 2m | 4m | 5m | 5m | 3m54s | +| 12 | 68.5% | 2m | 4m | 5m | 5m | 4m | +| 15 | 75.4% | 3m | 4m | 5m | 5m | 3m58s | +| 20 | 86.7% | 3m | 4m | 5m | 5m | 3m57s | +| 25 | 94.1% | 2m | 4m | 5m | 5m | 3m44s | +| 30 | 97.2% | 2m | 4m | 5m | 5m | 3m36s | + +## Reaction sensitivity (P[fire within 5 min of step change]) + +| Δ% | 6 | 8 | 10 | 12 | 15 | 20 | 25 | 30 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| -50% | 0.41 | 0.52 | 0.59 | 0.69 | 0.75 | 0.87 | 0.94 | 0.97 | +| -25% | 0.10 | 0.12 | 0.14 | 0.16 | 0.18 | 0.21 | 0.25 | 0.30 | +| -10% | 0.04 | 0.05 | 0.06 | 0.05 | 0.04 | 0.04 | 0.05 | 0.03 | +| -5% | 0.05 | 0.04 | 0.03 | 0.03 | 0.02 | 0.02 | 0.02 | 0.02 | +| +5% | 0.05 | 0.07 | 0.05 | 0.04 | 0.04 | 0.02 | 0.01 | 0.03 | +| +10% | 0.07 | 0.07 | 0.06 | 0.04 | 0.06 | 0.07 | 0.05 | 0.05 | +| +25% | 0.13 | 0.17 | 0.17 | 0.19 | 0.20 | 0.23 | 0.30 | 0.34 | +| +50% | 0.39 | 0.49 | 0.56 | 0.58 | 0.71 | 0.81 | 0.88 | 0.94 | + +## Estimator bias + +`E[H̃ − H_true] / H_true` averaged over post-settle ticks. Positive = systematic over-estimate. Populated only for algorithms that expose introspection (e.g. ClassicComposed, Parametric, EWMA-60s). + +### Bias — stable load + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | -10.2% | -0.3% | 9.3% | 21.8% | -0.2% | +| 8 | -8.9% | -0.2% | 7.6% | 16.6% | -0.4% | +| 10 | -7.9% | -0.1% | 8.2% | 14.6% | 0.0% | +| 12 | -7.4% | -0.4% | 7.1% | 13.0% | -0.2% | +| 15 | -6.3% | -0.1% | 6.4% | 11.6% | 0.1% | +| 20 | -5.6% | -0.2% | 5.3% | 10.0% | -0.1% | +| 25 | -5.0% | -0.0% | 4.9% | 9.0% | -0.1% | +| 30 | -4.5% | -0.1% | 4.5% | 7.8% | -0.0% | + +### Bias — cold start + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | -9.6% | -0.2% | 9.6% | 20.2% | 0.1% | +| 8 | -8.6% | 0.6% | 10.2% | 18.4% | 0.7% | +| 10 | -8.4% | 0.6% | 9.6% | 17.2% | 0.5% | +| 12 | -7.5% | 1.3% | 9.5% | 17.1% | 1.1% | +| 15 | -6.9% | 0.1% | 7.4% | 14.7% | 0.3% | +| 20 | -5.8% | 0.2% | 5.8% | 11.3% | 0.1% | +| 25 | -6.1% | 1.2% | 7.3% | 11.4% | 0.9% | +| 30 | -5.0% | 0.2% | 5.2% | 9.2% | 0.2% | + +## Estimator variance + +Population variance of `H̃ / H_true` over post-settle ticks (dimensionless). Populated only for algorithms that expose introspection. + +### Variance — stable load + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.003 | 0.008 | 0.028 | 0.081 | 0.013 | +| 8 | 0.002 | 0.005 | 0.018 | 0.056 | 0.009 | +| 10 | 0.002 | 0.004 | 0.016 | 0.053 | 0.008 | +| 12 | 0.001 | 0.003 | 0.011 | 0.035 | 0.005 | +| 15 | 0.001 | 0.003 | 0.010 | 0.024 | 0.005 | +| 20 | 0.001 | 0.002 | 0.006 | 0.019 | 0.003 | +| 25 | 0.001 | 0.002 | 0.005 | 0.016 | 0.003 | +| 30 | 0.001 | 0.001 | 0.004 | 0.010 | 0.002 | + +### Variance — cold start + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.003 | 0.008 | 0.028 | 0.076 | 0.013 | +| 8 | 0.002 | 0.006 | 0.020 | 0.048 | 0.009 | +| 10 | 0.002 | 0.006 | 0.018 | 0.040 | 0.008 | +| 12 | 0.002 | 0.005 | 0.017 | 0.046 | 0.008 | +| 15 | 0.001 | 0.004 | 0.013 | 0.034 | 0.006 | +| 20 | 0.001 | 0.002 | 0.009 | 0.024 | 0.004 | +| 25 | 0.001 | 0.003 | 0.010 | 0.027 | 0.005 | +| 30 | 0.001 | 0.002 | 0.006 | 0.013 | 0.003 | + +## Ramp target overshoot (cold start) + +`max(new_hashrate on fires) / H_true − 1`: how far the algorithm's actual *target* (not its belief) climbs past truth during the cold-start ramp. Reads `new_hashrate` (the actual target the algorithm set), so it's unaffected by estimator-belief noise. Works for any algorithm that fires, including those without introspection. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.0% | 11.1% | 14.2% | 55.6% | 9.0% | +| 8 | 7.1% | 7.1% | 7.1% | 54.0% | 9.5% | +| 10 | 0.0% | 20.0% | 20.0% | 70.0% | 12.7% | +| 12 | 0.0% | 25.0% | 25.0% | 58.3% | 14.7% | +| 15 | 0.0% | 33.3% | 33.3% | 58.1% | 18.3% | +| 20 | 0.0% | 50.0% | 50.0% | 50.0% | 26.0% | +| 25 | 20.0% | 20.0% | 20.0% | 45.6% | 20.6% | +| 30 | 0.0% | 30.0% | 100.0% | 100.0% | 50.1% | + +## Upward step magnitude (stable load) + +`new_hashrate / old_hashrate` for upward difficulty adjustments during steady-state. Per-trial p95 of ratios, then distribution across trials. Values near 1.0 indicate gentle retargeting; values >> 1.0 indicate aggressive jumps. + +| share/min | p50 | p90 | p95 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 1.000 | 1.317 | 1.476 | 2.333 | 715828.988 | +| 8 | 1.000 | 1.263 | 1.325 | 1.792 | 1.055 | +| 10 | 1.000 | 1.240 | 1.350 | 1.800 | 1.061 | +| 12 | 1.000 | 1.200 | 1.250 | 2.000 | 1.043 | +| 15 | 1.000 | 1.173 | 1.220 | 1.578 | 1.034 | +| 20 | 1.000 | 1.000 | 1.185 | 1.438 | 1.023 | +| 25 | 1.000 | 1.000 | 1.168 | 1.640 | 1.022 | +| 30 | 1.000 | 1.000 | 1.147 | 1.333 | 1.014 | + +## Operational fitness (per share rate) + +`0.15×react(-10%) + 0.1×react(-50%) + 0.25×jitter + 0.25×step_safety + 0.15×convergence + 0.1×overshoot`. Higher is better. + +| share/min | fitness | react-10% | react-50% | jitter | step-safe | conv | overshoot | +| --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.485 | 0.041 | 0.405 | 0.989 | 0.048 | 0.900 | 0.444 | +| 8 | 0.576 | 0.050 | 0.515 | 0.994 | 0.350 | 0.900 | 0.460 | +| 10 | 0.556 | 0.056 | 0.595 | 0.992 | 0.300 | 0.900 | 0.300 | +| 12 | 0.627 | 0.050 | 0.685 | 0.996 | 0.500 | 0.900 | 0.417 | +| 15 | 0.647 | 0.039 | 0.754 | 0.997 | 0.560 | 0.900 | 0.419 | +| 20 | 0.684 | 0.037 | 0.867 | 0.996 | 0.630 | 0.900 | 0.500 | +| 25 | 0.707 | 0.054 | 0.941 | 0.997 | 0.664 | 0.900 | 0.544 | +| 30 | 0.648 | 0.031 | 0.972 | 0.998 | 0.707 | 0.800 | 0.000 | + +## Decoupling score (per share rate) + +`reaction_rate(Step−50) × clamp(1 − jitter_p50 / J_max, 0, 1)` where `J_max = 0.50` fires/min. Higher is better. Score of 1.0 = perfect decoupling between reactivity and jitter. + +| share/min | decoupling score | +| --- | --- | +| 6 | 0.405 | +| 8 | 0.515 | +| 10 | 0.595 | +| 12 | 0.685 | +| 15 | 0.754 | +| 20 | 0.867 | +| 25 | 0.941 | +| 30 | 0.972 | + +## Reaction asymmetry (per share rate) + +`reaction_rate(+δ%) − reaction_rate(−δ%)`. Positive = responds faster to up-steps; negative = responds faster to down-steps; near zero = symmetric. + +| share/min | δ=5% | δ=10% | δ=25% | δ=50% | +| --- | --- | --- | --- | --- | +| 6 | +0.00 | +0.03 | +0.04 | -0.01 | +| 8 | +0.03 | +0.02 | +0.05 | -0.03 | +| 10 | +0.02 | +0.01 | +0.02 | -0.03 | +| 12 | +0.02 | -0.01 | +0.04 | -0.11 | +| 15 | +0.02 | +0.02 | +0.02 | -0.05 | +| 20 | -0.01 | +0.03 | +0.02 | -0.06 | +| 25 | -0.00 | -0.01 | +0.04 | -0.06 | +| 30 | +0.01 | +0.02 | +0.05 | -0.04 | + diff --git a/sv2/channels-sv2/sim/baseline_SlidingWindow-10t.toml b/sv2/channels-sv2/sim/baseline_SlidingWindow-10t.toml new file mode 100644 index 0000000000..411383e7fe --- /dev/null +++ b/sv2/channels-sv2/sim/baseline_SlidingWindow-10t.toml @@ -0,0 +1,6582 @@ +# Vardiff baseline characterization. Regenerate with +# `cargo run --release --bin generate-baseline` from the sim crate. + +[meta] +algorithm = "SlidingWindow-10t" +trial_count = 1000 +base_seed = 16045690984503111693 +quiet_window_secs = 300 +settle_buffer_secs = 120 +min_settled_window_secs = 600 +react_window_secs = 300 +step_event_at_secs = 900 +trial_duration_secs = 1800 + +[cell.spm_6.cold_start_10gh_to_1ph] +shares_per_minute = 6 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 60 +convergence_p10_secs_ci_low = 60 +convergence_p10_secs_ci_high = 60 +convergence_p50_secs = 60 +convergence_p50_secs_ci_low = 60 +convergence_p50_secs_ci_high = 60 +convergence_p90_secs = 60 +convergence_p90_secs_ci_low = 60 +convergence_p90_secs_ci_high = 60 +convergence_p95_secs = 60 +convergence_p95_secs_ci_low = 60 +convergence_p95_secs_ci_high = 60 +convergence_p99_secs = 60 +convergence_p99_secs_ci_low = 60 +convergence_p99_secs_ci_high = 60 +convergence_mean_secs = 61.44 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0.11111114093727337 +settled_accuracy_p50_ci_low = 0.11111114093727337 +settled_accuracy_p50_ci_high = 0.11111114093727337 +settled_accuracy_p90 = 0.26666774488242906 +settled_accuracy_p90_ci_low = 0.24074036915647046 +settled_accuracy_p90_ci_high = 0.28333288929634404 +settled_accuracy_p95 = 0.3076142187846973 +settled_accuracy_p95_ci_low = 0.2962961073972692 +settled_accuracy_p95_ci_high = 0.31666787574471544 +settled_accuracy_p99 = 0.4629642616437739 +settled_accuracy_p99_ci_low = 0.3666672013006236 +settled_accuracy_p99_ci_high = 0.5277788086445077 +settled_accuracy_mean = 0.10169243490490426 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.037037037037037035 +jitter_p90_per_min_ci_low = 0.037037037037037035 +jitter_p90_per_min_ci_high = 0.037037037037037035 +jitter_p95_per_min = 0.07407407407407407 +jitter_p95_per_min_ci_low = 0.07407407407407407 +jitter_p95_per_min_ci_high = 0.07407407407407407 +jitter_p99_per_min = 0.07407407407407407 +jitter_p99_per_min_ci_low = 0.07407407407407407 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.013468478260869608 +bias_mean = 0.0012333702325540072 +bias_p10 = -0.09649088487308577 +bias_p10_ci_low = -0.10350842002035596 +bias_p10_ci_high = -0.09122771673541694 +bias_p50 = -0.0017538583950464954 +bias_p50_ci_low = -0.0071449201349584575 +bias_p50_ci_high = 0.006140747231567705 +bias_p90 = 0.09649176082037465 +bias_p90_ci_low = 0.08966920518192474 +bias_p90_ci_high = 0.10526386783588629 +bias_p99 = 0.2017553460926194 +bias_p99_ci_low = 0.16959149410537455 +bias_p99_ci_high = 0.23476559274387027 +variance_mean = 0.013291965648696955 +variance_p10 = 0.0030363400075462837 +variance_p10_ci_low = 0.002787203947408747 +variance_p10_ci_high = 0.0032271607511882624 +variance_p50 = 0.008262567822038535 +variance_p50_ci_low = 0.007871383497253644 +variance_p50_ci_high = 0.008887513119625712 +variance_p90 = 0.028263615741659188 +variance_p90_ci_low = 0.024307602700000094 +variance_p90_ci_high = 0.03394438772150005 +variance_p99 = 0.07575292882002128 +variance_p99_ci_low = 0.06542855219748614 +variance_p99_ci_high = 0.09039264273301768 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.11111114093727337 +ramp_target_overshoot_p50_ci_low = 0.11111114093727337 +ramp_target_overshoot_p50_ci_high = 0.11111114093727337 +ramp_target_overshoot_p90 = 0.14197571585193924 +ramp_target_overshoot_p90_ci_low = 0.11111114093727337 +ramp_target_overshoot_p90_ci_high = 0.26666774488242906 +ramp_target_overshoot_p99 = 0.5555571810813935 +ramp_target_overshoot_p99_ci_low = 0.44444597303525546 +ramp_target_overshoot_p99_ci_high = 0.6666683891275318 +ramp_target_overshoot_mean = 0.0896383886463614 + +[cell.spm_6.stable_1ph] +shares_per_minute = 6 +scenario = "stable_1ph" +convergence_rate = 0.896 +convergence_rate_ci_low = 0.8770797554349845 +convergence_rate_ci_high = 0.9149202445650155 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 720 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 151.80803571428572 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0.2833346341268308 +settled_accuracy_p90_ci_low = 0.26666774488242906 +settled_accuracy_p90_ci_high = 0.3000012549357731 +settled_accuracy_p95 = 0.31666787574471544 +settled_accuracy_p95_ci_low = 0.3000012549357731 +settled_accuracy_p95_ci_high = 0.33333328859409006 +settled_accuracy_p99 = 0.41666733216290996 +settled_accuracy_p99_ci_low = 0.3777775436424048 +settled_accuracy_p99_ci_high = 0.48833731814588144 +settled_accuracy_mean = 0.06137433254361851 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.07692307692307693 +jitter_p99_per_min_ci_high = 0.125 +jitter_mean_per_min = 0.0032761900408959225 +bias_mean = -0.0019162863427748648 +bias_p10 = -0.10165643786872855 +bias_p10_ci_low = -0.10964883877169034 +bias_p10_ci_high = -0.09473654965189414 +bias_p50 = -0.002631045431892681 +bias_p50_ci_low = -0.008111284257084336 +bias_p50_ci_high = 0.002632218071005199 +bias_p90 = 0.0929830056088989 +bias_p90_ci_low = 0.08508842117455777 +bias_p90_ci_high = 0.10175511615645605 +bias_p99 = 0.21750718477220451 +bias_p99_ci_low = 0.17319811523410827 +bias_p99_ci_high = 0.27579630239973635 +variance_mean = 0.012918022853213189 +variance_p10 = 0.0025838703519255025 +variance_p10_ci_low = 0.002397680119469694 +variance_p10_ci_high = 0.002787004249501964 +variance_p50 = 0.007568500039396703 +variance_p50_ci_low = 0.007014468726869435 +variance_p50_ci_high = 0.008004608007477357 +variance_p90 = 0.027618979144407696 +variance_p90_ci_low = 0.0253086321305337 +variance_p90_ci_high = 0.03189712624268219 +variance_p99 = 0.08118801060812901 +variance_p99_ci_low = 0.07193473650006303 +variance_p99_ci_high = 0.10328546799598466 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1.3166678757447154 +upward_step_magnitude_p90_ci_low = 1.3000012549357731 +upward_step_magnitude_p90_ci_high = 1.3500013857980597 +upward_step_magnitude_p95 = 1.476191228011432 +upward_step_magnitude_p95_ci_low = 1.3666672013006236 +upward_step_magnitude_p95_ci_high = 1.5666688635961787 +upward_step_magnitude_p99 = 2.333335624854652 +upward_step_magnitude_p99_ci_low = 2 +upward_step_magnitude_p99_ci_high = 2.5 +upward_step_magnitude_mean = 715828.9880843011 +fire_decisiveness_mean = 226969762.2131846 +fire_decisiveness_p50 = 2.964950663563556 + +[cell.spm_6.step_minus_50_at_15min] +shares_per_minute = 6 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.967 +convergence_rate_ci_low = 0.9559279948699434 +convergence_rate_ci_high = 0.9780720051300565 +convergence_p10_secs = 1080 +convergence_p10_secs_ci_low = 1080 +convergence_p10_secs_ci_high = 1080 +convergence_p50_secs = 1260 +convergence_p50_secs_ci_low = 1260 +convergence_p50_secs_ci_high = 1260 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1245.4188210961738 +settled_accuracy_p10 = 0.20000045634028107 +settled_accuracy_p10_ci_low = 0.20000045634028107 +settled_accuracy_p10_ci_high = 0.21888844768538507 +settled_accuracy_p50 = 0.33333328859409006 +settled_accuracy_p50_ci_low = 0.33333328859409006 +settled_accuracy_p50_ci_high = 0.33333328859409006 +settled_accuracy_p90 = 0.4000004429185082 +settled_accuracy_p90_ci_low = 0.4000004429185082 +settled_accuracy_p90_ci_high = 0.4333342214073119 +settled_accuracy_p95 = 0.4333342214073119 +settled_accuracy_p95_ci_low = 0.4333342214073119 +settled_accuracy_p95_ci_high = 0.4333342214073119 +settled_accuracy_p99 = 0.5454762216178994 +settled_accuracy_p99_ci_low = 0.451851637600587 +settled_accuracy_p99_ci_high = 0.5792600321545416 +settled_accuracy_mean = 0.32551090753935125 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.09090909090909091 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.1875 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.4 +jitter_mean_per_min = 0.03160680279932618 +reaction_rate = 0.405 +reaction_rate_ci_low = 0.3745741958199952 +reaction_rate_ci_high = 0.43542580418000487 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 244.14814814814815 +fire_decisiveness_mean = 6.353719805587277 +fire_decisiveness_p50 = 3.7682885727229873 +step_correction_mean = 0.6671006164433043 +step_correction_p50 = 0.6666666865348816 + +[cell.spm_6.step_minus_25_at_15min] +shares_per_minute = 6 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.779 +convergence_rate_ci_low = 0.7532829625656453 +convergence_rate_ci_high = 0.8047170374343547 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1260 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 915.0962772785623 +settled_accuracy_p10 = 0.022221981624519493 +settled_accuracy_p10_ci_low = 0.022221981624519493 +settled_accuracy_p10_ci_high = 0.022221981624519493 +settled_accuracy_p50 = 0.08888855284746933 +settled_accuracy_p50_ci_low = 0.06666639226598092 +settled_accuracy_p50_ci_high = 0.08888855284746933 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.5527802709963276 +settled_accuracy_p99_ci_low = 0.3777788773689317 +settled_accuracy_p99_ci_high = 0.7037039887092469 +settled_accuracy_mean = 0.14661026585757886 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0.05263157894736842 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.06666666666666667 +jitter_p99_per_min = 0.07692307692307693 +jitter_p99_per_min_ci_low = 0.06666666666666667 +jitter_p99_per_min_ci_high = 0.09090909090909091 +jitter_mean_per_min = 0.004502421018975474 +reaction_rate = 0.096 +reaction_rate_ci_low = 0.07774104563782472 +reaction_rate_ci_high = 0.11425895436217529 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 212.5 +fire_decisiveness_mean = 4.186423050846871 +fire_decisiveness_p50 = 2.7344181327470167 +step_correction_mean = 1.2995217864712079 +step_correction_p50 = 1.2666656970977783 + +[cell.spm_6.step_minus_10_at_15min] +shares_per_minute = 6 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.847 +convergence_rate_ci_low = 0.8246877436013298 +convergence_rate_ci_high = 0.8693122563986702 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 237.7331759149941 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.11111110282606607 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.2407404493833255 +settled_accuracy_p90_ci_low = 0.2222219819559177 +settled_accuracy_p90_ci_high = 0.2444427708653576 +settled_accuracy_p95 = 0.29629614992716824 +settled_accuracy_p95_ci_low = 0.2638904723681115 +settled_accuracy_p95_ci_high = 0.40740859493052173 +settled_accuracy_p99 = 0.5370381651839957 +settled_accuracy_p99_ci_low = 0.48148142072448485 +settled_accuracy_p99_ci_high = 0.5617291568255867 +settled_accuracy_mean = 0.15151545028743066 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.041666666666666664 +jitter_p99_per_min = 0.07692307692307693 +jitter_p99_per_min_ci_low = 0.06666666666666667 +jitter_p99_per_min_ci_high = 0.09090909090909091 +jitter_mean_per_min = 0.0025409811009481473 +reaction_rate = 0.041 +reaction_rate_ci_low = 0.02870984660795481 +reaction_rate_ci_high = 0.053290153392045195 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 185.85365853658536 +fire_decisiveness_mean = 4.90592864208685 +fire_decisiveness_p50 = 2.834440246563723 +step_correction_mean = 1.5275217919814876 +step_correction_p50 = 2.999998092651367 + +[cell.spm_6.step_minus_5_at_15min] +shares_per_minute = 6 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.908 +convergence_rate_ci_low = 0.8900859859997822 +convergence_rate_ci_high = 0.9259140140002179 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1020 +convergence_p90_secs_ci_low = 840 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 162.75330396475772 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.2456135703448894 +settled_accuracy_p90_ci_low = 0.2456135703448894 +settled_accuracy_p90_ci_high = 0.27192928731869215 +settled_accuracy_p95 = 0.33333446358789565 +settled_accuracy_p95_ci_low = 0.28947535914368516 +settled_accuracy_p95_ci_high = 0.3508785574674047 +settled_accuracy_p99 = 0.42105408529451926 +settled_accuracy_p99_ci_low = 0.4035087198786276 +settled_accuracy_p99_ci_high = 0.473685660523945 +settled_accuracy_mean = 0.0971139715146185 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.09090909090909091 +jitter_p99_per_min_ci_low = 0.07142857142857142 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.0027187879786860487 +reaction_rate = 0.047 +reaction_rate_ci_low = 0.033882488589675255 +reaction_rate_ci_high = 0.060117511410324745 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 200.4255319148936 +fire_decisiveness_mean = 5.305886406000396 +fire_decisiveness_p50 = 2.7344181327470167 +step_correction_mean = 2.10458320632894 +step_correction_p50 = 5.999996185302734 + +[cell.spm_6.step_plus_5_at_15min] +shares_per_minute = 6 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.891 +convergence_rate_ci_low = 0.8716844013709127 +convergence_rate_ci_high = 0.9103155986290873 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 218.78787878787878 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.25396948962362664 +settled_accuracy_p90_ci_low = 0.23809651635941664 +settled_accuracy_p90_ci_high = 0.2698413124500758 +settled_accuracy_p95 = 0.2857156918048822 +settled_accuracy_p95_ci_low = 0.2698413124500758 +settled_accuracy_p95_ci_high = 0.30158706723886886 +settled_accuracy_p99 = 0.365080302473096 +settled_accuracy_p99_ci_low = 0.3174613826804662 +settled_accuracy_p99_ci_high = 0.5555577712134652 +settled_accuracy_mean = 0.10058941841408545 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.08333333333333333 +jitter_p99_per_min_ci_low = 0.06666666666666667 +jitter_p99_per_min_ci_high = 0.125 +jitter_mean_per_min = 0.002802508618759912 +reaction_rate = 0.052 +reaction_rate_ci_low = 0.03823862239454204 +reaction_rate_ci_high = 0.06576137760545796 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 182.30769230769232 +fire_decisiveness_mean = 5.2228623864993 +fire_decisiveness_p50 = 2.834440246563723 +step_correction_mean = 2.520743985588734 +step_correction_p50 = 6.333366394042969 + +[cell.spm_6.step_plus_10_at_15min] +shares_per_minute = 6 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.838 +convergence_rate_ci_low = 0.8151631821481188 +convergence_rate_ci_high = 0.8608368178518812 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 322.6968973747017 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.21212117884408888 +settled_accuracy_p90_ci_low = 0.19697080343404605 +settled_accuracy_p90_ci_high = 0.21212117884408888 +settled_accuracy_p95 = 0.24242473603490433 +settled_accuracy_p95_ci_low = 0.22727399457650543 +settled_accuracy_p95_ci_high = 0.24242473603490433 +settled_accuracy_p99 = 0.34848444084008834 +settled_accuracy_p99_ci_low = 0.301766726289843 +settled_accuracy_p99_ci_high = 0.37878763198254783 +settled_accuracy_mean = 0.12929166745214454 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.07142857142857142 +jitter_p99_per_min_ci_low = 0.047619047619047616 +jitter_p99_per_min_ci_high = 0.09523809523809523 +jitter_mean_per_min = 0.0019186255430901882 +reaction_rate = 0.066 +reaction_rate_ci_low = 0.05061131615764364 +reaction_rate_ci_high = 0.08138868384235637 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 206.36363636363637 +fire_decisiveness_mean = 7.950453008023603 +fire_decisiveness_p50 = 3.161572889946598 +step_correction_mean = 2.661115541602626 +step_correction_p50 = 3.1666789054870605 + +[cell.spm_6.step_plus_25_at_15min] +shares_per_minute = 6 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.807 +convergence_rate_ci_low = 0.7825391528846608 +convergence_rate_ci_high = 0.8314608471153393 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 1260 +convergence_p50_secs_ci_low = 1200 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 912.7137546468401 +settled_accuracy_p10 = 0.013334155103720269 +settled_accuracy_p10_ci_low = 0.013334155103720269 +settled_accuracy_p10_ci_high = 0.026667665962363696 +settled_accuracy_p50 = 0.05333425818293258 +settled_accuracy_p50_ci_low = 0.05333425818293258 +settled_accuracy_p50_ci_high = 0.06666658792560165 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.2133348852481407 +settled_accuracy_mean = 0.08953886494325437 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.043478260869565216 +jitter_p99_per_min = 0.06666666666666667 +jitter_p99_per_min_ci_low = 0.043478260869565216 +jitter_p99_per_min_ci_high = 0.08333333333333333 +jitter_mean_per_min = 0.002377399875988244 +reaction_rate = 0.133 +reaction_rate_ci_low = 0.11195293992976692 +reaction_rate_ci_high = 0.1540470600702331 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 230.52631578947367 +fire_decisiveness_mean = 4.7227489817429555 +fire_decisiveness_p50 = 3.633840235545758 +step_correction_mean = 1.319435757801945 +step_correction_p50 = 1.333332896232605 + +[cell.spm_6.step_plus_50_at_15min] +shares_per_minute = 6 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.951 +convergence_rate_ci_low = 0.9376203617986135 +convergence_rate_ci_high = 0.9643796382013864 +convergence_p10_secs = 1080 +convergence_p10_secs_ci_low = 1020 +convergence_p10_secs_ci_high = 1080 +convergence_p50_secs = 1260 +convergence_p50_secs_ci_low = 1260 +convergence_p50_secs_ci_high = 1260 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1237.0347003154575 +settled_accuracy_p10 = 0.06666576591658946 +settled_accuracy_p10_ci_low = 0.06666576591658946 +settled_accuracy_p10_ci_high = 0.06666576591658946 +settled_accuracy_p50 = 0.11111116082138028 +settled_accuracy_p50_ci_low = 0.11111116082138028 +settled_accuracy_p50_ci_high = 0.11111116082138028 +settled_accuracy_p90 = 0.14444359638725246 +settled_accuracy_p90_ci_low = 0.14444359638725246 +settled_accuracy_p90_ci_high = 0.14444359638725246 +settled_accuracy_p95 = 0.2600025537159476 +settled_accuracy_p95_ci_low = 0.15555485563496574 +settled_accuracy_p95_ci_high = 0.31666918846862147 +settled_accuracy_p99 = 0.49259444744843606 +settled_accuracy_p99_ci_low = 0.4263915537321432 +settled_accuracy_p99_ci_high = 0.5407421936062076 +settled_accuracy_mean = 0.12311409236022719 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.07407407407407407 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.08333333333333333 +jitter_p95_per_min_ci_low = 0.07692307692307693 +jitter_p95_per_min_ci_high = 0.09523809523809523 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.09090909090909091 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.01065898165512915 +reaction_rate = 0.392 +reaction_rate_ci_low = 0.36174125617941155 +reaction_rate_ci_high = 0.4222587438205885 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 225.30612244897958 +fire_decisiveness_mean = 5.892609193824719 +fire_decisiveness_p50 = 4.749604059635075 +step_correction_mean = 0.695104076394013 +step_correction_p50 = 0.6666665077209473 + +[cell.spm_8.cold_start_10gh_to_1ph] +shares_per_minute = 8 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 60 +convergence_p10_secs_ci_low = 60 +convergence_p10_secs_ci_high = 60 +convergence_p50_secs = 60 +convergence_p50_secs_ci_low = 60 +convergence_p50_secs_ci_high = 60 +convergence_p90_secs = 60 +convergence_p90_secs_ci_low = 60 +convergence_p90_secs_ci_high = 60 +convergence_p95_secs = 60 +convergence_p95_secs_ci_low = 60 +convergence_p95_secs_ci_high = 60 +convergence_p99_secs = 300 +convergence_p99_secs_ci_low = 60 +convergence_p99_secs_ci_high = 420 +convergence_mean_secs = 63.9 +settled_accuracy_p10 = 0.0714285953960232 +settled_accuracy_p10_ci_low = 0.0714285953960232 +settled_accuracy_p10_ci_high = 0.0714285953960232 +settled_accuracy_p50 = 0.0714285953960232 +settled_accuracy_p50_ci_low = 0.0714285953960232 +settled_accuracy_p50_ci_high = 0.0714285953960232 +settled_accuracy_p90 = 0.20982130184352754 +settled_accuracy_p90_ci_low = 0.19642851989855015 +settled_accuracy_p90_ci_high = 0.2232136811353156 +settled_accuracy_p95 = 0.24413882918250462 +settled_accuracy_p95_ci_low = 0.2232136811353156 +settled_accuracy_p95_ci_high = 0.2633927651677611 +settled_accuracy_p99 = 0.40792559720682164 +settled_accuracy_p99_ci_low = 0.3526795663774118 +settled_accuracy_p99_ci_high = 0.4569911700168865 +settled_accuracy_mean = 0.10387104256507194 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.037037037037037035 +jitter_p90_per_min_ci_low = 0.037037037037037035 +jitter_p90_per_min_ci_high = 0.07407407407407407 +jitter_p95_per_min = 0.07407407407407407 +jitter_p95_per_min_ci_low = 0.07407407407407407 +jitter_p95_per_min_ci_high = 0.07407407407407407 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.07407407407407407 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.01283583629693473 +bias_mean = 0.007197501910297985 +bias_p10 = -0.08578379970032643 +bias_p10_ci_low = -0.09204125984404486 +bias_p10_ci_high = -0.07941666601117789 +bias_p50 = 0.0058745510889351045 +bias_p50_ci_low = -0.00046913688205410824 +bias_p50_ci_high = 0.009399249953886496 +bias_p90 = 0.10173965286117112 +bias_p90_ci_low = 0.09610025829884206 +bias_p90_ci_high = 0.11160803616506619 +bias_p99 = 0.18421137930478246 +bias_p99_ci_low = 0.17258056886341022 +bias_p99_ci_high = 0.19478494962485418 +variance_mean = 0.009307394597521406 +variance_p10 = 0.00222894044995948 +variance_p10_ci_low = 0.002102735709787172 +variance_p10_ci_high = 0.0023641014596206523 +variance_p50 = 0.00595248622611043 +variance_p50_ci_low = 0.005554983392688624 +variance_p50_ci_high = 0.006348951241277899 +variance_p90 = 0.019736980957762062 +variance_p90_ci_low = 0.017411737196870395 +variance_p90_ci_high = 0.021365255363464786 +variance_p99 = 0.04817481812308006 +variance_p99_ci_low = 0.04537540084610638 +variance_p99_ci_high = 0.08186894022274908 +ramp_target_overshoot_p10 = 0.0714285953960232 +ramp_target_overshoot_p10_ci_low = 0.0714285953960232 +ramp_target_overshoot_p10_ci_high = 0.0714285953960232 +ramp_target_overshoot_p50 = 0.0714285953960232 +ramp_target_overshoot_p50_ci_low = 0.0714285953960232 +ramp_target_overshoot_p50_ci_high = 0.0714285953960232 +ramp_target_overshoot_p90 = 0.0714285953960232 +ramp_target_overshoot_p90_ci_low = 0.0714285953960232 +ramp_target_overshoot_p90_ci_high = 0.08482157866759499 +ramp_target_overshoot_p99 = 0.5401790504780131 +ramp_target_overshoot_p99_ci_low = 0.43303746600684345 +ramp_target_overshoot_p99_ci_high = 0.7477709287215943 +ramp_target_overshoot_mean = 0.095482559446206 + +[cell.spm_8.stable_1ph] +shares_per_minute = 8 +scenario = "stable_1ph" +convergence_rate = 0.926 +convergence_rate_ci_low = 0.9097752720084434 +convergence_rate_ci_high = 0.9422247279915567 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 840 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 133.67170626349892 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0.24999998322278383 +settled_accuracy_p90_ci_low = 0.23749954785402294 +settled_accuracy_p90_ci_high = 0.2500000503316486 +settled_accuracy_p95 = 0.275000652633711 +settled_accuracy_p95_ci_low = 0.26250082124473395 +settled_accuracy_p95_ci_high = 0.275000652633711 +settled_accuracy_p99 = 0.32500172302010566 +settled_accuracy_p99_ci_low = 0.30000018119393523 +settled_accuracy_p99_ci_high = 0.40000071135396764 +settled_accuracy_mean = 0.04284913242666126 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.07142857142857142 +jitter_p99_per_min_ci_low = 0.05 +jitter_p99_per_min_ci_high = 0.08333333333333333 +jitter_mean_per_min = 0.0017574038228872987 +bias_mean = -0.00417200440128899 +bias_p10 = -0.08881507533823073 +bias_p10_ci_low = -0.09539427657242348 +bias_p10_ci_high = -0.08420981778745822 +bias_p50 = -0.0019729794349934416 +bias_p50_ci_low = -0.007235981566522866 +bias_p50_ci_high = 0.00263229577600663 +bias_p90 = 0.0761528051758058 +bias_p90_ci_low = 0.07039563102357911 +bias_p90_ci_high = 0.08157976839240208 +bias_p99 = 0.16551964960102242 +bias_p99_ci_low = 0.13355375816901646 +bias_p99_ci_high = 0.20794094323819542 +variance_mean = 0.008630666539329744 +variance_p10 = 0.001990994202236334 +variance_p10_ci_low = 0.0018395167913451069 +variance_p10_ci_high = 0.0021381637890189515 +variance_p50 = 0.005272670280702238 +variance_p50_ci_low = 0.004987017549845949 +variance_p50_ci_high = 0.0056553005151868995 +variance_p90 = 0.017767516078543072 +variance_p90_ci_low = 0.01579552856027234 +variance_p90_ci_high = 0.02038610896191482 +variance_p99 = 0.05609200334927291 +variance_p99_ci_low = 0.0462654472992863 +variance_p99_ci_high = 0.0821591738853767 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1.262500821244734 +upward_step_magnitude_p90_ci_low = 1.2375012926845097 +upward_step_magnitude_p90_ci_high = 1.275000652633711 +upward_step_magnitude_p95 = 1.3250017230201057 +upward_step_magnitude_p95_ci_low = 1.2875006182404176 +upward_step_magnitude_p95_ci_high = 1.4166686938914015 +upward_step_magnitude_p99 = 1.7916694875915662 +upward_step_magnitude_p99_ci_low = 1.656250685069647 +upward_step_magnitude_p99_ci_high = 2.1250010731157096 +upward_step_magnitude_mean = 1.0546751818809428 +fire_decisiveness_mean = 3.5890511194831753 +fire_decisiveness_p50 = 2.241056903548383 + +[cell.spm_8.step_minus_50_at_15min] +shares_per_minute = 8 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.914 +convergence_rate_ci_low = 0.8966228562070748 +convergence_rate_ci_high = 0.9313771437929252 +convergence_p10_secs = 1080 +convergence_p10_secs_ci_low = 1080 +convergence_p10_secs_ci_high = 1140 +convergence_p50_secs = 1200 +convergence_p50_secs_ci_low = 1200 +convergence_p50_secs_ci_high = 1260 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1227.1115973741794 +settled_accuracy_p10 = 0.10624984187473718 +settled_accuracy_p10_ci_low = 0.0899994302457372 +settled_accuracy_p10_ci_high = 0.11187376607769017 +settled_accuracy_p50 = 0.350000177838492 +settled_accuracy_p50_ci_low = 0.350000177838492 +settled_accuracy_p50_ci_high = 0.3750001090519055 +settled_accuracy_p90 = 0.4750002365587487 +settled_accuracy_p90_ci_low = 0.4750002365587487 +settled_accuracy_p90_ci_high = 0.4750002365587487 +settled_accuracy_p95 = 0.4750002365587487 +settled_accuracy_p95_ci_low = 0.4750002365587487 +settled_accuracy_p95_ci_high = 0.4750002365587487 +settled_accuracy_p99 = 0.5802782078523949 +settled_accuracy_p99_ci_low = 0.5000000335544323 +settled_accuracy_p99_ci_high = 0.6324891731590578 +settled_accuracy_mean = 0.32004452334284583 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.08333333333333333 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.15 +jitter_p95_per_min = 0.15 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.15 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.05106366649223794 +reaction_rate = 0.515 +reaction_rate_ci_low = 0.484023627714014 +reaction_rate_ci_high = 0.545976372285986 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 245.94174757281553 +fire_decisiveness_mean = 5.358797779419235 +fire_decisiveness_p50 = 3.0723930292600876 +step_correction_mean = 0.5926786398424686 +step_correction_p50 = 0.574999213218689 + +[cell.spm_8.step_minus_25_at_15min] +shares_per_minute = 8 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.801 +convergence_rate_ci_low = 0.7762543499095296 +convergence_rate_ci_high = 0.8257456500904705 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1260 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1028.7640449438202 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0.0333326145228412 +settled_accuracy_p50_ci_low = 0.0333326145228412 +settled_accuracy_p50_ci_high = 0.03333431461404657 +settled_accuracy_p90 = 0.33333330350717194 +settled_accuracy_p90_ci_low = 0.33333330350717194 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.4078137623456821 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.6520859984872767 +settled_accuracy_mean = 0.0995423496745807 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.043478260869565216 +jitter_p95_per_min = 0.05555555555555555 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.07692307692307693 +jitter_p99_per_min = 0.08333333333333333 +jitter_p99_per_min_ci_low = 0.07692307692307693 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.005320135319676688 +reaction_rate = 0.123 +reaction_rate_ci_low = 0.10264325090786841 +reaction_rate_ci_high = 0.14335674909213159 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 219.5121951219512 +fire_decisiveness_mean = 3.397980683521481 +fire_decisiveness_p50 = 2.5268947506811834 +step_correction_mean = 1.1137157223088954 +step_correction_p50 = 1.1499985456466675 + +[cell.spm_8.step_minus_10_at_15min] +shares_per_minute = 8 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.848 +convergence_rate_ci_low = 0.8257476546494532 +convergence_rate_ci_high = 0.8702523453505467 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 243.89150943396226 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.11111110282606607 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.1944438334223768 +settled_accuracy_p90_ci_low = 0.18055543024425014 +settled_accuracy_p90_ci_high = 0.1944438334223768 +settled_accuracy_p95 = 0.222221832825108 +settled_accuracy_p95_ci_low = 0.20833290768914725 +settled_accuracy_p95_ci_high = 0.2803821029606566 +settled_accuracy_p99 = 0.4852436927920234 +settled_accuracy_p99_ci_low = 0.4027786798120505 +settled_accuracy_p99_ci_high = 0.6875019060781618 +settled_accuracy_mean = 0.138694425378485 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.0625 +jitter_p99_per_min = 0.09090909090909091 +jitter_p99_per_min_ci_low = 0.08333333333333333 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.003570073894807792 +reaction_rate = 0.05 +reaction_rate_ci_low = 0.036491632222951584 +reaction_rate_ci_high = 0.06350836777704842 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 205.2 +fire_decisiveness_mean = 3.856374200135921 +fire_decisiveness_p50 = 2.241056903548383 +step_correction_mean = 1.782973405122757 +step_correction_p50 = 2.8749964237213135 + +[cell.spm_8.step_minus_5_at_15min] +shares_per_minute = 8 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.891 +convergence_rate_ci_low = 0.8716844013709127 +convergence_rate_ci_high = 0.9103155986290873 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 165.72390572390572 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.2236840887636944 +settled_accuracy_p90_ci_low = 0.21052630091770308 +settled_accuracy_p90_ci_high = 0.23684152340513487 +settled_accuracy_p95 = 0.2894755004255056 +settled_accuracy_p95_ci_low = 0.24999959381476666 +settled_accuracy_p95_ci_high = 0.3026329350669461 +settled_accuracy_p99 = 0.38158036855199495 +settled_accuracy_p99_ci_low = 0.342105945400369 +settled_accuracy_p99_ci_high = 0.43092149018695336 +settled_accuracy_mean = 0.09425785973724615 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.09090909090909091 +jitter_p99_per_min_ci_low = 0.07142857142857142 +jitter_p99_per_min_ci_high = 0.09090909090909091 +jitter_mean_per_min = 0.0020612169052210256 +reaction_rate = 0.04 +reaction_rate_ci_low = 0.027854324226293543 +reaction_rate_ci_high = 0.05214567577370646 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 190.5 +fire_decisiveness_mean = 3.5153297296700714 +fire_decisiveness_p50 = 2.398892837489946 +step_correction_mean = 1.1619873732328414 +step_correction_p50 = 5.249998092651367 + +[cell.spm_8.step_plus_5_at_15min] +shares_per_minute = 8 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.908 +convergence_rate_ci_low = 0.8900859859997822 +convergence_rate_ci_high = 0.9259140140002179 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 207.62114537444933 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.2023818152092729 +settled_accuracy_p90_ci_low = 0.2023818152092729 +settled_accuracy_p90_ci_high = 0.2142864173310126 +settled_accuracy_p95 = 0.2380954937480737 +settled_accuracy_p95_ci_low = 0.22619114727917 +settled_accuracy_p95_ci_high = 0.261906487561403 +settled_accuracy_p99 = 0.309525151701197 +settled_accuracy_p99_ci_low = 0.2976188878360253 +settled_accuracy_p99_ci_high = 0.34151767538966926 +settled_accuracy_mean = 0.08578176425766251 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.09090909090909091 +jitter_p99_per_min_ci_low = 0.06666666666666667 +jitter_p99_per_min_ci_high = 0.09090909090909091 +jitter_mean_per_min = 0.002557392975572291 +reaction_rate = 0.067 +reaction_rate_ci_low = 0.051503475951039865 +reaction_rate_ci_high = 0.08249652404896014 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 181.7910447761194 +fire_decisiveness_mean = 3.773439279297326 +fire_decisiveness_p50 = 2.241056903548383 +step_correction_mean = 2.2596502437520383 +step_correction_p50 = 5.25002384185791 + +[cell.spm_8.step_plus_10_at_15min] +shares_per_minute = 8 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.837 +convergence_rate_ci_low = 0.8141064784360291 +convergence_rate_ci_high = 0.8598935215639708 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 318.06451612903226 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.17045511463200813 +settled_accuracy_p90_ci_low = 0.17045511463200813 +settled_accuracy_p90_ci_high = 0.1718738570521382 +settled_accuracy_p95 = 0.19318305706138705 +settled_accuracy_p95_ci_low = 0.18181835374998534 +settled_accuracy_p95_ci_high = 0.2045470282760764 +settled_accuracy_p99 = 0.30357116166116893 +settled_accuracy_p99_ci_low = 0.23181799685283822 +settled_accuracy_p99_ci_high = 0.39204809973011856 +settled_accuracy_mean = 0.11612601385480781 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.09090909090909091 +jitter_p99_per_min_ci_low = 0.058823529411764705 +jitter_p99_per_min_ci_high = 0.13333333333333333 +jitter_mean_per_min = 0.0027691056659818075 +reaction_rate = 0.071 +reaction_rate_ci_low = 0.05508183131135996 +reaction_rate_ci_high = 0.08691816868864002 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 201.1267605633803 +fire_decisiveness_mean = 4.0649731195404 +fire_decisiveness_p50 = 2.4751773590527506 +step_correction_mean = 1.8474834376657512 +step_correction_p50 = 2.750006675720215 + +[cell.spm_8.step_plus_25_at_15min] +shares_per_minute = 8 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.803 +convergence_rate_ci_low = 0.778348295280042 +convergence_rate_ci_high = 0.8276517047199581 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 1260 +convergence_p50_secs_ci_low = 1260 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1028.5180572851805 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0.009999005715098042 +settled_accuracy_p50 = 0.03000045311903743 +settled_accuracy_p50_ci_low = 0.020000481036324125 +settled_accuracy_p50_ci_high = 0.03000045311903743 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.3740095537249928 +settled_accuracy_mean = 0.060586080376445015 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.058823529411764705 +jitter_p99_per_min = 0.08695652173913043 +jitter_p99_per_min_ci_low = 0.058823529411764705 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.003424766857442339 +reaction_rate = 0.168 +reaction_rate_ci_low = 0.14482752750352265 +reaction_rate_ci_high = 0.19117247249647737 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 220.35714285714286 +fire_decisiveness_mean = 4.274038036225453 +fire_decisiveness_p50 = 2.872219239453287 +step_correction_mean = 1.1841313594153948 +step_correction_p50 = 1.200000524520874 + +[cell.spm_8.step_plus_50_at_15min] +shares_per_minute = 8 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.954 +convergence_rate_ci_low = 0.9410159800369838 +convergence_rate_ci_high = 0.9669840199630161 +convergence_p10_secs = 1080 +convergence_p10_secs_ci_low = 1020 +convergence_p10_secs_ci_high = 1080 +convergence_p50_secs = 1200 +convergence_p50_secs_ci_low = 1200 +convergence_p50_secs_ci_high = 1260 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1221.3836477987422 +settled_accuracy_p10 = 0.09166551761379493 +settled_accuracy_p10_ci_low = 0.0833324758311903 +settled_accuracy_p10_ci_high = 0.09166551761379493 +settled_accuracy_p50 = 0.14166627370698892 +settled_accuracy_p50_ci_low = 0.1333332319243843 +settled_accuracy_p50_ci_high = 0.14166627370698892 +settled_accuracy_p90 = 0.16948119748339963 +settled_accuracy_p90_ci_low = 0.16666665175358597 +settled_accuracy_p90_ci_high = 0.2025013531383817 +settled_accuracy_p95 = 0.28140178067552846 +settled_accuracy_p95_ci_low = 0.22481657134374577 +settled_accuracy_p95_ci_high = 0.30208339018945374 +settled_accuracy_p99 = 0.516668365266564 +settled_accuracy_p99_ci_low = 0.438940016397827 +settled_accuracy_p99_ci_high = 0.5604199440025748 +settled_accuracy_mean = 0.14682976924125263 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.08333333333333333 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.17647058823529413 +jitter_mean_per_min = 0.013056965553019632 +reaction_rate = 0.486 +reaction_rate_ci_low = 0.45502182951819137 +reaction_rate_ci_high = 0.5169781704818086 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 228.76543209876544 +fire_decisiveness_mean = 6.059510901062045 +fire_decisiveness_p50 = 4.04864032414287 +step_correction_mean = 0.6158125038132255 +step_correction_p50 = 0.6000003218650818 + +[cell.spm_10.cold_start_10gh_to_1ph] +shares_per_minute = 10 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 60 +convergence_p10_secs_ci_low = 60 +convergence_p10_secs_ci_high = 60 +convergence_p50_secs = 60 +convergence_p50_secs_ci_low = 60 +convergence_p50_secs_ci_high = 60 +convergence_p90_secs = 60 +convergence_p90_secs_ci_low = 60 +convergence_p90_secs_ci_high = 60 +convergence_p95_secs = 60 +convergence_p95_secs_ci_low = 60 +convergence_p95_secs_ci_high = 60 +convergence_p99_secs = 360 +convergence_p99_secs_ci_low = 240 +convergence_p99_secs_ci_high = 480 +convergence_mean_secs = 66.54 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0.0725027398871807 +settled_accuracy_p50_ci_low = 0.06399904007479684 +settled_accuracy_p50_ci_high = 0.07599904463819962 +settled_accuracy_p90 = 0.20000005368709184 +settled_accuracy_p90_ci_low = 0.20000005368709184 +settled_accuracy_p90_ci_high = 0.2086709216818743 +settled_accuracy_p95 = 0.23499960841977352 +settled_accuracy_p95_ci_low = 0.22400059968481645 +settled_accuracy_p95_ci_high = 0.24999998322278383 +settled_accuracy_p99 = 0.3100007442373114 +settled_accuracy_p99_ci_low = 0.2700025185956987 +settled_accuracy_p99_ci_high = 0.387003469058552 +settled_accuracy_mean = 0.086473582226244 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.07407407407407407 +jitter_p90_per_min_ci_low = 0.038461538461538464 +jitter_p90_per_min_ci_high = 0.07407407407407407 +jitter_p95_per_min = 0.07407407407407407 +jitter_p95_per_min_ci_low = 0.07407407407407407 +jitter_p95_per_min_ci_high = 0.07407407407407407 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.07407407407407407 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.021310753185906518 +bias_mean = 0.004863530769603507 +bias_p10 = -0.08420982131950376 +bias_p10_ci_low = -0.09105195155422348 +bias_p10_ci_high = -0.07894675207910945 +bias_p50 = 0.005790470745340258 +bias_p50_ci_low = 0.0010534714287310308 +bias_p50_ci_high = 0.011053497601188322 +bias_p90 = 0.0957901447022183 +bias_p90_ci_low = 0.08789573687015322 +bias_p90_ci_high = 0.10157994082686433 +bias_p99 = 0.17157994036769847 +bias_p99_ci_low = 0.16108726448616278 +bias_p99_ci_high = 0.19368514482299665 +variance_mean = 0.008303960374557722 +variance_p10 = 0.0017567990117084216 +variance_p10_ci_low = 0.001635744834353721 +variance_p10_ci_high = 0.0019113474365720121 +variance_p50 = 0.005539429512524574 +variance_p50_ci_low = 0.005209094575226028 +variance_p50_ci_high = 0.005989765557209285 +variance_p90 = 0.018419663923177038 +variance_p90_ci_low = 0.016550533526210803 +variance_p90_ci_high = 0.02042929349298241 +variance_p99 = 0.04046686452649828 +variance_p99_ci_low = 0.032394920997821285 +variance_p99_ci_high = 0.04925640406795342 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.20000005368709184 +ramp_target_overshoot_p50_ci_low = 0.20000005368709184 +ramp_target_overshoot_p50_ci_high = 0.20000005368709184 +ramp_target_overshoot_p90 = 0.20000005368709184 +ramp_target_overshoot_p90_ci_low = 0.20000005368709184 +ramp_target_overshoot_p90_ci_high = 0.2086709216818743 +ramp_target_overshoot_p99 = 0.700000825439038 +ramp_target_overshoot_p99_ci_low = 0.4136040809169166 +ramp_target_overshoot_p99_ci_high = 1 +ramp_target_overshoot_mean = 0.1272540819470374 + +[cell.spm_10.stable_1ph] +shares_per_minute = 10 +scenario = "stable_1ph" +convergence_rate = 0.93 +convergence_rate_ci_low = 0.9141858240809078 +convergence_rate_ci_high = 0.9458141759190923 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 780 +convergence_p90_secs_ci_low = 240 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 140.19354838709677 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0.22000064290292554 +settled_accuracy_p90_ci_low = 0.21000182469003592 +settled_accuracy_p90_ci_high = 0.2300022796881398 +settled_accuracy_p95 = 0.24000244007832672 +settled_accuracy_p95_ci_low = 0.23999935307054265 +settled_accuracy_p95_ci_high = 0.2500000503316486 +settled_accuracy_p99 = 0.3000012549357731 +settled_accuracy_p99_ci_low = 0.27999972619583136 +settled_accuracy_p99_ci_high = 0.34899864513912704 +settled_accuracy_mean = 0.03688407896539071 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.08333333333333333 +jitter_p99_per_min_ci_low = 0.06666666666666667 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.0023239494697340135 +bias_mean = 0.000008666443224753641 +bias_p10 = -0.07947267718902822 +bias_p10_ci_low = -0.08487468297198278 +bias_p10_ci_high = -0.07368354862098543 +bias_p50 = -0.0010517972391547218 +bias_p50_ci_low = -0.006841215434930136 +bias_p50_ci_high = 0.0031588566541189203 +bias_p90 = 0.08207004103484569 +bias_p90_ci_low = 0.075264086010338 +bias_p90_ci_high = 0.08579056003545099 +bias_p99 = 0.14638432323636075 +bias_p99_ci_low = 0.12789578857929965 +bias_p99_ci_high = 0.16414448653045433 +variance_mean = 0.00774002403213414 +variance_p10 = 0.0016664883421055594 +variance_p10_ci_low = 0.0015290949289428959 +variance_p10_ci_high = 0.0017916956644415123 +variance_p50 = 0.004490306571576154 +variance_p50_ci_low = 0.004229928487655886 +variance_p50_ci_high = 0.004803881887946737 +variance_p90 = 0.01604314163337185 +variance_p90_ci_low = 0.013747364937299876 +variance_p90_ci_high = 0.018919174853507838 +variance_p99 = 0.05285626765632486 +variance_p99_ci_low = 0.045602388933469615 +variance_p99_ci_high = 0.06341981887771518 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1.2400024400783267 +upward_step_magnitude_p90_ci_low = 1.2300022796881398 +upward_step_magnitude_p90_ci_high = 1.2500000503316486 +upward_step_magnitude_p95 = 1.3500013857980597 +upward_step_magnitude_p95_ci_low = 1.2900008261101266 +upward_step_magnitude_p95_ci_high = 1.4400022816991638 +upward_step_magnitude_p99 = 1.8000017764092846 +upward_step_magnitude_p99_ci_low = 1.6666713419175863 +upward_step_magnitude_p99_ci_high = 2.100002049057295 +upward_step_magnitude_mean = 1.0614919655820765 +fire_decisiveness_mean = 5.641498776511085 +fire_decisiveness_p50 = 2.1377040367001 + +[cell.spm_10.step_minus_50_at_15min] +shares_per_minute = 10 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.911 +convergence_rate_ci_low = 0.893351399874211 +convergence_rate_ci_high = 0.9286486001257891 +convergence_p10_secs = 1080 +convergence_p10_secs_ci_low = 1020 +convergence_p10_secs_ci_high = 1080 +convergence_p50_secs = 1200 +convergence_p50_secs_ci_low = 1200 +convergence_p50_secs_ci_high = 1200 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1202.9637760702524 +settled_accuracy_p10 = 0.03399882733969517 +settled_accuracy_p10_ci_low = 0.02799822107820993 +settled_accuracy_p10_ci_high = 0.03799811303293754 +settled_accuracy_p50 = 0.23499960841977352 +settled_accuracy_p50_ci_low = 0.21249988507606887 +settled_accuracy_p50_ci_high = 0.26849881026048905 +settled_accuracy_p90 = 0.48000145760454505 +settled_accuracy_p90_ci_low = 0.48000145760454505 +settled_accuracy_p90_ci_high = 0.5000000335544323 +settled_accuracy_p95 = 0.5162038716312105 +settled_accuracy_p95_ci_low = 0.5000000335544323 +settled_accuracy_p95_ci_high = 0.5200012938589147 +settled_accuracy_p99 = 0.5400014804215592 +settled_accuracy_p99_ci_low = 0.5200012938589147 +settled_accuracy_p99_ci_high = 0.5400014804215592 +settled_accuracy_mean = 0.2568131843552323 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.10526315789473684 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.12 +jitter_p99_per_min = 0.13333333333333333 +jitter_p99_per_min_ci_low = 0.10526315789473684 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.06672578923953912 +reaction_rate = 0.595 +reaction_rate_ci_low = 0.5645741958199951 +reaction_rate_ci_high = 0.6254258041800048 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 233.84873949579833 +fire_decisiveness_mean = 25243927.35092165 +fire_decisiveness_p50 = 3.0198637370312724 +step_correction_mean = 0.5463445692002272 +step_correction_p50 = 0.5399985909461975 + +[cell.spm_10.step_minus_25_at_15min] +shares_per_minute = 10 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.821 +convergence_rate_ci_low = 0.7972395771418099 +convergence_rate_ci_high = 0.84476042285819 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 840 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1320 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1178.148599269184 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0.02666763064820632 +settled_accuracy_p50_ci_low = 0.02666763064820632 +settled_accuracy_p50_ci_high = 0.02666763064820632 +settled_accuracy_p90 = 0.2400012491196435 +settled_accuracy_p90_ci_low = 0.10506832084944429 +settled_accuracy_p90_ci_high = 0.33333330350717194 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.39392276449862385 +settled_accuracy_mean = 0.060746965538525044 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.058823529411764705 +jitter_p95_per_min = 0.0625 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.07142857142857142 +jitter_p99_per_min = 0.07692307692307693 +jitter_p99_per_min_ci_low = 0.0625 +jitter_p99_per_min_ci_high = 0.09090909090909091 +jitter_mean_per_min = 0.0047631461081013085 +reaction_rate = 0.145 +reaction_rate_ci_low = 0.12317656397356272 +reaction_rate_ci_high = 0.16682343602643726 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 235.44827586206895 +fire_decisiveness_mean = 3.589296735082083 +fire_decisiveness_p50 = 2.163593474003754 +step_correction_mean = 1.0568227554189749 +step_correction_p50 = 1.0399971008300781 + +[cell.spm_10.step_minus_10_at_15min] +shares_per_minute = 10 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.851 +convergence_rate_ci_low = 0.8289294078375772 +convergence_rate_ci_high = 0.8730705921624228 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 312.4089306698002 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.11111110282606607 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.1777769741284143 +settled_accuracy_p90_ci_low = 0.1666666542390992 +settled_accuracy_p90_ci_high = 0.1777769741284143 +settled_accuracy_p95 = 0.19999970173838055 +settled_accuracy_p95_ci_low = 0.18888811423718288 +settled_accuracy_p95_ci_high = 0.21111069271633942 +settled_accuracy_p99 = 0.38666807843833206 +settled_accuracy_p99_ci_low = 0.3118542216508855 +settled_accuracy_p99_ci_high = 0.435557482657019 +settled_accuracy_mean = 0.13147128154442841 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.05 +jitter_p99_per_min = 0.09090909090909091 +jitter_p99_per_min_ci_low = 0.07692307692307693 +jitter_p99_per_min_ci_high = 0.09090909090909091 +jitter_mean_per_min = 0.0032556744442233635 +reaction_rate = 0.056 +reaction_rate_ci_low = 0.04174930379244579 +reaction_rate_ci_high = 0.07025069620755421 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 189.64285714285714 +fire_decisiveness_mean = 3.9260017007340764 +fire_decisiveness_p50 = 2.5078808018667758 +step_correction_mean = 1.8369043171405792 +step_correction_p50 = 2.5 + +[cell.spm_10.step_minus_5_at_15min] +shares_per_minute = 10 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.901 +convergence_rate_ci_low = 0.8824887364450722 +convergence_rate_ci_high = 0.9195112635549278 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 780 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 133.7846836847947 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.19999932184726266 +settled_accuracy_p90_ci_low = 0.18947290790410332 +settled_accuracy_p90_ci_high = 0.21052630091770308 +settled_accuracy_p95 = 0.24210497761990002 +settled_accuracy_p95_ci_low = 0.22105186716994074 +settled_accuracy_p95_ci_high = 0.2736861267539521 +settled_accuracy_p99 = 0.3473684106423922 +settled_accuracy_p99_ci_low = 0.3136869659679644 +settled_accuracy_p99_ci_high = 0.3894750553877717 +settled_accuracy_mean = 0.08401859657280035 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.07692307692307693 +jitter_p99_per_min_ci_low = 0.043478260869565216 +jitter_p99_per_min_ci_high = 0.08333333333333333 +jitter_mean_per_min = 0.0016473447104667642 +reaction_rate = 0.032 +reaction_rate_ci_low = 0.021091406983483156 +reaction_rate_ci_high = 0.042908593016516845 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 198.75 +fire_decisiveness_mean = 3.424575625933756 +fire_decisiveness_p50 = 2.1377040367001 +step_correction_mean = 2.125263411551714 +step_correction_p50 = 5 + +[cell.spm_10.step_plus_5_at_15min] +shares_per_minute = 10 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.908 +convergence_rate_ci_low = 0.8900859859997822 +convergence_rate_ci_high = 0.9259140140002179 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 206.69603524229075 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.19047631830260836 +settled_accuracy_p90_ci_low = 0.18095478408903665 +settled_accuracy_p90_ci_high = 0.19047631830260836 +settled_accuracy_p95 = 0.20952628935631612 +settled_accuracy_p95_ci_low = 0.20000130382946213 +settled_accuracy_p95_ci_high = 0.20952628935631612 +settled_accuracy_p99 = 0.25714207740170825 +settled_accuracy_p99_ci_low = 0.23809651635941664 +settled_accuracy_p99_ci_high = 0.26190725451991015 +settled_accuracy_mean = 0.07968158631050645 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.07142857142857142 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.08333333333333333 +jitter_mean_per_min = 0.001311177048330317 +reaction_rate = 0.048 +reaction_rate_ci_low = 0.034750631954693086 +reaction_rate_ci_high = 0.061249368045306916 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 215 +fire_decisiveness_mean = 3.7095564685980333 +fire_decisiveness_p50 = 1.9858209864105802 +step_correction_mean = 3.215375463167826 +step_correction_p50 = 5.0000081062316895 + +[cell.spm_10.step_plus_10_at_15min] +shares_per_minute = 10 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.836 +convergence_rate_ci_low = 0.8130500822136548 +convergence_rate_ci_high = 0.8589499177863451 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 339.1866028708134 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.1545477512215796 +settled_accuracy_p90_ci_low = 0.14545572013699726 +settled_accuracy_p90_ci_high = 0.1545477512215796 +settled_accuracy_p95 = 0.1727280308910648 +settled_accuracy_p95_ci_low = 0.16363636585483854 +settled_accuracy_p95_ci_high = 0.17600428569415305 +settled_accuracy_p99 = 0.24675325784562108 +settled_accuracy_p99_ci_low = 0.20000119575796327 +settled_accuracy_p99_ci_high = 0.2909097930563922 +settled_accuracy_mean = 0.10939948961877702 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.07142857142857142 +jitter_p99_per_min_ci_low = 0.043478260869565216 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.0018436127376516484 +reaction_rate = 0.062 +reaction_rate_ci_low = 0.047053024065049145 +reaction_rate_ci_high = 0.07694697593495085 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 196.4516129032258 +fire_decisiveness_mean = 3.787433950907054 +fire_decisiveness_p50 = 2.1380060265920378 +step_correction_mean = 2.0087615924496807 +step_correction_p50 = 2.600013017654419 + +[cell.spm_10.step_plus_25_at_15min] +shares_per_minute = 10 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.799 +convergence_rate_ci_low = 0.774161378492356 +convergence_rate_ci_high = 0.8238386215076441 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1260 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1112.5907384230288 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0.003197388316357852 +settled_accuracy_p50 = 0.016001973966915495 +settled_accuracy_p50_ci_low = 0.016001973966915495 +settled_accuracy_p50_ci_high = 0.016001973966915495 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.318798985442853 +settled_accuracy_mean = 0.04352501872068828 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.05263157894736842 +jitter_p95_per_min = 0.07692307692307693 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.15384615384615385 +jitter_p99_per_min_ci_low = 0.08333333333333333 +jitter_p99_per_min_ci_high = 0.17391304347826086 +jitter_mean_per_min = 0.0072890260699705256 +reaction_rate = 0.169 +reaction_rate_ci_low = 0.14577263548312036 +reaction_rate_ci_high = 0.19222736451687966 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 240.3550295857988 +fire_decisiveness_mean = 3.9669573229779482 +fire_decisiveness_p50 = 2.9488637033619938 +step_correction_mean = 1.0412610659937886 +step_correction_p50 = 1.0400049686431885 + +[cell.spm_10.step_plus_50_at_15min] +shares_per_minute = 10 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.962 +convergence_rate_ci_low = 0.9501495346251718 +convergence_rate_ci_high = 0.9738504653748281 +convergence_p10_secs = 1080 +convergence_p10_secs_ci_low = 1080 +convergence_p10_secs_ci_high = 1080 +convergence_p50_secs = 1200 +convergence_p50_secs_ci_low = 1200 +convergence_p50_secs_ci_high = 1200 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1208.5446985446986 +settled_accuracy_p10 = 0.10666631710405394 +settled_accuracy_p10_ci_low = 0.09999909626730663 +settled_accuracy_p10_ci_high = 0.10913619171159006 +settled_accuracy_p50 = 0.1466666893345494 +settled_accuracy_p50_ci_low = 0.1466666893345494 +settled_accuracy_p50_ci_high = 0.15333167320918428 +settled_accuracy_p90 = 0.1866662562586845 +settled_accuracy_p90_ci_low = 0.17999849855103012 +settled_accuracy_p90_ci_high = 0.20889002745289376 +settled_accuracy_p95 = 0.2708353559199099 +settled_accuracy_p95_ci_low = 0.23900320610357806 +settled_accuracy_p95_ci_high = 0.29514513902316875 +settled_accuracy_p99 = 0.41556054109787066 +settled_accuracy_p99_ci_low = 0.36400402259474895 +settled_accuracy_p99_ci_high = 0.5120029570849556 +settled_accuracy_mean = 0.15647161523249536 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.02188774904686583 +reaction_rate = 0.561 +reaction_rate_ci_low = 0.5302411735204349 +reaction_rate_ci_high = 0.5917588264795652 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 230.05347593582889 +fire_decisiveness_mean = 5.055529007832102 +fire_decisiveness_p50 = 3.9860678128155875 +step_correction_mean = 0.5704591237606211 +step_correction_p50 = 0.559999942779541 + +[cell.spm_12.cold_start_10gh_to_1ph] +shares_per_minute = 12 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 60 +convergence_p10_secs_ci_low = 60 +convergence_p10_secs_ci_high = 60 +convergence_p50_secs = 60 +convergence_p50_secs_ci_low = 60 +convergence_p50_secs_ci_high = 60 +convergence_p90_secs = 60 +convergence_p90_secs_ci_low = 60 +convergence_p90_secs_ci_high = 60 +convergence_p95_secs = 60 +convergence_p95_secs_ci_low = 60 +convergence_p95_secs_ci_high = 300 +convergence_p99_secs = 480 +convergence_p99_secs_ci_low = 360 +convergence_p99_secs_ci_high = 540 +convergence_mean_secs = 75.3 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0.031249511363577676 +settled_accuracy_p50_ci_low = 0.02083193383388049 +settled_accuracy_p50_ci_high = 0.0416652769539233 +settled_accuracy_p90 = 0.20833363252702264 +settled_accuracy_p90_ci_low = 0.1916657366496476 +settled_accuracy_p90_ci_high = 0.2250007902068838 +settled_accuracy_p95 = 0.2500000503316486 +settled_accuracy_p95_ci_low = 0.2500000503316486 +settled_accuracy_p95_ci_high = 0.2500000503316486 +settled_accuracy_p99 = 0.27500280011738676 +settled_accuracy_p99_ci_low = 0.2500005872025677 +settled_accuracy_p99_ci_high = 0.3326832721289301 +settled_accuracy_mean = 0.06450418151981575 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.037037037037037035 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.037037037037037035 +jitter_p90_per_min = 0.07407407407407407 +jitter_p90_per_min_ci_low = 0.045454545454545456 +jitter_p90_per_min_ci_high = 0.07407407407407407 +jitter_p95_per_min = 0.07407407407407407 +jitter_p95_per_min_ci_low = 0.07407407407407407 +jitter_p95_per_min_ci_high = 0.07407407407407407 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.1111111111111111 +jitter_p99_per_min_ci_high = 0.13043478260869565 +jitter_mean_per_min = 0.024817979484283614 +bias_mean = 0.010712088986326555 +bias_p10 = -0.07495800247765222 +bias_p10_ci_low = -0.08079343616245739 +bias_p10_ci_high = -0.06731580035591646 +bias_p50 = 0.013158978191805256 +bias_p50_ci_low = 0.006579812278067672 +bias_p50_ci_high = 0.017119238314101125 +bias_p90 = 0.09477476991646207 +bias_p90_ci_low = 0.08521242422866104 +bias_p90_ci_high = 0.10256864160485638 +bias_p99 = 0.1705057322997216 +bias_p99_ci_low = 0.15124827486508213 +bias_p99_ci_high = 0.1784552506380296 +variance_mean = 0.008200206826251315 +variance_p10 = 0.0016101172023811519 +variance_p10_ci_low = 0.0014831607531858252 +variance_p10_ci_high = 0.0017751539888708923 +variance_p50 = 0.0053650691208275945 +variance_p50_ci_low = 0.004888289762832411 +variance_p50_ci_high = 0.0057206243122856285 +variance_p90 = 0.01695849354939677 +variance_p90_ci_low = 0.01567677973557319 +variance_p90_ci_high = 0.019165023683487895 +variance_p99 = 0.046258334584137965 +variance_p99_ci_low = 0.039231505560987395 +variance_p99_ci_high = 0.052208064148941184 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.2500000503316486 +ramp_target_overshoot_p50_ci_low = 0.2351901975960129 +ramp_target_overshoot_p50_ci_high = 0.2500000503316486 +ramp_target_overshoot_p90 = 0.2500000503316486 +ramp_target_overshoot_p90_ci_low = 0.2500000503316486 +ramp_target_overshoot_p90_ci_high = 0.2500000503316486 +ramp_target_overshoot_p99 = 0.5833356877360092 +ramp_target_overshoot_p99_ci_low = 0.438804264983111 +ramp_target_overshoot_p99_ci_high = 0.7911086256970179 +ramp_target_overshoot_mean = 0.14674255314736948 + +[cell.spm_12.stable_1ph] +shares_per_minute = 12 +scenario = "stable_1ph" +convergence_rate = 0.925 +convergence_rate_ci_low = 0.9086748353760216 +convergence_rate_ci_high = 0.9413251646239785 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 900 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 88.28108108108108 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0.19999998657822704 +settled_accuracy_p90_ci_low = 0.14126744889206955 +settled_accuracy_p90_ci_high = 0.2083321561319954 +settled_accuracy_p95 = 0.2250007902068838 +settled_accuracy_p95_ci_low = 0.21666560075419627 +settled_accuracy_p95_ci_high = 0.2250007902068838 +settled_accuracy_p99 = 0.2701425076878239 +settled_accuracy_p99_ci_low = 0.251387660330628 +settled_accuracy_p99_ci_high = 0.32500172302010566 +settled_accuracy_mean = 0.030186725416898735 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.07142857142857142 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.09090909090909091 +jitter_mean_per_min = 0.0013084110900401927 +bias_mean = -0.0015831590095210493 +bias_p10 = -0.07412212977724918 +bias_p10_ci_low = -0.08026222711244127 +bias_p10_ci_high = -0.06710430500224641 +bias_p50 = -0.0035075401878170167 +bias_p50_ci_low = -0.008252023908882352 +bias_p50_ci_high = 0.0017553807066654594 +bias_p90 = 0.07149229583696975 +bias_p90_ci_low = 0.06622904646225394 +bias_p90_ci_high = 0.07850987690083167 +bias_p99 = 0.1298258607253206 +bias_p99_ci_low = 0.10789571504211196 +bias_p99_ci_high = 0.15482600032941976 +variance_mean = 0.005490430565306488 +variance_p10 = 0.0013146355360281405 +variance_p10_ci_low = 0.0012346142042111957 +variance_p10_ci_high = 0.0014134994520331621 +variance_p50 = 0.003431846421236201 +variance_p50_ci_low = 0.0032471622518509733 +variance_p50_ci_high = 0.003709598407698628 +variance_p90 = 0.010782212431409408 +variance_p90_ci_low = 0.010028114310730247 +variance_p90_ci_high = 0.0121045162893479 +variance_p99 = 0.03478926875628971 +variance_p99_ci_low = 0.029296697872076515 +variance_p99_ci_high = 0.03729995950329233 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1.2000019327353084 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1.2166693588506292 +upward_step_magnitude_p95 = 1.2500000503316486 +upward_step_magnitude_p95_ci_low = 1.2250007902068838 +upward_step_magnitude_p95_ci_high = 1.2750028001173868 +upward_step_magnitude_p99 = 2 +upward_step_magnitude_p99_ci_low = 1.625001547832796 +upward_step_magnitude_p99_ci_high = 2.166668899365644 +upward_step_magnitude_mean = 1.0434612406285826 +fire_decisiveness_mean = 4.537162803690793 +fire_decisiveness_p50 = 1.9077629201788966 + +[cell.spm_12.step_minus_50_at_15min] +shares_per_minute = 12 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.899 +convergence_rate_ci_low = 0.8803234521819475 +convergence_rate_ci_high = 0.9176765478180525 +convergence_p10_secs = 1080 +convergence_p10_secs_ci_low = 1080 +convergence_p10_secs_ci_high = 1080 +convergence_p50_secs = 1200 +convergence_p50_secs_ci_low = 1200 +convergence_p50_secs_ci_high = 1200 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1227.3637374860957 +settled_accuracy_p10 = 0.01635946353441864 +settled_accuracy_p10_ci_low = 0.01388992441595649 +settled_accuracy_p10_ci_high = 0.02036814446874302 +settled_accuracy_p50 = 0.1041661116204301 +settled_accuracy_p50_ci_low = 0.0942339996192243 +settled_accuracy_p50_ci_high = 0.12301511271504284 +settled_accuracy_p90 = 0.4833339496164091 +settled_accuracy_p90_ci_low = 0.46666706037200734 +settled_accuracy_p90_ci_high = 0.5000015099494597 +settled_accuracy_p95 = 0.516668130758402 +settled_accuracy_p95_ci_low = 0.516668130758402 +settled_accuracy_p95_ci_high = 0.533335422655993 +settled_accuracy_p99 = 0.550000701287638 +settled_accuracy_p99_ci_low = 0.550000701287638 +settled_accuracy_p99_ci_high = 0.5666687984916075 +settled_accuracy_mean = 0.19078290782174692 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.15384615384615385 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.12 +jitter_p99_per_min_ci_high = 0.2727272727272727 +jitter_mean_per_min = 0.08119129385172148 +reaction_rate = 0.685 +reaction_rate_ci_low = 0.6562090076586444 +reaction_rate_ci_high = 0.7137909923413557 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 239.73722627737226 +fire_decisiveness_mean = 18733620.846867893 +fire_decisiveness_p50 = 2.740906055804377 +step_correction_mean = 0.5140001014636381 +step_correction_p50 = 0.4999984800815582 + +[cell.spm_12.step_minus_25_at_15min] +shares_per_minute = 12 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.847 +convergence_rate_ci_low = 0.8246877436013298 +convergence_rate_ci_high = 0.8693122563986702 +convergence_p10_secs = 780 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 1020 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1320 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1203.4002361275088 +settled_accuracy_p10 = 0.011110722376806215 +settled_accuracy_p10_ci_low = 0.011110722376806215 +settled_accuracy_p10_ci_high = 0.011110722376806215 +settled_accuracy_p50 = 0.033333777743139725 +settled_accuracy_p50_ci_low = 0.033333777743139725 +settled_accuracy_p50_ci_high = 0.033333777743139725 +settled_accuracy_p90 = 0.07777711464278714 +settled_accuracy_p90_ci_low = 0.06666666070143434 +settled_accuracy_p90_ci_high = 0.13333582680043454 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.33333330350717194 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.33333330350717194 +settled_accuracy_mean = 0.05566282153757891 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.0625 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.07692307692307693 +jitter_p95_per_min = 0.07692307692307693 +jitter_p95_per_min_ci_low = 0.06666666666666667 +jitter_p95_per_min_ci_high = 0.08333333333333333 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.07692307692307693 +jitter_p99_per_min_ci_high = 0.17647058823529413 +jitter_mean_per_min = 0.010922169796544647 +reaction_rate = 0.158 +reaction_rate_ci_low = 0.13539311835745585 +reaction_rate_ci_high = 0.18060688164254415 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 242.27848101265823 +fire_decisiveness_mean = 3.081309491007919 +fire_decisiveness_p50 = 2.2011279766541954 +step_correction_mean = 0.9734391528594343 +step_correction_p50 = 0.9666637778282166 + +[cell.spm_12.step_minus_10_at_15min] +shares_per_minute = 12 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.834 +convergence_rate_ci_low = 0.8109382032269816 +convergence_rate_ci_high = 0.8570617967730183 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 283.23741007194246 +settled_accuracy_p10 = 0.11111110282606607 +settled_accuracy_p10_ci_low = 0.11111110282606607 +settled_accuracy_p10_ci_high = 0.11111110282606607 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.14814699376521367 +settled_accuracy_p90_ci_low = 0.13888850570555833 +settled_accuracy_p90_ci_high = 0.1574066003059419 +settled_accuracy_p95 = 0.16666583401964574 +settled_accuracy_p95_ci_low = 0.1574066003059419 +settled_accuracy_p95_ci_high = 0.18055729437937162 +settled_accuracy_p99 = 0.379631490312649 +settled_accuracy_p99_ci_low = 0.32510702931799873 +settled_accuracy_p99_ci_high = 0.3981515981789636 +settled_accuracy_mean = 0.12393834276150756 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.08 +jitter_p99_per_min_ci_low = 0.058823529411764705 +jitter_p99_per_min_ci_high = 0.09090909090909091 +jitter_mean_per_min = 0.0020658369168317266 +reaction_rate = 0.05 +reaction_rate_ci_low = 0.036491632222951584 +reaction_rate_ci_high = 0.06350836777704842 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 206.4 +fire_decisiveness_mean = 2.815329653464704 +fire_decisiveness_p50 = 1.7192995116684067 +step_correction_mean = 1.9400935757160187 +step_correction_p50 = 2.3333230018615723 + +[cell.spm_12.step_minus_5_at_15min] +shares_per_minute = 12 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.896 +convergence_rate_ci_low = 0.8770797554349845 +convergence_rate_ci_high = 0.9149202445650155 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 120.80357142857143 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.16666543045073912 +settled_accuracy_p90_ci_low = 0.16008960940733474 +settled_accuracy_p90_ci_high = 0.17543747739049365 +settled_accuracy_p95 = 0.19298135934727234 +settled_accuracy_p95_ci_low = 0.1842101600984395 +settled_accuracy_p95_ci_high = 0.20175361820975735 +settled_accuracy_p99 = 0.28070458374031326 +settled_accuracy_p99_ci_low = 0.25438717138466704 +settled_accuracy_p99_ci_high = 0.33717012372684774 +settled_accuracy_mean = 0.0763407359355898 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.08333333333333333 +jitter_p99_per_min_ci_low = 0.043478260869565216 +jitter_p99_per_min_ci_high = 0.09090909090909091 +jitter_mean_per_min = 0.0016101732400973581 +reaction_rate = 0.027 +reaction_rate_ci_low = 0.016953972247699095 +reaction_rate_ci_high = 0.037046027752300904 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 180 +fire_decisiveness_mean = 3.2518976263237347 +fire_decisiveness_p50 = 1.9822071846069278 +step_correction_mean = 2.955417017141978 +step_correction_p50 = 4.6666460037231445 + +[cell.spm_12.step_plus_5_at_15min] +shares_per_minute = 12 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.898 +convergence_rate_ci_low = 0.879241663357323 +convergence_rate_ci_high = 0.916758336642677 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 173.85300668151447 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.16666749753838284 +settled_accuracy_p90_ci_low = 0.16666749753838284 +settled_accuracy_p90_ci_high = 0.1746043676497413 +settled_accuracy_p95 = 0.19047631830260836 +settled_accuracy_p95_ci_low = 0.18254136558751766 +settled_accuracy_p95_ci_high = 0.19841574494232406 +settled_accuracy_p99 = 0.2460337699500288 +settled_accuracy_p99_ci_low = 0.23016130799149037 +settled_accuracy_p99_ci_high = 0.27777703212367355 +settled_accuracy_mean = 0.07584343884253711 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.047619047619047616 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.09090909090909091 +jitter_mean_per_min = 0.0013397532467521937 +reaction_rate = 0.045 +reaction_rate_ci_low = 0.03215115725055365 +reaction_rate_ci_high = 0.05784884274944635 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 186.66666666666666 +fire_decisiveness_mean = 2.9484070571442933 +fire_decisiveness_p50 = 1.8808756430719207 +step_correction_mean = 2.323725281821357 +step_correction_p50 = 4.666696548461914 + +[cell.spm_12.step_plus_10_at_15min] +shares_per_minute = 12 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.843 +convergence_rate_ci_low = 0.8204513946861451 +convergence_rate_ci_high = 0.8655486053138548 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 315.0889679715302 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.12878941646828368 +settled_accuracy_p90_ci_low = 0.12878941646828368 +settled_accuracy_p90_ci_high = 0.13636368905241492 +settled_accuracy_p95 = 0.1515176029298999 +settled_accuracy_p95_ci_low = 0.14394223220070046 +settled_accuracy_p95_ci_high = 0.1515176029298999 +settled_accuracy_p99 = 0.18939579875320267 +settled_accuracy_p99_ci_low = 0.16666785632382397 +settled_accuracy_p99_ci_high = 0.27272725608871107 +settled_accuracy_mean = 0.1020371980169688 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.07142857142857142 +jitter_p99_per_min_ci_low = 0.041666666666666664 +jitter_p99_per_min_ci_high = 0.09090909090909091 +jitter_mean_per_min = 0.0018416915337205193 +reaction_rate = 0.039 +reaction_rate_ci_low = 0.0270008614309193 +reaction_rate_ci_high = 0.0509991385690807 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 206.15384615384616 +fire_decisiveness_mean = 2.8698681072930627 +fire_decisiveness_p50 = 2.11776227615713 +step_correction_mean = 2.1459501080023937 +step_correction_p50 = 2.4166836738586426 + +[cell.spm_12.step_plus_25_at_15min] +shares_per_minute = 12 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.815 +convergence_rate_ci_low = 0.7909330674991597 +convergence_rate_ci_high = 0.8390669325008402 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 780 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1260 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1155.0920245398772 +settled_accuracy_p10 = 0.006665359564988593 +settled_accuracy_p10_ci_low = 0.006665359564988593 +settled_accuracy_p10_ci_high = 0.006665359564988593 +settled_accuracy_p50 = 0.019999407294529314 +settled_accuracy_p50_ci_low = 0.019999407294529314 +settled_accuracy_p50_ci_high = 0.019999407294529314 +settled_accuracy_p90 = 0.1244471035063468 +settled_accuracy_p90_ci_low = 0.060001335734792605 +settled_accuracy_p90_ci_high = 0.20000003221225382 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.20000003221225382 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.23545353672293579 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.41944810530744125 +settled_accuracy_mean = 0.040992390928771744 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.04 +jitter_p95_per_min = 0.047619047619047616 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.08333333333333333 +jitter_p99_per_min = 0.09090909090909091 +jitter_p99_per_min_ci_low = 0.047619047619047616 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.005157794708500742 +reaction_rate = 0.194 +reaction_rate_ci_low = 0.1694910640296238 +reaction_rate_ci_high = 0.2185089359703762 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 224.84536082474227 +fire_decisiveness_mean = 3.493487423891771 +fire_decisiveness_p50 = 2.7207300285530565 +step_correction_mean = 0.9917740176633462 +step_correction_p50 = 0.9666731953620911 + +[cell.spm_12.step_plus_50_at_15min] +shares_per_minute = 12 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.965 +convergence_rate_ci_low = 0.9536092124943004 +convergence_rate_ci_high = 0.9763907875056995 +convergence_p10_secs = 1020 +convergence_p10_secs_ci_low = 1020 +convergence_p10_secs_ci_high = 1080 +convergence_p50_secs = 1200 +convergence_p50_secs_ci_low = 1200 +convergence_p50_secs_ci_high = 1200 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1210.259067357513 +settled_accuracy_p10 = 0.11111116082138017 +settled_accuracy_p10_ci_low = 0.10298821452037155 +settled_accuracy_p10_ci_high = 0.11666553774645394 +settled_accuracy_p50 = 0.16110905360307037 +settled_accuracy_p50_ci_low = 0.15989903605723432 +settled_accuracy_p50_ci_high = 0.16110905360307037 +settled_accuracy_p90 = 0.19907566935946197 +settled_accuracy_p90_ci_low = 0.188887112243869 +settled_accuracy_p90_ci_high = 0.22338312602212396 +settled_accuracy_p95 = 0.2601826739052374 +settled_accuracy_p95_ci_low = 0.2416695754630669 +settled_accuracy_p95_ci_high = 0.28164176197094615 +settled_accuracy_p99 = 0.4046353970979084 +settled_accuracy_p99_ci_low = 0.3566409275840783 +settled_accuracy_p99_ci_high = 0.4236156627076315 +settled_accuracy_mean = 0.16257351838617307 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.09090909090909091 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.02981727502659483 +reaction_rate = 0.577 +reaction_rate_ci_low = 0.5463793671913855 +reaction_rate_ci_high = 0.6076206328086144 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 223.46620450606585 +fire_decisiveness_mean = 4.874876100727245 +fire_decisiveness_p50 = 3.386230028022144 +step_correction_mean = 0.5317293314628007 +step_correction_p50 = 0.5166728496551514 + +[cell.spm_15.cold_start_10gh_to_1ph] +shares_per_minute = 15 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 60 +convergence_p10_secs_ci_low = 60 +convergence_p10_secs_ci_high = 60 +convergence_p50_secs = 60 +convergence_p50_secs_ci_low = 60 +convergence_p50_secs_ci_high = 60 +convergence_p90_secs = 60 +convergence_p90_secs_ci_low = 60 +convergence_p90_secs_ci_high = 300 +convergence_p95_secs = 360 +convergence_p95_secs_ci_low = 360 +convergence_p95_secs_ci_high = 360 +convergence_p99_secs = 600 +convergence_p99_secs_ci_low = 600 +convergence_p99_secs_ci_high = 660 +convergence_mean_secs = 94.62 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0.009628914149709566 +settled_accuracy_p50_ci_low = 0.004445291209188351 +settled_accuracy_p50_ci_high = 0.013334799885726945 +settled_accuracy_p90 = 0.13333249670948455 +settled_accuracy_p90_ci_low = 0.11195932988040336 +settled_accuracy_p90_ci_high = 0.16419156869723106 +settled_accuracy_p95 = 0.1933352038810936 +settled_accuracy_p95_ci_low = 0.18518510067772564 +settled_accuracy_p95_ci_high = 0.20000126164665954 +settled_accuracy_p99 = 0.24000244007832672 +settled_accuracy_p99_ci_low = 0.22000319303979077 +settled_accuracy_p99_ci_high = 0.2771536392365669 +settled_accuracy_mean = 0.040848302290002754 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.037037037037037035 +jitter_p50_per_min_ci_low = 0.037037037037037035 +jitter_p50_per_min_ci_high = 0.037037037037037035 +jitter_p90_per_min = 0.05263157894736842 +jitter_p90_per_min_ci_low = 0.045454545454545456 +jitter_p90_per_min_ci_high = 0.07407407407407407 +jitter_p95_per_min = 0.07407407407407407 +jitter_p95_per_min_ci_low = 0.07407407407407407 +jitter_p95_per_min_ci_high = 0.07407407407407407 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.08695652173913043 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.02461317184293877 +bias_mean = 0.002533407504640958 +bias_p10 = -0.06895215112857034 +bias_p10_ci_low = -0.07333013214629101 +bias_p10_ci_high = -0.06300071094071831 +bias_p50 = 0.0010539270626030606 +bias_p50_ci_low = -0.0028057757237488906 +bias_p50_ci_high = 0.00494588448864029 +bias_p90 = 0.07403640703248769 +bias_p90_ci_low = 0.06666816095739117 +bias_p90_ci_high = 0.08285291539222665 +bias_p99 = 0.1469020716609016 +bias_p99_ci_low = 0.13245515426263557 +bias_p99_ci_high = 0.15555689357288832 +variance_mean = 0.006470266179165833 +variance_p10 = 0.0013350778749049435 +variance_p10_ci_low = 0.001260197551421964 +variance_p10_ci_high = 0.0014551295819246568 +variance_p50 = 0.0041115563225118485 +variance_p50_ci_low = 0.0038333389134307043 +variance_p50_ci_high = 0.004573230537509442 +variance_p90 = 0.013431640757817104 +variance_p90_ci_low = 0.012455484869496493 +variance_p90_ci_high = 0.01496294892169903 +variance_p99 = 0.03379463705719737 +variance_p99_ci_low = 0.028995798893380723 +variance_p99_ci_high = 0.039285991253686585 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.33333328859409006 +ramp_target_overshoot_p50_ci_low = 0.20000126164665954 +ramp_target_overshoot_p50_ci_high = 0.33333328859409006 +ramp_target_overshoot_p90 = 0.33333328859409006 +ramp_target_overshoot_p90_ci_low = 0.33333328859409006 +ramp_target_overshoot_p90_ci_high = 0.33333328859409006 +ramp_target_overshoot_p99 = 0.5810433831296768 +ramp_target_overshoot_p99_ci_low = 0.4204470376502878 +ramp_target_overshoot_p99_ci_high = 0.6641833478612842 +ramp_target_overshoot_mean = 0.18323614233816923 + +[cell.spm_15.stable_1ph] +shares_per_minute = 15 +scenario = "stable_1ph" +convergence_rate = 0.936 +convergence_rate_ci_low = 0.9208300558208015 +convergence_rate_ci_high = 0.9511699441791986 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 180 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 960 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 94.35897435897436 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0.17999852494715007 +settled_accuracy_p90_ci_low = 0.1053294437930038 +settled_accuracy_p90_ci_high = 0.18666901189779783 +settled_accuracy_p95 = 0.20000126164665954 +settled_accuracy_p95_ci_low = 0.1933352038810936 +settled_accuracy_p95_ci_high = 0.20666919846044207 +settled_accuracy_p99 = 0.24000244007832672 +settled_accuracy_p99_ci_low = 0.22666609668870763 +settled_accuracy_p99_ci_high = 0.24800127990027088 +settled_accuracy_mean = 0.025319415715325835 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.045454545454545456 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.06666666666666667 +jitter_mean_per_min = 0.0010002608816168136 +bias_mean = 0.0007232578034479454 +bias_p10 = -0.06315688033336884 +bias_p10_ci_low = -0.06736738941277619 +bias_p10_ci_high = -0.05824470921921347 +bias_p50 = -0.0007005353122273001 +bias_p50_ci_low = -0.004911058519816715 +bias_p50_ci_high = 0.002808594296073551 +bias_p90 = 0.06421183875326365 +bias_p90_ci_low = 0.059650413887389814 +bias_p90_ci_high = 0.07087876893407305 +bias_p99 = 0.11579106593033077 +bias_p99_ci_low = 0.1077205467766113 +bias_p99_ci_high = 0.12686138313228357 +variance_mean = 0.004522943289928598 +variance_p10 = 0.0010807113676306276 +variance_p10_ci_low = 0.0010208612572131398 +variance_p10_ci_high = 0.0011710768441967518 +variance_p50 = 0.003016856265942941 +variance_p50_ci_low = 0.0028518713637974984 +variance_p50_ci_high = 0.003211610400386022 +variance_p90 = 0.009635480927362904 +variance_p90_ci_low = 0.00823539230092978 +variance_p90_ci_high = 0.01078584770984352 +variance_p99 = 0.02410606548896482 +variance_p99_ci_low = 0.02169115287750954 +variance_p99_ci_high = 0.027551524780440293 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1.1733336751411518 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1.1933352038810936 +upward_step_magnitude_p95 = 1.2200031930397908 +upward_step_magnitude_p95_ci_low = 1.206669198460442 +upward_step_magnitude_p95_ci_high = 1.2400024400783267 +upward_step_magnitude_p99 = 1.5777786542593482 +upward_step_magnitude_p99_ci_low = 1.4500003864749582 +upward_step_magnitude_p99_ci_high = 1.7666673856892448 +upward_step_magnitude_mean = 1.0337600395497653 +fire_decisiveness_mean = 3.7518065746391267 +fire_decisiveness_p50 = 1.4095012751221994 + +[cell.spm_15.step_minus_50_at_15min] +shares_per_minute = 15 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.895 +convergence_rate_ci_low = 0.8759996221090212 +convergence_rate_ci_high = 0.9140003778909789 +convergence_p10_secs = 1080 +convergence_p10_secs_ci_low = 1080 +convergence_p10_secs_ci_high = 1080 +convergence_p50_secs = 1260 +convergence_p50_secs_ci_low = 1260 +convergence_p50_secs_ci_high = 1260 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1264.826815642458 +settled_accuracy_p10 = 0.015468056482310422 +settled_accuracy_p10_ci_low = 0.01307757160666878 +settled_accuracy_p10_ci_high = 0.01866646498215807 +settled_accuracy_p50 = 0.08408713925042488 +settled_accuracy_p50_ci_low = 0.07901270243305203 +settled_accuracy_p50_ci_high = 0.08999875915708855 +settled_accuracy_p90 = 0.4000013824426163 +settled_accuracy_p90_ci_low = 0.3125920859455179 +settled_accuracy_p90_ci_high = 0.45333521327633464 +settled_accuracy_p95 = 0.5066679703682149 +settled_accuracy_p95_ci_low = 0.48000145760454505 +settled_accuracy_p95_ci_high = 0.520002233383023 +settled_accuracy_p99 = 0.573335124692633 +settled_accuracy_p99_ci_low = 0.5466678066225847 +settled_accuracy_p99_ci_high = 0.573335124692633 +settled_accuracy_mean = 0.13369393559334072 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.13043478260869565 +jitter_p99_per_min = 0.13636363636363635 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08544668311434486 +reaction_rate = 0.754 +reaction_rate_ci_low = 0.7273062678817667 +reaction_rate_ci_high = 0.7806937321182333 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 237.85145888594164 +fire_decisiveness_mean = 5.794140100080137 +fire_decisiveness_p50 = 2.968976412911722 +step_correction_mean = 0.47815619428847134 +step_correction_p50 = 0.4666663110256195 + +[cell.spm_15.step_minus_25_at_15min] +shares_per_minute = 15 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.87 +convergence_rate_ci_low = 0.849155697181244 +convergence_rate_ci_high = 0.890844302818756 +convergence_p10_secs = 1080 +convergence_p10_secs_ci_low = 1020 +convergence_p10_secs_ci_high = 1140 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1320 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1262.7586206896551 +settled_accuracy_p10 = 0.013334799587432666 +settled_accuracy_p10_ci_low = 0.013332383668351211 +settled_accuracy_p10_ci_high = 0.013334799587432666 +settled_accuracy_p50 = 0.048890059665148256 +settled_accuracy_p50_ci_low = 0.048890059665148256 +settled_accuracy_p50_ci_high = 0.048890059665148256 +settled_accuracy_p90 = 0.08444505130741042 +settled_accuracy_p90_ci_low = 0.07555724292093213 +settled_accuracy_p90_ci_high = 0.08444505130741042 +settled_accuracy_p95 = 0.10222442617671579 +settled_accuracy_p95_ci_low = 0.09333527561297017 +settled_accuracy_p95_ci_high = 0.33333330350717194 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.33333330350717194 +settled_accuracy_p99_ci_high = 0.33333330350717194 +settled_accuracy_mean = 0.058753447986290876 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.058823529411764705 +jitter_p95_per_min = 0.058823529411764705 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.06666666666666667 +jitter_p99_per_min = 0.07142857142857142 +jitter_p99_per_min_ci_low = 0.058823529411764705 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.005401237535441331 +reaction_rate = 0.177 +reaction_rate_ci_low = 0.1533439286101855 +reaction_rate_ci_high = 0.20065607138981448 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 242.03389830508473 +fire_decisiveness_mean = 2.820385126972723 +fire_decisiveness_p50 = 2.2308173250668197 +step_correction_mean = 0.9165362722456118 +step_correction_p50 = 0.9066644310951233 + +[cell.spm_15.step_minus_10_at_15min] +shares_per_minute = 15 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.833 +convergence_rate_ci_low = 0.8098827160418876 +convergence_rate_ci_high = 0.8561172839581124 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 322.7611044417767 +settled_accuracy_p10 = 0.1037022841993297 +settled_accuracy_p10_ci_low = 0.09629577710014392 +settled_accuracy_p10_ci_high = 0.1037022841993297 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.1259249372438911 +settled_accuracy_p90_ci_low = 0.1259249372438911 +settled_accuracy_p90_ci_high = 0.13333248825874489 +settled_accuracy_p95 = 0.14814796311547684 +settled_accuracy_p95_ci_low = 0.13333248825874489 +settled_accuracy_p95_ci_high = 0.15555432108385292 +settled_accuracy_p99 = 0.3203339486221991 +settled_accuracy_p99_ci_low = 0.22370628090503009 +settled_accuracy_p99_ci_high = 0.37926671635208153 +settled_accuracy_mean = 0.1162611086608103 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.09090909090909091 +jitter_p99_per_min_ci_low = 0.07142857142857142 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.002594049896015352 +reaction_rate = 0.039 +reaction_rate_ci_low = 0.0270008614309193 +reaction_rate_ci_high = 0.0509991385690807 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 223.07692307692307 +fire_decisiveness_mean = 3.7408633436518044 +fire_decisiveness_p50 = 1.8277104815799525 +step_correction_mean = 1.94240691111638 +step_correction_p50 = 2.13332462310791 + +[cell.spm_15.step_minus_5_at_15min] +shares_per_minute = 15 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.916 +convergence_rate_ci_low = 0.8988073250946806 +convergence_rate_ci_high = 0.9331926749053194 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 480 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 109.06113537117903 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.14385915389284754 +settled_accuracy_p90_ci_low = 0.14385915389284754 +settled_accuracy_p90_ci_high = 0.15087584485645522 +settled_accuracy_p95 = 0.16491113408824454 +settled_accuracy_p95_ci_low = 0.15789472568827734 +settled_accuracy_p95_ci_high = 0.1789465646018541 +settled_accuracy_p99 = 0.2771942956334805 +settled_accuracy_p99_ci_low = 0.249125271269925 +settled_accuracy_p99_ci_high = 0.32491378453519304 +settled_accuracy_mean = 0.07139714263169805 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.06666666666666667 +jitter_p99_per_min_ci_low = 0.043478260869565216 +jitter_p99_per_min_ci_high = 0.08333333333333333 +jitter_mean_per_min = 0.0015844563305797725 +reaction_rate = 0.019 +reaction_rate_ci_low = 0.010538109998351433 +reaction_rate_ci_high = 0.027461890001648566 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 183.1578947368421 +fire_decisiveness_mean = 2.9562662207068704 +fire_decisiveness_p50 = 1.5655776741108554 +step_correction_mean = 0.06928381166960064 +step_correction_p50 = 1.0641330480575562 + +[cell.spm_15.step_plus_5_at_15min] +shares_per_minute = 15 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.907 +convergence_rate_ci_low = 0.8889988111059297 +convergence_rate_ci_high = 0.9250011888940703 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 960 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 168.55567805953694 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.14285842112132152 +settled_accuracy_p90_ci_low = 0.14285842112132152 +settled_accuracy_p90_ci_high = 0.14920883756061687 +settled_accuracy_p95 = 0.1619078808693577 +settled_accuracy_p95_ci_low = 0.15555682529797288 +settled_accuracy_p95_ci_high = 0.1682575303501459 +settled_accuracy_p99 = 0.2253963226129152 +settled_accuracy_p99_ci_low = 0.19365433870344906 +settled_accuracy_p99_ci_high = 0.2327450633756989 +settled_accuracy_mean = 0.0689712602112536 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.07692307692307693 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.09090909090909091 +jitter_mean_per_min = 0.001295092144374441 +reaction_rate = 0.035 +reaction_rate_ci_low = 0.023609212494300494 +reaction_rate_ci_high = 0.04639078750569951 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 185.14285714285714 +fire_decisiveness_mean = 4.100137722308495 +fire_decisiveness_p50 = 1.629763583524234 +step_correction_mean = 2.479557851382664 +step_correction_p50 = 4.266697883605957 + +[cell.spm_15.step_plus_10_at_15min] +shares_per_minute = 15 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.825 +convergence_rate_ci_low = 0.801449394912232 +convergence_rate_ci_high = 0.8485506050877679 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 410.90909090909093 +settled_accuracy_p10 = 0.08485019196490917 +settled_accuracy_p10_ci_low = 0.07879001739766833 +settled_accuracy_p10_ci_high = 0.08485019196490917 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.11515484730079306 +settled_accuracy_p90_ci_low = 0.10909381862072132 +settled_accuracy_p90_ci_high = 0.11515484730079306 +settled_accuracy_p95 = 0.1272749524030372 +settled_accuracy_p95_ci_low = 0.12121319162625332 +settled_accuracy_p95_ci_high = 0.13333549301863434 +settled_accuracy_p99 = 0.1575761912875977 +settled_accuracy_p99_ci_low = 0.15151687083318777 +settled_accuracy_p99_ci_high = 0.18788048057512552 +settled_accuracy_mean = 0.09598491923478458 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.0625 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.001535786120132516 +reaction_rate = 0.059 +reaction_rate_ci_low = 0.0443958296914888 +reaction_rate_ci_high = 0.0736041703085112 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 183.05084745762713 +fire_decisiveness_mean = 3.4274340623434543 +fire_decisiveness_p50 = 1.8278379884232017 +step_correction_mean = 1.8365659653130224 +step_correction_p50 = 2.2667033672332764 + +[cell.spm_15.step_plus_25_at_15min] +shares_per_minute = 15 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.883 +convergence_rate_ci_low = 0.8630781643014506 +convergence_rate_ci_high = 0.9029218356985494 +convergence_p10_secs = 1020 +convergence_p10_secs_ci_low = 900 +convergence_p10_secs_ci_high = 1080 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1320 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1216.0362400906001 +settled_accuracy_p10 = 0.00799808788061196 +settled_accuracy_p10_ci_low = 0.00799808788061196 +settled_accuracy_p10_ci_high = 0.00799808788061196 +settled_accuracy_p50 = 0.02933237097435415 +settled_accuracy_p50_ci_low = 0.02933237097435415 +settled_accuracy_p50_ci_high = 0.02933237097435415 +settled_accuracy_p90 = 0.05066482870704525 +settled_accuracy_p90_ci_low = 0.05066482870704525 +settled_accuracy_p90_ci_high = 0.0559999295625383 +settled_accuracy_p95 = 0.20000003221225382 +settled_accuracy_p95_ci_low = 0.11466477888542592 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.3238089572829006 +settled_accuracy_mean = 0.0404246563435696 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.041666666666666664 +jitter_p95_per_min = 0.041666666666666664 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.05 +jitter_p99_per_min = 0.07692307692307693 +jitter_p99_per_min_ci_low = 0.043478260869565216 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.004118602341108735 +reaction_rate = 0.196 +reaction_rate_ci_low = 0.17139563667964564 +reaction_rate_ci_high = 0.22060436332035438 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 232.6530612244898 +fire_decisiveness_mean = 3.841317140484283 +fire_decisiveness_p50 = 2.3274734107111925 +step_correction_mean = 0.9214676393538105 +step_correction_p50 = 0.9066811203956604 + +[cell.spm_15.step_plus_50_at_15min] +shares_per_minute = 15 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.951 +convergence_rate_ci_low = 0.9376203617986135 +convergence_rate_ci_high = 0.9643796382013864 +convergence_p10_secs = 1080 +convergence_p10_secs_ci_low = 1020 +convergence_p10_secs_ci_high = 1080 +convergence_p50_secs = 1200 +convergence_p50_secs_ci_low = 1200 +convergence_p50_secs_ci_high = 1200 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1191.9242902208202 +settled_accuracy_p10 = 0.06311508069482907 +settled_accuracy_p10_ci_low = 0.052624712651031746 +settled_accuracy_p10_ci_high = 0.06936783719139217 +settled_accuracy_p50 = 0.15999916248138513 +settled_accuracy_p50_ci_low = 0.15555431876405879 +settled_accuracy_p50_ci_high = 0.15999916248138513 +settled_accuracy_p90 = 0.19555388568819376 +settled_accuracy_p90_ci_low = 0.19466786973471684 +settled_accuracy_p90_ci_high = 0.1994121979396506 +settled_accuracy_p95 = 0.22580029780229216 +settled_accuracy_p95_ci_low = 0.2044432152089085 +settled_accuracy_p95_ci_high = 0.2626251680965179 +settled_accuracy_p99 = 0.40000139586435823 +settled_accuracy_p99_ci_low = 0.326623043519382 +settled_accuracy_p99_ci_high = 0.48800438015077297 +settled_accuracy_mean = 0.15002057768025537 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.06666666666666667 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.2727272727272727 +jitter_mean_per_min = 0.0426683515153454 +reaction_rate = 0.707 +reaction_rate_ci_low = 0.6787902271969446 +reaction_rate_ci_high = 0.7352097728030553 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 227.77934936350778 +fire_decisiveness_mean = 4.804743925572558 +fire_decisiveness_p50 = 3.309842169015756 +step_correction_mean = 0.49586243191905205 +step_correction_p50 = 0.48000484704971313 + +[cell.spm_20.cold_start_10gh_to_1ph] +shares_per_minute = 20 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 60 +convergence_p10_secs_ci_low = 60 +convergence_p10_secs_ci_high = 60 +convergence_p50_secs = 60 +convergence_p50_secs_ci_low = 60 +convergence_p50_secs_ci_high = 60 +convergence_p90_secs = 360 +convergence_p90_secs_ci_low = 360 +convergence_p90_secs_ci_high = 360 +convergence_p95_secs = 360 +convergence_p95_secs_ci_low = 360 +convergence_p95_secs_ci_high = 360 +convergence_p99_secs = 540 +convergence_p99_secs_ci_low = 480 +convergence_p99_secs_ci_high = 600 +convergence_mean_secs = 142.8 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0.01250103934854474 +settled_accuracy_p50_ci_low = 0.00824143836846003 +settled_accuracy_p50_ci_high = 0.02000112608675253 +settled_accuracy_p90 = 0.1332981369706696 +settled_accuracy_p90_ci_low = 0.12359500041641058 +settled_accuracy_p90_ci_high = 0.1438500664478426 +settled_accuracy_p95 = 0.16820253133296115 +settled_accuracy_p95_ci_low = 0.15706729160231214 +settled_accuracy_p95_ci_high = 0.1750006593445974 +settled_accuracy_p99 = 0.21500291151810247 +settled_accuracy_p99_ci_low = 0.2049989930314826 +settled_accuracy_p99_ci_high = 0.2495037131670479 +settled_accuracy_mean = 0.04342699337320099 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.043478260869565216 +jitter_p90_per_min_ci_low = 0.041666666666666664 +jitter_p90_per_min_ci_high = 0.045454545454545456 +jitter_p95_per_min = 0.07407407407407407 +jitter_p95_per_min_ci_low = 0.047619047619047616 +jitter_p95_per_min_ci_high = 0.07407407407407407 +jitter_p99_per_min = 0.08695652173913043 +jitter_p99_per_min_ci_low = 0.07407407407407407 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.017719164542339558 +bias_mean = 0.0007260010513698614 +bias_p10 = -0.05815653170281584 +bias_p10_ci_low = -0.06210401288442169 +bias_p10_ci_high = -0.053419670135981874 +bias_p50 = 0.0015805267932160673 +bias_p50_ci_low = -0.002109221026822214 +bias_p50_ci_high = 0.004715785851218325 +bias_p90 = 0.05787598485923697 +bias_p90_ci_low = 0.052911867951624364 +bias_p90_ci_high = 0.0647382830738738 +bias_p99 = 0.11301853735105818 +bias_p99_ci_low = 0.09283244863657901 +bias_p99_ci_high = 0.14202210573779417 +variance_mean = 0.0038945084878560902 +variance_p10 = 0.0007933396768849547 +variance_p10_ci_low = 0.0007523577305948496 +variance_p10_ci_high = 0.0008496006488508486 +variance_p50 = 0.0024711255973147604 +variance_p50_ci_low = 0.0022854810814699287 +variance_p50_ci_high = 0.002630878932757417 +variance_p90 = 0.008545729930947382 +variance_p90_ci_low = 0.007761595365574801 +variance_p90_ci_high = 0.00944966181504893 +variance_p99 = 0.024011375267925694 +variance_p99_ci_low = 0.017518510720881987 +variance_p99_ci_high = 0.027302832737529606 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.5000000335544323 +ramp_target_overshoot_p50_ci_low = 0.1750006593445974 +ramp_target_overshoot_p50_ci_high = 0.5000000335544323 +ramp_target_overshoot_p90 = 0.5000000335544323 +ramp_target_overshoot_p90_ci_low = 0.5000000335544323 +ramp_target_overshoot_p90_ci_high = 0.5000000335544323 +ramp_target_overshoot_p99 = 0.5000000335544323 +ramp_target_overshoot_p99_ci_low = 0.5000000335544323 +ramp_target_overshoot_p99_ci_high = 0.530005078127805 +ramp_target_overshoot_mean = 0.2597846256409171 + +[cell.spm_20.stable_1ph] +shares_per_minute = 20 +scenario = "stable_1ph" +convergence_rate = 0.948 +convergence_rate_ci_low = 0.934238622394542 +convergence_rate_ci_high = 0.9617613776054579 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 960 +convergence_p95_secs_ci_low = 120 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 73.54430379746836 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0.0666653423850665 +settled_accuracy_p90_ci_low = 0 +settled_accuracy_p90_ci_high = 0.16000303600504684 +settled_accuracy_p95 = 0.17499918294957018 +settled_accuracy_p95_ci_low = 0.16999823033923334 +settled_accuracy_p95_ci_high = 0.17999852494715007 +settled_accuracy_p99 = 0.20000005368709184 +settled_accuracy_p99_ci_low = 0.19000391982879727 +settled_accuracy_p99_ci_high = 0.21500291151810247 +settled_accuracy_mean = 0.01790722212853079 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.0625 +jitter_p99_per_min_ci_low = 0.038461538461538464 +jitter_p99_per_min_ci_high = 0.09090909090909091 +jitter_mean_per_min = 0.0013296212166207864 +bias_mean = -0.0014099586938225827 +bias_p10 = -0.056051400784705364 +bias_p10_ci_low = -0.05973558210100471 +bias_p10_ci_high = -0.05236703933408453 +bias_p50 = -0.0021037922728585415 +bias_p50_ci_low = -0.0052615681210484554 +bias_p50_ci_high = 0.0002646844271502007 +bias_p90 = 0.052896733136572734 +bias_p90_ci_low = 0.0497385581672391 +bias_p90_ci_high = 0.05684423904249721 +bias_p99 = 0.10000190765778516 +bias_p99_ci_low = 0.09184371607017736 +bias_p99_ci_high = 0.11184397327373212 +variance_mean = 0.003102580860995612 +variance_p10 = 0.0007979309188216214 +variance_p10_ci_low = 0.0007447534568244568 +variance_p10_ci_high = 0.0008515425262649113 +variance_p50 = 0.002108593659383323 +variance_p50_ci_low = 0.0019759282325256407 +variance_p50_ci_high = 0.0022534674402418862 +variance_p90 = 0.00610709499154337 +variance_p90_ci_low = 0.005621708538066011 +variance_p90_ci_high = 0.006591736470913754 +variance_p99 = 0.01887016508817908 +variance_p99_ci_low = 0.01386117900201068 +variance_p99_ci_high = 0.026132688063881925 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1 +upward_step_magnitude_p95 = 1.185002564565271 +upward_step_magnitude_p95_ci_low = 1.1700011831292878 +upward_step_magnitude_p95_ci_high = 1.195000174818593 +upward_step_magnitude_p99 = 1.4375044862610138 +upward_step_magnitude_p99_ci_low = 1.2785761915031957 +upward_step_magnitude_p99_ci_high = 1.7000056572773088 +upward_step_magnitude_mean = 1.023142952955139 +fire_decisiveness_mean = 3.5581430437296078 +fire_decisiveness_p50 = 1.2843976812775715 + +[cell.spm_20.step_minus_50_at_15min] +shares_per_minute = 20 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.932 +convergence_rate_ci_low = 0.9163966272363954 +convergence_rate_ci_high = 0.9476033727636047 +convergence_p10_secs = 1140 +convergence_p10_secs_ci_low = 1080 +convergence_p10_secs_ci_high = 1140 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1320 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1292.7038626609442 +settled_accuracy_p10 = 0.01638113969777244 +settled_accuracy_p10_ci_low = 0.013626790556789503 +settled_accuracy_p10_ci_high = 0.01999938125626588 +settled_accuracy_p50 = 0.07657316097718825 +settled_accuracy_p50_ci_low = 0.07249750539572053 +settled_accuracy_p50_ci_high = 0.08085994104754657 +settled_accuracy_p90 = 0.18000188039039378 +settled_accuracy_p90_ci_low = 0.17049731896729392 +settled_accuracy_p90_ci_high = 0.18999922220825616 +settled_accuracy_p95 = 0.21756579906760276 +settled_accuracy_p95_ci_low = 0.2000922612674274 +settled_accuracy_p95_ci_high = 0.22850239655822802 +settled_accuracy_p99 = 0.3737567160035382 +settled_accuracy_p99_ci_low = 0.31670854371682844 +settled_accuracy_p99_ci_high = 0.4900020206479214 +settled_accuracy_mean = 0.09272230103412761 +jitter_p10_per_min = 0.08695652173913043 +jitter_p10_per_min_ci_low = 0.045454545454545456 +jitter_p10_per_min_ci_high = 0.09090909090909091 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.1 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.12 +jitter_p95_per_min = 0.12 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.11538461538461539 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.09378660134492572 +reaction_rate = 0.867 +reaction_rate_ci_low = 0.845952939929767 +reaction_rate_ci_high = 0.888047060070233 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 180 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 237.2318339100346 +fire_decisiveness_mean = 5.332895641565426 +fire_decisiveness_p50 = 3.074953853765166 +step_correction_mean = 0.43709941986935363 +step_correction_p50 = 0.4299975037574768 + +[cell.spm_20.step_minus_25_at_15min] +shares_per_minute = 20 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.92 +convergence_rate_ci_low = 0.9031850732978107 +convergence_rate_ci_high = 0.9368149267021894 +convergence_p10_secs = 1140 +convergence_p10_secs_ci_low = 1080 +convergence_p10_secs_ci_high = 1140 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1320 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1288.3695652173913 +settled_accuracy_p10 = 0.033335388355860696 +settled_accuracy_p10_ci_low = 0.028104118238301057 +settled_accuracy_p10_ci_high = 0.04000099857988704 +settled_accuracy_p50 = 0.07333567110787165 +settled_accuracy_p50_ci_low = 0.07333567110787165 +settled_accuracy_p50_ci_high = 0.07333567110787165 +settled_accuracy_p90 = 0.10000106479396553 +settled_accuracy_p90_ci_low = 0.10000106479396553 +settled_accuracy_p90_ci_high = 0.10000106479396553 +settled_accuracy_p95 = 0.10778542450964224 +settled_accuracy_p95_ci_low = 0.10666900145858871 +settled_accuracy_p95_ci_high = 0.11333470116109967 +settled_accuracy_p99 = 0.33333330350717194 +settled_accuracy_p99_ci_low = 0.24838699372961626 +settled_accuracy_p99_ci_high = 0.33333330350717194 +settled_accuracy_mean = 0.07476373479078299 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.07142857142857142 +jitter_p95_per_min = 0.07142857142857142 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.13043478260869565 +jitter_p99_per_min = 0.13043478260869565 +jitter_p99_per_min_ci_low = 0.06666666666666667 +jitter_p99_per_min_ci_high = 0.13043478260869565 +jitter_mean_per_min = 0.00818116240111125 +reaction_rate = 0.212 +reaction_rate_ci_low = 0.18666697156674708 +reaction_rate_ci_high = 0.2373330284332529 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 240 +fire_decisiveness_mean = 2.98875971927488 +fire_decisiveness_p50 = 2.137977986381383 +step_correction_mean = 0.8378747715702597 +step_correction_p50 = 0.800000011920929 + +[cell.spm_20.step_minus_10_at_15min] +shares_per_minute = 20 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.808 +convergence_rate_ci_low = 0.7835874938279578 +convergence_rate_ci_high = 0.8324125061720423 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 313.36633663366337 +settled_accuracy_p10 = 0.07777581836463898 +settled_accuracy_p10_ci_low = 0.07777581836463898 +settled_accuracy_p10_ci_high = 0.08333243233469134 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606618 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11666555439937754 +settled_accuracy_p95 = 0.1277763962465267 +settled_accuracy_p95_ci_low = 0.12222030423430841 +settled_accuracy_p95_ci_high = 0.1388871635282709 +settled_accuracy_p99 = 0.2755620460597963 +settled_accuracy_p99_ci_low = 0.19844359630438935 +settled_accuracy_p99_ci_high = 0.372227742133443 +settled_accuracy_mean = 0.10948369124106416 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.0625 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.08333333333333333 +jitter_mean_per_min = 0.0012049402153182732 +reaction_rate = 0.037 +reaction_rate_ci_low = 0.02530042523849691 +reaction_rate_ci_high = 0.048699574761503085 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 209.1891891891892 +fire_decisiveness_mean = 2.3049486061412847 +fire_decisiveness_p50 = 1.6538185355975017 +step_correction_mean = 1.4178879116032574 +step_correction_p50 = 1.9499824047088623 + +[cell.spm_20.step_minus_5_at_15min] +shares_per_minute = 20 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.898 +convergence_rate_ci_low = 0.879241663357323 +convergence_rate_ci_high = 0.916758336642677 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 720 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 133.42984409799556 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.1368405556246659 +settled_accuracy_p90_ci_low = 0.1315780903826428 +settled_accuracy_p90_ci_high = 0.14210492817126297 +settled_accuracy_p95 = 0.15262971737348907 +settled_accuracy_p95_ci_low = 0.14736760533601656 +settled_accuracy_p95_ci_high = 0.15789472568827734 +settled_accuracy_p99 = 0.26315794678803894 +settled_accuracy_p99_ci_low = 0.2368427949415175 +settled_accuracy_p99_ci_high = 0.4673760144299599 +settled_accuracy_mean = 0.07238762920840607 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.0625 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.07692307692307693 +jitter_mean_per_min = 0.0011395183044285411 +reaction_rate = 0.024 +reaction_rate_ci_low = 0.014513923972474183 +reaction_rate_ci_high = 0.03348607602752582 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 240 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 245 +fire_decisiveness_mean = 2.669535489401434 +fire_decisiveness_p50 = 1.7405367062733674 +step_correction_mean = 3.049058680733045 +step_correction_p50 = 3.8999648094177246 + +[cell.spm_20.step_plus_5_at_15min] +shares_per_minute = 20 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.911 +convergence_rate_ci_low = 0.893351399874211 +convergence_rate_ci_high = 0.9286486001257891 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 840 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 138.5071350164654 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.1238108787695531 +settled_accuracy_p90_ci_low = 0.11904832209291727 +settled_accuracy_p90_ci_high = 0.1285739467518605 +settled_accuracy_p95 = 0.138095480965432 +settled_accuracy_p95_ci_low = 0.1333371425605856 +settled_accuracy_p95_ci_high = 0.14762212823571796 +settled_accuracy_p99 = 0.18857272728783414 +settled_accuracy_p99_ci_low = 0.16667133233091858 +settled_accuracy_p99_ci_high = 0.20952207108452658 +settled_accuracy_mean = 0.06288341016340172 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.04 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.06666666666666667 +jitter_mean_per_min = 0.0007266983586206927 +reaction_rate = 0.019 +reaction_rate_ci_low = 0.010538109998351433 +reaction_rate_ci_high = 0.027461890001648566 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 214.73684210526315 +fire_decisiveness_mean = 2.114767528969978 +fire_decisiveness_p50 = 1.3221343420556977 +step_correction_mean = 3.8166949372542534 +step_correction_p50 = 3.9000089168548584 + +[cell.spm_20.step_plus_10_at_15min] +shares_per_minute = 20 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.796 +convergence_rate_ci_low = 0.7710237237683437 +convergence_rate_ci_high = 0.8209762762316564 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 409.67336683417085 +settled_accuracy_p10 = 0.06363744569748908 +settled_accuracy_p10_ci_low = 0.06363744569748908 +settled_accuracy_p10_ci_high = 0.06363744569748908 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090914637096303 +settled_accuracy_p90_ci_low = 0.09090914637096303 +settled_accuracy_p90_ci_high = 0.09545741921145012 +settled_accuracy_p95 = 0.10454810811872672 +settled_accuracy_p95_ci_low = 0.1000039838262754 +settled_accuracy_p95_ci_high = 0.10909381862072132 +settled_accuracy_p99 = 0.13182224911457485 +settled_accuracy_p99_ci_low = 0.11818389744740454 +settled_accuracy_p99_ci_high = 0.14545572013699726 +settled_accuracy_mean = 0.08564798734107162 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.05 +jitter_mean_per_min = 0.0005670367694589147 +reaction_rate = 0.068 +reaction_rate_ci_low = 0.052396627236395335 +reaction_rate_ci_high = 0.08360337276360467 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 224.11764705882354 +fire_decisiveness_mean = 2.2106849384300897 +fire_decisiveness_p50 = 1.6061574697601309 +step_correction_mean = 1.889825298505671 +step_correction_p50 = 2.0000007152557373 + +[cell.spm_20.step_plus_25_at_15min] +shares_per_minute = 20 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.892 +convergence_rate_ci_low = 0.8727624227720848 +convergence_rate_ci_high = 0.9112375772279152 +convergence_p10_secs = 1080 +convergence_p10_secs_ci_low = 1080 +convergence_p10_secs_ci_high = 1140 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1320 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1261.0762331838564 +settled_accuracy_p10 = 0.01599821587063388 +settled_accuracy_p10_ci_low = 0.011996058079123184 +settled_accuracy_p10_ci_high = 0.01599821587063388 +settled_accuracy_p50 = 0.043999898638774626 +settled_accuracy_p50_ci_low = 0.043999898638774626 +settled_accuracy_p50_ci_high = 0.043999898638774626 +settled_accuracy_p90 = 0.06399909118494496 +settled_accuracy_p90_ci_low = 0.05999951037374163 +settled_accuracy_p90_ci_high = 0.06399909118494496 +settled_accuracy_p95 = 0.07199760856227477 +settled_accuracy_p95_ci_low = 0.06399909118494496 +settled_accuracy_p95_ci_high = 0.12600515653759503 +settled_accuracy_p99 = 0.20277860754157584 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.2744026613334627 +settled_accuracy_mean = 0.04708798750293402 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.08 +jitter_p95_per_min = 0.05555555555555555 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.08333333333333333 +jitter_p99_per_min = 0.09090909090909091 +jitter_p99_per_min_ci_low = 0.05555555555555555 +jitter_p99_per_min_ci_high = 0.11764705882352941 +jitter_mean_per_min = 0.005841441374529611 +reaction_rate = 0.233 +reaction_rate_ci_low = 0.2067981646139054 +reaction_rate_ci_high = 0.25920183538609465 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 240.7725321888412 +fire_decisiveness_mean = 2.969833509626064 +fire_decisiveness_p50 = 2.1384477484354925 +step_correction_mean = 0.8161700570020552 +step_correction_p50 = 0.8200124502182007 + +[cell.spm_20.step_plus_50_at_15min] +shares_per_minute = 20 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.971 +convergence_rate_ci_low = 0.9605992493347836 +convergence_rate_ci_high = 0.9814007506652164 +convergence_p10_secs = 1080 +convergence_p10_secs_ci_low = 1080 +convergence_p10_secs_ci_high = 1080 +convergence_p50_secs = 1200 +convergence_p50_secs_ci_low = 1140 +convergence_p50_secs_ci_high = 1200 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1191.5345005149331 +settled_accuracy_p10 = 0.017198033155536585 +settled_accuracy_p10_ci_low = 0.014340448274680284 +settled_accuracy_p10_ci_high = 0.02090548468213349 +settled_accuracy_p50 = 0.1293411493386063 +settled_accuracy_p50_ci_low = 0.11725448513140502 +settled_accuracy_p50_ci_high = 0.1399994684978021 +settled_accuracy_p90 = 0.20333323460873876 +settled_accuracy_p90_ci_low = 0.19999998210430314 +settled_accuracy_p90_ci_high = 0.20333323460873876 +settled_accuracy_p95 = 0.20999830796185814 +settled_accuracy_p95_ci_low = 0.20666407119409302 +settled_accuracy_p95_ci_high = 0.22000316574878154 +settled_accuracy_p99 = 0.3120024381097455 +settled_accuracy_p99_ci_low = 0.26500073238139565 +settled_accuracy_p99_ci_high = 0.354338019828611 +settled_accuracy_mean = 0.11995956458337817 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.2222222222222222 +jitter_mean_per_min = 0.06264099806984152 +reaction_rate = 0.809 +reaction_rate_ci_low = 0.7846360883600355 +reaction_rate_ci_high = 0.8333639116399646 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 219.38195302843016 +fire_decisiveness_mean = 4.173850397821421 +fire_decisiveness_p50 = 3.0198581908641486 +step_correction_mean = 0.4469722077637285 +step_correction_p50 = 0.4300057888031006 + +[cell.spm_25.cold_start_10gh_to_1ph] +shares_per_minute = 25 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 60 +convergence_p10_secs_ci_low = 60 +convergence_p10_secs_ci_high = 60 +convergence_p50_secs = 60 +convergence_p50_secs_ci_low = 60 +convergence_p50_secs_ci_high = 60 +convergence_p90_secs = 60 +convergence_p90_secs_ci_low = 60 +convergence_p90_secs_ci_high = 240 +convergence_p95_secs = 300 +convergence_p95_secs_ci_low = 300 +convergence_p95_secs_ci_high = 360 +convergence_p99_secs = 540 +convergence_p99_secs_ci_low = 480 +convergence_p99_secs_ci_high = 660 +convergence_mean_secs = 89.82 +settled_accuracy_p10 = 0.008001054414484843 +settled_accuracy_p10_ci_low = 0.006399702680885078 +settled_accuracy_p10_ci_high = 0.011199462914332603 +settled_accuracy_p50 = 0.04479825431051987 +settled_accuracy_p50_ci_low = 0.044480560944210934 +settled_accuracy_p50_ci_high = 0.04959902117694048 +settled_accuracy_p90 = 0.12804096271424759 +settled_accuracy_p90_ci_low = 0.11199905832840806 +settled_accuracy_p90_ci_high = 0.15200003543348073 +settled_accuracy_p95 = 0.20000005368709184 +settled_accuracy_p95_ci_low = 0.20000005368709184 +settled_accuracy_p95_ci_high = 0.20000005368709184 +settled_accuracy_p99 = 0.20000005368709184 +settled_accuracy_p99_ci_low = 0.20000005368709184 +settled_accuracy_p99_ci_high = 0.22426353221738893 +settled_accuracy_mean = 0.059105979191822755 +jitter_p10_per_min = 0.037037037037037035 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.037037037037037035 +jitter_p50_per_min = 0.037037037037037035 +jitter_p50_per_min_ci_low = 0.037037037037037035 +jitter_p50_per_min_ci_high = 0.037037037037037035 +jitter_p90_per_min = 0.07407407407407407 +jitter_p90_per_min_ci_low = 0.07407407407407407 +jitter_p90_per_min_ci_high = 0.07407407407407407 +jitter_p95_per_min = 0.07407407407407407 +jitter_p95_per_min_ci_low = 0.07407407407407407 +jitter_p95_per_min_ci_high = 0.07407407407407407 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.1111111111111111 +jitter_p99_per_min_ci_high = 0.14814814814814814 +jitter_mean_per_min = 0.040519702707031466 +bias_mean = 0.008853779447118243 +bias_p10 = -0.06103276113854485 +bias_p10_ci_low = -0.0686175286680859 +bias_p10_ci_high = -0.05648371256017177 +bias_p50 = 0.0117764825947384 +bias_p50_ci_low = 0.007292003340509758 +bias_p50_ci_high = 0.016886942744365956 +bias_p90 = 0.07323183885152516 +bias_p90_ci_low = 0.06932355984314174 +bias_p90_ci_high = 0.07920095692720291 +bias_p99 = 0.11435974686804609 +bias_p99_ci_low = 0.10756263255347404 +bias_p99_ci_high = 0.13558134655978887 +variance_mean = 0.0048156815712902794 +variance_p10 = 0.0010460480214620114 +variance_p10_ci_low = 0.0009367869046311748 +variance_p10_ci_high = 0.0011794307526322996 +variance_p50 = 0.003261946889700959 +variance_p50_ci_low = 0.0030740585593455323 +variance_p50_ci_high = 0.003467649564705315 +variance_p90 = 0.010105269530467344 +variance_p90_ci_low = 0.008891820280745534 +variance_p90_ci_high = 0.011542749739229224 +variance_p99 = 0.026799491665302797 +variance_p99_ci_low = 0.02013598199134914 +variance_p99_ci_high = 0.0318494266407296 +ramp_target_overshoot_p10 = 0.20000005368709184 +ramp_target_overshoot_p10_ci_low = 0.20000005368709184 +ramp_target_overshoot_p10_ci_high = 0.20000005368709184 +ramp_target_overshoot_p50 = 0.20000005368709184 +ramp_target_overshoot_p50_ci_low = 0.20000005368709184 +ramp_target_overshoot_p50_ci_high = 0.20000005368709184 +ramp_target_overshoot_p90 = 0.20000005368709184 +ramp_target_overshoot_p90_ci_low = 0.20000005368709184 +ramp_target_overshoot_p90_ci_high = 0.20000005368709184 +ramp_target_overshoot_p99 = 0.45622800800555074 +ramp_target_overshoot_p99_ci_low = 0.29600519046804474 +ramp_target_overshoot_p99_ci_high = 0.5029838279044163 +ramp_target_overshoot_mean = 0.20623087140659677 + +[cell.spm_25.stable_1ph] +shares_per_minute = 25 +scenario = "stable_1ph" +convergence_rate = 0.957 +convergence_rate_ci_low = 0.9444267871409094 +convergence_rate_ci_high = 0.9695732128590905 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 780 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 69.52978056426332 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0.0297972084188608 +settled_accuracy_p90_ci_low = 0 +settled_accuracy_p90_ci_high = 0.10880219333245233 +settled_accuracy_p95 = 0.16399903336391042 +settled_accuracy_p95_ci_low = 0.15200178026396727 +settled_accuracy_p95_ci_high = 0.16800254691563965 +settled_accuracy_p99 = 0.18720346689764633 +settled_accuracy_p99_ci_low = 0.18000483318044824 +settled_accuracy_p99_ci_high = 0.2030390115240014 +settled_accuracy_mean = 0.015354912144094 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.043478260869565216 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.07692307692307693 +jitter_mean_per_min = 0.0008286889173286214 +bias_mean = -0.0006107025079949686 +bias_p10 = -0.0500664838694183 +bias_p10_ci_low = -0.05347218812081329 +bias_p10_ci_high = -0.04715641037352022 +bias_p50 = -0.00041913371363267723 +bias_p50_ci_low = -0.002735145409492801 +bias_p50_ci_high = 0.0033697762843692795 +bias_p90 = 0.04926463183146037 +bias_p90_ci_low = 0.043791656657879846 +bias_p90_ci_high = 0.05347546232700998 +bias_p99 = 0.08989660533656968 +bias_p99_ci_low = 0.08021240761038688 +bias_p99_ci_high = 0.09452847685033261 +variance_mean = 0.002640115185610221 +variance_p10 = 0.0006256305133201499 +variance_p10_ci_low = 0.0005862272034465816 +variance_p10_ci_high = 0.0006622354761098978 +variance_p50 = 0.0017525083199623167 +variance_p50_ci_low = 0.001644186141161614 +variance_p50_ci_high = 0.0018356374392452992 +variance_p90 = 0.0052463847052543365 +variance_p90_ci_low = 0.004807698493129168 +variance_p90_ci_high = 0.005765118164107337 +variance_p99 = 0.015614962256650208 +variance_p99_ci_low = 0.013910672086023453 +variance_p99_ci_high = 0.02099678251361878 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1 +upward_step_magnitude_p95 = 1.1680025469156397 +upward_step_magnitude_p95_ci_low = 1.1520017802639673 +upward_step_magnitude_p95_ci_high = 1.1800048331804482 +upward_step_magnitude_p99 = 1.6400051651940848 +upward_step_magnitude_p99_ci_low = 1.3200013072806878 +upward_step_magnitude_p99_ci_high = 1.6800016594175606 +upward_step_magnitude_mean = 1.0217683363737295 +fire_decisiveness_mean = 3.1267293481554934 +fire_decisiveness_p50 = 1.4800005592405157 + +[cell.spm_25.step_minus_50_at_15min] +shares_per_minute = 25 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.963 +convergence_rate_ci_low = 0.9513004252384969 +convergence_rate_ci_high = 0.974699574761503 +convergence_p10_secs = 1140 +convergence_p10_secs_ci_low = 1140 +convergence_p10_secs_ci_high = 1200 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1320 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1301.0591900311526 +settled_accuracy_p10 = 0.013560218562835402 +settled_accuracy_p10_ci_low = 0.01077466379968639 +settled_accuracy_p10_ci_high = 0.01439901226488327 +settled_accuracy_p50 = 0.07456392156289038 +settled_accuracy_p50_ci_low = 0.06952411291979199 +settled_accuracy_p50_ci_high = 0.08159612529520355 +settled_accuracy_p90 = 0.16671747926218639 +settled_accuracy_p90_ci_low = 0.16019281987490763 +settled_accuracy_p90_ci_high = 0.17226570466556268 +settled_accuracy_p95 = 0.19369410209043436 +settled_accuracy_p95_ci_low = 0.18463802921128092 +settled_accuracy_p95_ci_high = 0.2026731339927137 +settled_accuracy_p99 = 0.2767271624002988 +settled_accuracy_p99_ci_low = 0.23632460584782633 +settled_accuracy_p99_ci_high = 0.39926654037225684 +settled_accuracy_mean = 0.0850899872835413 +jitter_p10_per_min = 0.06666666666666667 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.13043478260869565 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.18181818181818182 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.11538461538461539 +jitter_p95_per_min_ci_high = 0.25 +jitter_p99_per_min = 0.25 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.0981919573180443 +reaction_rate = 0.941 +reaction_rate_ci_low = 0.9263958296914887 +reaction_rate_ci_high = 0.9556041703085112 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 223.8682252922423 +fire_decisiveness_mean = 5.252306266020048 +fire_decisiveness_p50 = 3.2620516725939197 +step_correction_mean = 0.40791870560200133 +step_correction_p50 = 0.3999999761581421 + +[cell.spm_25.step_minus_25_at_15min] +shares_per_minute = 25 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.951 +convergence_rate_ci_low = 0.9376203617986135 +convergence_rate_ci_high = 0.9643796382013864 +convergence_p10_secs = 1140 +convergence_p10_secs_ci_low = 1140 +convergence_p10_secs_ci_high = 1140 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1320 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1284.794952681388 +settled_accuracy_p10 = 0.056001004306510005 +settled_accuracy_p10_ci_low = 0.05066844454450137 +settled_accuracy_p10_ci_high = 0.056001004306510005 +settled_accuracy_p50 = 0.09333679674720652 +settled_accuracy_p50_ci_low = 0.08800235793702349 +settled_accuracy_p50_ci_high = 0.09333679674720652 +settled_accuracy_p90 = 0.1146679305800864 +settled_accuracy_p90_ci_low = 0.1146679305800864 +settled_accuracy_p90_ci_high = 0.1200011166914865 +settled_accuracy_p95 = 0.1200011166914865 +settled_accuracy_p95_ci_low = 0.1200011166914865 +settled_accuracy_p95_ci_high = 0.12533403436743318 +settled_accuracy_p99 = 0.23029068606822678 +settled_accuracy_p99_ci_low = 0.18336467913776033 +settled_accuracy_p99_ci_high = 0.33333330350717194 +settled_accuracy_mean = 0.0908494049814994 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.06666666666666667 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.08695652173913043 +jitter_p95_per_min = 0.08695652173913043 +jitter_p95_per_min_ci_low = 0.041666666666666664 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.09090909090909091 +jitter_p99_per_min_ci_low = 0.08 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.010681097661396573 +reaction_rate = 0.254 +reaction_rate_ci_low = 0.22701997527058213 +reaction_rate_ci_high = 0.28098002472941785 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 180 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 300 +reaction_p50_secs_ci_low = 300 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 257.9527559055118 +fire_decisiveness_mean = 2.7700128215356843 +fire_decisiveness_p50 = 1.9247284120945878 +step_correction_mean = 0.7557019516239016 +step_correction_p50 = 0.7359929084777832 + +[cell.spm_25.step_minus_10_at_15min] +shares_per_minute = 25 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.807 +convergence_rate_ci_low = 0.7825391528846608 +convergence_rate_ci_high = 0.8314608471153393 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 448.7732342007435 +settled_accuracy_p10 = 0.0622216240419744 +settled_accuracy_p10_ci_low = 0.0622216240419744 +settled_accuracy_p10_ci_high = 0.06666572217153843 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.11111110282606607 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.11111110282606607 +settled_accuracy_p99 = 0.20786113237260784 +settled_accuracy_p99_ci_low = 0.14381981419046763 +settled_accuracy_p99_ci_high = 0.27466509880475387 +settled_accuracy_mean = 0.09825685194554327 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.06666666666666667 +jitter_p99_per_min_ci_low = 0.045454545454545456 +jitter_p99_per_min_ci_high = 0.08 +jitter_mean_per_min = 0.00161039010592582 +reaction_rate = 0.054 +reaction_rate_ci_low = 0.03999127791695474 +reaction_rate_ci_high = 0.06800872208304526 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 237.77777777777777 +fire_decisiveness_mean = 2.047554129273948 +fire_decisiveness_p50 = 1.200036031805796 +step_correction_mean = 1.6475278889691387 +step_correction_p50 = 1.839982271194458 + +[cell.spm_25.step_minus_5_at_15min] +shares_per_minute = 25 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.906 +convergence_rate_ci_low = 0.8879122687326465 +convergence_rate_ci_high = 0.9240877312673536 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 123.57615894039735 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.11999898559653033 +settled_accuracy_p90_ci_low = 0.1157885754292689 +settled_accuracy_p90_ci_high = 0.12420890127742079 +settled_accuracy_p95 = 0.1368393547291935 +settled_accuracy_p95_ci_low = 0.12842086554470533 +settled_accuracy_p95_ci_high = 0.14105075386919697 +settled_accuracy_p99 = 0.21684477712545602 +settled_accuracy_p99_ci_low = 0.18315697476911552 +settled_accuracy_p99_ci_high = 0.25473853927171897 +settled_accuracy_mean = 0.06728351715157821 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.041666666666666664 +jitter_mean_per_min = 0.0003513526622770321 +reaction_rate = 0.018 +reaction_rate_ci_low = 0.009759604281346677 +reaction_rate_ci_high = 0.02624039571865332 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 226.66666666666666 +fire_decisiveness_mean = 1.6988983344912563 +fire_decisiveness_p50 = 1.127365514334965 +step_correction_mean = 1.9835652609666188 +step_correction_p50 = 3.4399967193603516 + +[cell.spm_25.step_plus_5_at_15min] +shares_per_minute = 25 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.893 +convergence_rate_ci_low = 0.873840962404129 +convergence_rate_ci_high = 0.912159037595871 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 540 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 130.07838745800672 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.11238345266568572 +settled_accuracy_p90_ci_low = 0.10857460889270487 +settled_accuracy_p90_ci_high = 0.11619140165374153 +settled_accuracy_p95 = 0.12381420225641748 +settled_accuracy_p95_ci_low = 0.12000356891358677 +settled_accuracy_p95_ci_high = 0.12762304602939833 +settled_accuracy_p99 = 0.16190673043159687 +settled_accuracy_p99_ci_low = 0.1428572706835607 +settled_accuracy_p99_ci_high = 0.20380854977221974 +settled_accuracy_mean = 0.06135734169113562 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.058823529411764705 +jitter_mean_per_min = 0.0005129926996856695 +reaction_rate = 0.015 +reaction_rate_ci_low = 0.007466100611237232 +reaction_rate_ci_high = 0.022533899388762768 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 204 +fire_decisiveness_mean = 3.076182434488583 +fire_decisiveness_p50 = 1.5274148796159608 +step_correction_mean = 3.096245869000753 +step_correction_p50 = 3.6800875663757324 + +[cell.spm_25.step_plus_10_at_15min] +shares_per_minute = 25 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.811 +convergence_rate_ci_low = 0.7867340442924661 +convergence_rate_ci_high = 0.835265955707534 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 478.66831072749693 +settled_accuracy_p10 = 0.05454822098363654 +settled_accuracy_p10_ci_low = 0.050911408549803694 +settled_accuracy_p10_ci_high = 0.05454822098363654 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.09090908536290365 +settled_accuracy_p95_ci_low = 0.09090908536290365 +settled_accuracy_p95_ci_high = 0.0945485211432886 +settled_accuracy_p99 = 0.1163678095367433 +settled_accuracy_p99_ci_low = 0.1054568841707697 +settled_accuracy_p99_ci_high = 0.18881793041506167 +settled_accuracy_mean = 0.08182830160212683 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.05 +jitter_mean_per_min = 0.0006855443966961335 +reaction_rate = 0.046 +reaction_rate_ci_low = 0.03301598003698392 +reaction_rate_ci_high = 0.058984019963016075 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 233.47826086956522 +fire_decisiveness_mean = 1.8846049684854258 +fire_decisiveness_p50 = 1.4112234252824933 +step_correction_mean = 1.7160972019900447 +step_correction_p50 = 1.8000484704971313 + +[cell.spm_25.step_plus_25_at_15min] +shares_per_minute = 25 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.929 +convergence_rate_ci_low = 0.91308183131136 +convergence_rate_ci_high = 0.9449181686886401 +convergence_p10_secs = 1080 +convergence_p10_secs_ci_low = 1080 +convergence_p10_secs_ci_high = 1140 +convergence_p50_secs = 1260 +convergence_p50_secs_ci_low = 1260 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1252.1205597416576 +settled_accuracy_p10 = 0.0271979870347826 +settled_accuracy_p10_ci_low = 0.02399845123483524 +settled_accuracy_p10_ci_high = 0.03039612697039673 +settled_accuracy_p50 = 0.05279674304048887 +settled_accuracy_p50_ci_low = 0.05279674304048887 +settled_accuracy_p50_ci_high = 0.05599617146625668 +settled_accuracy_p90 = 0.07199760856227477 +settled_accuracy_p90_ci_low = 0.06879742851725068 +settled_accuracy_p90_ci_high = 0.07199760856227477 +settled_accuracy_p95 = 0.07839861289739991 +settled_accuracy_p95_ci_low = 0.07519800335565785 +settled_accuracy_p95_ci_high = 0.10631267833509028 +settled_accuracy_p99 = 0.20000003221225382 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.27842146212279184 +settled_accuracy_mean = 0.05695630211808442 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.041666666666666664 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.07692307692307693 +jitter_p95_per_min = 0.07692307692307693 +jitter_p95_per_min_ci_low = 0.041666666666666664 +jitter_p95_per_min_ci_high = 0.08333333333333333 +jitter_p99_per_min = 0.15384615384615385 +jitter_p99_per_min_ci_low = 0.07692307692307693 +jitter_p99_per_min_ci_high = 0.2727272727272727 +jitter_mean_per_min = 0.010872508832352213 +reaction_rate = 0.299 +reaction_rate_ci_low = 0.27062403273190494 +reaction_rate_ci_high = 0.32737596726809504 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 245.61872909698997 +fire_decisiveness_mean = 3.2349651601678207 +fire_decisiveness_p50 = 2.062588087172628 +step_correction_mean = 0.7740406098971797 +step_correction_p50 = 0.7520043253898621 + +[cell.spm_25.step_plus_50_at_15min] +shares_per_minute = 25 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.972 +convergence_rate_ci_low = 0.9617748845678887 +convergence_rate_ci_high = 0.9822251154321112 +convergence_p10_secs = 1080 +convergence_p10_secs_ci_low = 1020 +convergence_p10_secs_ci_high = 1080 +convergence_p50_secs = 1200 +convergence_p50_secs_ci_low = 1200 +convergence_p50_secs_ci_high = 1200 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1199.1975308641975 +settled_accuracy_p10 = 0.00775778460578147 +settled_accuracy_p10_ci_low = 0.005285404600679389 +settled_accuracy_p10_ci_high = 0.00996369768405514 +settled_accuracy_p50 = 0.06920570217748567 +settled_accuracy_p50_ci_low = 0.060870244475799584 +settled_accuracy_p50_ci_high = 0.07712454805535973 +settled_accuracy_p90 = 0.20266313023835014 +settled_accuracy_p90_ci_low = 0.19999998210430314 +settled_accuracy_p90_ci_high = 0.20533227343085836 +settled_accuracy_p95 = 0.21333012881054192 +settled_accuracy_p95_ci_low = 0.20800302723608755 +settled_accuracy_p95_ci_high = 0.22006240050551762 +settled_accuracy_p99 = 0.28853652659376605 +settled_accuracy_p99_ci_low = 0.26576219428445436 +settled_accuracy_p99_ci_high = 0.31413453143831016 +settled_accuracy_mean = 0.09461107268507293 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.07258986935017413 +reaction_rate = 0.878 +reaction_rate_ci_low = 0.8577146154682738 +reaction_rate_ci_high = 0.8982853845317262 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 219.0888382687927 +fire_decisiveness_mean = 3.88414430039214 +fire_decisiveness_p50 = 2.7455138020210903 +step_correction_mean = 0.41222084203314946 +step_correction_p50 = 0.40000009536743164 + +[cell.spm_30.cold_start_10gh_to_1ph] +shares_per_minute = 30 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 60 +convergence_p10_secs_ci_low = 60 +convergence_p10_secs_ci_high = 60 +convergence_p50_secs = 120 +convergence_p50_secs_ci_low = 60 +convergence_p50_secs_ci_high = 120 +convergence_p90_secs = 240 +convergence_p90_secs_ci_low = 240 +convergence_p90_secs_ci_high = 240 +convergence_p95_secs = 360 +convergence_p95_secs_ci_low = 300 +convergence_p95_secs_ci_high = 420 +convergence_p99_secs = 540 +convergence_p99_secs_ci_low = 480 +convergence_p99_secs_ci_high = 660 +convergence_mean_secs = 139.08 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0.005710964400693297 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0.016893113227888668 +settled_accuracy_p90 = 0.10250993194422908 +settled_accuracy_p90_ci_low = 0.10000106703095146 +settled_accuracy_p90_ci_high = 0.11166720499161098 +settled_accuracy_p95 = 0.13333383888678196 +settled_accuracy_p95_ci_low = 0.12778178827810804 +settled_accuracy_p95_ci_high = 0.1405406598854948 +settled_accuracy_p99 = 0.1766712674267461 +settled_accuracy_p99_ci_low = 0.16667057016564013 +settled_accuracy_p99_ci_high = 0.20000126164665954 +settled_accuracy_mean = 0.03462395373085359 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.04 +jitter_p90_per_min_ci_low = 0.04 +jitter_p90_per_min_ci_high = 0.041666666666666664 +jitter_p95_per_min = 0.047619047619047616 +jitter_p95_per_min_ci_low = 0.041666666666666664 +jitter_p95_per_min_ci_high = 0.058823529411764705 +jitter_p99_per_min = 0.08 +jitter_p99_per_min_ci_low = 0.08 +jitter_p99_per_min_ci_high = 0.09523809523809523 +jitter_mean_per_min = 0.0142711070829929 +bias_mean = 0.0015740843757426897 +bias_p10 = -0.05022048811816531 +bias_p10_ci_low = -0.05268883693728718 +bias_p10_ci_high = -0.04478627361211723 +bias_p50 = 0.0022829164293411697 +bias_p50_ci_low = -0.001031774073103929 +bias_p50_ci_high = 0.00482403951434953 +bias_p90 = 0.05228301903526351 +bias_p90_ci_low = 0.048072810179725325 +bias_p90_ci_high = 0.05701145314148764 +bias_p99 = 0.09204610227845227 +bias_p99_ci_low = 0.08764350643550527 +bias_p99_ci_high = 0.09796198889610364 +variance_mean = 0.0025897520841325168 +variance_p10 = 0.0005617232667857201 +variance_p10_ci_low = 0.0005280596217134585 +variance_p10_ci_high = 0.0006014680343060402 +variance_p50 = 0.0017195723555058558 +variance_p50_ci_low = 0.001611752122797629 +variance_p50_ci_high = 0.0018578103857820123 +variance_p90 = 0.005650462424106779 +variance_p90_ci_low = 0.0051887269928809305 +variance_p90_ci_high = 0.00629112293638084 +variance_p99 = 0.012839696076164971 +variance_p99_ci_low = 0.011133481150969618 +variance_p99_ci_high = 0.015349539868189946 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.3000012549357731 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 1 +ramp_target_overshoot_p90 = 1 +ramp_target_overshoot_p90_ci_low = 1 +ramp_target_overshoot_p90_ci_high = 1 +ramp_target_overshoot_p99 = 1 +ramp_target_overshoot_p99_ci_low = 1 +ramp_target_overshoot_p99_ci_high = 1 +ramp_target_overshoot_mean = 0.5014039977153458 + +[cell.spm_30.stable_1ph] +shares_per_minute = 30 +scenario = "stable_1ph" +convergence_rate = 0.97 +convergence_rate_ci_low = 0.9594268944959392 +convergence_rate_ci_high = 0.9805731055040607 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 0 +convergence_p95_secs = 0 +convergence_p95_secs_ci_low = 0 +convergence_p95_secs_ci_high = 360 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1140 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 42.371134020618555 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0 +settled_accuracy_p50_ci_low = 0 +settled_accuracy_p50_ci_high = 0 +settled_accuracy_p90 = 0 +settled_accuracy_p90_ci_low = 0 +settled_accuracy_p90_ci_high = 0 +settled_accuracy_p95 = 0.13666579402772705 +settled_accuracy_p95_ci_low = 0.035647490823030425 +settled_accuracy_p95_ci_high = 0.1466706520384553 +settled_accuracy_p99 = 0.16333861502469516 +settled_accuracy_p99_ci_low = 0.16000531770645243 +settled_accuracy_p99_ci_high = 0.1733370305843953 +settled_accuracy_mean = 0.009378906516076167 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.058823529411764705 +jitter_mean_per_min = 0.0006978903332229589 +bias_mean = -0.0002688639319340381 +bias_p10 = -0.04473474106798581 +bias_p10_ci_low = -0.04771710847157975 +bias_p10_ci_high = -0.04122592934378173 +bias_p50 = -0.0006993026283409473 +bias_p50_ci_low = -0.003155766114289245 +bias_p50_ci_high = 0.002984981117278463 +bias_p90 = 0.0452662150214159 +bias_p90_ci_low = 0.041756393132193204 +bias_p90_ci_high = 0.04859894368032976 +bias_p99 = 0.0784237267785623 +bias_p99_ci_low = 0.07175730168026222 +bias_p99_ci_high = 0.09140601086120245 +variance_mean = 0.0019927640862796797 +variance_p10 = 0.0005191575944478789 +variance_p10_ci_low = 0.0004965950278448949 +variance_p10_ci_high = 0.0005589452408698147 +variance_p50 = 0.001489219354128741 +variance_p50_ci_low = 0.001412375690000139 +variance_p50_ci_high = 0.0015608081168897547 +variance_p90 = 0.003856435773674477 +variance_p90_ci_low = 0.00355331051823833 +variance_p90_ci_high = 0.004256804611054037 +variance_p99 = 0.009699199859767776 +variance_p99_ci_low = 0.007486766214753759 +variance_p99_ci_high = 0.011552851619733873 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1 +upward_step_magnitude_p95 = 1.1466706520384553 +upward_step_magnitude_p95_ci_low = 1 +upward_step_magnitude_p95_ci_high = 1.1600053177064524 +upward_step_magnitude_p99 = 1.333333359858559 +upward_step_magnitude_p99_ci_low = 1.261909274314829 +upward_step_magnitude_p99_ci_high = 1.4000014141708101 +upward_step_magnitude_mean = 1.0136318520964889 +fire_decisiveness_mean = 1.8003399781115916 +fire_decisiveness_p50 = 0.9670963715578296 + +[cell.spm_30.step_minus_50_at_15min] +shares_per_minute = 30 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.974 +convergence_rate_ci_low = 0.9641367004303834 +convergence_rate_ci_high = 0.9838632995696166 +convergence_p10_secs = 1200 +convergence_p10_secs_ci_low = 1140 +convergence_p10_secs_ci_high = 1200 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1260 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1285.2566735112937 +settled_accuracy_p10 = 0.01599727699069886 +settled_accuracy_p10_ci_low = 0.012503589485409972 +settled_accuracy_p10_ci_high = 0.01851667799576151 +settled_accuracy_p50 = 0.070747507526427 +settled_accuracy_p50_ci_low = 0.06679956011481258 +settled_accuracy_p50_ci_high = 0.07466988646052486 +settled_accuracy_p90 = 0.15266347367161526 +settled_accuracy_p90_ci_low = 0.14577434603921136 +settled_accuracy_p90_ci_high = 0.16000330444050626 +settled_accuracy_p95 = 0.18333014454377083 +settled_accuracy_p95_ci_low = 0.16753976418347527 +settled_accuracy_p95_ci_high = 0.19340459444737235 +settled_accuracy_p99 = 0.24710759114675696 +settled_accuracy_p99_ci_low = 0.21500586430815694 +settled_accuracy_p99_ci_high = 0.26709563100485934 +settled_accuracy_mean = 0.07938852308219478 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.1 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.11538461538461539 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.2727272727272727 +jitter_p99_per_min = 0.2727272727272727 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.2727272727272727 +jitter_mean_per_min = 0.09593294643952541 +reaction_rate = 0.972 +reaction_rate_ci_low = 0.9617748845678887 +reaction_rate_ci_high = 0.9822251154321112 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 216.11111111111111 +fire_decisiveness_mean = 5.340510476705045 +fire_decisiveness_p50 = 3.567712428489422 +step_correction_mean = 0.38323994293624974 +step_correction_p50 = 0.37332916259765625 + +[cell.spm_30.step_minus_25_at_15min] +shares_per_minute = 30 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.975 +convergence_rate_ci_low = 0.9653232753475155 +convergence_rate_ci_high = 0.9846767246524845 +convergence_p10_secs = 1140 +convergence_p10_secs_ci_low = 1140 +convergence_p10_secs_ci_high = 1140 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1260 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1274.7692307692307 +settled_accuracy_p10 = 0.06666666070143434 +settled_accuracy_p10_ci_low = 0.062222264376530445 +settled_accuracy_p10_ci_high = 0.06666666070143434 +settled_accuracy_p50 = 0.10667061207130968 +settled_accuracy_p50_ci_low = 0.10222442617671579 +settled_accuracy_p50_ci_high = 0.10667061207130968 +settled_accuracy_p90 = 0.12444515510245235 +settled_accuracy_p90_ci_low = 0.12444515510245235 +settled_accuracy_p90_ci_high = 0.12889116204007722 +settled_accuracy_p95 = 0.13333385827377575 +settled_accuracy_p95_ci_low = 0.12889116204007722 +settled_accuracy_p95_ci_high = 0.13333385827377575 +settled_accuracy_p99 = 0.21910766507594803 +settled_accuracy_p99_ci_low = 0.18099725739497174 +settled_accuracy_p99_ci_high = 0.26424830780527087 +settled_accuracy_mean = 0.10205325253843721 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.08 +jitter_p95_per_min_ci_low = 0.045454545454545456 +jitter_p95_per_min_ci_high = 0.09523809523809523 +jitter_p99_per_min = 0.09523809523809523 +jitter_p99_per_min_ci_low = 0.05263157894736842 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.009942036910457964 +reaction_rate = 0.296 +reaction_rate_ci_low = 0.26770639693499604 +reaction_rate_ci_high = 0.32429360306500393 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 249.1216216216216 +fire_decisiveness_mean = 2.401365477028279 +fire_decisiveness_p50 = 1.8219209023109642 +step_correction_mean = 0.6990766499090839 +step_correction_p50 = 0.6799881458282471 + +[cell.spm_30.step_minus_10_at_15min] +shares_per_minute = 30 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.798 +convergence_rate_ci_low = 0.7731152546004586 +convergence_rate_ci_high = 0.8228847453995415 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 454.6616541353383 +settled_accuracy_p10 = 0.05555510402060393 +settled_accuracy_p10_ci_low = 0.05185188775371341 +settled_accuracy_p10_ci_high = 0.05555510402060393 +settled_accuracy_p50 = 0.11111110282606607 +settled_accuracy_p50_ci_low = 0.11111110282606607 +settled_accuracy_p50_ci_high = 0.11111110282606607 +settled_accuracy_p90 = 0.11111110282606607 +settled_accuracy_p90_ci_low = 0.11111110282606607 +settled_accuracy_p90_ci_high = 0.11111110282606607 +settled_accuracy_p95 = 0.11111110282606607 +settled_accuracy_p95_ci_low = 0.11111110282606607 +settled_accuracy_p95_ci_high = 0.11111110282606607 +settled_accuracy_p99 = 0.20078129631210695 +settled_accuracy_p99_ci_low = 0.11481476648538569 +settled_accuracy_p99_ci_high = 0.25481884521303155 +settled_accuracy_mean = 0.09250432356315355 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.041666666666666664 +jitter_mean_per_min = 0.0003874890708210794 +reaction_rate = 0.031 +reaction_rate_ci_low = 0.020257662153888474 +reaction_rate_ci_high = 0.041742337846111525 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 238.06451612903226 +fire_decisiveness_mean = 1.6624233702105675 +fire_decisiveness_p50 = 1.1937227599213998 +step_correction_mean = 1.56549132831635 +step_correction_p50 = 1.666666865348816 + +[cell.spm_30.step_minus_5_at_15min] +shares_per_minute = 30 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.928 +convergence_rate_ci_low = 0.9119787533069365 +convergence_rate_ci_high = 0.9440212466930636 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 0 +convergence_p90_secs_ci_low = 0 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 120.90517241379311 +settled_accuracy_p10 = 0.05263157522942574 +settled_accuracy_p10_ci_low = 0.05263157522942574 +settled_accuracy_p10_ci_high = 0.05263157522942574 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.05263157522942574 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.10526272661339076 +settled_accuracy_p90_ci_low = 0.09824547052250188 +settled_accuracy_p90_ci_high = 0.10877011844290763 +settled_accuracy_p95 = 0.1157885754292689 +settled_accuracy_p95_ci_low = 0.11228012398609988 +settled_accuracy_p95_ci_high = 0.11929519020877422 +settled_accuracy_p99 = 0.17006841501506442 +settled_accuracy_p99_ci_low = 0.1368405556246659 +settled_accuracy_p99_ci_high = 0.23158018841767403 +settled_accuracy_mean = 0.06252761187171406 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.07142857142857142 +jitter_mean_per_min = 0.0006488151224993329 +reaction_rate = 0.023 +reaction_rate_ci_low = 0.013708897073005811 +reaction_rate_ci_high = 0.03229110292699419 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 193.04347826086956 +fire_decisiveness_mean = 1.6612422064598564 +fire_decisiveness_p50 = 1.0454988112986392 +step_correction_mean = 1.738678929598435 +step_correction_p50 = 3.333333730697632 + +[cell.spm_30.step_plus_5_at_15min] +shares_per_minute = 30 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.909 +convergence_rate_ci_low = 0.891173802693788 +convergence_rate_ci_high = 0.9268261973062121 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 360 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 156.8976897689769 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.10159157951141928 +settled_accuracy_p90_ci_low = 0.09841534868042867 +settled_accuracy_p90_ci_high = 0.10476704338390275 +settled_accuracy_p95 = 0.11111490329484086 +settled_accuracy_p95_ci_low = 0.10794161247146117 +settled_accuracy_p95_ci_high = 0.11428691585404227 +settled_accuracy_p99 = 0.13210809155285963 +settled_accuracy_p99_ci_low = 0.12381305181865665 +settled_accuracy_p99_ci_high = 0.13651324556515831 +settled_accuracy_mean = 0.05836424406204727 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.038461538461538464 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.07692307692307693 +jitter_mean_per_min = 0.0008157317472144172 +reaction_rate = 0.029 +reaction_rate_ci_low = 0.018599249334783574 +reaction_rate_ci_high = 0.03940075066521643 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 208.9655172413793 +fire_decisiveness_mean = 1.9446907433502867 +fire_decisiveness_p50 = 1.209103356795616 +step_correction_mean = 1.9652384766216935 +step_correction_p50 = 3.2667768001556396 + +[cell.spm_30.step_plus_10_at_15min] +shares_per_minute = 30 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.778 +convergence_rate_ci_low = 0.752241393950759 +convergence_rate_ci_high = 0.8037586060492411 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 495.65552699228795 +settled_accuracy_p10 = 0.04242787184915486 +settled_accuracy_p10_ci_low = 0.04242787184915486 +settled_accuracy_p10_ci_high = 0.04545484772174868 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.07575816088032683 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.09090908536290365 +settled_accuracy_p90_ci_low = 0.09090908536290365 +settled_accuracy_p90_ci_high = 0.09090908536290365 +settled_accuracy_p95 = 0.09090908536290365 +settled_accuracy_p95_ci_low = 0.09090908536290365 +settled_accuracy_p95_ci_high = 0.09090908536290365 +settled_accuracy_p99 = 0.09394588353305244 +settled_accuracy_p99_ci_low = 0.09090908536290365 +settled_accuracy_p99_ci_high = 0.10303144776334383 +settled_accuracy_mean = 0.0730052024622607 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.047619047619047616 +jitter_mean_per_min = 0.0005724284464441946 +reaction_rate = 0.048 +reaction_rate_ci_low = 0.034750631954693086 +reaction_rate_ci_high = 0.061249368045306916 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 236.25 +fire_decisiveness_mean = 1.5776246467039492 +fire_decisiveness_p50 = 1.1942193655214641 +step_correction_mean = 1.7189164149264495 +step_correction_p50 = 1.7333704233169556 + +[cell.spm_30.step_plus_25_at_15min] +shares_per_minute = 30 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.95 +convergence_rate_ci_low = 0.9364916322229515 +convergence_rate_ci_high = 0.9635083677770484 +convergence_p10_secs = 1080 +convergence_p10_secs_ci_low = 1080 +convergence_p10_secs_ci_high = 1140 +convergence_p50_secs = 1260 +convergence_p50_secs_ci_low = 1260 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1259.7473684210527 +settled_accuracy_p10 = 0.03732766712629976 +settled_accuracy_p10_ci_low = 0.03466167362415562 +settled_accuracy_p10_ci_high = 0.03999623760875126 +settled_accuracy_p50 = 0.061330413328313904 +settled_accuracy_p50_ci_low = 0.061330413328313904 +settled_accuracy_p50_ci_high = 0.06399909118494496 +settled_accuracy_p90 = 0.07733120617925515 +settled_accuracy_p90_ci_low = 0.07733120617925515 +settled_accuracy_p90_ci_high = 0.07733120617925515 +settled_accuracy_p95 = 0.08266351530608196 +settled_accuracy_p95_ci_low = 0.07999977666170666 +settled_accuracy_p95_ci_high = 0.10168742818009568 +settled_accuracy_p99 = 0.21333853597024266 +settled_accuracy_p99_ci_low = 0.20000003221225382 +settled_accuracy_p99_ci_high = 0.24406677127775067 +settled_accuracy_mean = 0.06362779320506166 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.047619047619047616 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.07692307692307693 +jitter_p95_per_min = 0.07692307692307693 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0.08333333333333333 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.07692307692307693 +jitter_p99_per_min_ci_high = 0.14285714285714285 +jitter_mean_per_min = 0.007932760308997934 +reaction_rate = 0.344 +reaction_rate_ci_low = 0.31455665062531096 +reaction_rate_ci_high = 0.373443349374689 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 241.74418604651163 +fire_decisiveness_mean = 2.535519588988619 +fire_decisiveness_p50 = 1.9913083202564579 +step_correction_mean = 0.7255528048547202 +step_correction_p50 = 0.706684947013855 + +[cell.spm_30.step_plus_50_at_15min] +shares_per_minute = 30 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.977 +convergence_rate_ci_low = 0.9677088970730058 +convergence_rate_ci_high = 0.9862911029269942 +convergence_p10_secs = 1080 +convergence_p10_secs_ci_low = 1080 +convergence_p10_secs_ci_high = 1080 +convergence_p50_secs = 1200 +convergence_p50_secs_ci_low = 1200 +convergence_p50_secs_ci_high = 1200 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1222.7226202661209 +settled_accuracy_p10 = 0.007664190110998947 +settled_accuracy_p10_ci_low = 0.005707027219623462 +settled_accuracy_p10_ci_high = 0.008802177476815887 +settled_accuracy_p50 = 0.04741688589641013 +settled_accuracy_p50_ci_low = 0.04363597253404228 +settled_accuracy_p50_ci_high = 0.05136798733628911 +settled_accuracy_p90 = 0.1888861279805395 +settled_accuracy_p90_ci_low = 0.18221980192863718 +settled_accuracy_p90_ci_high = 0.19333213491816437 +settled_accuracy_p95 = 0.21111070448110936 +settled_accuracy_p95_ci_low = 0.20315633564489066 +settled_accuracy_p95_ci_high = 0.21645337531186604 +settled_accuracy_p99 = 0.2641561449662402 +settled_accuracy_p99_ci_low = 0.23413360802035021 +settled_accuracy_p99_ci_high = 0.28711775574360154 +settled_accuracy_mean = 0.07364179525694241 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.07877706541738143 +reaction_rate = 0.935 +reaction_rate_ci_low = 0.9197201688491006 +reaction_rate_ci_high = 0.9502798311508995 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 214.07486631016042 +fire_decisiveness_mean = 3.671478761329417 +fire_decisiveness_p50 = 2.735084761305206 +step_correction_mean = 0.3862081215343373 +step_correction_p50 = 0.373337984085083 + +[derived.operational_fitness.spm_6] +score = 0.4852685095187314 +reaction_10_component = 0.041 +reaction_50_component = 0.405 +jitter_component = 0.9890793665303469 +step_safety_component = 0.04761754397713602 +convergence_component = 0.9 +overshoot_component = 0.4444428189186065 + +[derived.operational_fitness.spm_8] +score = 0.5760167302564065 +reaction_10_component = 0.05 +reaction_50_component = 0.515 +jitter_component = 0.9941419872570424 +step_safety_component = 0.3499965539597887 +convergence_component = 0.9 +overshoot_component = 0.45982094952198693 + +[derived.operational_fitness.spm_10] +score = 0.5559625999989547 +reaction_10_component = 0.056 +reaction_50_component = 0.595 +jitter_component = 0.9922535017675533 +step_safety_component = 0.29999722840388054 +convergence_component = 0.9 +overshoot_component = 0.29999917456096203 + +[derived.operational_fitness.spm_12] +score = 0.6265760634855414 +reaction_10_component = 0.05 +reaction_50_component = 0.685 +jitter_component = 0.995638629699866 +step_safety_component = 0.49999989933670275 +convergence_component = 0.9 +overshoot_component = 0.4166643122639908 + +[derived.operational_fitness.spm_15] +score = 0.6473105144324562 +reaction_10_component = 0.039 +reaction_50_component = 0.754 +jitter_component = 0.9966657970612773 +step_safety_component = 0.5599936139204185 +convergence_component = 0.9 +overshoot_component = 0.41895661687032315 + +[derived.operational_fitness.spm_20] +score = 0.6836406966814039 +reaction_10_component = 0.037 +reaction_50_component = 0.867 +jitter_component = 0.9955679292779307 +step_safety_component = 0.6299948708694578 +convergence_component = 0.9 +overshoot_component = 0.49999996644556766 + +[derived.operational_fitness.spm_25] +score = 0.7068853516438512 +reaction_10_component = 0.054 +reaction_50_component = 0.941 +jitter_component = 0.9972377036089046 +step_safety_component = 0.6639949061687207 +convergence_component = 0.9 +overshoot_component = 0.5437719919944493 + +[derived.operational_fitness.spm_30] +score = 0.6479330987030866 +reaction_10_component = 0.031 +reaction_50_component = 0.972 +jitter_component = 0.9976736988892568 +step_safety_component = 0.7066586959230894 +convergence_component = 0.8 +overshoot_component = 0 + +[derived.decoupling_score.spm_6] +score = 0.405 +score_ci_low = 0.3745741958199952 +score_ci_high = 0.43542580418000487 + +[derived.decoupling_score.spm_8] +score = 0.515 +score_ci_low = 0.484023627714014 +score_ci_high = 0.545976372285986 + +[derived.decoupling_score.spm_10] +score = 0.595 +score_ci_low = 0.5645741958199951 +score_ci_high = 0.6254258041800048 + +[derived.decoupling_score.spm_12] +score = 0.685 +score_ci_low = 0.6562090076586444 +score_ci_high = 0.7137909923413557 + +[derived.decoupling_score.spm_15] +score = 0.754 +score_ci_low = 0.7273062678817667 +score_ci_high = 0.7806937321182333 + +[derived.decoupling_score.spm_20] +score = 0.867 +score_ci_low = 0.845952939929767 +score_ci_high = 0.888047060070233 + +[derived.decoupling_score.spm_25] +score = 0.941 +score_ci_low = 0.9263958296914887 +score_ci_high = 0.9556041703085112 + +[derived.decoupling_score.spm_30] +score = 0.972 +score_ci_low = 0.9617748845678887 +score_ci_high = 0.9822251154321112 + +[derived.reaction_asymmetry.spm_6] +asymmetry_at_5 = 0.0049999999999999975 +asymmetry_at_5_ci_low = -0.021878889015782707 +asymmetry_at_5_ci_high = 0.0318788890157827 +asymmetry_at_10 = 0.025 +asymmetry_at_10_ci_low = -0.002678837234401557 +asymmetry_at_10_ci_high = 0.05267883723440156 +asymmetry_at_25 = 0.037000000000000005 +asymmetry_at_25_ci_low = -0.002306014432408368 +asymmetry_at_25_ci_high = 0.07630601443240839 +asymmetry_at_50 = -0.013000000000000012 +asymmetry_at_50_ci_low = -0.07368454800059332 +asymmetry_at_50_ci_high = 0.047684548000593296 +max_abs_asymmetry = 0.037000000000000005 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.07630601443240839 + +[derived.reaction_asymmetry.spm_8] +asymmetry_at_5 = 0.027000000000000003 +asymmetry_at_5_ci_low = -0.0006421998226665976 +asymmetry_at_5_ci_high = 0.054642199822666604 +asymmetry_at_10 = 0.02099999999999999 +asymmetry_at_10_ci_low = -0.008426536465688458 +asymmetry_at_10_ci_high = 0.05042653646568844 +asymmetry_at_25 = 0.04500000000000001 +asymmetry_at_25_ci_low = 0.001470778411391066 +asymmetry_at_25_ci_high = 0.08852922158860896 +asymmetry_at_50 = -0.029000000000000026 +asymmetry_at_50_ci_low = -0.09095454276779458 +asymmetry_at_50_ci_high = 0.03295454276779458 +max_abs_asymmetry = 0.04500000000000001 +max_abs_asymmetry_ci_low = 0.001470778411391066 +max_abs_asymmetry_ci_high = 0.08852922158860896 + +[derived.reaction_asymmetry.spm_10] +asymmetry_at_5 = 0.016 +asymmetry_at_5_ci_low = -0.00815796106182376 +asymmetry_at_5_ci_high = 0.04015796106182376 +asymmetry_at_10 = 0.005999999999999998 +asymmetry_at_10_ci_low = -0.023197672142505066 +asymmetry_at_10_ci_high = 0.03519767214250506 +asymmetry_at_25 = 0.02400000000000002 +asymmetry_at_25_ci_low = -0.0210508005433169 +asymmetry_at_25_ci_high = 0.06905080054331694 +asymmetry_at_50 = -0.03399999999999992 +asymmetry_at_50_ci_low = -0.09518463065956995 +asymmetry_at_50_ci_high = 0.027184630659570108 +max_abs_asymmetry = 0.03399999999999992 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.09518463065956995 + +[derived.reaction_asymmetry.spm_12] +asymmetry_at_5 = 0.018 +asymmetry_at_5_ci_low = -0.004894870501747257 +asymmetry_at_5_ci_high = 0.040894870501747255 +asymmetry_at_10 = -0.011000000000000003 +asymmetry_at_10_ci_low = -0.03650750634612912 +asymmetry_at_10_ci_high = 0.014507506346129115 +asymmetry_at_25 = 0.036000000000000004 +asymmetry_at_25_ci_low = -0.011115817612920353 +asymmetry_at_25_ci_high = 0.08311581761292036 +asymmetry_at_50 = -0.1080000000000001 +asymmetry_at_50_ci_low = -0.1674116251499702 +asymmetry_at_50_ci_high = -0.04858837485002998 +max_abs_asymmetry = 0.1080000000000001 +max_abs_asymmetry_ci_low = 0.04858837485002998 +max_abs_asymmetry_ci_high = 0.1674116251499702 + +[derived.reaction_asymmetry.spm_15] +asymmetry_at_5 = 0.016000000000000004 +asymmetry_at_5_ci_low = -0.003852677507348072 +asymmetry_at_5_ci_high = 0.03585267750734808 +asymmetry_at_10 = 0.019999999999999997 +asymmetry_at_10_ci_low = -0.006603308877591897 +asymmetry_at_10_ci_high = 0.0466033088775919 +asymmetry_at_25 = 0.019000000000000017 +asymmetry_at_25_ci_low = -0.029260434710168842 +asymmetry_at_25_ci_high = 0.06726043471016888 +asymmetry_at_50 = -0.04700000000000004 +asymmetry_at_50_ci_low = -0.10190350492128875 +asymmetry_at_50_ci_high = 0.007903504921288662 +max_abs_asymmetry = 0.04700000000000004 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.10190350492128875 + +[derived.reaction_asymmetry.spm_20] +asymmetry_at_5 = -0.005000000000000001 +asymmetry_at_5_ci_low = -0.022947966029174385 +asymmetry_at_5_ci_high = 0.012947966029174383 +asymmetry_at_10 = 0.031000000000000007 +asymmetry_at_10_ci_low = 0.00369705247489225 +asymmetry_at_10_ci_high = 0.058302947525107764 +asymmetry_at_25 = 0.02100000000000002 +asymmetry_at_25_ci_low = -0.030534863819347502 +asymmetry_at_25_ci_high = 0.07253486381934757 +asymmetry_at_50 = -0.05799999999999994 +asymmetry_at_50_ci_low = -0.10341097171019753 +asymmetry_at_50_ci_high = -0.012589028289802351 +max_abs_asymmetry = 0.05799999999999994 +max_abs_asymmetry_ci_low = 0.012589028289802351 +max_abs_asymmetry_ci_high = 0.10341097171019753 + +[derived.reaction_asymmetry.spm_25] +asymmetry_at_5 = -0.002999999999999999 +asymmetry_at_5_ci_low = -0.01877429510741609 +asymmetry_at_5_ci_high = 0.012774295107416091 +asymmetry_at_10 = -0.008 +asymmetry_at_10_ci_low = -0.034992742046061336 +asymmetry_at_10_ci_high = 0.018992742046061335 +asymmetry_at_25 = 0.044999999999999984 +asymmetry_at_25_ci_low = -0.010355991997512914 +asymmetry_at_25_ci_high = 0.10035599199751291 +asymmetry_at_50 = -0.06299999999999994 +asymmetry_at_50_ci_low = -0.09788955484023742 +asymmetry_at_50_ci_high = -0.028110445159762465 +max_abs_asymmetry = 0.06299999999999994 +max_abs_asymmetry_ci_low = 0.028110445159762465 +max_abs_asymmetry_ci_high = 0.09788955484023742 + +[derived.reaction_asymmetry.spm_30] +asymmetry_at_5 = 0.006000000000000002 +asymmetry_at_5_ci_low = -0.013691853592210618 +asymmetry_at_5_ci_high = 0.025691853592210618 +asymmetry_at_10 = 0.017 +asymmetry_at_10_ci_low = -0.00699170589141844 +asymmetry_at_10_ci_high = 0.04099170589141844 +asymmetry_at_25 = 0.04799999999999999 +asymmetry_at_25_ci_low = -0.00973695243969297 +asymmetry_at_25_ci_high = 0.10573695243969294 +asymmetry_at_50 = -0.03699999999999992 +asymmetry_at_50_ci_low = -0.06250494658301065 +asymmetry_at_50_ci_high = -0.011495053416989198 +max_abs_asymmetry = 0.04799999999999999 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.10573695243969294 + diff --git a/sv2/channels-sv2/sim/baseline_VardiffState.md b/sv2/channels-sv2/sim/baseline_VardiffState.md new file mode 100644 index 0000000000..db82e1d716 --- /dev/null +++ b/sv2/channels-sv2/sim/baseline_VardiffState.md @@ -0,0 +1,183 @@ +# Vardiff baseline characterization — `VardiffState` + +*Generated by `cargo run --release --bin generate-baseline` from the vardiff_sim crate. 1000 trials per cell, base seed `0xdeadbeefcafef00d`.* + +## Summary + +Headline per-metric values at each share rate's best and worst cells. ↑ = higher is better; ↓ = lower is better; ↔ = near-zero is better. Where a `(floor: X.X%)` annotation appears, it's the Poisson-noise lower bound on that metric at that share rate — the algorithm cannot do better than this without exotic estimation techniques. + +| Metric | Dir | Best | Worst | +| --- | :-: | --- | --- | +| cold-start convergence rate | ↑ | 100.0% @ SPM=6 | 100.0% @ SPM=6 | +| cold-start p90 time | ↓ | 6m @ SPM=30 | 9m @ SPM=6 | +| settled accuracy p50 (stable) | ↓ | 2.7% @ SPM=30 (floor: 3.9%) | 8.7% @ SPM=10 (floor: 6.7%) | +| settled accuracy p99 (stable) | ↓ | 10.8% @ SPM=30 (floor: 14.9%) | 30.7% @ SPM=6 (floor: 33.3%) | +| stable-load jitter (mean) | ↓ | 0.002/min @ SPM=30 (floor: 0.020/min) | 0.061/min @ SPM=10 (floor: 0.020/min) | +| reaction rate at −50% step | ↑ | 99.9% @ SPM=20 | 87.1% @ SPM=6 | +| reaction rate at +50% step | ↑ | 87.2% @ SPM=8 | 73.8% @ SPM=15 | +| ramp target overshoot p99 (cold start) | ↓ | 0.0% @ SPM=20 (floor: 52.0%) | 28.2% @ SPM=6 (floor: 95.0%) | +| upward step magnitude p95 (stable) | ↓ | 1.000 @ SPM=20 | 1.152 @ SPM=6 | +| operational fitness | ↑ | 0.881 @ SPM=25 | 0.680 @ SPM=6 | +| comprehensive fitness | ↑ | 0.905 @ SPM=25 | 0.744 @ SPM=6 | +| decoupling score | ↑ | 0.999 @ SPM=20 | 0.871 @ SPM=6 | +| max |reaction asymmetry| | ↓ | 0.037 @ SPM=6 | 0.762 @ SPM=30 | + +## Convergence time (cold start: 10 GH/s → 1 PH/s) + +| share/min | rate | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 100.0% | 3m | 5m | 9m | 13m | 5m49s | +| 8 | 100.0% | 3m | 5m | 9m | 14m | 6m | +| 10 | 100.0% | 2m | 6m | 7m | 12m | 5m43s | +| 12 | 100.0% | 2m | 6m | 7m | 11m | 5m40s | +| 15 | 100.0% | 2m | 6m | 8m | 8m | 5m25s | +| 20 | 100.0% | 2m | 3m | 8m | 8m | 4m24s | +| 25 | 100.0% | 3m | 3m | 8m | 8m | 3m55s | +| 30 | 100.0% | 3m | 5m | 6m | 8m | 4m24s | + +## Settled accuracy (stable load, post-convergence) + +`|final_hashrate / true_hashrate - 1|` at trial end. Smaller is better. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.4% | 6.6% | 10.8% | 30.7% | 7.0% | +| 8 | 0.3% | 5.7% | 9.1% | 26.3% | 5.9% | +| 10 | 2.1% | 8.7% | 15.0% | 22.2% | 8.5% | +| 12 | 2.3% | 6.9% | 13.6% | 19.3% | 7.5% | +| 15 | 2.1% | 4.0% | 12.2% | 16.1% | 5.8% | +| 20 | 0.0% | 3.2% | 9.6% | 13.2% | 3.9% | +| 25 | 0.0% | 2.8% | 4.8% | 11.9% | 2.9% | +| 30 | 0.0% | 2.7% | 4.2% | 10.8% | 2.3% | + +## Steady-state jitter (fires per minute) + +Post-convergence rate of vardiff fires. Smaller is better — ideal is zero under stable load. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.000 | 0.000 | 0.083 | 0.105 | 0.032 | +| 8 | 0.000 | 0.000 | 0.083 | 0.118 | 0.031 | +| 10 | 0.000 | 0.059 | 0.100 | 0.150 | 0.061 | +| 12 | 0.000 | 0.050 | 0.091 | 0.133 | 0.048 | +| 15 | 0.000 | 0.000 | 0.077 | 0.100 | 0.031 | +| 20 | 0.000 | 0.000 | 0.062 | 0.091 | 0.014 | +| 25 | 0.000 | 0.000 | 0.000 | 0.083 | 0.005 | +| 30 | 0.000 | 0.000 | 0.000 | 0.077 | 0.002 | + +## Reaction time to a 50% drop (step at 15 min) + +| share/min | reacted | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 87.1% | 1m | 3m | 5m | 5m | 2m44s | +| 8 | 92.3% | 1m | 2m | 4m | 5m | 2m30s | +| 10 | 99.7% | 1m | 2m | 3m | 4m | 1m54s | +| 12 | 99.7% | 1m | 2m | 3m | 4m | 1m52s | +| 15 | 99.8% | 1m | 2m | 3m | 4m | 1m52s | +| 20 | 99.9% | 1m | 1m | 3m | 4m | 1m45s | +| 25 | 99.9% | 1m | 1m | 3m | 5m | 1m40s | +| 30 | 99.9% | 1m | 1m | 3m | 5m | 1m32s | + +## Reaction sensitivity (P[fire within 5 min of step change]) + +| Δ% | 6 | 8 | 10 | 12 | 15 | 20 | 25 | 30 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| -50% | 0.87 | 0.92 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | +| -25% | 0.51 | 0.57 | 0.85 | 0.84 | 0.84 | 0.84 | 0.88 | 0.88 | +| -10% | 0.33 | 0.30 | 0.55 | 0.52 | 0.49 | 0.51 | 0.54 | 0.50 | +| -5% | 0.28 | 0.30 | 0.45 | 0.41 | 0.41 | 0.35 | 0.36 | 0.33 | +| +5% | 0.30 | 0.31 | 0.35 | 0.29 | 0.18 | 0.18 | 0.11 | 0.11 | +| +10% | 0.35 | 0.36 | 0.35 | 0.28 | 0.17 | 0.10 | 0.07 | 0.04 | +| +25% | 0.51 | 0.60 | 0.47 | 0.37 | 0.32 | 0.24 | 0.17 | 0.12 | +| +50% | 0.83 | 0.87 | 0.80 | 0.77 | 0.74 | 0.76 | 0.77 | 0.77 | + +## Ramp target overshoot (cold start) + +`max(new_hashrate on fires) / H_true − 1`: how far the algorithm's actual *target* (not its belief) climbs past truth during the cold-start ramp. Reads `new_hashrate` (the actual target the algorithm set), so it's unaffected by estimator-belief noise. Works for any algorithm that fires, including those without introspection. + +| share/min | p10 | p50 | p90 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.0% | 1.9% | 15.4% | 28.2% | 5.3% | +| 8 | 0.0% | 0.1% | 11.5% | 23.7% | 3.7% | +| 10 | 0.0% | 0.0% | 3.8% | 12.0% | 1.0% | +| 12 | 0.0% | 0.0% | 0.8% | 12.1% | 0.6% | +| 15 | 0.0% | 0.0% | 0.0% | 7.1% | 0.2% | +| 20 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | +| 25 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | +| 30 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | + +## Upward step magnitude (stable load) + +`new_hashrate / old_hashrate` for upward difficulty adjustments during steady-state. Per-trial p95 of ratios, then distribution across trials. Values near 1.0 indicate gentle retargeting; values >> 1.0 indicate aggressive jumps. + +| share/min | p50 | p90 | p95 | p99 | mean | +| --- | --- | --- | --- | --- | --- | +| 6 | 1.069 | 1.119 | 1.152 | 1.218 | 1.061 | +| 8 | 1.060 | 1.098 | 1.123 | 1.209 | 1.052 | +| 10 | 1.000 | 1.093 | 1.109 | 1.148 | 1.031 | +| 12 | 1.000 | 1.079 | 1.090 | 1.119 | 1.017 | +| 15 | 1.000 | 1.000 | 1.076 | 1.094 | 1.008 | +| 20 | 1.000 | 1.000 | 1.000 | 1.070 | 1.001 | +| 25 | 1.000 | 1.000 | 1.000 | 1.058 | 1.001 | +| 30 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | + +## Operational fitness (per share rate) + +`0.15×react(-10%) + 0.1×react(-50%) + 0.25×jitter + 0.25×step_safety + 0.15×convergence + 0.1×overshoot`. Higher is better. + +| share/min | fitness | react-10% | react-50% | jitter | step-safe | conv | overshoot | +| --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.680 | 0.329 | 0.871 | 0.892 | 0.697 | 0.500 | 0.718 | +| 8 | 0.702 | 0.300 | 0.923 | 0.897 | 0.755 | 0.500 | 0.763 | +| 10 | 0.724 | 0.547 | 0.997 | 0.796 | 0.783 | 0.400 | 0.880 | +| 12 | 0.741 | 0.521 | 0.997 | 0.841 | 0.819 | 0.400 | 0.879 | +| 15 | 0.763 | 0.491 | 0.998 | 0.897 | 0.848 | 0.400 | 0.929 | +| 20 | 0.870 | 0.511 | 0.999 | 0.953 | 1.000 | 0.700 | 1.000 | +| 25 | 0.881 | 0.539 | 0.999 | 0.982 | 1.000 | 0.700 | 1.000 | +| 30 | 0.849 | 0.504 | 0.999 | 0.993 | 1.000 | 0.500 | 1.000 | + +## Comprehensive fitness (per share rate) + +`0.80 × operational_fitness + 0.20 × counter_age_independence`. Higher is better. + +| share/min | comprehensive | operational | counter-age | +| --- | --- | --- | --- | +| 6 | 0.744 | 0.680 | 1.000 | +| 8 | 0.761 | 0.702 | 1.000 | +| 10 | 0.780 | 0.724 | 1.000 | +| 12 | 0.793 | 0.741 | 1.000 | +| 15 | 0.810 | 0.763 | 1.000 | +| 20 | 0.896 | 0.870 | 1.000 | +| 25 | 0.905 | 0.881 | 1.000 | +| 30 | 0.879 | 0.849 | 1.000 | + +## Decoupling score (per share rate) + +`reaction_rate(Step−50) × clamp(1 − jitter_p50 / J_max, 0, 1)` where `J_max = 0.50` fires/min. Higher is better. Score of 1.0 = perfect decoupling between reactivity and jitter. + +| share/min | decoupling score | +| --- | --- | +| 6 | 0.871 | +| 8 | 0.923 | +| 10 | 0.880 | +| 12 | 0.897 | +| 15 | 0.998 | +| 20 | 0.999 | +| 25 | 0.999 | +| 30 | 0.999 | + +## Reaction asymmetry (per share rate) + +`reaction_rate(+δ%) − reaction_rate(−δ%)`. Positive = responds faster to up-steps; negative = responds faster to down-steps; near zero = symmetric. + +| share/min | δ=5% | δ=10% | δ=25% | δ=50% | +| --- | --- | --- | --- | --- | +| 6 | +0.03 | +0.03 | +0.00 | -0.04 | +| 8 | +0.01 | +0.06 | +0.03 | -0.05 | +| 10 | -0.10 | -0.19 | -0.38 | -0.19 | +| 12 | -0.12 | -0.24 | -0.47 | -0.23 | +| 15 | -0.22 | -0.32 | -0.53 | -0.26 | +| 20 | -0.17 | -0.41 | -0.60 | -0.24 | +| 25 | -0.24 | -0.47 | -0.71 | -0.23 | +| 30 | -0.23 | -0.46 | -0.76 | -0.23 | + diff --git a/sv2/channels-sv2/sim/baseline_VardiffState.toml b/sv2/channels-sv2/sim/baseline_VardiffState.toml new file mode 100644 index 0000000000..43b2473d8d --- /dev/null +++ b/sv2/channels-sv2/sim/baseline_VardiffState.toml @@ -0,0 +1,6062 @@ +# Vardiff baseline characterization. Regenerate with +# `cargo run --release --bin generate-baseline` from the sim crate. + +[meta] +algorithm = "VardiffState" +trial_count = 1000 +base_seed = 16045690984503111693 +quiet_window_secs = 300 +settle_buffer_secs = 120 +min_settled_window_secs = 600 +react_window_secs = 300 +step_event_at_secs = 900 +trial_duration_secs = 1800 + +[cell.spm_6.cold_start_10gh_to_1ph] +shares_per_minute = 6 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 240 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 300 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 540 +convergence_p90_secs_ci_low = 540 +convergence_p90_secs_ci_high = 540 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 660 +convergence_p99_secs = 780 +convergence_p99_secs_ci_low = 720 +convergence_p99_secs_ci_high = 840 +convergence_mean_secs = 348.96 +settled_accuracy_p10 = 0.014978363095331959 +settled_accuracy_p10_ci_low = 0.01289617634491702 +settled_accuracy_p10_ci_high = 0.017618828492625527 +settled_accuracy_p50 = 0.0775236238303848 +settled_accuracy_p50_ci_low = 0.073732845380303 +settled_accuracy_p50_ci_high = 0.08250545041423285 +settled_accuracy_p90 = 0.16406117617278282 +settled_accuracy_p90_ci_low = 0.15866602609018188 +settled_accuracy_p90_ci_high = 0.16862196173841748 +settled_accuracy_p95 = 0.18888622168433722 +settled_accuracy_p95_ci_low = 0.1790071256863811 +settled_accuracy_p95_ci_high = 0.20367936431261968 +settled_accuracy_p99 = 0.27000010267656327 +settled_accuracy_p99_ci_low = 0.23624165929084318 +settled_accuracy_p99_ci_high = 0.3144271107466057 +settled_accuracy_mean = 0.08716470434753369 +jitter_p10_per_min = 0.04 +jitter_p10_per_min_ci_low = 0.04 +jitter_p10_per_min_ci_high = 0.04 +jitter_p50_per_min = 0.05263157894736842 +jitter_p50_per_min_ci_low = 0.05263157894736842 +jitter_p50_per_min_ci_high = 0.05555555555555555 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.09090909090909091 +jitter_p90_per_min_ci_high = 0.09523809523809523 +jitter_p95_per_min = 0.11538461538461539 +jitter_p95_per_min_ci_low = 0.09523809523809523 +jitter_p95_per_min_ci_high = 0.11538461538461539 +jitter_p99_per_min = 0.13043478260869565 +jitter_p99_per_min_ci_low = 0.125 +jitter_p99_per_min_ci_high = 0.13043478260869565 +jitter_mean_per_min = 0.06185878078824356 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.018681832912214036 +ramp_target_overshoot_p50_ci_low = 0.00999747603559209 +ramp_target_overshoot_p50_ci_high = 0.024611035341474352 +ramp_target_overshoot_p90 = 0.15445487771053545 +ramp_target_overshoot_p90_ci_low = 0.14496528156430233 +ramp_target_overshoot_p90_ci_high = 0.16196717826215012 +ramp_target_overshoot_p99 = 0.2821833144410695 +ramp_target_overshoot_p99_ci_low = 0.23624165929084318 +ramp_target_overshoot_p99_ci_high = 0.32359995305063816 +ramp_target_overshoot_mean = 0.05270981717464832 + +[cell.spm_6.stable_1ph] +shares_per_minute = 6 +scenario = "stable_1ph" +convergence_rate = 0.898 +convergence_rate_ci_low = 0.879241663357323 +convergence_rate_ci_high = 0.916758336642677 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 900 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 865.924276169265 +settled_accuracy_p10 = 0.004307248274144526 +settled_accuracy_p10_ci_low = 0.0013381507655678693 +settled_accuracy_p10_ci_high = 0.006118852081391513 +settled_accuracy_p50 = 0.06616672351906006 +settled_accuracy_p50_ci_low = 0.06399085279328243 +settled_accuracy_p50_ci_high = 0.06774767415773852 +settled_accuracy_p90 = 0.10763033833403979 +settled_accuracy_p90_ci_low = 0.10211070130709943 +settled_accuracy_p90_ci_high = 0.12314510258630174 +settled_accuracy_p95 = 0.23018817124383806 +settled_accuracy_p95_ci_low = 0.19201436720266296 +settled_accuracy_p95_ci_high = 0.24922870103879835 +settled_accuracy_p99 = 0.307493422827926 +settled_accuracy_p99_ci_low = 0.2947946807634654 +settled_accuracy_p99_ci_high = 0.34833789125558745 +settled_accuracy_mean = 0.07012957614510702 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.045454545454545456 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.08695652173913043 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.10526315789473684 +jitter_p99_per_min_ci_low = 0.10526315789473684 +jitter_p99_per_min_ci_high = 0.125 +jitter_mean_per_min = 0.03232785460718754 +upward_step_magnitude_p50 = 1.0692384304820275 +upward_step_magnitude_p50_ci_low = 1.0664556271823384 +upward_step_magnitude_p50_ci_high = 1.0718802380566186 +upward_step_magnitude_p90 = 1.1190943147062726 +upward_step_magnitude_p90_ci_low = 1.1127766487456916 +upward_step_magnitude_p90_ci_high = 1.1267653574107412 +upward_step_magnitude_p95 = 1.1516937315152849 +upward_step_magnitude_p95_ci_low = 1.1372801085767748 +upward_step_magnitude_p95_ci_high = 1.163422893584591 +upward_step_magnitude_p99 = 1.2177949706059927 +upward_step_magnitude_p99_ci_low = 1.1977349155797203 +upward_step_magnitude_p99_ci_high = 1.2708954733130962 +upward_step_magnitude_mean = 1.0606250644249575 + +[cell.spm_6.step_minus_50_at_15min] +shares_per_minute = 6 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.98 +convergence_rate_ci_low = 0.971322710100498 +convergence_rate_ci_high = 0.988677289899502 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 971.0204081632653 +settled_accuracy_p10 = 0.10574243174743225 +settled_accuracy_p10_ci_low = 0.09421970543100633 +settled_accuracy_p10_ci_high = 0.11464281206008042 +settled_accuracy_p50 = 0.4224600351610186 +settled_accuracy_p50_ci_low = 0.4150804759441227 +settled_accuracy_p50_ci_high = 0.43483222548900713 +settled_accuracy_p90 = 0.5462014000117172 +settled_accuracy_p90_ci_low = 0.536281099170729 +settled_accuracy_p90_ci_high = 0.5546222203759827 +settled_accuracy_p95 = 0.5922372760082251 +settled_accuracy_p95_ci_low = 0.5679304451512202 +settled_accuracy_p95_ci_high = 0.6200322914435996 +settled_accuracy_p99 = 0.9150647389153099 +settled_accuracy_p99_ci_low = 0.8594662523275871 +settled_accuracy_p99_ci_high = 0.9521341994761348 +settled_accuracy_mean = 0.3799092684791473 +jitter_p10_per_min = 0.08333333333333333 +jitter_p10_per_min_ci_low = 0.07692307692307693 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.1 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.15789473684210525 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.17647058823529413 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.1875 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.11157207178661833 +reaction_rate = 0.871 +reaction_rate_ci_low = 0.8502240924530359 +reaction_rate_ci_high = 0.8917759075469641 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 164.1561423650976 +step_correction_mean = 0.19606295452120656 +step_correction_p50 = 0.16990596055984497 + +[cell.spm_6.step_minus_25_at_15min] +shares_per_minute = 6 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.952 +convergence_rate_ci_low = 0.938750631954693 +convergence_rate_ci_high = 0.9652493680453069 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 959.3697478991596 +settled_accuracy_p10 = 0.014271907755556645 +settled_accuracy_p10_ci_low = 0.012163705182352214 +settled_accuracy_p10_ci_high = 0.018769185864797366 +settled_accuracy_p50 = 0.22850827465707146 +settled_accuracy_p50_ci_low = 0.22399480094213686 +settled_accuracy_p50_ci_high = 0.23267636142185255 +settled_accuracy_p90 = 0.32923518891726644 +settled_accuracy_p90_ci_low = 0.3211782777378156 +settled_accuracy_p90_ci_high = 0.33450520321861266 +settled_accuracy_p95 = 0.35671161558682996 +settled_accuracy_p95_ci_low = 0.3427070695429466 +settled_accuracy_p95_ci_high = 0.36558295993216094 +settled_accuracy_p99 = 0.4284314842216772 +settled_accuracy_p99_ci_low = 0.40486106183580683 +settled_accuracy_p99_ci_high = 0.43613236051131943 +settled_accuracy_mean = 0.18497181311416347 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.0625 +jitter_p50_per_min_ci_low = 0.058823529411764705 +jitter_p50_per_min_ci_high = 0.0625 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.11764705882352941 +jitter_p95_per_min_ci_low = 0.10526315789473684 +jitter_p95_per_min_ci_high = 0.125 +jitter_p99_per_min = 0.15384615384615385 +jitter_p99_per_min_ci_low = 0.14285714285714285 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.05594464109250587 +reaction_rate = 0.506 +reaction_rate_ci_low = 0.4750119103137996 +reaction_rate_ci_high = 0.5369880896862004 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 187.47035573122528 +step_correction_mean = 0.29783180918500357 +step_correction_p50 = 0.29086002707481384 + +[cell.spm_6.step_minus_10_at_15min] +shares_per_minute = 6 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.904 +convergence_rate_ci_low = 0.8857410456378247 +convergence_rate_ci_high = 0.9222589543621753 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 902.5221238938053 +settled_accuracy_p10 = 0.021956230853002134 +settled_accuracy_p10_ci_low = 0.019084940808117512 +settled_accuracy_p10_ci_high = 0.02395808827723722 +settled_accuracy_p50 = 0.07868738043903356 +settled_accuracy_p50_ci_low = 0.05430613348922475 +settled_accuracy_p50_ci_high = 0.09080321481286502 +settled_accuracy_p90 = 0.19446911109462395 +settled_accuracy_p90_ci_low = 0.19044429423657894 +settled_accuracy_p90_ci_high = 0.19824965168635256 +settled_accuracy_p95 = 0.20997565812358387 +settled_accuracy_p95_ci_low = 0.20274259015609886 +settled_accuracy_p95_ci_high = 0.21631192796683618 +settled_accuracy_p99 = 0.3508784736759887 +settled_accuracy_p99_ci_low = 0.23397751629347296 +settled_accuracy_p99_ci_high = 0.4284952440320646 +settled_accuracy_mean = 0.09409341456985626 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.045454545454545456 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09523809523809523 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.11764705882352941 +jitter_p99_per_min_ci_low = 0.1111111111111111 +jitter_p99_per_min_ci_high = 0.15384615384615385 +jitter_mean_per_min = 0.03370779984294192 +reaction_rate = 0.329 +reaction_rate_ci_low = 0.2998783967749027 +reaction_rate_ci_high = 0.35812160322509734 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 185.83586626139817 +step_correction_mean = -3.0051807374396224 +step_correction_p50 = 0.6465020179748535 + +[cell.spm_6.step_minus_5_at_15min] +shares_per_minute = 6 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.895 +convergence_rate_ci_low = 0.8759996221090212 +convergence_rate_ci_high = 0.9140003778909789 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 900 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 874.391061452514 +settled_accuracy_p10 = 0.010694468668389856 +settled_accuracy_p10_ci_low = 0.009141922745264042 +settled_accuracy_p10_ci_high = 0.012281063510204748 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.047378222664811065 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.1535512986872163 +settled_accuracy_p90_ci_low = 0.1461165548173815 +settled_accuracy_p90_ci_high = 0.158934418603764 +settled_accuracy_p95 = 0.1887490504978665 +settled_accuracy_p95_ci_low = 0.1742909047779604 +settled_accuracy_p95_ci_high = 0.20643442619766184 +settled_accuracy_p99 = 0.34653272867539897 +settled_accuracy_p99_ci_low = 0.3138423759702793 +settled_accuracy_p99_ci_high = 0.3766133235961904 +settled_accuracy_mean = 0.07306810892800095 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.041666666666666664 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.047619047619047616 +jitter_p90_per_min = 0.07692307692307693 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.08695652173913043 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.11764705882352941 +jitter_mean_per_min = 0.034316379343596444 +reaction_rate = 0.279 +reaction_rate_ci_low = 0.25120121559492214 +reaction_rate_ci_high = 0.3067987844050779 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 187.95698924731184 +step_correction_mean = 0.43441165871517634 +step_correction_p50 = 1.2490047216415405 + +[cell.spm_6.step_plus_5_at_15min] +shares_per_minute = 6 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.888 +convergence_rate_ci_low = 0.8684533847022049 +convergence_rate_ci_high = 0.9075466152977951 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 886.8918918918919 +settled_accuracy_p10 = 0.011354373306060372 +settled_accuracy_p10_ci_low = 0.009662015446799899 +settled_accuracy_p10_ci_high = 0.012454575284583158 +settled_accuracy_p50 = 0.044835755196559246 +settled_accuracy_p50_ci_low = 0.04099802265314212 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.1264722247894028 +settled_accuracy_p90_ci_low = 0.11866139152605437 +settled_accuracy_p90_ci_high = 0.1399694162512628 +settled_accuracy_p95 = 0.20213332065295275 +settled_accuracy_p95_ci_low = 0.17832961294544147 +settled_accuracy_p95_ci_high = 0.215922723306041 +settled_accuracy_p99 = 0.26756817526126764 +settled_accuracy_p99_ci_low = 0.24924067912130576 +settled_accuracy_p99_ci_high = 0.28385159915322666 +settled_accuracy_mean = 0.06179173209781427 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.045454545454545456 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.05 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09523809523809523 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.125 +jitter_p99_per_min_ci_low = 0.1111111111111111 +jitter_p99_per_min_ci_high = 0.17647058823529413 +jitter_mean_per_min = 0.03738456441327201 +reaction_rate = 0.305 +reaction_rate_ci_low = 0.27646365195053857 +reaction_rate_ci_high = 0.3335363480494614 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 180.78688524590163 +step_correction_mean = 0.5060970873129172 +step_correction_p50 = 1.3014065027236938 + +[cell.spm_6.step_plus_10_at_15min] +shares_per_minute = 6 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.908 +convergence_rate_ci_low = 0.8900859859997822 +convergence_rate_ci_high = 0.9259140140002179 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 917.1806167400881 +settled_accuracy_p10 = 0.011263246908706392 +settled_accuracy_p10_ci_low = 0.009873727349003936 +settled_accuracy_p10_ci_high = 0.01310855767979513 +settled_accuracy_p50 = 0.058767172319764915 +settled_accuracy_p50_ci_low = 0.04213283687414959 +settled_accuracy_p50_ci_high = 0.06625609462886872 +settled_accuracy_p90 = 0.16004122192554004 +settled_accuracy_p90_ci_low = 0.15653466169841423 +settled_accuracy_p90_ci_high = 0.16457564593655505 +settled_accuracy_p95 = 0.17815762615688824 +settled_accuracy_p95_ci_low = 0.16944140471788738 +settled_accuracy_p95_ci_high = 0.19027211851767256 +settled_accuracy_p99 = 0.24384109914071983 +settled_accuracy_p99_ci_low = 0.22836030408125008 +settled_accuracy_p99_ci_high = 0.26797173887062 +settled_accuracy_mean = 0.07510270706791174 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.047619047619047616 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.05263157894736842 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09523809523809523 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.13333333333333333 +jitter_p99_per_min_ci_low = 0.125 +jitter_p99_per_min_ci_high = 0.15384615384615385 +jitter_mean_per_min = 0.037999303632357026 +reaction_rate = 0.355 +reaction_rate_ci_low = 0.3253414369869341 +reaction_rate_ci_high = 0.3846585630130659 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 176.7887323943662 +step_correction_mean = 0.1824932961396768 +step_correction_p50 = 0.6673014760017395 + +[cell.spm_6.step_plus_25_at_15min] +shares_per_minute = 6 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.943 +convergence_rate_ci_low = 0.9286302455970883 +convergence_rate_ci_high = 0.9573697544029116 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 961.7815482502651 +settled_accuracy_p10 = 0.015513850947029617 +settled_accuracy_p10_ci_low = 0.012486221208419135 +settled_accuracy_p10_ci_high = 0.01971379197713019 +settled_accuracy_p50 = 0.11546391121615651 +settled_accuracy_p50_ci_low = 0.10740456636615492 +settled_accuracy_p50_ci_high = 0.12177821090135688 +settled_accuracy_p90 = 0.17859321786027738 +settled_accuracy_p90_ci_low = 0.16094122487739482 +settled_accuracy_p90_ci_high = 0.18791635680268037 +settled_accuracy_p95 = 0.1999673367746042 +settled_accuracy_p95_ci_low = 0.19314730470408426 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.2475417755351368 +settled_accuracy_p99_ci_low = 0.21893724043634288 +settled_accuracy_p99_ci_high = 0.25953772624008054 +settled_accuracy_mean = 0.10148810143767585 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.0625 +jitter_p50_per_min_ci_low = 0.058823529411764705 +jitter_p50_per_min_ci_high = 0.06666666666666667 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.11764705882352941 +jitter_p95_per_min_ci_low = 0.10526315789473684 +jitter_p95_per_min_ci_high = 0.125 +jitter_p99_per_min = 0.14285714285714285 +jitter_p99_per_min_ci_low = 0.13333333333333333 +jitter_p99_per_min_ci_high = 0.15789473684210525 +jitter_mean_per_min = 0.0561141285054664 +reaction_rate = 0.509 +reaction_rate_ci_low = 0.47801469976908406 +reaction_rate_ci_high = 0.539985300230916 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 176.2278978388998 +step_correction_mean = 0.39843494426056536 +step_correction_p50 = 0.3249968886375427 + +[cell.spm_6.step_plus_50_at_15min] +shares_per_minute = 6 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.985 +convergence_rate_ci_low = 0.9774661006112372 +convergence_rate_ci_high = 0.9925338993887628 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 984.243654822335 +settled_accuracy_p10 = 0.03371799835556444 +settled_accuracy_p10_ci_low = 0.029994082787820342 +settled_accuracy_p10_ci_high = 0.039847364022007725 +settled_accuracy_p50 = 0.11105505781160141 +settled_accuracy_p50_ci_low = 0.10669155003668174 +settled_accuracy_p50_ci_high = 0.11363660156778832 +settled_accuracy_p90 = 0.21030253480914363 +settled_accuracy_p90_ci_low = 0.1848375844710448 +settled_accuracy_p90_ci_high = 0.25282937678861894 +settled_accuracy_p95 = 0.2775488818723838 +settled_accuracy_p95_ci_low = 0.26712620430210765 +settled_accuracy_p95_ci_high = 0.283635432083996 +settled_accuracy_p99 = 0.29559427627609514 +settled_accuracy_p99_ci_low = 0.2928840624592034 +settled_accuracy_p99_ci_high = 0.317067278246143 +settled_accuracy_mean = 0.1168848549254014 +jitter_p10_per_min = 0.045454545454545456 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.05 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.13333333333333333 +jitter_p90_per_min_ci_low = 0.125 +jitter_p90_per_min_ci_high = 0.14285714285714285 +jitter_p95_per_min = 0.15384615384615385 +jitter_p95_per_min_ci_low = 0.14285714285714285 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.08643384372984012 +reaction_rate = 0.834 +reaction_rate_ci_low = 0.8109382032269816 +reaction_rate_ci_high = 0.8570617967730183 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 160.14388489208633 +step_correction_mean = 0.25703664326803577 +step_correction_p50 = 0.19341284036636353 + +[cell.spm_8.cold_start_10gh_to_1ph] +shares_per_minute = 8 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 180 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 300 +convergence_p50_secs_ci_high = 360 +convergence_p90_secs = 540 +convergence_p90_secs_ci_low = 540 +convergence_p90_secs_ci_high = 540 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 600 +convergence_p95_secs_ci_high = 660 +convergence_p99_secs = 840 +convergence_p99_secs_ci_low = 780 +convergence_p99_secs_ci_high = 840 +convergence_mean_secs = 359.94 +settled_accuracy_p10 = 0.0103691249292589 +settled_accuracy_p10_ci_low = 0.008408069679939678 +settled_accuracy_p10_ci_high = 0.012489966385840656 +settled_accuracy_p50 = 0.05801346619904324 +settled_accuracy_p50_ci_low = 0.054229935506367566 +settled_accuracy_p50_ci_high = 0.06271934113053335 +settled_accuracy_p90 = 0.1474477726936847 +settled_accuracy_p90_ci_low = 0.1411210844577815 +settled_accuracy_p90_ci_high = 0.15712520655269746 +settled_accuracy_p95 = 0.17340507897337654 +settled_accuracy_p95_ci_low = 0.16651937389308125 +settled_accuracy_p95_ci_high = 0.17965694082494643 +settled_accuracy_p99 = 0.2441137975759069 +settled_accuracy_p99_ci_low = 0.21869658344071308 +settled_accuracy_p99_ci_high = 0.2653717384840013 +settled_accuracy_mean = 0.07070864290373076 +jitter_p10_per_min = 0.04 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.04 +jitter_p50_per_min = 0.05263157894736842 +jitter_p50_per_min_ci_low = 0.05263157894736842 +jitter_p50_per_min_ci_high = 0.05263157894736842 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.08695652173913043 +jitter_p90_per_min_ci_high = 0.09523809523809523 +jitter_p95_per_min = 0.1111111111111111 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.12 +jitter_p99_per_min = 0.13043478260869565 +jitter_p99_per_min_ci_low = 0.125 +jitter_p99_per_min_ci_high = 0.13636363636363635 +jitter_mean_per_min = 0.06089501296971133 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0.0012692970702081752 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0.009134791577649626 +ramp_target_overshoot_p90 = 0.1146211358967264 +ramp_target_overshoot_p90_ci_low = 0.1055609022679509 +ramp_target_overshoot_p90_ci_high = 0.12884251099629074 +ramp_target_overshoot_p99 = 0.23661411349088834 +ramp_target_overshoot_p99_ci_low = 0.20374526521792502 +ramp_target_overshoot_p99_ci_high = 0.2653717384840013 +ramp_target_overshoot_mean = 0.03702288479401032 + +[cell.spm_8.stable_1ph] +shares_per_minute = 8 +scenario = "stable_1ph" +convergence_rate = 0.878 +convergence_rate_ci_low = 0.8577146154682738 +convergence_rate_ci_high = 0.8982853845317262 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 900 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 862.9612756264237 +settled_accuracy_p10 = 0.0026140916133985392 +settled_accuracy_p10_ci_low = 0.0005036520308718817 +settled_accuracy_p10_ci_high = 0.005003972509256105 +settled_accuracy_p50 = 0.05734553166696199 +settled_accuracy_p50_ci_low = 0.05592262240505963 +settled_accuracy_p50_ci_high = 0.05864261180722763 +settled_accuracy_p90 = 0.09085721575654415 +settled_accuracy_p90_ci_low = 0.08624368262311899 +settled_accuracy_p90_ci_high = 0.09711853995806097 +settled_accuracy_p95 = 0.161046176200633 +settled_accuracy_p95_ci_low = 0.11219105679080976 +settled_accuracy_p95_ci_high = 0.2031870536799112 +settled_accuracy_p99 = 0.26349926693631454 +settled_accuracy_p99_ci_low = 0.24557059681457027 +settled_accuracy_p99_ci_high = 0.2962399372773705 +settled_accuracy_mean = 0.05867700369118893 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.11764705882352941 +jitter_p99_per_min_ci_low = 0.10526315789473684 +jitter_p99_per_min_ci_high = 0.13333333333333333 +jitter_mean_per_min = 0.030751213668484465 +upward_step_magnitude_p50 = 1.060221012309041 +upward_step_magnitude_p50_ci_low = 1.0581022512272702 +upward_step_magnitude_p50_ci_high = 1.0621026106623503 +upward_step_magnitude_p90 = 1.0977472158041914 +upward_step_magnitude_p90_ci_low = 1.0949052224856841 +upward_step_magnitude_p90_ci_high = 1.104351600522939 +upward_step_magnitude_p95 = 1.1226244447683917 +upward_step_magnitude_p95_ci_low = 1.1127789146646698 +upward_step_magnitude_p95_ci_high = 1.1360478814499102 +upward_step_magnitude_p99 = 1.2087218006896174 +upward_step_magnitude_p99_ci_low = 1.1856263395864883 +upward_step_magnitude_p99_ci_high = 1.2209816762157928 +upward_step_magnitude_mean = 1.0516977798803213 + +[cell.spm_8.step_minus_50_at_15min] +shares_per_minute = 8 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.966 +convergence_rate_ci_low = 0.9547673017311066 +convergence_rate_ci_high = 0.9772326982688934 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1018.8819875776397 +settled_accuracy_p10 = 0.1309361733625991 +settled_accuracy_p10_ci_low = 0.12145382497377222 +settled_accuracy_p10_ci_high = 0.1373688264961368 +settled_accuracy_p50 = 0.33233927208759106 +settled_accuracy_p50_ci_low = 0.28363125530956945 +settled_accuracy_p50_ci_high = 0.37950727463450673 +settled_accuracy_p90 = 0.5403328639963021 +settled_accuracy_p90_ci_low = 0.5314049690490559 +settled_accuracy_p90_ci_high = 0.5473575515357494 +settled_accuracy_p95 = 0.5696104484744511 +settled_accuracy_p95_ci_low = 0.5612594213296533 +settled_accuracy_p95_ci_high = 0.5801576803310828 +settled_accuracy_p99 = 0.6111238580671667 +settled_accuracy_p99_ci_low = 0.5936456226464502 +settled_accuracy_p99_ci_high = 0.7696536531616562 +settled_accuracy_mean = 0.33630128471197657 +jitter_p10_per_min = 0.08333333333333333 +jitter_p10_per_min_ci_low = 0.08333333333333333 +jitter_p10_per_min_ci_high = 0.08333333333333333 +jitter_p50_per_min = 0.1111111111111111 +jitter_p50_per_min_ci_low = 0.10526315789473684 +jitter_p50_per_min_ci_high = 0.11764705882352941 +jitter_p90_per_min = 0.18181818181818182 +jitter_p90_per_min_ci_low = 0.17647058823529413 +jitter_p90_per_min_ci_high = 0.18181818181818182 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.18181818181818182 +jitter_p95_per_min_ci_high = 0.1875 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.21428571428571427 +jitter_mean_per_min = 0.12226942897157964 +reaction_rate = 0.923 +reaction_rate_ci_low = 0.9064764908811718 +reaction_rate_ci_high = 0.9395235091188283 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 149.96749729144096 +step_correction_mean = 0.18532855797433906 +step_correction_p50 = 0.15487168729305267 + +[cell.spm_8.step_minus_25_at_15min] +shares_per_minute = 8 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.966 +convergence_rate_ci_low = 0.9547673017311066 +convergence_rate_ci_high = 0.9772326982688934 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 970.8074534161491 +settled_accuracy_p10 = 0.023597355409703535 +settled_accuracy_p10_ci_low = 0.01981653152582019 +settled_accuracy_p10_ci_high = 0.02676892029265554 +settled_accuracy_p50 = 0.22673677962102468 +settled_accuracy_p50_ci_low = 0.21835532997830764 +settled_accuracy_p50_ci_high = 0.23336069287127592 +settled_accuracy_p90 = 0.30853962075975994 +settled_accuracy_p90_ci_low = 0.2979974446734397 +settled_accuracy_p90_ci_high = 0.3178473516739768 +settled_accuracy_p95 = 0.33333330350717194 +settled_accuracy_p95_ci_low = 0.3256626709452892 +settled_accuracy_p95_ci_high = 0.33640876849777523 +settled_accuracy_p99 = 0.38331696920982705 +settled_accuracy_p99_ci_low = 0.35827516262490855 +settled_accuracy_p99_ci_high = 0.4169232089382564 +settled_accuracy_mean = 0.17070869134047814 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.06666666666666667 +jitter_p50_per_min_ci_low = 0.06666666666666667 +jitter_p50_per_min_ci_high = 0.07142857142857142 +jitter_p90_per_min = 0.1111111111111111 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.1111111111111111 +jitter_p95_per_min = 0.125 +jitter_p95_per_min_ci_low = 0.11764705882352941 +jitter_p95_per_min_ci_high = 0.13333333333333333 +jitter_p99_per_min = 0.15384615384615385 +jitter_p99_per_min_ci_low = 0.14285714285714285 +jitter_p99_per_min_ci_high = 0.15384615384615385 +jitter_mean_per_min = 0.0608050138882274 +reaction_rate = 0.573 +reaction_rate_ci_low = 0.5423417529268224 +reaction_rate_ci_high = 0.6036582470731775 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 188.1675392670157 +step_correction_mean = 0.2878988427849548 +step_correction_p50 = 0.26901906728744507 + +[cell.spm_8.step_minus_10_at_15min] +shares_per_minute = 8 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.897 +convergence_rate_ci_low = 0.8781604335081723 +convergence_rate_ci_high = 0.9158395664918277 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 900.4013377926422 +settled_accuracy_p10 = 0.03098013614897277 +settled_accuracy_p10_ci_low = 0.028603587565323885 +settled_accuracy_p10_ci_high = 0.03272601053832869 +settled_accuracy_p50 = 0.070209293906627 +settled_accuracy_p50_ci_low = 0.0567023673397562 +settled_accuracy_p50_ci_high = 0.08578175675348199 +settled_accuracy_p90 = 0.17132781226220617 +settled_accuracy_p90_ci_low = 0.1669419497138367 +settled_accuracy_p90_ci_high = 0.1764068348141401 +settled_accuracy_p95 = 0.18632418279112484 +settled_accuracy_p95_ci_low = 0.1810323505737248 +settled_accuracy_p95_ci_high = 0.19186245367158183 +settled_accuracy_p99 = 0.21234072363488443 +settled_accuracy_p99_ci_low = 0.20021631423949438 +settled_accuracy_p99_ci_high = 0.2915059191882512 +settled_accuracy_mean = 0.08668394923736361 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.045454545454545456 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.05 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.125 +jitter_mean_per_min = 0.03663789007951112 +reaction_rate = 0.3 +reaction_rate_ci_low = 0.2715969015774687 +reaction_rate_ci_high = 0.3284030984225313 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 185.2 +step_correction_mean = 0.9768777440985044 +step_correction_p50 = 0.6005311012268066 + +[cell.spm_8.step_minus_5_at_15min] +shares_per_minute = 8 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.888 +convergence_rate_ci_low = 0.8684533847022049 +convergence_rate_ci_high = 0.9075466152977951 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 900 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 871.2162162162163 +settled_accuracy_p10 = 0.005882268587619088 +settled_accuracy_p10_ci_low = 0.005183629986303395 +settled_accuracy_p10_ci_high = 0.007366999237007565 +settled_accuracy_p50 = 0.05263157522942574 +settled_accuracy_p50_ci_low = 0.04956992754291201 +settled_accuracy_p50_ci_high = 0.05263157522942574 +settled_accuracy_p90 = 0.135513566127627 +settled_accuracy_p90_ci_low = 0.13009194691505144 +settled_accuracy_p90_ci_high = 0.1391108838357562 +settled_accuracy_p95 = 0.159206315466905 +settled_accuracy_p95_ci_low = 0.14515682741217684 +settled_accuracy_p95_ci_high = 0.16987761391676792 +settled_accuracy_p99 = 0.3066066275443178 +settled_accuracy_p99_ci_low = 0.2641371710844431 +settled_accuracy_p99_ci_high = 0.31797769485005856 +settled_accuracy_mean = 0.06548350474703388 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.045454545454545456 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.08333333333333333 +jitter_p95_per_min_ci_high = 0.09523809523809523 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.125 +jitter_mean_per_min = 0.032791721183148374 +reaction_rate = 0.305 +reaction_rate_ci_low = 0.27646365195053857 +reaction_rate_ci_high = 0.3335363480494614 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 183.7377049180328 +step_correction_mean = 0.42795048453768747 +step_correction_p50 = 1.103134274482727 + +[cell.spm_8.step_plus_5_at_15min] +shares_per_minute = 8 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.907 +convergence_rate_ci_low = 0.8889988111059297 +convergence_rate_ci_high = 0.9250011888940703 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 905.0275633958104 +settled_accuracy_p10 = 0.005924434901776188 +settled_accuracy_p10_ci_low = 0.005111458884185405 +settled_accuracy_p10_ci_high = 0.0071998868991853815 +settled_accuracy_p50 = 0.04009281987506497 +settled_accuracy_p50_ci_low = 0.03583466624330556 +settled_accuracy_p50_ci_high = 0.045545894860981706 +settled_accuracy_p90 = 0.11845885056695493 +settled_accuracy_p90_ci_low = 0.11362272978684052 +settled_accuracy_p90_ci_high = 0.12911682554851278 +settled_accuracy_p95 = 0.16894459734614453 +settled_accuracy_p95_ci_low = 0.15568017779120802 +settled_accuracy_p95_ci_high = 0.18167393551591826 +settled_accuracy_p99 = 0.23510627296641262 +settled_accuracy_p99_ci_low = 0.21338639152285865 +settled_accuracy_p99_ci_high = 0.2548062413549397 +settled_accuracy_mean = 0.05558827398416662 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.041666666666666664 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.11764705882352941 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.14285714285714285 +jitter_mean_per_min = 0.032239568465958005 +reaction_rate = 0.313 +reaction_rate_ci_low = 0.2842586867105903 +reaction_rate_ci_high = 0.3417413132894097 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 188.24281150159743 +step_correction_mean = 0.5971578661435709 +step_correction_p50 = 1.1802667379379272 + +[cell.spm_8.step_plus_10_at_15min] +shares_per_minute = 8 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.9 +convergence_rate_ci_low = 0.88140580735821 +convergence_rate_ci_high = 0.9185941926417901 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 907.8666666666667 +settled_accuracy_p10 = 0.01717370769830806 +settled_accuracy_p10_ci_low = 0.015361158255088991 +settled_accuracy_p10_ci_high = 0.01950189725913365 +settled_accuracy_p50 = 0.047521068675735245 +settled_accuracy_p50_ci_low = 0.0430962151393085 +settled_accuracy_p50_ci_high = 0.06069954159154278 +settled_accuracy_p90 = 0.144978027032305 +settled_accuracy_p90_ci_low = 0.14191944898496922 +settled_accuracy_p90_ci_high = 0.14905592773522158 +settled_accuracy_p95 = 0.15884357271248606 +settled_accuracy_p95_ci_low = 0.15219326718717519 +settled_accuracy_p95_ci_high = 0.16555433722461044 +settled_accuracy_p99 = 0.202388563136356 +settled_accuracy_p99_ci_low = 0.18211326670887207 +settled_accuracy_p99_ci_high = 0.21699877318893468 +settled_accuracy_mean = 0.07010318897057251 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.041666666666666664 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.05 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09523809523809523 +jitter_p95_per_min_ci_high = 0.10526315789473684 +jitter_p99_per_min = 0.13333333333333333 +jitter_p99_per_min_ci_low = 0.125 +jitter_p99_per_min_ci_high = 0.15384615384615385 +jitter_mean_per_min = 0.036883638514718015 +reaction_rate = 0.364 +reaction_rate_ci_low = 0.3341780992155094 +reaction_rate_ci_high = 0.3938219007844906 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 182.30769230769232 +step_correction_mean = 0.7781141364312434 +step_correction_p50 = 0.6148984432220459 + +[cell.spm_8.step_plus_25_at_15min] +shares_per_minute = 8 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.946 +convergence_rate_ci_low = 0.9319912779169547 +convergence_rate_ci_high = 0.9600087220830452 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 975.1585623678646 +settled_accuracy_p10 = 0.010457708209808292 +settled_accuracy_p10_ci_low = 0.008766779631461663 +settled_accuracy_p10_ci_high = 0.011989723002534314 +settled_accuracy_p50 = 0.08246573206749197 +settled_accuracy_p50_ci_low = 0.0702140160670428 +settled_accuracy_p50_ci_high = 0.10018569290598123 +settled_accuracy_p90 = 0.16140964473534736 +settled_accuracy_p90_ci_low = 0.15764322695487043 +settled_accuracy_p90_ci_high = 0.1705189479993291 +settled_accuracy_p95 = 0.19618798040550078 +settled_accuracy_p95_ci_low = 0.18441434793915668 +settled_accuracy_p95_ci_high = 0.20000003221225382 +settled_accuracy_p99 = 0.23436052126298668 +settled_accuracy_p99_ci_low = 0.20871435955704287 +settled_accuracy_p99_ci_high = 0.24070944912106718 +settled_accuracy_mean = 0.0887054834168097 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.07142857142857142 +jitter_p50_per_min_ci_low = 0.06666666666666667 +jitter_p50_per_min_ci_high = 0.07142857142857142 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.10526315789473684 +jitter_p95_per_min = 0.11764705882352941 +jitter_p95_per_min_ci_low = 0.10526315789473684 +jitter_p95_per_min_ci_high = 0.125 +jitter_p99_per_min = 0.15 +jitter_p99_per_min_ci_low = 0.13333333333333333 +jitter_p99_per_min_ci_high = 0.15384615384615385 +jitter_mean_per_min = 0.060647872353422054 +reaction_rate = 0.603 +reaction_rate_ci_low = 0.572674359601156 +reaction_rate_ci_high = 0.633325640398844 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 175.3233830845771 +step_correction_mean = 0.3737237973395074 +step_correction_p50 = 0.28996580839157104 + +[cell.spm_8.step_plus_50_at_15min] +shares_per_minute = 8 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.979 +convergence_rate_ci_low = 0.9701129614381392 +convergence_rate_ci_high = 0.9878870385618608 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1017.7936670071501 +settled_accuracy_p10 = 0.0382261928399138 +settled_accuracy_p10_ci_low = 0.032409554476783065 +settled_accuracy_p10_ci_high = 0.04361700309532923 +settled_accuracy_p50 = 0.11691920924999943 +settled_accuracy_p50_ci_low = 0.11381296366072946 +settled_accuracy_p50_ci_high = 0.12103316153166044 +settled_accuracy_p90 = 0.17710789610939492 +settled_accuracy_p90_ci_low = 0.17308351179071413 +settled_accuracy_p90_ci_high = 0.1816550137345 +settled_accuracy_p95 = 0.2069108528543323 +settled_accuracy_p95_ci_low = 0.1938059234935693 +settled_accuracy_p95_ci_high = 0.2633832298171659 +settled_accuracy_p99 = 0.28627491315889386 +settled_accuracy_p99_ci_low = 0.2808828502046955 +settled_accuracy_p99_ci_high = 0.29330568507814736 +settled_accuracy_mean = 0.11714748286733084 +jitter_p10_per_min = 0.05263157894736842 +jitter_p10_per_min_ci_low = 0.047619047619047616 +jitter_p10_per_min_ci_high = 0.05555555555555555 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.15384615384615385 +jitter_p90_per_min_ci_low = 0.13333333333333333 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.21428571428571427 +jitter_mean_per_min = 0.09275850463913018 +reaction_rate = 0.872 +reaction_rate_ci_low = 0.8512928991502915 +reaction_rate_ci_high = 0.8927071008497085 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 150.27522935779817 +step_correction_mean = 0.2196219787257937 +step_correction_p50 = 0.170330211520195 + +[cell.spm_10.cold_start_10gh_to_1ph] +shares_per_minute = 10 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 120 +convergence_p10_secs_ci_low = 120 +convergence_p10_secs_ci_high = 120 +convergence_p50_secs = 360 +convergence_p50_secs_ci_low = 360 +convergence_p50_secs_ci_high = 360 +convergence_p90_secs = 420 +convergence_p90_secs_ci_low = 420 +convergence_p90_secs_ci_high = 420 +convergence_p95_secs = 600 +convergence_p95_secs_ci_low = 420 +convergence_p95_secs_ci_high = 660 +convergence_p99_secs = 720 +convergence_p99_secs_ci_low = 660 +convergence_p99_secs_ci_high = 720 +convergence_mean_secs = 342.96 +settled_accuracy_p10 = 0.021213649057278183 +settled_accuracy_p10_ci_low = 0.017821564373406984 +settled_accuracy_p10_ci_high = 0.02562954658365202 +settled_accuracy_p50 = 0.10293244935746948 +settled_accuracy_p50_ci_low = 0.0992322678749663 +settled_accuracy_p50_ci_high = 0.10705253100748324 +settled_accuracy_p90 = 0.17029646213472893 +settled_accuracy_p90_ci_low = 0.16652393729589254 +settled_accuracy_p90_ci_high = 0.17610473438948815 +settled_accuracy_p95 = 0.19275222917194168 +settled_accuracy_p95_ci_low = 0.18401150084882645 +settled_accuracy_p95_ci_high = 0.19945002943059265 +settled_accuracy_p99 = 0.23307653678797247 +settled_accuracy_p99_ci_low = 0.2152538986727276 +settled_accuracy_p99_ci_high = 0.2563964646781549 +settled_accuracy_mean = 0.10094891538988142 +jitter_p10_per_min = 0.043478260869565216 +jitter_p10_per_min_ci_low = 0.043478260869565216 +jitter_p10_per_min_ci_high = 0.043478260869565216 +jitter_p50_per_min = 0.07692307692307693 +jitter_p50_per_min_ci_low = 0.07692307692307693 +jitter_p50_per_min_ci_high = 0.08695652173913043 +jitter_p90_per_min = 0.1111111111111111 +jitter_p90_per_min_ci_low = 0.09523809523809523 +jitter_p90_per_min_ci_high = 0.11538461538461539 +jitter_p95_per_min = 0.11538461538461539 +jitter_p95_per_min_ci_low = 0.11538461538461539 +jitter_p95_per_min_ci_high = 0.13043478260869565 +jitter_p99_per_min = 0.13636363636363635 +jitter_p99_per_min_ci_low = 0.13636363636363635 +jitter_p99_per_min_ci_high = 0.14285714285714285 +jitter_mean_per_min = 0.07252321723792331 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0.03825654927156341 +ramp_target_overshoot_p90_ci_low = 0.032421970341774076 +ramp_target_overshoot_p90_ci_high = 0.04580260558220939 +ramp_target_overshoot_p99 = 0.11985690242525404 +ramp_target_overshoot_p99_ci_low = 0.10271588905052442 +ramp_target_overshoot_p99_ci_high = 0.13288286731483545 +ramp_target_overshoot_mean = 0.009924178324091659 + +[cell.spm_10.stable_1ph] +shares_per_minute = 10 +scenario = "stable_1ph" +convergence_rate = 0.986 +convergence_rate_ci_low = 0.9787178680044921 +convergence_rate_ci_high = 0.9932821319955079 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 647.7079107505072 +settled_accuracy_p10 = 0.020667718441536254 +settled_accuracy_p10_ci_low = 0.018062082545111657 +settled_accuracy_p10_ci_high = 0.022739033555841726 +settled_accuracy_p50 = 0.08733910062444128 +settled_accuracy_p50_ci_low = 0.08226499935139286 +settled_accuracy_p50_ci_high = 0.09081822550605279 +settled_accuracy_p90 = 0.15037566535922942 +settled_accuracy_p90_ci_low = 0.1431635427601916 +settled_accuracy_p90_ci_high = 0.15844624455772272 +settled_accuracy_p95 = 0.18497840537391685 +settled_accuracy_p95_ci_low = 0.17171299605446855 +settled_accuracy_p95_ci_high = 0.1916388259948335 +settled_accuracy_p99 = 0.22152367859121846 +settled_accuracy_p99_ci_low = 0.21266691904073787 +settled_accuracy_p99_ci_high = 0.25321624268068776 +settled_accuracy_mean = 0.08493129850754581 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.058823529411764705 +jitter_p50_per_min_ci_low = 0.058823529411764705 +jitter_p50_per_min_ci_high = 0.0625 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.10526315789473684 +jitter_p95_per_min = 0.11764705882352941 +jitter_p95_per_min_ci_low = 0.1111111111111111 +jitter_p95_per_min_ci_high = 0.125 +jitter_p99_per_min = 0.15 +jitter_p99_per_min_ci_low = 0.13636363636363635 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.06128153905550489 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1.0931806353143672 +upward_step_magnitude_p90_ci_low = 1.0905013422098218 +upward_step_magnitude_p90_ci_high = 1.0965664842662306 +upward_step_magnitude_p95 = 1.1085197736338093 +upward_step_magnitude_p95_ci_low = 1.1018731352478732 +upward_step_magnitude_p95_ci_high = 1.1147094937338156 +upward_step_magnitude_p99 = 1.148492455775447 +upward_step_magnitude_p99_ci_low = 1.1299087269517951 +upward_step_magnitude_p99_ci_high = 1.1677973783689064 +upward_step_magnitude_mean = 1.0312179014613543 + +[cell.spm_10.step_minus_50_at_15min] +shares_per_minute = 10 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.777 +convergence_rate_ci_low = 0.7512000412093353 +convergence_rate_ci_high = 0.8027999587906648 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 540 +convergence_p50_secs_ci_low = 540 +convergence_p50_secs_ci_high = 540 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 692.4324324324324 +settled_accuracy_p10 = 0.02673113860054266 +settled_accuracy_p10_ci_low = 0.022998744862900322 +settled_accuracy_p10_ci_high = 0.030160938466472498 +settled_accuracy_p50 = 0.13391110934241968 +settled_accuracy_p50_ci_low = 0.1274152396581716 +settled_accuracy_p50_ci_high = 0.14112504388080893 +settled_accuracy_p90 = 0.27948352480722805 +settled_accuracy_p90_ci_low = 0.2687865059641996 +settled_accuracy_p90_ci_high = 0.2907650618633004 +settled_accuracy_p95 = 0.31679887224894765 +settled_accuracy_p95_ci_low = 0.30435715713695055 +settled_accuracy_p95_ci_high = 0.33019621759673634 +settled_accuracy_p99 = 0.3824188598458871 +settled_accuracy_p99_ci_low = 0.36738499771930533 +settled_accuracy_p99_ci_high = 0.42284349521490316 +settled_accuracy_mean = 0.14702930187788732 +jitter_p10_per_min = 0.13636363636363635 +jitter_p10_per_min_ci_low = 0.13043478260869565 +jitter_p10_per_min_ci_high = 0.13636363636363635 +jitter_p50_per_min = 0.17647058823529413 +jitter_p50_per_min_ci_low = 0.17647058823529413 +jitter_p50_per_min_ci_high = 0.18181818181818182 +jitter_p90_per_min = 0.2222222222222222 +jitter_p90_per_min_ci_low = 0.2222222222222222 +jitter_p90_per_min_ci_high = 0.2222222222222222 +jitter_p95_per_min = 0.23529411764705882 +jitter_p95_per_min_ci_low = 0.2222222222222222 +jitter_p95_per_min_ci_high = 0.23529411764705882 +jitter_p99_per_min = 0.25 +jitter_p99_per_min_ci_low = 0.23809523809523808 +jitter_p99_per_min_ci_high = 0.2727272727272727 +jitter_mean_per_min = 0.17800610936868808 +reaction_rate = 0.997 +reaction_rate_ci_low = 0.9936102764714508 +reaction_rate_ci_high = 1 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 113.68104312938816 +step_correction_mean = 0.2088167999227463 +step_correction_p50 = 0.2017420083284378 + +[cell.spm_10.step_minus_25_at_15min] +shares_per_minute = 10 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.97 +convergence_rate_ci_low = 0.9594268944959392 +convergence_rate_ci_high = 0.9805731055040607 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 738.3711340206186 +settled_accuracy_p10 = 0.009971303355237326 +settled_accuracy_p10_ci_low = 0.008304050753628056 +settled_accuracy_p10_ci_high = 0.011683384677579012 +settled_accuracy_p50 = 0.05384806249105778 +settled_accuracy_p50_ci_low = 0.04985222180893101 +settled_accuracy_p50_ci_high = 0.05730309521289212 +settled_accuracy_p90 = 0.15420605695967682 +settled_accuracy_p90_ci_low = 0.14540200043468654 +settled_accuracy_p90_ci_high = 0.16224927793099964 +settled_accuracy_p95 = 0.18270960715276696 +settled_accuracy_p95_ci_low = 0.17622644355862738 +settled_accuracy_p95_ci_high = 0.19079953589299659 +settled_accuracy_p99 = 0.22066915410888344 +settled_accuracy_p99_ci_low = 0.21049026066961574 +settled_accuracy_p99_ci_high = 0.22844223953551368 +settled_accuracy_mean = 0.06826131922961531 +jitter_p10_per_min = 0.06666666666666667 +jitter_p10_per_min_ci_low = 0.0625 +jitter_p10_per_min_ci_high = 0.07692307692307693 +jitter_p50_per_min = 0.10526315789473684 +jitter_p50_per_min_ci_low = 0.1 +jitter_p50_per_min_ci_high = 0.1111111111111111 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.15789473684210525 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.17647058823529413 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.11063294507937738 +reaction_rate = 0.849 +reaction_rate_ci_low = 0.8268079005409582 +reaction_rate_ci_high = 0.8711920994590417 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 159.434628975265 +step_correction_mean = 0.3824395716313198 +step_correction_p50 = 0.35596105456352234 + +[cell.spm_10.step_minus_10_at_15min] +shares_per_minute = 10 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.985 +convergence_rate_ci_low = 0.9774661006112372 +convergence_rate_ci_high = 0.9925338993887628 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 673.4619289340102 +settled_accuracy_p10 = 0.007591131041615351 +settled_accuracy_p10_ci_low = 0.0059421171131704975 +settled_accuracy_p10_ci_high = 0.008771575965929479 +settled_accuracy_p50 = 0.05486388271756604 +settled_accuracy_p50_ci_low = 0.04963848827589501 +settled_accuracy_p50_ci_high = 0.05924370546814206 +settled_accuracy_p90 = 0.12864396473205486 +settled_accuracy_p90_ci_low = 0.12328673865459394 +settled_accuracy_p90_ci_high = 0.13416016425267385 +settled_accuracy_p95 = 0.14950721588064164 +settled_accuracy_p95_ci_low = 0.142134859736881 +settled_accuracy_p95_ci_high = 0.1535238305441522 +settled_accuracy_p99 = 0.18315343808032858 +settled_accuracy_p99_ci_low = 0.1758718280342807 +settled_accuracy_p99_ci_high = 0.19788853143062302 +settled_accuracy_mean = 0.0619533701512447 +jitter_p10_per_min = 0.04 +jitter_p10_per_min_ci_low = 0.038461538461538464 +jitter_p10_per_min_ci_high = 0.041666666666666664 +jitter_p50_per_min = 0.07142857142857142 +jitter_p50_per_min_ci_low = 0.07142857142857142 +jitter_p50_per_min_ci_high = 0.07692307692307693 +jitter_p90_per_min = 0.11764705882352941 +jitter_p90_per_min_ci_low = 0.11764705882352941 +jitter_p90_per_min_ci_high = 0.125 +jitter_p95_per_min = 0.13636363636363635 +jitter_p95_per_min_ci_low = 0.13333333333333333 +jitter_p95_per_min_ci_high = 0.14285714285714285 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.15384615384615385 +jitter_p99_per_min_ci_high = 0.1875 +jitter_mean_per_min = 0.07453060263184941 +reaction_rate = 0.547 +reaction_rate_ci_low = 0.516146897958228 +reaction_rate_ci_high = 0.5778531020417721 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 180.43875685557586 +step_correction_mean = 0.9742604852049617 +step_correction_p50 = 1.0401134490966797 + +[cell.spm_10.step_minus_5_at_15min] +shares_per_minute = 10 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.98 +convergence_rate_ci_low = 0.971322710100498 +convergence_rate_ci_high = 0.988677289899502 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 684.5510204081633 +settled_accuracy_p10 = 0.01788931600737853 +settled_accuracy_p10_ci_low = 0.01569633959289507 +settled_accuracy_p10_ci_high = 0.019965169792844906 +settled_accuracy_p50 = 0.0674309165453233 +settled_accuracy_p50_ci_low = 0.06399882792601885 +settled_accuracy_p50_ci_high = 0.07055762451007874 +settled_accuracy_p90 = 0.1361430472779126 +settled_accuracy_p90_ci_low = 0.1300202463912561 +settled_accuracy_p90_ci_high = 0.1464034275534729 +settled_accuracy_p95 = 0.15925887230405145 +settled_accuracy_p95_ci_low = 0.1550226075636777 +settled_accuracy_p95_ci_high = 0.1700455273601782 +settled_accuracy_p99 = 0.1958957913770477 +settled_accuracy_p99_ci_low = 0.1875516870709404 +settled_accuracy_p99_ci_high = 0.21139617308520575 +settled_accuracy_mean = 0.07326867019828835 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.038461538461538464 +jitter_p50_per_min = 0.058823529411764705 +jitter_p50_per_min_ci_low = 0.058823529411764705 +jitter_p50_per_min_ci_high = 0.0625 +jitter_p90_per_min = 0.10526315789473684 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.1111111111111111 +jitter_p95_per_min = 0.11764705882352941 +jitter_p95_per_min_ci_low = 0.1111111111111111 +jitter_p95_per_min_ci_high = 0.125 +jitter_p99_per_min = 0.14285714285714285 +jitter_p99_per_min_ci_low = 0.13636363636363635 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.0640894274870369 +reaction_rate = 0.448 +reaction_rate_ci_low = 0.4171777302328333 +reaction_rate_ci_high = 0.47882226976716674 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 178.92857142857142 +step_correction_mean = 3.053254348691553 +step_correction_p50 = 0.7080938816070557 + +[cell.spm_10.step_plus_5_at_15min] +shares_per_minute = 10 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.973 +convergence_rate_ci_low = 0.9629539722476991 +convergence_rate_ci_high = 0.9830460277523009 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 662.9599177800617 +settled_accuracy_p10 = 0.012805970107280906 +settled_accuracy_p10_ci_low = 0.011041965540809828 +settled_accuracy_p10_ci_high = 0.015700343686889662 +settled_accuracy_p50 = 0.08746695207749244 +settled_accuracy_p50_ci_low = 0.08354185017746785 +settled_accuracy_p50_ci_high = 0.09551055724776425 +settled_accuracy_p90 = 0.17458123106810863 +settled_accuracy_p90_ci_low = 0.16987907237391175 +settled_accuracy_p90_ci_high = 0.1816883799011365 +settled_accuracy_p95 = 0.19511290204444298 +settled_accuracy_p95_ci_low = 0.18816067882986165 +settled_accuracy_p95_ci_high = 0.20466274980957055 +settled_accuracy_p99 = 0.22553980776696325 +settled_accuracy_p99_ci_low = 0.22034583693004917 +settled_accuracy_p99_ci_high = 0.2370502571292309 +settled_accuracy_mean = 0.09610936591833237 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.05555555555555555 +jitter_p50_per_min_ci_low = 0.05555555555555555 +jitter_p50_per_min_ci_high = 0.058823529411764705 +jitter_p90_per_min = 0.09523809523809523 +jitter_p90_per_min_ci_low = 0.09523809523809523 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1111111111111111 +jitter_p95_per_min_ci_low = 0.10526315789473684 +jitter_p95_per_min_ci_high = 0.11764705882352941 +jitter_p99_per_min = 0.13636363636363635 +jitter_p99_per_min_ci_low = 0.125 +jitter_p99_per_min_ci_high = 0.14285714285714285 +jitter_mean_per_min = 0.05778962936990987 +reaction_rate = 0.348 +reaction_rate_ci_low = 0.3184763878632712 +reaction_rate_ci_high = 0.37752361213672875 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 179.48275862068965 +step_correction_mean = -0.17795687871075225 +step_correction_p50 = -0.5322129726409912 + +[cell.spm_10.step_plus_10_at_15min] +shares_per_minute = 10 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.982 +convergence_rate_ci_low = 0.9737596042813467 +convergence_rate_ci_high = 0.9902403957186533 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 691.7107942973523 +settled_accuracy_p10 = 0.035433175828826546 +settled_accuracy_p10_ci_low = 0.03204423914012311 +settled_accuracy_p10_ci_high = 0.03729813119502523 +settled_accuracy_p50 = 0.10874808594839802 +settled_accuracy_p50_ci_low = 0.09521271588540658 +settled_accuracy_p50_ci_high = 0.11192868011442914 +settled_accuracy_p90 = 0.192752950242986 +settled_accuracy_p90_ci_low = 0.18746123319128827 +settled_accuracy_p90_ci_high = 0.1977285845392034 +settled_accuracy_p95 = 0.21348592913169606 +settled_accuracy_p95_ci_low = 0.2020267853444243 +settled_accuracy_p95_ci_high = 0.22154802215837122 +settled_accuracy_p99 = 0.253220539192889 +settled_accuracy_p99_ci_low = 0.24106315816638324 +settled_accuracy_p99_ci_high = 0.26858816430226884 +settled_accuracy_mean = 0.10694226441295578 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.058823529411764705 +jitter_p50_per_min_ci_low = 0.05555555555555555 +jitter_p50_per_min_ci_high = 0.058823529411764705 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.10526315789473684 +jitter_p95_per_min = 0.1111111111111111 +jitter_p95_per_min_ci_low = 0.1111111111111111 +jitter_p95_per_min_ci_high = 0.11764705882352941 +jitter_p99_per_min = 0.13333333333333333 +jitter_p99_per_min_ci_low = 0.13333333333333333 +jitter_p99_per_min_ci_high = 0.15 +jitter_mean_per_min = 0.058464897849579506 +reaction_rate = 0.353 +reaction_rate_ci_low = 0.32337928316870096 +reaction_rate_ci_high = 0.382620716831299 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 189.0084985835694 +step_correction_mean = 0.008530740021983896 +step_correction_p50 = 0.4015287756919861 + +[cell.spm_10.step_plus_25_at_15min] +shares_per_minute = 10 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.991 +convergence_rate_ci_low = 0.985146519804424 +convergence_rate_ci_high = 0.996853480195576 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 240 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 684.7628657921292 +settled_accuracy_p10 = 0.029630978567469546 +settled_accuracy_p10_ci_low = 0.02574897248278951 +settled_accuracy_p10_ci_high = 0.035228072420877554 +settled_accuracy_p50 = 0.15320180139513417 +settled_accuracy_p50_ci_low = 0.15084971630668043 +settled_accuracy_p50_ci_high = 0.15503559131927003 +settled_accuracy_p90 = 0.22160570354461495 +settled_accuracy_p90_ci_low = 0.21376910642993097 +settled_accuracy_p90_ci_high = 0.22638809581126884 +settled_accuracy_p95 = 0.24055343443829236 +settled_accuracy_p95_ci_low = 0.2316739119183836 +settled_accuracy_p95_ci_high = 0.2481411382049571 +settled_accuracy_p99 = 0.28179113231011466 +settled_accuracy_p99_ci_low = 0.26876089982139384 +settled_accuracy_p99_ci_high = 0.290154507149295 +settled_accuracy_mean = 0.14175391969442178 +jitter_p10_per_min = 0.04 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.041666666666666664 +jitter_p50_per_min = 0.06666666666666667 +jitter_p50_per_min_ci_low = 0.0625 +jitter_p50_per_min_ci_high = 0.07142857142857142 +jitter_p90_per_min = 0.10526315789473684 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.1111111111111111 +jitter_p95_per_min = 0.125 +jitter_p95_per_min_ci_low = 0.11764705882352941 +jitter_p95_per_min_ci_high = 0.13043478260869565 +jitter_p99_per_min = 0.15 +jitter_p99_per_min_ci_low = 0.14285714285714285 +jitter_p99_per_min_ci_high = 0.15384615384615385 +jitter_mean_per_min = 0.06811552940989019 +reaction_rate = 0.473 +reaction_rate_ci_low = 0.44205489580563667 +reaction_rate_ci_high = 0.5039451041943632 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 187.23044397463002 +step_correction_mean = 0.25072418233619936 +step_correction_p50 = 0.2898957431316376 + +[cell.spm_10.step_plus_50_at_15min] +shares_per_minute = 10 +scenario = "step_plus_50_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1020 +convergence_p90_secs_ci_high = 1080 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1080 +convergence_p95_secs_ci_high = 1140 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 674.94 +settled_accuracy_p10 = 0.07688689320053887 +settled_accuracy_p10_ci_low = 0.07316557250884514 +settled_accuracy_p10_ci_high = 0.08011366630842465 +settled_accuracy_p50 = 0.1379848604193803 +settled_accuracy_p50_ci_low = 0.1347793831908045 +settled_accuracy_p50_ci_high = 0.14163343510317894 +settled_accuracy_p90 = 0.27822328121002826 +settled_accuracy_p90_ci_low = 0.2723798887800334 +settled_accuracy_p90_ci_high = 0.2825592296117233 +settled_accuracy_p95 = 0.2924660189796393 +settled_accuracy_p95_ci_low = 0.2873867280679958 +settled_accuracy_p95_ci_high = 0.2975134555508022 +settled_accuracy_p99 = 0.31891321938129025 +settled_accuracy_p99_ci_low = 0.3084828466613475 +settled_accuracy_p99_ci_high = 0.34006682790093046 +settled_accuracy_mean = 0.15335327421012648 +jitter_p10_per_min = 0.0625 +jitter_p10_per_min_ci_low = 0.058823529411764705 +jitter_p10_per_min_ci_high = 0.06666666666666667 +jitter_p50_per_min = 0.09523809523809523 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.13333333333333333 +jitter_p90_per_min_ci_low = 0.13043478260869565 +jitter_p90_per_min_ci_high = 0.13333333333333333 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.13636363636363635 +jitter_p95_per_min_ci_high = 0.14285714285714285 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.15384615384615385 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.09632341795693357 +reaction_rate = 0.804 +reaction_rate_ci_low = 0.7793956366796456 +reaction_rate_ci_high = 0.8286043633203545 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 173.80597014925374 +step_correction_mean = 0.199606105819604 +step_correction_p50 = 0.19140252470970154 + +[cell.spm_12.cold_start_10gh_to_1ph] +shares_per_minute = 12 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 120 +convergence_p10_secs_ci_low = 120 +convergence_p10_secs_ci_high = 120 +convergence_p50_secs = 360 +convergence_p50_secs_ci_low = 360 +convergence_p50_secs_ci_high = 360 +convergence_p90_secs = 420 +convergence_p90_secs_ci_low = 420 +convergence_p90_secs_ci_high = 480 +convergence_p95_secs = 480 +convergence_p95_secs_ci_low = 480 +convergence_p95_secs_ci_high = 480 +convergence_p99_secs = 660 +convergence_p99_secs_ci_low = 660 +convergence_p99_secs_ci_high = 720 +convergence_mean_secs = 339.72 +settled_accuracy_p10 = 0.027740254601638092 +settled_accuracy_p10_ci_low = 0.023350730859159174 +settled_accuracy_p10_ci_high = 0.032641886091962835 +settled_accuracy_p50 = 0.10545661509193804 +settled_accuracy_p50_ci_low = 0.10112480497325005 +settled_accuracy_p50_ci_high = 0.10944731085047665 +settled_accuracy_p90 = 0.1708426611859304 +settled_accuracy_p90_ci_low = 0.16476508105643584 +settled_accuracy_p90_ci_high = 0.1763662576358983 +settled_accuracy_p95 = 0.19127972645889801 +settled_accuracy_p95_ci_low = 0.18083966745946845 +settled_accuracy_p95_ci_high = 0.19620055108457657 +settled_accuracy_p99 = 0.2378999864507202 +settled_accuracy_p99_ci_low = 0.21720455204799138 +settled_accuracy_p99_ci_high = 0.25145403099798735 +settled_accuracy_mean = 0.10358201773673871 +jitter_p10_per_min = 0.045454545454545456 +jitter_p10_per_min_ci_low = 0.043478260869565216 +jitter_p10_per_min_ci_high = 0.045454545454545456 +jitter_p50_per_min = 0.05 +jitter_p50_per_min_ci_low = 0.047619047619047616 +jitter_p50_per_min_ci_high = 0.058823529411764705 +jitter_p90_per_min = 0.09523809523809523 +jitter_p90_per_min_ci_low = 0.09523809523809523 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.11538461538461539 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.11538461538461539 +jitter_p99_per_min = 0.13043478260869565 +jitter_p99_per_min_ci_low = 0.12 +jitter_p99_per_min_ci_high = 0.13636363636363635 +jitter_mean_per_min = 0.06663473463450466 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0.00819768338856286 +ramp_target_overshoot_p90_ci_low = 0 +ramp_target_overshoot_p90_ci_high = 0.021909098223957146 +ramp_target_overshoot_p99 = 0.12143342387885081 +ramp_target_overshoot_p99_ci_low = 0.10142317098647546 +ramp_target_overshoot_p99_ci_high = 0.13834767639917445 +ramp_target_overshoot_mean = 0.006078944922479534 + +[cell.spm_12.stable_1ph] +shares_per_minute = 12 +scenario = "stable_1ph" +convergence_rate = 0.974 +convergence_rate_ci_low = 0.9641367004303834 +convergence_rate_ci_high = 0.9838632995696166 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 749.5071868583162 +settled_accuracy_p10 = 0.022848286787855 +settled_accuracy_p10_ci_low = 0.020754154659492596 +settled_accuracy_p10_ci_high = 0.0242546201601338 +settled_accuracy_p50 = 0.06864102736692801 +settled_accuracy_p50_ci_low = 0.060195779375848524 +settled_accuracy_p50_ci_high = 0.078879021574225 +settled_accuracy_p90 = 0.13631488177330608 +settled_accuracy_p90_ci_low = 0.1311046166134303 +settled_accuracy_p90_ci_high = 0.14102652806717542 +settled_accuracy_p95 = 0.15274548070449012 +settled_accuracy_p95_ci_low = 0.14591923407847218 +settled_accuracy_p95_ci_high = 0.16062768531928484 +settled_accuracy_p99 = 0.19293731542126147 +settled_accuracy_p99_ci_low = 0.18479902337811127 +settled_accuracy_p99_ci_high = 0.20704769245832588 +settled_accuracy_mean = 0.0748650801102008 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.05 +jitter_p50_per_min_ci_low = 0.05 +jitter_p50_per_min_ci_high = 0.05263157894736842 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.09090909090909091 +jitter_p90_per_min_ci_high = 0.09523809523809523 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.1111111111111111 +jitter_p99_per_min = 0.13333333333333333 +jitter_p99_per_min_ci_low = 0.11764705882352941 +jitter_p99_per_min_ci_high = 0.13636363636363635 +jitter_mean_per_min = 0.047631278445836964 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1.0785367663633727 +upward_step_magnitude_p90_ci_low = 1.0759130781822974 +upward_step_magnitude_p90_ci_high = 1.0830247523351337 +upward_step_magnitude_p95 = 1.0904933278186324 +upward_step_magnitude_p95_ci_low = 1.0871689974959653 +upward_step_magnitude_p95_ci_high = 1.0942846826236856 +upward_step_magnitude_p99 = 1.119261376891317 +upward_step_magnitude_p99_ci_low = 1.1093274450166288 +upward_step_magnitude_p99_ci_high = 1.1271929871606063 +upward_step_magnitude_mean = 1.0173085191737212 + +[cell.spm_12.step_minus_50_at_15min] +shares_per_minute = 12 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.72 +convergence_rate_ci_low = 0.6921707607002994 +convergence_rate_ci_high = 0.7478292392997006 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 600 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 828.0833333333334 +settled_accuracy_p10 = 0.039412231033541634 +settled_accuracy_p10_ci_low = 0.03394124793363407 +settled_accuracy_p10_ci_high = 0.049668009090029885 +settled_accuracy_p50 = 0.16367066968808675 +settled_accuracy_p50_ci_low = 0.1552666265400393 +settled_accuracy_p50_ci_high = 0.17233308196589503 +settled_accuracy_p90 = 0.2953147744662312 +settled_accuracy_p90_ci_low = 0.28478203812441194 +settled_accuracy_p90_ci_high = 0.31054231277683675 +settled_accuracy_p95 = 0.3418843001562093 +settled_accuracy_p95_ci_low = 0.3232223985768625 +settled_accuracy_p95_ci_high = 0.35519601459242 +settled_accuracy_p99 = 0.4268723088086894 +settled_accuracy_p99_ci_low = 0.4144821333049149 +settled_accuracy_p99_ci_high = 0.4354778127690855 +settled_accuracy_mean = 0.1695122543136071 +jitter_p10_per_min = 0.13043478260869565 +jitter_p10_per_min_ci_low = 0.13043478260869565 +jitter_p10_per_min_ci_high = 0.13636363636363635 +jitter_p50_per_min = 0.16666666666666666 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.17647058823529413 +jitter_p90_per_min = 0.2222222222222222 +jitter_p90_per_min_ci_low = 0.21052631578947367 +jitter_p90_per_min_ci_high = 0.2222222222222222 +jitter_p95_per_min = 0.23529411764705882 +jitter_p95_per_min_ci_low = 0.2222222222222222 +jitter_p95_per_min_ci_high = 0.23529411764705882 +jitter_p99_per_min = 0.25 +jitter_p99_per_min_ci_low = 0.23529411764705882 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.17245119666778994 +reaction_rate = 0.997 +reaction_rate_ci_low = 0.9936102764714508 +reaction_rate_ci_high = 1 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 111.81544633901706 +step_correction_mean = 0.2035179462698601 +step_correction_p50 = 0.20464934408664703 + +[cell.spm_12.step_minus_25_at_15min] +shares_per_minute = 12 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.96 +convergence_rate_ci_low = 0.9478543242262935 +convergence_rate_ci_high = 0.9721456757737065 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 799.5 +settled_accuracy_p10 = 0.011469978492056665 +settled_accuracy_p10_ci_low = 0.009985619912756594 +settled_accuracy_p10_ci_high = 0.012851168378733124 +settled_accuracy_p50 = 0.05943286210085996 +settled_accuracy_p50_ci_low = 0.05469282886318205 +settled_accuracy_p50_ci_high = 0.06405684174414694 +settled_accuracy_p90 = 0.16703154501335948 +settled_accuracy_p90_ci_low = 0.1581007869543234 +settled_accuracy_p90_ci_high = 0.17266654205296383 +settled_accuracy_p95 = 0.1803775294113541 +settled_accuracy_p95_ci_low = 0.17523654308465075 +settled_accuracy_p95_ci_high = 0.18977026488584192 +settled_accuracy_p99 = 0.21525624266779753 +settled_accuracy_p99_ci_low = 0.20599020872735552 +settled_accuracy_p99_ci_high = 0.25713960012602155 +settled_accuracy_mean = 0.0738911675877432 +jitter_p10_per_min = 0.06666666666666667 +jitter_p10_per_min_ci_low = 0.0625 +jitter_p10_per_min_ci_high = 0.07692307692307693 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.1 +jitter_p50_per_min_ci_high = 0.10526315789473684 +jitter_p90_per_min = 0.16666666666666666 +jitter_p90_per_min_ci_low = 0.16666666666666666 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.18181818181818182 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.10903579221232994 +reaction_rate = 0.84 +reaction_rate_ci_low = 0.817277521261975 +reaction_rate_ci_high = 0.862722478738025 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 163.35714285714286 +step_correction_mean = 0.34347138204390093 +step_correction_p50 = 0.3376448154449463 + +[cell.spm_12.step_minus_10_at_15min] +shares_per_minute = 12 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.986 +convergence_rate_ci_low = 0.9787178680044921 +convergence_rate_ci_high = 0.9932821319955079 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 756.4503042596349 +settled_accuracy_p10 = 0.005389885724788823 +settled_accuracy_p10_ci_low = 0.004622831405009853 +settled_accuracy_p10_ci_high = 0.006454754271572383 +settled_accuracy_p50 = 0.04410856872078206 +settled_accuracy_p50_ci_low = 0.040088598614052784 +settled_accuracy_p50_ci_high = 0.04721414326773188 +settled_accuracy_p90 = 0.11136924825768613 +settled_accuracy_p90_ci_low = 0.10604893205563026 +settled_accuracy_p90_ci_high = 0.12117579204305118 +settled_accuracy_p95 = 0.1359158067100663 +settled_accuracy_p95_ci_low = 0.1279548312603529 +settled_accuracy_p95_ci_high = 0.1408474134565949 +settled_accuracy_p99 = 0.16916787617967133 +settled_accuracy_p99_ci_low = 0.1538928547327968 +settled_accuracy_p99_ci_high = 0.18427102436834708 +settled_accuracy_mean = 0.05273068347768576 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.041666666666666664 +jitter_p50_per_min = 0.0625 +jitter_p50_per_min_ci_low = 0.0625 +jitter_p50_per_min_ci_high = 0.06666666666666667 +jitter_p90_per_min = 0.10526315789473684 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.10526315789473684 +jitter_p95_per_min = 0.11764705882352941 +jitter_p95_per_min_ci_low = 0.1111111111111111 +jitter_p95_per_min_ci_high = 0.125 +jitter_p99_per_min = 0.15789473684210525 +jitter_p99_per_min_ci_low = 0.14285714285714285 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.0662664502722791 +reaction_rate = 0.521 +reaction_rate_ci_low = 0.490037024458234 +reaction_rate_ci_high = 0.551962975541766 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 180.92130518234165 +step_correction_mean = 0.7464903952578894 +step_correction_p50 = 0.8430153727531433 + +[cell.spm_12.step_minus_5_at_15min] +shares_per_minute = 12 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.976 +convergence_rate_ci_low = 0.9665139239724742 +convergence_rate_ci_high = 0.9854860760275258 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 743.5450819672132 +settled_accuracy_p10 = 0.015651058769493242 +settled_accuracy_p10_ci_low = 0.013458788764111107 +settled_accuracy_p10_ci_high = 0.017098773581966764 +settled_accuracy_p50 = 0.05788831855772736 +settled_accuracy_p50_ci_low = 0.05538741841592987 +settled_accuracy_p50_ci_high = 0.06089705620254393 +settled_accuracy_p90 = 0.12726221333653764 +settled_accuracy_p90_ci_low = 0.11715752562693282 +settled_accuracy_p90_ci_high = 0.13666126899472264 +settled_accuracy_p95 = 0.15347090933147345 +settled_accuracy_p95_ci_low = 0.14335343561713276 +settled_accuracy_p95_ci_high = 0.15947800040731552 +settled_accuracy_p99 = 0.19740305647677192 +settled_accuracy_p99_ci_low = 0.1826574022525832 +settled_accuracy_p99_ci_high = 0.2085246200878872 +settled_accuracy_mean = 0.06433068783124846 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.05555555555555555 +jitter_p50_per_min_ci_low = 0.05555555555555555 +jitter_p50_per_min_ci_high = 0.058823529411764705 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.09523809523809523 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1111111111111111 +jitter_p95_per_min_ci_low = 0.10526315789473684 +jitter_p95_per_min_ci_high = 0.11764705882352941 +jitter_p99_per_min = 0.14285714285714285 +jitter_p99_per_min_ci_low = 0.13333333333333333 +jitter_p99_per_min_ci_high = 0.15384615384615385 +jitter_mean_per_min = 0.056226170924744155 +reaction_rate = 0.411 +reaction_rate_ci_low = 0.38050457925523895 +reaction_rate_ci_high = 0.441495420744761 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 182.62773722627736 +step_correction_mean = 3.4522458984904048 +step_correction_p50 = 0.725375771522522 + +[cell.spm_12.step_plus_5_at_15min] +shares_per_minute = 12 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.964 +convergence_rate_ci_low = 0.9524536202037175 +convergence_rate_ci_high = 0.9755463797962824 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 724.4813278008298 +settled_accuracy_p10 = 0.014730332914957511 +settled_accuracy_p10_ci_low = 0.012017345022292236 +settled_accuracy_p10_ci_high = 0.017726008930720516 +settled_accuracy_p50 = 0.08189621287393545 +settled_accuracy_p50_ci_low = 0.07899269970544953 +settled_accuracy_p50_ci_high = 0.08368667750890346 +settled_accuracy_p90 = 0.16152612727241822 +settled_accuracy_p90_ci_low = 0.1576895451667617 +settled_accuracy_p90_ci_high = 0.16614622140634883 +settled_accuracy_p95 = 0.17498918908070948 +settled_accuracy_p95_ci_low = 0.1699773069760373 +settled_accuracy_p95_ci_high = 0.17935944648093227 +settled_accuracy_p99 = 0.2360912394292346 +settled_accuracy_p99_ci_low = 0.19428036858491937 +settled_accuracy_p99_ci_high = 0.2533759915655016 +settled_accuracy_mean = 0.08915111511293013 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.047619047619047616 +jitter_p50_per_min_ci_low = 0.047619047619047616 +jitter_p50_per_min_ci_high = 0.05 +jitter_p90_per_min = 0.08695652173913043 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09523809523809523 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.125 +jitter_p99_per_min_ci_low = 0.1111111111111111 +jitter_p99_per_min_ci_high = 0.13333333333333333 +jitter_mean_per_min = 0.042799570146028344 +reaction_rate = 0.294 +reaction_rate_ci_low = 0.26576212007958105 +reaction_rate_ci_high = 0.3222378799204189 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 174.89795918367346 +step_correction_mean = -0.21867582404694588 +step_correction_p50 = -0.5607919692993164 + +[cell.spm_12.step_plus_10_at_15min] +shares_per_minute = 12 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.954 +convergence_rate_ci_low = 0.9410159800369838 +convergence_rate_ci_high = 0.9669840199630161 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 735.7861635220125 +settled_accuracy_p10 = 0.031590400186635836 +settled_accuracy_p10_ci_low = 0.029865458316640003 +settled_accuracy_p10_ci_high = 0.03357023372858625 +settled_accuracy_p50 = 0.1102361335239469 +settled_accuracy_p50_ci_low = 0.10254259018379108 +settled_accuracy_p50_ci_high = 0.11262502610382341 +settled_accuracy_p90 = 0.18260883517495308 +settled_accuracy_p90_ci_low = 0.1760884158079935 +settled_accuracy_p90_ci_high = 0.18720884284976702 +settled_accuracy_p95 = 0.19776567743928675 +settled_accuracy_p95_ci_low = 0.19161685816181373 +settled_accuracy_p95_ci_high = 0.20335108728868412 +settled_accuracy_p99 = 0.22142448083819222 +settled_accuracy_p99_ci_low = 0.21576824063189215 +settled_accuracy_p99_ci_high = 0.23121481017006784 +settled_accuracy_mean = 0.10212777454740116 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.05 +jitter_p50_per_min_ci_low = 0.05 +jitter_p50_per_min_ci_high = 0.05263157894736842 +jitter_p90_per_min = 0.08695652173913043 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.09523809523809523 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1111111111111111 +jitter_p99_per_min_ci_low = 0.10526315789473684 +jitter_p99_per_min_ci_high = 0.125 +jitter_mean_per_min = 0.04394349851370668 +reaction_rate = 0.283 +reaction_rate_ci_low = 0.2550804208914246 +reaction_rate_ci_high = 0.3109195791085754 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 178.9399293286219 +step_correction_mean = 0.11820741092568994 +step_correction_p50 = -0.2173575758934021 + +[cell.spm_12.step_plus_25_at_15min] +shares_per_minute = 12 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.979 +convergence_rate_ci_low = 0.9701129614381392 +convergence_rate_ci_high = 0.9878870385618608 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 720 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 777.1807967313586 +settled_accuracy_p10 = 0.08212406742840783 +settled_accuracy_p10_ci_low = 0.05403562632325254 +settled_accuracy_p10_ci_high = 0.1101593046276339 +settled_accuracy_p50 = 0.1538987671940958 +settled_accuracy_p50_ci_low = 0.15235676660267883 +settled_accuracy_p50_ci_high = 0.15596121043342015 +settled_accuracy_p90 = 0.22089526228612943 +settled_accuracy_p90_ci_low = 0.21875411377325105 +settled_accuracy_p90_ci_high = 0.224389969705449 +settled_accuracy_p95 = 0.232767678997589 +settled_accuracy_p95_ci_low = 0.22853804900686403 +settled_accuracy_p95_ci_high = 0.23598622002730307 +settled_accuracy_p99 = 0.26574926883552485 +settled_accuracy_p99_ci_low = 0.2489319490367784 +settled_accuracy_p99_ci_high = 0.2793908899021671 +settled_accuracy_mean = 0.15246867143565496 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.058823529411764705 +jitter_p50_per_min_ci_low = 0.05555555555555555 +jitter_p50_per_min_ci_high = 0.058823529411764705 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.09090909090909091 +jitter_p90_per_min_ci_high = 0.09523809523809523 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.10526315789473684 +jitter_p99_per_min = 0.14285714285714285 +jitter_p99_per_min_ci_low = 0.11764705882352941 +jitter_p99_per_min_ci_high = 0.15 +jitter_mean_per_min = 0.05520275520347118 +reaction_rate = 0.372 +reaction_rate_ci_low = 0.34204237616899497 +reaction_rate_ci_high = 0.40195762383100503 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 190.6451612903226 +step_correction_mean = 0.2564721132518463 +step_correction_p50 = 0.29365044832229614 + +[cell.spm_12.step_plus_50_at_15min] +shares_per_minute = 12 +scenario = "step_plus_50_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 300 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1080 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1320 +convergence_mean_secs = 747.84 +settled_accuracy_p10 = 0.08112548901110261 +settled_accuracy_p10_ci_low = 0.07758196206810186 +settled_accuracy_p10_ci_high = 0.08597540182774122 +settled_accuracy_p50 = 0.14352751566298505 +settled_accuracy_p50_ci_low = 0.13890792046543843 +settled_accuracy_p50_ci_high = 0.14939506728379381 +settled_accuracy_p90 = 0.28889220356963674 +settled_accuracy_p90_ci_low = 0.28681352889631595 +settled_accuracy_p90_ci_high = 0.2913369347230297 +settled_accuracy_p95 = 0.2994706184421778 +settled_accuracy_p95_ci_low = 0.29453731167798913 +settled_accuracy_p95_ci_high = 0.30303168316813966 +settled_accuracy_p99 = 0.32475115362373097 +settled_accuracy_p99_ci_low = 0.31196503610322635 +settled_accuracy_p99_ci_high = 0.3444126189359201 +settled_accuracy_mean = 0.17454123392261792 +jitter_p10_per_min = 0.05 +jitter_p10_per_min_ci_low = 0.045454545454545456 +jitter_p10_per_min_ci_high = 0.05263157894736842 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.08695652173913043 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.125 +jitter_p90_per_min_ci_low = 0.11764705882352941 +jitter_p90_per_min_ci_high = 0.125 +jitter_p95_per_min = 0.13333333333333333 +jitter_p95_per_min_ci_low = 0.13333333333333333 +jitter_p95_per_min_ci_high = 0.14285714285714285 +jitter_p99_per_min = 0.15384615384615385 +jitter_p99_per_min_ci_low = 0.15 +jitter_p99_per_min_ci_high = 0.15789473684210525 +jitter_mean_per_min = 0.08492580480386425 +reaction_rate = 0.771 +reaction_rate_ci_low = 0.7449564008938857 +reaction_rate_ci_high = 0.7970435991061143 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 177.35408560311285 +step_correction_mean = 0.19560241841272621 +step_correction_p50 = 0.18625737726688385 + +[cell.spm_15.cold_start_10gh_to_1ph] +shares_per_minute = 15 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 120 +convergence_p10_secs_ci_low = 120 +convergence_p10_secs_ci_high = 180 +convergence_p50_secs = 360 +convergence_p50_secs_ci_low = 360 +convergence_p50_secs_ci_high = 360 +convergence_p90_secs = 480 +convergence_p90_secs_ci_low = 480 +convergence_p90_secs_ci_high = 480 +convergence_p95_secs = 480 +convergence_p95_secs_ci_low = 480 +convergence_p95_secs_ci_high = 480 +convergence_p99_secs = 480 +convergence_p99_secs_ci_low = 480 +convergence_p99_secs_ci_high = 480 +convergence_mean_secs = 325.26 +settled_accuracy_p10 = 0.047911233225384264 +settled_accuracy_p10_ci_low = 0.04201699451472274 +settled_accuracy_p10_ci_high = 0.054541253530513534 +settled_accuracy_p50 = 0.11818099274278027 +settled_accuracy_p50_ci_low = 0.11394326925264409 +settled_accuracy_p50_ci_high = 0.12062972811313155 +settled_accuracy_p90 = 0.17217973820966026 +settled_accuracy_p90_ci_low = 0.16651937389308125 +settled_accuracy_p90_ci_high = 0.1771240509380444 +settled_accuracy_p95 = 0.18679900176905684 +settled_accuracy_p95_ci_low = 0.1820388357658843 +settled_accuracy_p95_ci_high = 0.19113463709304257 +settled_accuracy_p99 = 0.24037986033437264 +settled_accuracy_p99_ci_low = 0.21976609742019426 +settled_accuracy_p99_ci_high = 0.25538365768949145 +settled_accuracy_mean = 0.11469552144292651 +jitter_p10_per_min = 0.045454545454545456 +jitter_p10_per_min_ci_low = 0.045454545454545456 +jitter_p10_per_min_ci_high = 0.045454545454545456 +jitter_p50_per_min = 0.05 +jitter_p50_per_min_ci_low = 0.05 +jitter_p50_per_min_ci_high = 0.05 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.08 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09523809523809523 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.12 +jitter_p99_per_min_ci_low = 0.12 +jitter_p99_per_min_ci_high = 0.12 +jitter_mean_per_min = 0.06225980175195626 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0 +ramp_target_overshoot_p90_ci_low = 0 +ramp_target_overshoot_p90_ci_high = 0 +ramp_target_overshoot_p99 = 0.07122726880140418 +ramp_target_overshoot_p99_ci_low = 0.03962617409475677 +ramp_target_overshoot_p99_ci_high = 0.08417981659281448 +ramp_target_overshoot_mean = 0.001861964916693404 + +[cell.spm_15.stable_1ph] +shares_per_minute = 15 +scenario = "stable_1ph" +convergence_rate = 0.934 +convergence_rate_ci_low = 0.9186113161576437 +convergence_rate_ci_high = 0.9493886838423564 +convergence_p10_secs = 360 +convergence_p10_secs_ci_low = 360 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 820.4710920770877 +settled_accuracy_p10 = 0.021106341982346177 +settled_accuracy_p10_ci_low = 0.020208559588075103 +settled_accuracy_p10_ci_high = 0.022340675333955562 +settled_accuracy_p50 = 0.03986326971435317 +settled_accuracy_p50_ci_low = 0.0379717392490424 +settled_accuracy_p50_ci_high = 0.04158320281218353 +settled_accuracy_p90 = 0.12235966043182811 +settled_accuracy_p90_ci_low = 0.1171354366280587 +settled_accuracy_p90_ci_high = 0.12566403382931035 +settled_accuracy_p95 = 0.1359116917131491 +settled_accuracy_p95_ci_low = 0.12791754951174605 +settled_accuracy_p95_ci_high = 0.1403079934509801 +settled_accuracy_p99 = 0.16089551679899305 +settled_accuracy_p99_ci_low = 0.15039626778074544 +settled_accuracy_p99_ci_high = 0.18895400163785891 +settled_accuracy_mean = 0.057987355951660415 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.041666666666666664 +jitter_p90_per_min = 0.07692307692307693 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.030813471745521306 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1.0624878826555864 +upward_step_magnitude_p95 = 1.0759420021030577 +upward_step_magnitude_p95_ci_low = 1.0702191594332817 +upward_step_magnitude_p95_ci_high = 1.0805835867419995 +upward_step_magnitude_p99 = 1.0943643541851533 +upward_step_magnitude_p99_ci_low = 1.0866613044493039 +upward_step_magnitude_p99_ci_high = 1.1062025301250016 +upward_step_magnitude_mean = 1.0076889225066612 + +[cell.spm_15.step_minus_50_at_15min] +shares_per_minute = 15 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.735 +convergence_rate_ci_low = 0.7076458844047189 +convergence_rate_ci_high = 0.7623541155952811 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 1080 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 1200 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 953.2244897959183 +settled_accuracy_p10 = 0.07265964041325379 +settled_accuracy_p10_ci_low = 0.06908401298395472 +settled_accuracy_p10_ci_high = 0.08203058808639141 +settled_accuracy_p50 = 0.18797065544087466 +settled_accuracy_p50_ci_low = 0.1817088614773037 +settled_accuracy_p50_ci_high = 0.19451041432274985 +settled_accuracy_p90 = 0.32475637301012994 +settled_accuracy_p90_ci_low = 0.30987954562735087 +settled_accuracy_p90_ci_high = 0.3374551150745906 +settled_accuracy_p95 = 0.36249437208281954 +settled_accuracy_p95_ci_low = 0.34640636390681245 +settled_accuracy_p95_ci_high = 0.3795543850576475 +settled_accuracy_p99 = 0.44992970681948874 +settled_accuracy_p99_ci_low = 0.41843028204312405 +settled_accuracy_p99_ci_high = 0.4798518048358782 +settled_accuracy_mean = 0.19494075387817092 +jitter_p10_per_min = 0.13636363636363635 +jitter_p10_per_min_ci_low = 0.13043478260869565 +jitter_p10_per_min_ci_high = 0.13636363636363635 +jitter_p50_per_min = 0.16666666666666666 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.16666666666666666 +jitter_p90_per_min = 0.2 +jitter_p90_per_min_ci_low = 0.2 +jitter_p90_per_min_ci_high = 0.21052631578947367 +jitter_p95_per_min = 0.2222222222222222 +jitter_p95_per_min_ci_low = 0.21052631578947367 +jitter_p95_per_min_ci_high = 0.2222222222222222 +jitter_p99_per_min = 0.23529411764705882 +jitter_p99_per_min_ci_low = 0.2222222222222222 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.1671512396274483 +reaction_rate = 0.998 +reaction_rate_ci_low = 0.995230914663648 +reaction_rate_ci_high = 1 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 240 +reaction_mean_secs = 112.30460921843688 +step_correction_mean = 0.18881190535360443 +step_correction_p50 = 0.18195882439613342 + +[cell.spm_15.step_minus_25_at_15min] +shares_per_minute = 15 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.982 +convergence_rate_ci_low = 0.9737596042813467 +convergence_rate_ci_high = 0.9902403957186533 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 900 +convergence_p50_secs_ci_low = 840 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 870.8553971486762 +settled_accuracy_p10 = 0.014341074624071859 +settled_accuracy_p10_ci_low = 0.011495748295591524 +settled_accuracy_p10_ci_high = 0.016573920726178804 +settled_accuracy_p50 = 0.07181883183869964 +settled_accuracy_p50_ci_low = 0.0671756143212463 +settled_accuracy_p50_ci_high = 0.07949751746418698 +settled_accuracy_p90 = 0.16876671178470115 +settled_accuracy_p90_ci_low = 0.16383689468140772 +settled_accuracy_p90_ci_high = 0.17360875049470414 +settled_accuracy_p95 = 0.18472851019844438 +settled_accuracy_p95_ci_low = 0.18026102842454073 +settled_accuracy_p95_ci_high = 0.1900945349136547 +settled_accuracy_p99 = 0.2060249263793399 +settled_accuracy_p99_ci_low = 0.1993655796492282 +settled_accuracy_p99_ci_high = 0.21437040567128962 +settled_accuracy_mean = 0.0855737929509029 +jitter_p10_per_min = 0.0625 +jitter_p10_per_min_ci_low = 0.058823529411764705 +jitter_p10_per_min_ci_high = 0.06666666666666667 +jitter_p50_per_min = 0.1 +jitter_p50_per_min_ci_low = 0.1 +jitter_p50_per_min_ci_high = 0.1 +jitter_p90_per_min = 0.15384615384615385 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.10433486967942528 +reaction_rate = 0.842 +reaction_rate_ci_low = 0.8193931183574558 +reaction_rate_ci_high = 0.8646068816425442 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 161.61520190023754 +step_correction_mean = 0.3014721383922457 +step_correction_p50 = 0.2298411726951599 + +[cell.spm_15.step_minus_10_at_15min] +shares_per_minute = 15 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.985 +convergence_rate_ci_low = 0.9774661006112372 +convergence_rate_ci_high = 0.9925338993887628 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 900 +convergence_p50_secs_ci_low = 840 +convergence_p50_secs_ci_high = 900 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 869.1167512690355 +settled_accuracy_p10 = 0.005319794244221798 +settled_accuracy_p10_ci_low = 0.004349772892418224 +settled_accuracy_p10_ci_high = 0.00630979912452756 +settled_accuracy_p50 = 0.03467679066023566 +settled_accuracy_p50_ci_low = 0.03184494571452112 +settled_accuracy_p50_ci_high = 0.03903155943477932 +settled_accuracy_p90 = 0.08414176523902495 +settled_accuracy_p90_ci_low = 0.08280555318396132 +settled_accuracy_p90_ci_high = 0.08571599006639685 +settled_accuracy_p95 = 0.09870319576140407 +settled_accuracy_p95_ci_low = 0.08807031815939781 +settled_accuracy_p95_ci_high = 0.11489216537562885 +settled_accuracy_p99 = 0.14670892536711344 +settled_accuracy_p99_ci_low = 0.1371073618797044 +settled_accuracy_p99_ci_high = 0.153236306343018 +settled_accuracy_mean = 0.043327352342789074 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.0625 +jitter_p50_per_min_ci_low = 0.058823529411764705 +jitter_p50_per_min_ci_high = 0.0625 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.09090909090909091 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.10526315789473684 +jitter_p99_per_min = 0.13333333333333333 +jitter_p99_per_min_ci_low = 0.125 +jitter_p99_per_min_ci_high = 0.15384615384615385 +jitter_mean_per_min = 0.059570200342479514 +reaction_rate = 0.491 +reaction_rate_ci_low = 0.46001469976908405 +reaction_rate_ci_high = 0.5219853002309159 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 177.18940936863544 +step_correction_mean = 0.6829882458671775 +step_correction_p50 = 0.36508500576019287 + +[cell.spm_15.step_minus_5_at_15min] +shares_per_minute = 15 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.958 +convergence_rate_ci_low = 0.9455673567733969 +convergence_rate_ci_high = 0.970432643226603 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 420 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 840 +convergence_p50_secs_ci_high = 900 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 850.3966597077244 +settled_accuracy_p10 = 0.011332850573353426 +settled_accuracy_p10_ci_low = 0.009422013953981567 +settled_accuracy_p10_ci_high = 0.013170644491637296 +settled_accuracy_p50 = 0.044732932502680955 +settled_accuracy_p50_ci_low = 0.03978729174264983 +settled_accuracy_p50_ci_high = 0.04893684370620921 +settled_accuracy_p90 = 0.09505857650230431 +settled_accuracy_p90_ci_low = 0.0905349445394682 +settled_accuracy_p90_ci_high = 0.10032443250801437 +settled_accuracy_p95 = 0.11523128928914972 +settled_accuracy_p95_ci_low = 0.1083849135598971 +settled_accuracy_p95_ci_high = 0.12292931183108802 +settled_accuracy_p99 = 0.15472965970931407 +settled_accuracy_p99_ci_low = 0.14225574651441852 +settled_accuracy_p99_ci_high = 0.16944642180125424 +settled_accuracy_mean = 0.04984257376482782 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.05 +jitter_p50_per_min_ci_low = 0.05 +jitter_p50_per_min_ci_high = 0.05263157894736842 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.08333333333333333 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.125 +jitter_p99_per_min_ci_low = 0.1111111111111111 +jitter_p99_per_min_ci_high = 0.14285714285714285 +jitter_mean_per_min = 0.04390074954628882 +reaction_rate = 0.408 +reaction_rate_ci_low = 0.3775388001286883 +reaction_rate_ci_high = 0.43846119987131166 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 177.05882352941177 +step_correction_mean = -3.572054292568389 +step_correction_p50 = 0.6173537373542786 + +[cell.spm_15.step_plus_5_at_15min] +shares_per_minute = 15 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.914 +convergence_rate_ci_low = 0.8966228562070748 +convergence_rate_ci_high = 0.9313771437929252 +convergence_p10_secs = 240 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 300 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 770.8752735229759 +settled_accuracy_p10 = 0.0169639717406469 +settled_accuracy_p10_ci_low = 0.013984977072414528 +settled_accuracy_p10_ci_high = 0.02014192822827854 +settled_accuracy_p50 = 0.07569407507935788 +settled_accuracy_p50_ci_low = 0.07428625882625439 +settled_accuracy_p50_ci_high = 0.07701183762107877 +settled_accuracy_p90 = 0.14054227034290334 +settled_accuracy_p90_ci_low = 0.13569796867204587 +settled_accuracy_p90_ci_high = 0.14545361696992842 +settled_accuracy_p95 = 0.15451970565666417 +settled_accuracy_p95_ci_low = 0.15119340661110559 +settled_accuracy_p95_ci_high = 0.16063524105314142 +settled_accuracy_p99 = 0.1806388610972952 +settled_accuracy_p99_ci_low = 0.17303101618550887 +settled_accuracy_p99_ci_high = 0.20053370085985 +settled_accuracy_mean = 0.07544360899228165 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.06666666666666667 +jitter_p90_per_min_ci_low = 0.06666666666666667 +jitter_p90_per_min_ci_high = 0.07142857142857142 +jitter_p95_per_min = 0.07692307692307693 +jitter_p95_per_min_ci_low = 0.07692307692307693 +jitter_p95_per_min_ci_high = 0.08333333333333333 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.09090909090909091 +jitter_p99_per_min_ci_high = 0.10526315789473684 +jitter_mean_per_min = 0.022922625364391325 +reaction_rate = 0.185 +reaction_rate_ci_low = 0.16093306749915975 +reaction_rate_ci_high = 0.20906693250084024 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 169.2972972972973 +step_correction_mean = -0.1796967098841796 +step_correction_p50 = -0.5572969317436218 + +[cell.spm_15.step_plus_10_at_15min] +shares_per_minute = 15 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.898 +convergence_rate_ci_low = 0.879241663357323 +convergence_rate_ci_high = 0.916758336642677 +convergence_p10_secs = 300 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 360 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 792.0267260579064 +settled_accuracy_p10 = 0.030458883709914786 +settled_accuracy_p10_ci_low = 0.028641636646125845 +settled_accuracy_p10_ci_high = 0.03277212629620008 +settled_accuracy_p50 = 0.1115977113924681 +settled_accuracy_p50_ci_low = 0.10987887032840704 +settled_accuracy_p50_ci_high = 0.11356888178999114 +settled_accuracy_p90 = 0.1490633097104027 +settled_accuracy_p90_ci_low = 0.14037094242260684 +settled_accuracy_p90_ci_high = 0.16565256020016017 +settled_accuracy_p95 = 0.1830620030397876 +settled_accuracy_p95_ci_low = 0.17445492501895976 +settled_accuracy_p95_ci_high = 0.18708286120721407 +settled_accuracy_p99 = 0.208439647502754 +settled_accuracy_p99_ci_low = 0.20186352777760996 +settled_accuracy_p99_ci_high = 0.21618218031456604 +settled_accuracy_mean = 0.09731524895833317 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.07142857142857142 +jitter_p90_per_min_ci_low = 0.06666666666666667 +jitter_p90_per_min_ci_high = 0.07692307692307693 +jitter_p95_per_min = 0.08695652173913043 +jitter_p95_per_min_ci_low = 0.07692307692307693 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.09523809523809523 +jitter_p99_per_min_ci_high = 0.10526315789473684 +jitter_mean_per_min = 0.02653517257512507 +reaction_rate = 0.171 +reaction_rate_ci_low = 0.14766373263780175 +reaction_rate_ci_high = 0.19433626736219828 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 186.31578947368422 +step_correction_mean = 0.048620884268604524 +step_correction_p50 = -0.2551875114440918 + +[cell.spm_15.step_plus_25_at_15min] +shares_per_minute = 15 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.948 +convergence_rate_ci_low = 0.934238622394542 +convergence_rate_ci_high = 0.9617613776054579 +convergence_p10_secs = 420 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 853.2278481012659 +settled_accuracy_p10 = 0.12860812139638833 +settled_accuracy_p10_ci_low = 0.12718557457963542 +settled_accuracy_p10_ci_high = 0.1311998119663369 +settled_accuracy_p50 = 0.15051422568291584 +settled_accuracy_p50_ci_low = 0.149195670758983 +settled_accuracy_p50_ci_high = 0.15206723212772888 +settled_accuracy_p90 = 0.21647139240473712 +settled_accuracy_p90_ci_low = 0.19900902222280448 +settled_accuracy_p90_ci_high = 0.22225633738513384 +settled_accuracy_p95 = 0.22947462028732046 +settled_accuracy_p95_ci_low = 0.22568168108451359 +settled_accuracy_p95_ci_high = 0.23201514706075 +settled_accuracy_p99 = 0.25354361635806966 +settled_accuracy_p99_ci_low = 0.24089590438372266 +settled_accuracy_p99_ci_high = 0.274754526519597 +settled_accuracy_mean = 0.15774425601826925 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.05263157894736842 +jitter_p50_per_min_ci_low = 0.05263157894736842 +jitter_p50_per_min_ci_high = 0.05555555555555555 +jitter_p90_per_min = 0.07692307692307693 +jitter_p90_per_min_ci_low = 0.07142857142857142 +jitter_p90_per_min_ci_high = 0.07692307692307693 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.08333333333333333 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.10526315789473684 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.04541260752003152 +reaction_rate = 0.315 +reaction_rate_ci_low = 0.2862090076586443 +reaction_rate_ci_high = 0.3437909923413557 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 194.47619047619048 +step_correction_mean = 0.2891475806870158 +step_correction_p50 = 0.2991575598716736 + +[cell.spm_15.step_plus_50_at_15min] +shares_per_minute = 15 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 480 +convergence_p50_secs = 900 +convergence_p50_secs_ci_low = 900 +convergence_p50_secs_ci_high = 960 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1080 +convergence_p90_secs_ci_high = 1140 +convergence_p95_secs = 1140 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1200 +convergence_p99_secs = 1260 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1320 +convergence_mean_secs = 839.6396396396397 +settled_accuracy_p10 = 0.08845127149373866 +settled_accuracy_p10_ci_low = 0.08454276181247977 +settled_accuracy_p10_ci_high = 0.09242796378018325 +settled_accuracy_p50 = 0.15159077981483504 +settled_accuracy_p50_ci_low = 0.1465624469001119 +settled_accuracy_p50_ci_high = 0.16570305795405116 +settled_accuracy_p90 = 0.28958834617901374 +settled_accuracy_p90_ci_low = 0.28753946784103 +settled_accuracy_p90_ci_high = 0.29183439035758374 +settled_accuracy_p95 = 0.2976763063925846 +settled_accuracy_p95_ci_low = 0.2940607492695647 +settled_accuracy_p95_ci_high = 0.3002327514338703 +settled_accuracy_p99 = 0.31102296187921286 +settled_accuracy_p99_ci_low = 0.30506557385997024 +settled_accuracy_p99_ci_high = 0.3215177143687503 +settled_accuracy_mean = 0.18826416929830359 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0.045454545454545456 +jitter_p50_per_min = 0.08333333333333333 +jitter_p50_per_min_ci_low = 0.08333333333333333 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.1111111111111111 +jitter_p90_per_min_ci_low = 0.10526315789473684 +jitter_p90_per_min_ci_high = 0.1111111111111111 +jitter_p95_per_min = 0.125 +jitter_p95_per_min_ci_low = 0.11764705882352941 +jitter_p95_per_min_ci_high = 0.125 +jitter_p99_per_min = 0.14285714285714285 +jitter_p99_per_min_ci_low = 0.13636363636363635 +jitter_p99_per_min_ci_high = 0.15384615384615385 +jitter_mean_per_min = 0.07701725714911291 +reaction_rate = 0.738 +reaction_rate_ci_low = 0.7107457084186728 +reaction_rate_ci_high = 0.7652542915813272 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 174.47154471544715 +step_correction_mean = 0.18529402060802713 +step_correction_p50 = 0.18025340139865875 + +[cell.spm_20.cold_start_10gh_to_1ph] +shares_per_minute = 20 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 120 +convergence_p10_secs_ci_low = 120 +convergence_p10_secs_ci_high = 120 +convergence_p50_secs = 180 +convergence_p50_secs_ci_low = 180 +convergence_p50_secs_ci_high = 180 +convergence_p90_secs = 480 +convergence_p90_secs_ci_low = 420 +convergence_p90_secs_ci_high = 480 +convergence_p95_secs = 480 +convergence_p95_secs_ci_low = 480 +convergence_p95_secs_ci_high = 480 +convergence_p99_secs = 480 +convergence_p99_secs_ci_low = 480 +convergence_p99_secs_ci_high = 540 +convergence_mean_secs = 264.42 +settled_accuracy_p10 = 0.06376758159984985 +settled_accuracy_p10_ci_low = 0.057978703807038956 +settled_accuracy_p10_ci_high = 0.06826723098958531 +settled_accuracy_p50 = 0.12173541377077934 +settled_accuracy_p50_ci_low = 0.11717791653952336 +settled_accuracy_p50_ci_high = 0.12447426076397672 +settled_accuracy_p90 = 0.1992856127116538 +settled_accuracy_p90_ci_low = 0.1855221885059829 +settled_accuracy_p90_ci_high = 0.20567934270356514 +settled_accuracy_p95 = 0.22302785668848224 +settled_accuracy_p95_ci_low = 0.21400668041906268 +settled_accuracy_p95_ci_high = 0.2293099846381097 +settled_accuracy_p99 = 0.2549868429714973 +settled_accuracy_p99_ci_low = 0.24395172966723866 +settled_accuracy_p99_ci_high = 0.2650913576465619 +settled_accuracy_mean = 0.12478612666489539 +jitter_p10_per_min = 0.04 +jitter_p10_per_min_ci_low = 0.04 +jitter_p10_per_min_ci_high = 0.045454545454545456 +jitter_p50_per_min = 0.07692307692307693 +jitter_p50_per_min_ci_low = 0.07692307692307693 +jitter_p50_per_min_ci_high = 0.07692307692307693 +jitter_p90_per_min = 0.08 +jitter_p90_per_min_ci_low = 0.08 +jitter_p90_per_min_ci_high = 0.08 +jitter_p95_per_min = 0.08 +jitter_p95_per_min_ci_low = 0.08 +jitter_p95_per_min_ci_high = 0.08 +jitter_p99_per_min = 0.09523809523809523 +jitter_p99_per_min_ci_low = 0.08333333333333333 +jitter_p99_per_min_ci_high = 0.11538461538461539 +jitter_mean_per_min = 0.06315455973850653 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0 +ramp_target_overshoot_p90_ci_low = 0 +ramp_target_overshoot_p90_ci_high = 0 +ramp_target_overshoot_p99 = 0 +ramp_target_overshoot_p99_ci_low = 0 +ramp_target_overshoot_p99_ci_high = 0 +ramp_target_overshoot_mean = 0.00008987682234961403 + +[cell.spm_20.stable_1ph] +shares_per_minute = 20 +scenario = "stable_1ph" +convergence_rate = 0.87 +convergence_rate_ci_low = 0.849155697181244 +convergence_rate_ci_high = 0.890844302818756 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 840 +convergence_p50_secs_ci_low = 780 +convergence_p50_secs_ci_high = 900 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 812.4137931034483 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0.032056495463675616 +settled_accuracy_p50_ci_low = 0.03115522340843102 +settled_accuracy_p50_ci_high = 0.033115943113425805 +settled_accuracy_p90 = 0.0959034668506702 +settled_accuracy_p90_ci_low = 0.08922022921569672 +settled_accuracy_p90_ci_high = 0.10315236510765835 +settled_accuracy_p95 = 0.11284590509424064 +settled_accuracy_p95_ci_low = 0.10803211910803456 +settled_accuracy_p95_ci_high = 0.1180401312354118 +settled_accuracy_p99 = 0.13221567098026787 +settled_accuracy_p99_ci_low = 0.12572731748888555 +settled_accuracy_p99_ci_high = 0.1366629083465376 +settled_accuracy_mean = 0.039208729776156345 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.0625 +jitter_p90_per_min_ci_low = 0.058823529411764705 +jitter_p90_per_min_ci_high = 0.06666666666666667 +jitter_p95_per_min = 0.07692307692307693 +jitter_p95_per_min_ci_low = 0.06666666666666667 +jitter_p95_per_min_ci_high = 0.07692307692307693 +jitter_p99_per_min = 0.09090909090909091 +jitter_p99_per_min_ci_low = 0.08333333333333333 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.013985999941102606 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1 +upward_step_magnitude_p95 = 1 +upward_step_magnitude_p95_ci_low = 1 +upward_step_magnitude_p95_ci_high = 1 +upward_step_magnitude_p99 = 1.0701339982837579 +upward_step_magnitude_p99_ci_low = 1.0615279574524428 +upward_step_magnitude_p99_ci_high = 1.0760181739087733 +upward_step_magnitude_mean = 1.0014557314668378 + +[cell.spm_20.step_minus_50_at_15min] +shares_per_minute = 20 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.745 +convergence_rate_ci_low = 0.7179850419211874 +convergence_rate_ci_high = 0.7720149580788126 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1260 +convergence_p50_secs_ci_high = 1320 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1161.1006711409395 +settled_accuracy_p10 = 0.10236001074010281 +settled_accuracy_p10_ci_low = 0.09501548235067048 +settled_accuracy_p10_ci_high = 0.11164116675204028 +settled_accuracy_p50 = 0.2301504560617793 +settled_accuracy_p50_ci_low = 0.22145569731110215 +settled_accuracy_p50_ci_high = 0.24140327052368593 +settled_accuracy_p90 = 0.3785129896925481 +settled_accuracy_p90_ci_low = 0.3712442943204224 +settled_accuracy_p90_ci_high = 0.38917202491805836 +settled_accuracy_p95 = 0.40781298853156467 +settled_accuracy_p95_ci_low = 0.3973241413873725 +settled_accuracy_p95_ci_high = 0.4161301928084664 +settled_accuracy_p99 = 0.45352070217884366 +settled_accuracy_p99_ci_low = 0.4360966907209445 +settled_accuracy_p99_ci_high = 0.46070430351031044 +settled_accuracy_mean = 0.2370268920656584 +jitter_p10_per_min = 0.14285714285714285 +jitter_p10_per_min_ci_low = 0.13636363636363635 +jitter_p10_per_min_ci_high = 0.15 +jitter_p50_per_min = 0.16666666666666666 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.17391304347826086 +jitter_p90_per_min = 0.2 +jitter_p90_per_min_ci_low = 0.1875 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.2 +jitter_p95_per_min_ci_high = 0.2222222222222222 +jitter_p99_per_min = 0.23529411764705882 +jitter_p99_per_min_ci_low = 0.21052631578947367 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.1684378245444363 +reaction_rate = 0.999 +reaction_rate_ci_low = 0.9970409802451226 +reaction_rate_ci_high = 1 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 60 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 240 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 104.56456456456456 +step_correction_mean = 0.16220165049289917 +step_correction_p50 = 0.10681932419538498 + +[cell.spm_20.step_minus_25_at_15min] +shares_per_minute = 20 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.992 +convergence_rate_ci_low = 0.9864785022321837 +convergence_rate_ci_high = 0.9975214977678163 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1380 +convergence_p99_secs = 1440 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 965.2620967741935 +settled_accuracy_p10 = 0.01690812286577037 +settled_accuracy_p10_ci_low = 0.014262512514684578 +settled_accuracy_p10_ci_high = 0.019376386860585626 +settled_accuracy_p50 = 0.1208402459190876 +settled_accuracy_p50_ci_low = 0.11729152922398622 +settled_accuracy_p50_ci_high = 0.12602310817653506 +settled_accuracy_p90 = 0.17710216948638724 +settled_accuracy_p90_ci_low = 0.17413398919869416 +settled_accuracy_p90_ci_high = 0.1808684978557824 +settled_accuracy_p95 = 0.19111933199658449 +settled_accuracy_p95_ci_low = 0.1855850877305223 +settled_accuracy_p95_ci_high = 0.19616332364609423 +settled_accuracy_p99 = 0.28159389098174104 +settled_accuracy_p99_ci_low = 0.21638805601818412 +settled_accuracy_p99_ci_high = 0.2926272144694584 +settled_accuracy_mean = 0.10873686390975713 +jitter_p10_per_min = 0.0625 +jitter_p10_per_min_ci_low = 0.058823529411764705 +jitter_p10_per_min_ci_high = 0.06666666666666667 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.15384615384615385 +jitter_p90_per_min_ci_low = 0.14285714285714285 +jitter_p90_per_min_ci_high = 0.16666666666666666 +jitter_p95_per_min = 0.16666666666666666 +jitter_p95_per_min_ci_low = 0.16666666666666666 +jitter_p95_per_min_ci_high = 0.18181818181818182 +jitter_p99_per_min = 0.18181818181818182 +jitter_p99_per_min_ci_low = 0.18181818181818182 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.09893247896040484 +reaction_rate = 0.836 +reaction_rate_ci_low = 0.8130500822136548 +reaction_rate_ci_high = 0.8589499177863451 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 151.2200956937799 +step_correction_mean = 0.23552017659840116 +step_correction_p50 = 0.1568511426448822 + +[cell.spm_20.step_minus_10_at_15min] +shares_per_minute = 20 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.964 +convergence_rate_ci_low = 0.9524536202037175 +convergence_rate_ci_high = 0.9755463797962824 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 540 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 981.3485477178423 +settled_accuracy_p10 = 0.006741383687848268 +settled_accuracy_p10_ci_low = 0.005325684911205553 +settled_accuracy_p10_ci_high = 0.008203238450098516 +settled_accuracy_p50 = 0.05337921094142928 +settled_accuracy_p50_ci_low = 0.04788933300872522 +settled_accuracy_p50_ci_high = 0.05846718134194617 +settled_accuracy_p90 = 0.08295871052554071 +settled_accuracy_p90_ci_low = 0.08223825958379827 +settled_accuracy_p90_ci_high = 0.08404207129272923 +settled_accuracy_p95 = 0.08516472802827812 +settled_accuracy_p95_ci_low = 0.08460869380424874 +settled_accuracy_p95_ci_high = 0.08589442508022316 +settled_accuracy_p99 = 0.11111110282606607 +settled_accuracy_p99_ci_low = 0.0888603386238731 +settled_accuracy_p99_ci_high = 0.11111110282606607 +settled_accuracy_mean = 0.048479931355088206 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.058823529411764705 +jitter_p50_per_min_ci_low = 0.05555555555555555 +jitter_p50_per_min_ci_high = 0.058823529411764705 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.09090909090909091 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.125 +jitter_mean_per_min = 0.04878840600912507 +reaction_rate = 0.511 +reaction_rate_ci_low = 0.480017179495727 +reaction_rate_ci_high = 0.541982820504273 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 176.3600782778865 +step_correction_mean = 0.450720501097681 +step_correction_p50 = 0.3224433660507202 + +[cell.spm_20.step_minus_5_at_15min] +shares_per_minute = 20 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.926 +convergence_rate_ci_low = 0.9097752720084434 +convergence_rate_ci_high = 0.9422247279915567 +convergence_p10_secs = 480 +convergence_p10_secs_ci_low = 420 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 960 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 917.9481641468683 +settled_accuracy_p10 = 0.008239414477275275 +settled_accuracy_p10_ci_low = 0.006523688051718768 +settled_accuracy_p10_ci_high = 0.009350666634736937 +settled_accuracy_p50 = 0.024978131340242404 +settled_accuracy_p50_ci_low = 0.023661808620635272 +settled_accuracy_p50_ci_high = 0.02593249003627629 +settled_accuracy_p90 = 0.0749804518941406 +settled_accuracy_p90_ci_low = 0.07140453838178484 +settled_accuracy_p90_ci_high = 0.07860002148896483 +settled_accuracy_p95 = 0.08995088549440478 +settled_accuracy_p95_ci_low = 0.08374359807921716 +settled_accuracy_p95_ci_high = 0.09458245676793964 +settled_accuracy_p99 = 0.11585737967574838 +settled_accuracy_p99_ci_low = 0.10700649748027402 +settled_accuracy_p99_ci_high = 0.12534113378519496 +settled_accuracy_mean = 0.03573536636459915 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.029876266191479577 +reaction_rate = 0.347 +reaction_rate_ci_low = 0.3174962377721078 +reaction_rate_ci_high = 0.37650376222789217 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 174.985590778098 +step_correction_mean = 0.21281312075403308 +step_correction_p50 = 0.6082922220230103 + +[cell.spm_20.step_plus_5_at_15min] +shares_per_minute = 20 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.879 +convergence_rate_ci_low = 0.8587864220287451 +convergence_rate_ci_high = 0.8992135779712549 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 780 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 708.7372013651877 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.028804021521366963 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.07394675186041766 +settled_accuracy_p50_ci_low = 0.07295341276722589 +settled_accuracy_p50_ci_high = 0.07478459011628247 +settled_accuracy_p90 = 0.0949847432778963 +settled_accuracy_p90_ci_low = 0.09194758758953758 +settled_accuracy_p90_ci_high = 0.09842531914102182 +settled_accuracy_p95 = 0.1368345372664499 +settled_accuracy_p95_ci_low = 0.10480277086769463 +settled_accuracy_p95_ci_high = 0.1432808235191405 +settled_accuracy_p99 = 0.1608721673186453 +settled_accuracy_p99_ci_low = 0.1542177157444694 +settled_accuracy_p99_ci_high = 0.1746377303448028 +settled_accuracy_mean = 0.07133845962008196 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05263157894736842 +jitter_p90_per_min_ci_low = 0.047619047619047616 +jitter_p90_per_min_ci_high = 0.058823529411764705 +jitter_p95_per_min = 0.0625 +jitter_p95_per_min_ci_low = 0.058823529411764705 +jitter_p95_per_min_ci_high = 0.06666666666666667 +jitter_p99_per_min = 0.08333333333333333 +jitter_p99_per_min_ci_low = 0.07692307692307693 +jitter_p99_per_min_ci_high = 0.09090909090909091 +jitter_mean_per_min = 0.008588062394519098 +reaction_rate = 0.178 +reaction_rate_ci_low = 0.15429161444551737 +reaction_rate_ci_high = 0.20170838555448262 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 178.98876404494382 +step_correction_mean = -0.42868949857990396 +step_correction_p50 = -0.5695282220840454 + +[cell.spm_20.step_plus_10_at_15min] +shares_per_minute = 20 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.863 +convergence_rate_ci_low = 0.8416881204582983 +convergence_rate_ci_high = 0.8843118795417017 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 660 +convergence_p50_secs_ci_low = 660 +convergence_p50_secs_ci_high = 720 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 628.4356894553882 +settled_accuracy_p10 = 0.030756847071768734 +settled_accuracy_p10_ci_low = 0.028366612314586592 +settled_accuracy_p10_ci_high = 0.033544244295304115 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.11083145016706142 +settled_accuracy_p90 = 0.13008894914044833 +settled_accuracy_p90_ci_low = 0.12866648522869817 +settled_accuracy_p90_ci_high = 0.13132180000374594 +settled_accuracy_p95 = 0.13656483262408414 +settled_accuracy_p95_ci_low = 0.1335373686870157 +settled_accuracy_p95_ci_high = 0.1390063141511183 +settled_accuracy_p99 = 0.18204298542450348 +settled_accuracy_p99_ci_low = 0.17500564477069114 +settled_accuracy_p99_ci_high = 0.1912431227902499 +settled_accuracy_mean = 0.09560800210990243 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.047619047619047616 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.05263157894736842 +jitter_p95_per_min = 0.0625 +jitter_p95_per_min_ci_low = 0.05555555555555555 +jitter_p95_per_min_ci_high = 0.06666666666666667 +jitter_p99_per_min = 0.07692307692307693 +jitter_p99_per_min_ci_low = 0.07142857142857142 +jitter_p99_per_min_ci_high = 0.08333333333333333 +jitter_mean_per_min = 0.0073350736324450235 +reaction_rate = 0.103 +reaction_rate_ci_low = 0.08416043350817222 +reaction_rate_ci_high = 0.12183956649182777 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 174.75728155339806 +step_correction_mean = -0.008536192398626827 +step_correction_p50 = -0.2721083462238312 + +[cell.spm_20.step_plus_25_at_15min] +shares_per_minute = 20 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.902 +convergence_rate_ci_low = 0.883572247190718 +convergence_rate_ci_high = 0.920427752809282 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 480 +convergence_p10_secs_ci_high = 540 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 960 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 955.1441241685144 +settled_accuracy_p10 = 0.1300929452372357 +settled_accuracy_p10_ci_low = 0.12874829838769075 +settled_accuracy_p10_ci_high = 0.13207222717455802 +settled_accuracy_p50 = 0.1470358391388763 +settled_accuracy_p50_ci_low = 0.14602668291309584 +settled_accuracy_p50_ci_high = 0.1479906103427534 +settled_accuracy_p90 = 0.2246900268499873 +settled_accuracy_p90_ci_low = 0.22230717905911446 +settled_accuracy_p90_ci_high = 0.22650094607389537 +settled_accuracy_p95 = 0.23032395004695472 +settled_accuracy_p95_ci_low = 0.22813518108547992 +settled_accuracy_p95_ci_high = 0.2317993786470982 +settled_accuracy_p99 = 0.2375638688463052 +settled_accuracy_p99_ci_low = 0.2352501700270132 +settled_accuracy_p99_ci_high = 0.23979510429576179 +settled_accuracy_mean = 0.15902933757862223 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.043478260869565216 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.05 +jitter_p90_per_min = 0.07142857142857142 +jitter_p90_per_min_ci_low = 0.06666666666666667 +jitter_p90_per_min_ci_high = 0.07142857142857142 +jitter_p95_per_min = 0.07692307692307693 +jitter_p95_per_min_ci_low = 0.07142857142857142 +jitter_p95_per_min_ci_high = 0.07692307692307693 +jitter_p99_per_min = 0.09090909090909091 +jitter_p99_per_min_ci_low = 0.07692307692307693 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.030951082476952635 +reaction_rate = 0.237 +reaction_rate_ci_low = 0.21064321018029697 +reaction_rate_ci_high = 0.263356789819703 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 222.78481012658227 +step_correction_mean = 0.29777875806711895 +step_correction_p50 = 0.3156717121601105 + +[cell.spm_20.step_plus_50_at_15min] +shares_per_minute = 20 +scenario = "step_plus_50_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 600 +convergence_p10_secs_ci_low = 600 +convergence_p10_secs_ci_high = 600 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1200 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1260 +convergence_p99_secs_ci_high = 1320 +convergence_mean_secs = 944.1 +settled_accuracy_p10 = 0.10302499017749933 +settled_accuracy_p10_ci_low = 0.0980056051112258 +settled_accuracy_p10_ci_high = 0.10613132524525382 +settled_accuracy_p50 = 0.26997121745589225 +settled_accuracy_p50_ci_low = 0.2678723653843177 +settled_accuracy_p50_ci_high = 0.2713485597677353 +settled_accuracy_p90 = 0.28794605807457874 +settled_accuracy_p90_ci_low = 0.28673290878178537 +settled_accuracy_p90_ci_high = 0.2888800792349876 +settled_accuracy_p95 = 0.29307514376284405 +settled_accuracy_p95_ci_low = 0.2902969262977355 +settled_accuracy_p95_ci_high = 0.29564599484013376 +settled_accuracy_p99 = 0.3039953664461589 +settled_accuracy_p99_ci_low = 0.3006205511856749 +settled_accuracy_p99_ci_high = 0.30551390580653626 +settled_accuracy_mean = 0.2237448207839904 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.06666666666666667 +jitter_p50_per_min_ci_low = 0.0625 +jitter_p50_per_min_ci_high = 0.06666666666666667 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.10526315789473684 +jitter_p99_per_min = 0.11764705882352941 +jitter_p99_per_min_ci_low = 0.1111111111111111 +jitter_p99_per_min_ci_high = 0.125 +jitter_mean_per_min = 0.05650886791906879 +reaction_rate = 0.756 +reaction_rate_ci_low = 0.7293797651700816 +reaction_rate_ci_high = 0.7826202348299184 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 181.74603174603175 +step_correction_mean = 0.18281773757189512 +step_correction_p50 = 0.17672622203826904 + +[cell.spm_25.cold_start_10gh_to_1ph] +shares_per_minute = 25 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 180 +convergence_p50_secs = 180 +convergence_p50_secs_ci_low = 180 +convergence_p50_secs_ci_high = 180 +convergence_p90_secs = 480 +convergence_p90_secs_ci_low = 480 +convergence_p90_secs_ci_high = 480 +convergence_p95_secs = 480 +convergence_p95_secs_ci_low = 480 +convergence_p95_secs_ci_high = 480 +convergence_p99_secs = 480 +convergence_p99_secs_ci_low = 480 +convergence_p99_secs_ci_high = 480 +convergence_mean_secs = 234.66 +settled_accuracy_p10 = 0.08170390213218959 +settled_accuracy_p10_ci_low = 0.07896921588861427 +settled_accuracy_p10_ci_high = 0.08586344379474864 +settled_accuracy_p50 = 0.12896572287219765 +settled_accuracy_p50_ci_low = 0.12675307648846956 +settled_accuracy_p50_ci_high = 0.1321988937640497 +settled_accuracy_p90 = 0.23082382641191512 +settled_accuracy_p90_ci_low = 0.2171820034693941 +settled_accuracy_p90_ci_high = 0.23749766880580647 +settled_accuracy_p95 = 0.2516794496750958 +settled_accuracy_p95_ci_low = 0.2440311865632483 +settled_accuracy_p95_ci_high = 0.25636062854431274 +settled_accuracy_p99 = 0.2779954528375339 +settled_accuracy_p99_ci_low = 0.2716074942080017 +settled_accuracy_p99_ci_high = 0.29014497595187383 +settled_accuracy_mean = 0.1384421227312423 +jitter_p10_per_min = 0.04 +jitter_p10_per_min_ci_low = 0.04 +jitter_p10_per_min_ci_high = 0.04 +jitter_p50_per_min = 0.08 +jitter_p50_per_min_ci_low = 0.08 +jitter_p50_per_min_ci_high = 0.08 +jitter_p90_per_min = 0.08 +jitter_p90_per_min_ci_low = 0.08 +jitter_p90_per_min_ci_high = 0.08 +jitter_p95_per_min = 0.08 +jitter_p95_per_min_ci_low = 0.08 +jitter_p95_per_min_ci_high = 0.08 +jitter_p99_per_min = 0.08 +jitter_p99_per_min_ci_low = 0.08 +jitter_p99_per_min_ci_high = 0.08 +jitter_mean_per_min = 0.06811571428571322 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0 +ramp_target_overshoot_p90_ci_low = 0 +ramp_target_overshoot_p90_ci_high = 0 +ramp_target_overshoot_p99 = 0 +ramp_target_overshoot_p99_ci_low = 0 +ramp_target_overshoot_p99_ci_high = 0 +ramp_target_overshoot_mean = 0 + +[cell.spm_25.stable_1ph] +shares_per_minute = 25 +scenario = "stable_1ph" +convergence_rate = 0.859 +convergence_rate_ci_low = 0.8374294007871825 +convergence_rate_ci_high = 0.8805705992128174 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 900 +convergence_p50_secs_ci_low = 840 +convergence_p50_secs_ci_high = 900 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 748.0791618160652 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0.028413960496098234 +settled_accuracy_p50_ci_low = 0.027635095010382082 +settled_accuracy_p50_ci_high = 0.02933697582356165 +settled_accuracy_p90 = 0.048234765062937 +settled_accuracy_p90_ci_low = 0.04493421687075261 +settled_accuracy_p90_ci_high = 0.05237175814689876 +settled_accuracy_p95 = 0.09084922980162413 +settled_accuracy_p95_ci_low = 0.06174357823527976 +settled_accuracy_p95_ci_high = 0.09896275867363624 +settled_accuracy_p99 = 0.11900542514774515 +settled_accuracy_p99_ci_low = 0.11290603463716686 +settled_accuracy_p99_ci_high = 0.12806968530841323 +settled_accuracy_mean = 0.028855368182385238 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.05 +jitter_p95_per_min = 0.058823529411764705 +jitter_p95_per_min_ci_low = 0.05263157894736842 +jitter_p95_per_min_ci_high = 0.06666666666666667 +jitter_p99_per_min = 0.08333333333333333 +jitter_p99_per_min_ci_low = 0.07692307692307693 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.005426351392859765 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1 +upward_step_magnitude_p95 = 1 +upward_step_magnitude_p95_ci_low = 1 +upward_step_magnitude_p95_ci_high = 1 +upward_step_magnitude_p99 = 1.0582435824966927 +upward_step_magnitude_p99_ci_low = 1 +upward_step_magnitude_p99_ci_high = 1.0665111933224531 +upward_step_magnitude_mean = 1.0007309980074706 + +[cell.spm_25.step_minus_50_at_15min] +shares_per_minute = 25 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.778 +convergence_rate_ci_low = 0.752241393950759 +convergence_rate_ci_high = 0.8037586060492411 +convergence_p10_secs = 720 +convergence_p10_secs_ci_low = 660 +convergence_p10_secs_ci_high = 960 +convergence_p50_secs = 1320 +convergence_p50_secs_ci_low = 1260 +convergence_p50_secs_ci_high = 1380 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1257.4550128534704 +settled_accuracy_p10 = 0.1393851794501113 +settled_accuracy_p10_ci_low = 0.1297263347466684 +settled_accuracy_p10_ci_high = 0.1465644858142261 +settled_accuracy_p50 = 0.29793899951822556 +settled_accuracy_p50_ci_low = 0.29048052027623883 +settled_accuracy_p50_ci_high = 0.30423381104331404 +settled_accuracy_p90 = 0.3885861645277171 +settled_accuracy_p90_ci_low = 0.38104232280961203 +settled_accuracy_p90_ci_high = 0.3953523487196735 +settled_accuracy_p95 = 0.4098360523720266 +settled_accuracy_p95_ci_low = 0.4034284979539513 +settled_accuracy_p95_ci_high = 0.414250607721103 +settled_accuracy_p99 = 0.4490107180239178 +settled_accuracy_p99_ci_low = 0.4389713660566448 +settled_accuracy_p99_ci_high = 0.4704110639432726 +settled_accuracy_mean = 0.2807535476598096 +jitter_p10_per_min = 0.1111111111111111 +jitter_p10_per_min_ci_low = 0.1 +jitter_p10_per_min_ci_high = 0.125 +jitter_p50_per_min = 0.16666666666666666 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.16666666666666666 +jitter_p90_per_min = 0.1875 +jitter_p90_per_min_ci_low = 0.1875 +jitter_p90_per_min_ci_high = 0.2 +jitter_p95_per_min = 0.2 +jitter_p95_per_min_ci_low = 0.1875 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.2 +jitter_p99_per_min_ci_high = 0.25 +jitter_mean_per_min = 0.15883677070458144 +reaction_rate = 0.999 +reaction_rate_ci_low = 0.9970409802451226 +reaction_rate_ci_high = 1 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 60 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 60 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 180 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 99.51951951951952 +step_correction_mean = 0.1417947209685355 +step_correction_p50 = 0.09954740852117538 + +[cell.spm_25.step_minus_25_at_15min] +shares_per_minute = 25 +scenario = "step_minus_25_at_15min" +convergence_rate = 0.999 +convergence_rate_ci_low = 0.9970409802451226 +convergence_rate_ci_high = 1 +convergence_p10_secs = 780 +convergence_p10_secs_ci_low = 720 +convergence_p10_secs_ci_high = 840 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 1002.5825825825826 +settled_accuracy_p10 = 0.05072087893641575 +settled_accuracy_p10_ci_low = 0.037681805740241714 +settled_accuracy_p10_ci_high = 0.06452284569140065 +settled_accuracy_p50 = 0.1393463650394675 +settled_accuracy_p50_ci_low = 0.13734285229312326 +settled_accuracy_p50_ci_high = 0.14243444649638493 +settled_accuracy_p90 = 0.17838770687313765 +settled_accuracy_p90_ci_low = 0.17603880717663967 +settled_accuracy_p90_ci_high = 0.18122757501406372 +settled_accuracy_p95 = 0.18859075950321902 +settled_accuracy_p95_ci_low = 0.1850095621182457 +settled_accuracy_p95_ci_high = 0.19444166812591157 +settled_accuracy_p99 = 0.2852339652095126 +settled_accuracy_p99_ci_low = 0.27045650401655497 +settled_accuracy_p99_ci_high = 0.29088265245724476 +settled_accuracy_mean = 0.13105360280196512 +jitter_p10_per_min = 0.07142857142857142 +jitter_p10_per_min_ci_low = 0.06666666666666667 +jitter_p10_per_min_ci_high = 0.07692307692307693 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.1111111111111111 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.11764705882352941 +jitter_p95_per_min = 0.14285714285714285 +jitter_p95_per_min_ci_low = 0.125 +jitter_p95_per_min_ci_high = 0.16666666666666666 +jitter_p99_per_min = 0.16666666666666666 +jitter_p99_per_min_ci_low = 0.16666666666666666 +jitter_p99_per_min_ci_high = 0.18181818181818182 +jitter_mean_per_min = 0.09186505405037905 +reaction_rate = 0.876 +reaction_rate_ci_low = 0.8555723237151163 +reaction_rate_ci_high = 0.8964276762848837 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 139.93150684931507 +step_correction_mean = 0.18432496497450082 +step_correction_p50 = 0.14766661822795868 + +[cell.spm_25.step_minus_10_at_15min] +shares_per_minute = 25 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.945 +convergence_rate_ci_low = 0.9308696369473392 +convergence_rate_ci_high = 0.9591303630526608 +convergence_p10_secs = 720 +convergence_p10_secs_ci_low = 660 +convergence_p10_secs_ci_high = 780 +convergence_p50_secs = 1080 +convergence_p50_secs_ci_low = 1080 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1320 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1049.7777777777778 +settled_accuracy_p10 = 0.01078886842897031 +settled_accuracy_p10_ci_low = 0.009039340334776269 +settled_accuracy_p10_ci_high = 0.013234390012113129 +settled_accuracy_p50 = 0.07049927876612161 +settled_accuracy_p50_ci_low = 0.06854648537828334 +settled_accuracy_p50_ci_high = 0.07197433160503142 +settled_accuracy_p90 = 0.08272539537373857 +settled_accuracy_p90_ci_low = 0.08212141559438502 +settled_accuracy_p90_ci_high = 0.08331326902564262 +settled_accuracy_p95 = 0.08510507570439141 +settled_accuracy_p95_ci_low = 0.08407607311734466 +settled_accuracy_p95_ci_high = 0.0859613848137859 +settled_accuracy_p99 = 0.11111110282606607 +settled_accuracy_p99_ci_low = 0.08782850255144181 +settled_accuracy_p99_ci_high = 0.11111110282606607 +settled_accuracy_mean = 0.058372069216082734 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.05263157894736842 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.09090909090909091 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.036533513131142156 +reaction_rate = 0.539 +reaction_rate_ci_low = 0.5081040953134562 +reaction_rate_ci_high = 0.5698959046865438 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 177.77365491651207 +step_correction_mean = 0.3903518109297266 +step_correction_p50 = 0.32125017046928406 + +[cell.spm_25.step_minus_5_at_15min] +shares_per_minute = 25 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.879 +convergence_rate_ci_low = 0.8587864220287451 +convergence_rate_ci_high = 0.8992135779712549 +convergence_p10_secs = 540 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 660 +convergence_p50_secs = 1080 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 992.3549488054607 +settled_accuracy_p10 = 0.009592258547426402 +settled_accuracy_p10_ci_low = 0.008370382724680603 +settled_accuracy_p10_ci_high = 0.010531923934150589 +settled_accuracy_p50 = 0.022473911075668207 +settled_accuracy_p50_ci_low = 0.02175824801500803 +settled_accuracy_p50_ci_high = 0.023254493132749854 +settled_accuracy_p90 = 0.05755185590271561 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.06068308488572027 +settled_accuracy_p95 = 0.07139139917249826 +settled_accuracy_p95_ci_low = 0.06633548795173361 +settled_accuracy_p95_ci_high = 0.07842808151367642 +settled_accuracy_p99 = 0.09749526405678177 +settled_accuracy_p99_ci_low = 0.09106877789741996 +settled_accuracy_p99_ci_high = 0.1203522607881562 +settled_accuracy_mean = 0.028624631086676944 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.08333333333333333 +jitter_p90_per_min_ci_low = 0.07142857142857142 +jitter_p90_per_min_ci_high = 0.08333333333333333 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.08333333333333333 +jitter_p95_per_min_ci_high = 0.09090909090909091 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.01958391580221597 +reaction_rate = 0.357 +reaction_rate_ci_low = 0.3273041564928692 +reaction_rate_ci_high = 0.38669584350713077 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 178.48739495798318 +step_correction_mean = 0.8156058267385018 +step_correction_p50 = 0.6367947459220886 + +[cell.spm_25.step_plus_5_at_15min] +shares_per_minute = 25 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.873 +convergence_rate_ci_low = 0.8523621213880883 +convergence_rate_ci_high = 0.8936378786119117 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 600 +convergence_p50_secs_ci_low = 420 +convergence_p50_secs_ci_high = 660 +convergence_p90_secs = 1320 +convergence_p90_secs_ci_low = 1260 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 532.4398625429553 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.06989375962932387 +settled_accuracy_p50_ci_low = 0.06831452814986982 +settled_accuracy_p50_ci_high = 0.07138798654090084 +settled_accuracy_p90 = 0.08773954191357936 +settled_accuracy_p90_ci_low = 0.08632386433577754 +settled_accuracy_p90_ci_high = 0.08893753110176528 +settled_accuracy_p95 = 0.09287918652290283 +settled_accuracy_p95_ci_low = 0.09037577004231945 +settled_accuracy_p95_ci_high = 0.09536783905222335 +settled_accuracy_p99 = 0.1471427791687423 +settled_accuracy_p99_ci_low = 0.13414321595161205 +settled_accuracy_p99_ci_high = 0.15426360542848117 +settled_accuracy_mean = 0.06557760124523376 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.06666666666666667 +jitter_p99_per_min_ci_low = 0.058823529411764705 +jitter_p99_per_min_ci_high = 0.07142857142857142 +jitter_mean_per_min = 0.0019196304026025386 +reaction_rate = 0.113 +reaction_rate_ci_low = 0.09337737505836693 +reaction_rate_ci_high = 0.13262262494163307 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 170.97345132743362 +step_correction_mean = -0.5801632130040532 +step_correction_p50 = -0.6098714470863342 + +[cell.spm_25.step_plus_10_at_15min] +shares_per_minute = 25 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.884 +convergence_rate_ci_low = 0.864152253770264 +convergence_rate_ci_high = 0.9038477462297361 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1380 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 407.10407239819006 +settled_accuracy_p10 = 0.03348756780817019 +settled_accuracy_p10_ci_low = 0.031147237643534442 +settled_accuracy_p10_ci_high = 0.04240395668989061 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.12716159942876937 +settled_accuracy_p90_ci_low = 0.12590532147068223 +settled_accuracy_p90_ci_high = 0.12811100684833765 +settled_accuracy_p95 = 0.1314050149966961 +settled_accuracy_p95_ci_low = 0.12949143620719727 +settled_accuracy_p95_ci_high = 0.13258552094507337 +settled_accuracy_p99 = 0.14015558397310957 +settled_accuracy_p99_ci_low = 0.13773801760533977 +settled_accuracy_p99_ci_high = 0.14272829383580055 +settled_accuracy_mean = 0.09430288408889632 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.0625 +jitter_p99_per_min_ci_low = 0.05 +jitter_p99_per_min_ci_high = 0.0625 +jitter_mean_per_min = 0.0014507160033252068 +reaction_rate = 0.067 +reaction_rate_ci_low = 0.051503475951039865 +reaction_rate_ci_high = 0.08249652404896014 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 192.53731343283582 +step_correction_mean = -0.05103016477912219 +step_correction_p50 = -0.2751309275627136 + +[cell.spm_25.step_plus_25_at_15min] +shares_per_minute = 25 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.814 +convergence_rate_ci_low = 0.7898829187835674 +convergence_rate_ci_high = 0.8381170812164325 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 1140 +convergence_p50_secs_ci_low = 1080 +convergence_p50_secs_ci_high = 1140 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 958.3046683046683 +settled_accuracy_p10 = 0.1304087863861566 +settled_accuracy_p10_ci_low = 0.1295050716046191 +settled_accuracy_p10_ci_high = 0.13168954559891488 +settled_accuracy_p50 = 0.14518084281429444 +settled_accuracy_p50_ci_low = 0.14387871613982095 +settled_accuracy_p50_ci_high = 0.1460605594667197 +settled_accuracy_p90 = 0.225098478228704 +settled_accuracy_p90_ci_low = 0.22361896940974046 +settled_accuracy_p90_ci_high = 0.22693511356859586 +settled_accuracy_p95 = 0.22987861563758893 +settled_accuracy_p95_ci_low = 0.22860386937888122 +settled_accuracy_p95_ci_high = 0.23162043957700584 +settled_accuracy_p99 = 0.23682599348496425 +settled_accuracy_p99_ci_low = 0.23554373103369342 +settled_accuracy_p99_ci_high = 0.23869945816841553 +settled_accuracy_mean = 0.1598342005766856 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.0625 +jitter_p90_per_min_ci_low = 0.0625 +jitter_p90_per_min_ci_high = 0.06666666666666667 +jitter_p95_per_min = 0.07142857142857142 +jitter_p95_per_min_ci_low = 0.06666666666666667 +jitter_p95_per_min_ci_high = 0.07692307692307693 +jitter_p99_per_min = 0.07692307692307693 +jitter_p99_per_min_ci_low = 0.07692307692307693 +jitter_p99_per_min_ci_high = 0.07692307692307693 +jitter_mean_per_min = 0.018809666759636832 +reaction_rate = 0.167 +reaction_rate_ci_low = 0.14388271604188763 +reaction_rate_ci_high = 0.1901172839581124 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 236.40718562874252 +step_correction_mean = 0.3229272882203142 +step_correction_p50 = 0.3243982791900635 + +[cell.spm_25.step_plus_50_at_15min] +shares_per_minute = 25 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.998 +convergence_rate_ci_low = 0.995230914663648 +convergence_rate_ci_high = 1 +convergence_p10_secs = 780 +convergence_p10_secs_ci_low = 720 +convergence_p10_secs_ci_high = 780 +convergence_p50_secs = 1080 +convergence_p50_secs_ci_low = 1080 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1320 +convergence_p99_secs_ci_low = 1320 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 1032.3847695390782 +settled_accuracy_p10 = 0.1107621947318469 +settled_accuracy_p10_ci_low = 0.10650695592316695 +settled_accuracy_p10_ci_high = 0.11524864594446371 +settled_accuracy_p50 = 0.2719365676285992 +settled_accuracy_p50_ci_low = 0.2708526700066599 +settled_accuracy_p50_ci_high = 0.2730956719167571 +settled_accuracy_p90 = 0.2839747344972039 +settled_accuracy_p90_ci_low = 0.28325675913760995 +settled_accuracy_p90_ci_high = 0.28530076089818857 +settled_accuracy_p95 = 0.28840365104429 +settled_accuracy_p95_ci_low = 0.28600276434829996 +settled_accuracy_p95_ci_high = 0.29126857316087484 +settled_accuracy_p99 = 0.29942820564052686 +settled_accuracy_p99_ci_low = 0.29545710575936324 +settled_accuracy_p99_ci_high = 0.30467589505999126 +settled_accuracy_mean = 0.24258035029216085 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0.05 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0.058823529411764705 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.09090909090909091 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.1111111111111111 +jitter_mean_per_min = 0.04078656216125493 +reaction_rate = 0.768 +reaction_rate_ci_low = 0.7418374137058279 +reaction_rate_ci_high = 0.7941625862941721 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 192.265625 +step_correction_mean = 0.18338756993762217 +step_correction_p50 = 0.17855721712112427 + +[cell.spm_30.cold_start_10gh_to_1ph] +shares_per_minute = 30 +scenario = "cold_start_10gh_to_1ph" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 180 +convergence_p10_secs_ci_low = 180 +convergence_p10_secs_ci_high = 180 +convergence_p50_secs = 300 +convergence_p50_secs_ci_low = 240 +convergence_p50_secs_ci_high = 300 +convergence_p90_secs = 360 +convergence_p90_secs_ci_low = 300 +convergence_p90_secs_ci_high = 480 +convergence_p95_secs = 480 +convergence_p95_secs_ci_low = 480 +convergence_p95_secs_ci_high = 480 +convergence_p99_secs = 480 +convergence_p99_secs_ci_low = 480 +convergence_p99_secs_ci_high = 480 +convergence_mean_secs = 264 +settled_accuracy_p10 = 0.11362403238244323 +settled_accuracy_p10_ci_low = 0.10835236261120862 +settled_accuracy_p10_ci_high = 0.1170801389234033 +settled_accuracy_p50 = 0.1690118642433298 +settled_accuracy_p50_ci_low = 0.16603169377204907 +settled_accuracy_p50_ci_high = 0.17335964627185763 +settled_accuracy_p90 = 0.22898182228888075 +settled_accuracy_p90_ci_low = 0.22395543541875695 +settled_accuracy_p90_ci_high = 0.23211607471390983 +settled_accuracy_p95 = 0.24920360232333572 +settled_accuracy_p95_ci_low = 0.23918230264071372 +settled_accuracy_p95_ci_high = 0.2565951069181791 +settled_accuracy_p99 = 0.28009005472795034 +settled_accuracy_p99_ci_low = 0.2731326102711057 +settled_accuracy_p99_ci_high = 0.29001894550364227 +settled_accuracy_mean = 0.17035367532771456 +jitter_p10_per_min = 0.041666666666666664 +jitter_p10_per_min_ci_low = 0.041666666666666664 +jitter_p10_per_min_ci_high = 0.041666666666666664 +jitter_p50_per_min = 0.043478260869565216 +jitter_p50_per_min_ci_low = 0.043478260869565216 +jitter_p50_per_min_ci_high = 0.045454545454545456 +jitter_p90_per_min = 0.08 +jitter_p90_per_min_ci_low = 0.08 +jitter_p90_per_min_ci_high = 0.08 +jitter_p95_per_min = 0.08 +jitter_p95_per_min_ci_low = 0.08 +jitter_p95_per_min_ci_high = 0.08 +jitter_p99_per_min = 0.08695652173913043 +jitter_p99_per_min_ci_low = 0.08 +jitter_p99_per_min_ci_high = 0.08695652173913043 +jitter_mean_per_min = 0.05699113683417983 +ramp_target_overshoot_p10 = 0 +ramp_target_overshoot_p10_ci_low = 0 +ramp_target_overshoot_p10_ci_high = 0 +ramp_target_overshoot_p50 = 0 +ramp_target_overshoot_p50_ci_low = 0 +ramp_target_overshoot_p50_ci_high = 0 +ramp_target_overshoot_p90 = 0 +ramp_target_overshoot_p90_ci_low = 0 +ramp_target_overshoot_p90_ci_high = 0 +ramp_target_overshoot_p99 = 0 +ramp_target_overshoot_p99_ci_low = 0 +ramp_target_overshoot_p99_ci_high = 0 +ramp_target_overshoot_mean = 0 + +[cell.spm_30.stable_1ph] +shares_per_minute = 30 +scenario = "stable_1ph" +convergence_rate = 0.845 +convergence_rate_ci_low = 0.8225689153182464 +convergence_rate_ci_high = 0.8674310846817536 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 780 +convergence_p50_secs_ci_low = 720 +convergence_p50_secs_ci_high = 840 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 644.5207100591716 +settled_accuracy_p10 = 0 +settled_accuracy_p10_ci_low = 0 +settled_accuracy_p10_ci_high = 0 +settled_accuracy_p50 = 0.02693347182813477 +settled_accuracy_p50_ci_low = 0.025772622683561397 +settled_accuracy_p50_ci_high = 0.027758441104018705 +settled_accuracy_p90 = 0.042245164655290934 +settled_accuracy_p90_ci_low = 0.04073836931229724 +settled_accuracy_p90_ci_high = 0.04406737166318786 +settled_accuracy_p95 = 0.04745402052900438 +settled_accuracy_p95_ci_low = 0.0455622216282342 +settled_accuracy_p95_ci_high = 0.049348235348910086 +settled_accuracy_p99 = 0.10815291506480607 +settled_accuracy_p99_ci_low = 0.06676969666994403 +settled_accuracy_p99_ci_high = 0.11986535814222798 +settled_accuracy_mean = 0.022864377614603307 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.07692307692307693 +jitter_p99_per_min_ci_low = 0.06666666666666667 +jitter_p99_per_min_ci_high = 0.09090909090909091 +jitter_mean_per_min = 0.002151119401522496 +upward_step_magnitude_p50 = 1 +upward_step_magnitude_p50_ci_low = 1 +upward_step_magnitude_p50_ci_high = 1 +upward_step_magnitude_p90 = 1 +upward_step_magnitude_p90_ci_low = 1 +upward_step_magnitude_p90_ci_high = 1 +upward_step_magnitude_p95 = 1 +upward_step_magnitude_p95_ci_low = 1 +upward_step_magnitude_p95_ci_high = 1 +upward_step_magnitude_p99 = 1 +upward_step_magnitude_p99_ci_low = 1 +upward_step_magnitude_p99_ci_high = 1 +upward_step_magnitude_mean = 1 + +[cell.spm_30.step_minus_50_at_15min] +shares_per_minute = 30 +scenario = "step_minus_50_at_15min" +convergence_rate = 0.787 +convergence_rate_ci_low = 0.761623411387659 +convergence_rate_ci_high = 0.8123765886123411 +convergence_p10_secs = 960 +convergence_p10_secs_ci_low = 960 +convergence_p10_secs_ci_high = 960 +convergence_p50_secs = 1260 +convergence_p50_secs_ci_low = 1260 +convergence_p50_secs_ci_high = 1260 +convergence_p90_secs = 1500 +convergence_p90_secs_ci_low = 1500 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1260.609911054638 +settled_accuracy_p10 = 0.22884532285772896 +settled_accuracy_p10_ci_low = 0.21786174916169276 +settled_accuracy_p10_ci_high = 0.23762249129447022 +settled_accuracy_p50 = 0.3152364436569741 +settled_accuracy_p50_ci_low = 0.3115191494139282 +settled_accuracy_p50_ci_high = 0.31743399054610566 +settled_accuracy_p90 = 0.38132028772791604 +settled_accuracy_p90_ci_low = 0.37558798270819294 +settled_accuracy_p90_ci_high = 0.38553472444194115 +settled_accuracy_p95 = 0.4008033333778489 +settled_accuracy_p95_ci_low = 0.3920734095819782 +settled_accuracy_p95_ci_high = 0.4049993822628988 +settled_accuracy_p99 = 0.43519515023024047 +settled_accuracy_p99_ci_low = 0.41914432036537286 +settled_accuracy_p99_ci_high = 0.4558748811585889 +settled_accuracy_mean = 0.30691537786887907 +jitter_p10_per_min = 0.10526315789473684 +jitter_p10_per_min_ci_low = 0.1 +jitter_p10_per_min_ci_high = 0.11764705882352941 +jitter_p50_per_min = 0.16666666666666666 +jitter_p50_per_min_ci_low = 0.16666666666666666 +jitter_p50_per_min_ci_high = 0.16666666666666666 +jitter_p90_per_min = 0.18181818181818182 +jitter_p90_per_min_ci_low = 0.18181818181818182 +jitter_p90_per_min_ci_high = 0.1875 +jitter_p95_per_min = 0.1875 +jitter_p95_per_min_ci_low = 0.18181818181818182 +jitter_p95_per_min_ci_high = 0.2 +jitter_p99_per_min = 0.2 +jitter_p99_per_min_ci_low = 0.1875 +jitter_p99_per_min_ci_high = 0.2 +jitter_mean_per_min = 0.15547799606341683 +reaction_rate = 0.999 +reaction_rate_ci_low = 0.9970409802451226 +reaction_rate_ci_high = 1 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 60 +reaction_p50_secs_ci_low = 60 +reaction_p50_secs_ci_high = 60 +reaction_p90_secs = 180 +reaction_p90_secs_ci_low = 120 +reaction_p90_secs_ci_high = 180 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 240 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 92.37237237237237 +step_correction_mean = 0.12281881313812029 +step_correction_p50 = 0.09321501851081848 + +[cell.spm_30.step_minus_25_at_15min] +shares_per_minute = 30 +scenario = "step_minus_25_at_15min" +convergence_rate = 1 +convergence_rate_ci_low = 1 +convergence_rate_ci_high = 1 +convergence_p10_secs = 840 +convergence_p10_secs_ci_low = 780 +convergence_p10_secs_ci_high = 900 +convergence_p50_secs = 1020 +convergence_p50_secs_ci_low = 1020 +convergence_p50_secs_ci_high = 1020 +convergence_p90_secs = 1140 +convergence_p90_secs_ci_low = 1140 +convergence_p90_secs_ci_high = 1200 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1200 +convergence_p95_secs_ci_high = 1260 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1380 +convergence_mean_secs = 1012.2 +settled_accuracy_p10 = 0.0992637620817205 +settled_accuracy_p10_ci_low = 0.09093644692212366 +settled_accuracy_p10_ci_high = 0.10232446312238208 +settled_accuracy_p50 = 0.14365904903519366 +settled_accuracy_p50_ci_low = 0.140045102524895 +settled_accuracy_p50_ci_high = 0.1459976587059746 +settled_accuracy_p90 = 0.18191897526376244 +settled_accuracy_p90_ci_low = 0.17824767304490186 +settled_accuracy_p90_ci_high = 0.1858466333407034 +settled_accuracy_p95 = 0.26048341109162765 +settled_accuracy_p95_ci_low = 0.18923097805978606 +settled_accuracy_p95_ci_high = 0.2718580055192119 +settled_accuracy_p99 = 0.29171694984668317 +settled_accuracy_p99_ci_low = 0.288012719545528 +settled_accuracy_p99_ci_high = 0.29646951007219036 +settled_accuracy_mean = 0.1431805336693667 +jitter_p10_per_min = 0.06666666666666667 +jitter_p10_per_min_ci_low = 0.06666666666666667 +jitter_p10_per_min_ci_high = 0.07142857142857142 +jitter_p50_per_min = 0.09090909090909091 +jitter_p50_per_min_ci_low = 0.09090909090909091 +jitter_p50_per_min_ci_high = 0.09090909090909091 +jitter_p90_per_min = 0.1 +jitter_p90_per_min_ci_low = 0.1 +jitter_p90_per_min_ci_high = 0.1 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.1 +jitter_p95_per_min_ci_high = 0.1111111111111111 +jitter_p99_per_min = 0.14285714285714285 +jitter_p99_per_min_ci_low = 0.125 +jitter_p99_per_min_ci_high = 0.16666666666666666 +jitter_mean_per_min = 0.08657551267690462 +reaction_rate = 0.879 +reaction_rate_ci_low = 0.8587864220287451 +reaction_rate_ci_high = 0.8992135779712549 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 120 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 120 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 240 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 144.50511945392492 +step_correction_mean = 0.1689760814737677 +step_correction_p50 = 0.14791037142276764 + +[cell.spm_30.step_minus_10_at_15min] +shares_per_minute = 30 +scenario = "step_minus_10_at_15min" +convergence_rate = 0.931 +convergence_rate_ci_low = 0.9152907497823735 +convergence_rate_ci_high = 0.9467092502176266 +convergence_p10_secs = 780 +convergence_p10_secs_ci_low = 720 +convergence_p10_secs_ci_high = 780 +convergence_p50_secs = 1140 +convergence_p50_secs_ci_low = 1080 +convergence_p50_secs_ci_high = 1140 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1380 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 1078.2599355531686 +settled_accuracy_p10 = 0.02156685030883132 +settled_accuracy_p10_ci_low = 0.01755187608422759 +settled_accuracy_p10_ci_high = 0.025301085784142807 +settled_accuracy_p50 = 0.07359307197910381 +settled_accuracy_p50_ci_low = 0.07282407895879861 +settled_accuracy_p50_ci_high = 0.07442581842056306 +settled_accuracy_p90 = 0.0830084456505813 +settled_accuracy_p90_ci_low = 0.08245382816924418 +settled_accuracy_p90_ci_high = 0.0838437273158057 +settled_accuracy_p95 = 0.0852668080675294 +settled_accuracy_p95_ci_low = 0.08456731000455231 +settled_accuracy_p95_ci_high = 0.08610596713380647 +settled_accuracy_p99 = 0.11111110282606607 +settled_accuracy_p99_ci_low = 0.11111110282606607 +settled_accuracy_p99_ci_high = 0.11111110282606607 +settled_accuracy_mean = 0.06470379653487104 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.09090909090909091 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.1 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.02928538076724574 +reaction_rate = 0.504 +reaction_rate_ci_low = 0.47301067063649166 +reaction_rate_ci_high = 0.5349893293635083 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 184.28571428571428 +step_correction_mean = 0.3504727715774188 +step_correction_p50 = 0.3235117197036743 + +[cell.spm_30.step_minus_5_at_15min] +shares_per_minute = 30 +scenario = "step_minus_5_at_15min" +convergence_rate = 0.853 +convergence_rate_ci_low = 0.8310522879187829 +convergence_rate_ci_high = 0.874947712081217 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 1080 +convergence_p50_secs_ci_low = 1080 +convergence_p50_secs_ci_high = 1140 +convergence_p90_secs = 1380 +convergence_p90_secs_ci_low = 1380 +convergence_p90_secs_ci_high = 1440 +convergence_p95_secs = 1440 +convergence_p95_secs_ci_low = 1440 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 953.388042203986 +settled_accuracy_p10 = 0.010004448258111642 +settled_accuracy_p10_ci_low = 0.008848904249990186 +settled_accuracy_p10_ci_high = 0.011417549024615115 +settled_accuracy_p50 = 0.021939300667704886 +settled_accuracy_p50_ci_low = 0.02130021235363988 +settled_accuracy_p50_ci_high = 0.022474688125679876 +settled_accuracy_p90 = 0.05263157522942574 +settled_accuracy_p90_ci_low = 0.05263157522942574 +settled_accuracy_p90_ci_high = 0.05263157522942574 +settled_accuracy_p95 = 0.05512583512566982 +settled_accuracy_p95_ci_low = 0.05263157522942574 +settled_accuracy_p95_ci_high = 0.06164916997283787 +settled_accuracy_p99 = 0.08592795630266326 +settled_accuracy_p99_ci_low = 0.07515182674214793 +settled_accuracy_p99_ci_high = 0.09953304239168081 +settled_accuracy_mean = 0.026625062208151595 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05263157894736842 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0.0625 +jitter_p95_per_min = 0.07142857142857142 +jitter_p95_per_min_ci_low = 0.0625 +jitter_p95_per_min_ci_high = 0.07692307692307693 +jitter_p99_per_min = 0.09090909090909091 +jitter_p99_per_min_ci_low = 0.08333333333333333 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.008288036679600501 +reaction_rate = 0.332 +reaction_rate_ci_low = 0.302811394661615 +reaction_rate_ci_high = 0.36118860533838504 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 190.12048192771084 +step_correction_mean = 0.7496005025613739 +step_correction_p50 = 0.6585500836372375 + +[cell.spm_30.step_plus_5_at_15min] +shares_per_minute = 30 +scenario = "step_plus_5_at_15min" +convergence_rate = 0.89 +convergence_rate_ci_low = 0.8706068919458484 +convergence_rate_ci_high = 0.9093931080541516 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 1260 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1320 +convergence_p95_secs = 1380 +convergence_p95_secs_ci_low = 1320 +convergence_p95_secs_ci_high = 1440 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 400.17977528089887 +settled_accuracy_p10 = 0.047618983705838724 +settled_accuracy_p10_ci_low = 0.047618983705838724 +settled_accuracy_p10_ci_high = 0.047618983705838724 +settled_accuracy_p50 = 0.047618983705838724 +settled_accuracy_p50_ci_low = 0.047618983705838724 +settled_accuracy_p50_ci_high = 0.047618983705838724 +settled_accuracy_p90 = 0.08625419893804365 +settled_accuracy_p90_ci_low = 0.08466723396030917 +settled_accuracy_p90_ci_high = 0.08825902847576328 +settled_accuracy_p95 = 0.09216770468109292 +settled_accuracy_p95_ci_low = 0.08966773951379181 +settled_accuracy_p95_ci_high = 0.09416524811299443 +settled_accuracy_p99 = 0.1112640767244838 +settled_accuracy_p99_ci_low = 0.1011358144185387 +settled_accuracy_p99_ci_high = 0.1458574206239489 +settled_accuracy_mean = 0.06257687142030098 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0.05263157894736842 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0.06666666666666667 +jitter_mean_per_min = 0.0008104870264498253 +reaction_rate = 0.107 +reaction_rate_ci_low = 0.08784096240412896 +reaction_rate_ci_high = 0.12615903759587105 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 60 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 240 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 187.28971962616822 +step_correction_mean = -0.6527367395775341 +step_correction_p50 = -0.61775141954422 + +[cell.spm_30.step_plus_10_at_15min] +shares_per_minute = 30 +scenario = "step_plus_10_at_15min" +convergence_rate = 0.907 +convergence_rate_ci_low = 0.8889988111059297 +convergence_rate_ci_high = 0.9250011888940703 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 0 +convergence_p50_secs_ci_low = 0 +convergence_p50_secs_ci_high = 0 +convergence_p90_secs = 900 +convergence_p90_secs_ci_low = 900 +convergence_p90_secs_ci_high = 1020 +convergence_p95_secs = 1260 +convergence_p95_secs_ci_low = 1140 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1440 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 245.15986769570011 +settled_accuracy_p10 = 0.09090908536290365 +settled_accuracy_p10_ci_low = 0.09090908536290365 +settled_accuracy_p10_ci_high = 0.09090908536290365 +settled_accuracy_p50 = 0.09090908536290365 +settled_accuracy_p50_ci_low = 0.09090908536290365 +settled_accuracy_p50_ci_high = 0.09090908536290365 +settled_accuracy_p90 = 0.1251799356450385 +settled_accuracy_p90_ci_low = 0.12392829429946184 +settled_accuracy_p90_ci_high = 0.12660526693557794 +settled_accuracy_p95 = 0.13003300475002644 +settled_accuracy_p95_ci_low = 0.12834808416696275 +settled_accuracy_p95_ci_high = 0.13202888341158536 +settled_accuracy_p99 = 0.13708254701570843 +settled_accuracy_p99_ci_low = 0.13556759488598724 +settled_accuracy_p99_ci_high = 0.14077847625904927 +settled_accuracy_mean = 0.09622026850012912 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0 +jitter_p90_per_min_ci_low = 0 +jitter_p90_per_min_ci_high = 0 +jitter_p95_per_min = 0 +jitter_p95_per_min_ci_low = 0 +jitter_p95_per_min_ci_high = 0 +jitter_p99_per_min = 0 +jitter_p99_per_min_ci_low = 0 +jitter_p99_per_min_ci_high = 0 +jitter_mean_per_min = 0.00019747235387045816 +reaction_rate = 0.043 +reaction_rate_ci_low = 0.030426787140909448 +reaction_rate_ci_high = 0.055573212859090546 +reaction_p10_secs = 60 +reaction_p10_secs_ci_low = 60 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 120 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 240 +reaction_p90_secs_ci_low = 240 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 168.8372093023256 +step_correction_mean = -0.2959065395732259 +step_correction_p50 = -0.31165894865989685 + +[cell.spm_30.step_plus_25_at_15min] +shares_per_minute = 30 +scenario = "step_plus_25_at_15min" +convergence_rate = 0.746 +convergence_rate_ci_low = 0.7190199752705821 +convergence_rate_ci_high = 0.7729800247294178 +convergence_p10_secs = 0 +convergence_p10_secs_ci_low = 0 +convergence_p10_secs_ci_high = 0 +convergence_p50_secs = 1140 +convergence_p50_secs_ci_low = 1080 +convergence_p50_secs_ci_high = 1200 +convergence_p90_secs = 1440 +convergence_p90_secs_ci_low = 1440 +convergence_p90_secs_ci_high = 1500 +convergence_p95_secs = 1500 +convergence_p95_secs_ci_low = 1500 +convergence_p95_secs_ci_high = 1500 +convergence_p99_secs = 1500 +convergence_p99_secs_ci_low = 1500 +convergence_p99_secs_ci_high = 1500 +convergence_mean_secs = 878.1233243967829 +settled_accuracy_p10 = 0.13170742339979724 +settled_accuracy_p10_ci_low = 0.1304942025459277 +settled_accuracy_p10_ci_high = 0.13240562400182276 +settled_accuracy_p50 = 0.1437107292360349 +settled_accuracy_p50_ci_low = 0.14301558879812426 +settled_accuracy_p50_ci_high = 0.1446568568184644 +settled_accuracy_p90 = 0.20000003221225382 +settled_accuracy_p90_ci_low = 0.20000003221225382 +settled_accuracy_p90_ci_high = 0.22570873937774083 +settled_accuracy_p95 = 0.23049204432492032 +settled_accuracy_p95_ci_low = 0.22784124426917163 +settled_accuracy_p95_ci_high = 0.2315556392596937 +settled_accuracy_p99 = 0.2361859360011236 +settled_accuracy_p99_ci_low = 0.23515949253244794 +settled_accuracy_p99_ci_high = 0.2398275849850524 +settled_accuracy_mean = 0.1600244377190033 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.05555555555555555 +jitter_p90_per_min_ci_low = 0.05 +jitter_p90_per_min_ci_high = 0.058823529411764705 +jitter_p95_per_min = 0.0625 +jitter_p95_per_min_ci_low = 0.05555555555555555 +jitter_p95_per_min_ci_high = 0.06666666666666667 +jitter_p99_per_min = 0.07142857142857142 +jitter_p99_per_min_ci_low = 0.06666666666666667 +jitter_p99_per_min_ci_high = 0.07692307692307693 +jitter_mean_per_min = 0.008417878869629629 +reaction_rate = 0.117 +reaction_rate_ci_low = 0.09707816430145054 +reaction_rate_ci_high = 0.1369218356985495 +reaction_p10_secs = 180 +reaction_p10_secs_ci_low = 180 +reaction_p10_secs_ci_high = 180 +reaction_p50_secs = 240 +reaction_p50_secs_ci_low = 240 +reaction_p50_secs_ci_high = 300 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 249.74358974358975 +step_correction_mean = 0.3307691044532336 +step_correction_p50 = 0.3279520869255066 + +[cell.spm_30.step_plus_50_at_15min] +shares_per_minute = 30 +scenario = "step_plus_50_at_15min" +convergence_rate = 0.998 +convergence_rate_ci_low = 0.995230914663648 +convergence_rate_ci_high = 1 +convergence_p10_secs = 840 +convergence_p10_secs_ci_low = 780 +convergence_p10_secs_ci_high = 900 +convergence_p50_secs = 1080 +convergence_p50_secs_ci_low = 1080 +convergence_p50_secs_ci_high = 1080 +convergence_p90_secs = 1200 +convergence_p90_secs_ci_low = 1200 +convergence_p90_secs_ci_high = 1260 +convergence_p95_secs = 1320 +convergence_p95_secs_ci_low = 1260 +convergence_p95_secs_ci_high = 1320 +convergence_p99_secs = 1380 +convergence_p99_secs_ci_low = 1380 +convergence_p99_secs_ci_high = 1440 +convergence_mean_secs = 1069.2985971943888 +settled_accuracy_p10 = 0.2555542650769681 +settled_accuracy_p10_ci_low = 0.2498080910203777 +settled_accuracy_p10_ci_high = 0.25830080715856507 +settled_accuracy_p50 = 0.2730879320278482 +settled_accuracy_p50_ci_low = 0.2726270730934528 +settled_accuracy_p50_ci_high = 0.27382545843630446 +settled_accuracy_p90 = 0.2817473018434089 +settled_accuracy_p90_ci_low = 0.2812239421875933 +settled_accuracy_p90_ci_high = 0.2827324152184648 +settled_accuracy_p95 = 0.2861130913196833 +settled_accuracy_p95_ci_low = 0.2834334344052468 +settled_accuracy_p95_ci_high = 0.2882881790600482 +settled_accuracy_p99 = 0.2986869211357218 +settled_accuracy_p99_ci_low = 0.29558268881235295 +settled_accuracy_p99_ci_high = 0.30106190381045017 +settled_accuracy_mean = 0.25988554292546884 +jitter_p10_per_min = 0 +jitter_p10_per_min_ci_low = 0 +jitter_p10_per_min_ci_high = 0 +jitter_p50_per_min = 0 +jitter_p50_per_min_ci_low = 0 +jitter_p50_per_min_ci_high = 0 +jitter_p90_per_min = 0.09090909090909091 +jitter_p90_per_min_ci_low = 0.07692307692307693 +jitter_p90_per_min_ci_high = 0.09090909090909091 +jitter_p95_per_min = 0.09090909090909091 +jitter_p95_per_min_ci_low = 0.09090909090909091 +jitter_p95_per_min_ci_high = 0.1 +jitter_p99_per_min = 0.1 +jitter_p99_per_min_ci_low = 0.1 +jitter_p99_per_min_ci_high = 0.1 +jitter_mean_per_min = 0.025913650229999953 +reaction_rate = 0.77 +reaction_rate_ci_low = 0.7439165309055716 +reaction_rate_ci_high = 0.7960834690944284 +reaction_p10_secs = 120 +reaction_p10_secs_ci_low = 120 +reaction_p10_secs_ci_high = 120 +reaction_p50_secs = 180 +reaction_p50_secs_ci_low = 180 +reaction_p50_secs_ci_high = 180 +reaction_p90_secs = 300 +reaction_p90_secs_ci_low = 300 +reaction_p90_secs_ci_high = 300 +reaction_p99_secs = 300 +reaction_p99_secs_ci_low = 300 +reaction_p99_secs_ci_high = 300 +reaction_mean_secs = 200.88311688311688 +step_correction_mean = 0.18599189372805805 +step_correction_p50 = 0.18162354826927185 + +[derived.operational_fitness.spm_6] +score = 0.6804449239589276 +reaction_10_component = 0.329 +reaction_50_component = 0.871 +jitter_component = 0.8922404846427082 +step_safety_component = 0.6966125369694303 +convergence_component = 0.5 +overshoot_component = 0.7178166855589305 + +[derived.operational_fitness.spm_8] +score = 0.7017003548763115 +reaction_10_component = 0.3 +reaction_50_component = 0.923 +jitter_component = 0.8974959544383851 +step_safety_component = 0.7547511104632165 +convergence_component = 0.5 +overshoot_component = 0.7633858865091117 + +[derived.operational_fitness.spm_10] +score = 0.7244364737276492 +reaction_10_component = 0.547 +reaction_50_component = 0.997 +jitter_component = 0.795728203148317 +step_safety_component = 0.7829604527323815 +convergence_component = 0.4 +overshoot_component = 0.880143097574746 + +[derived.operational_fitness.spm_12] +score = 0.7407672616646013 +reaction_10_component = 0.521 +reaction_50_component = 0.997 +jitter_component = 0.8412290718472101 +step_safety_component = 0.8190133443627352 +convergence_component = 0.4 +overshoot_component = 0.8785665761211492 + +[derived.operational_fitness.spm_15] +score = 0.7626783789470629 +reaction_10_component = 0.491 +reaction_50_component = 0.998 +jitter_component = 0.897288427514929 +step_safety_component = 0.8481159957938846 +convergence_component = 0.4 +overshoot_component = 0.9287727311985958 + +[derived.operational_fitness.spm_20] +score = 0.8698950000490812 +reaction_10_component = 0.511 +reaction_50_component = 0.999 +jitter_component = 0.9533800001963246 +step_safety_component = 1 +convergence_component = 0.7 +overshoot_component = 1 + +[derived.operational_fitness.spm_25] +score = 0.8812280405059502 +reaction_10_component = 0.539 +reaction_50_component = 0.999 +jitter_component = 0.9819121620238008 +step_safety_component = 1 +convergence_component = 0.7 +overshoot_component = 1 + +[derived.operational_fitness.spm_30] +score = 0.8487074004987312 +reaction_10_component = 0.504 +reaction_50_component = 0.999 +jitter_component = 0.992829601994925 +step_safety_component = 1 +convergence_component = 0.5 +overshoot_component = 1 + +[derived.comprehensive_fitness.spm_6] +score = 0.7443559391671422 +operational_component = 0.6804449239589276 +counter_age_component = 1 + +[derived.comprehensive_fitness.spm_8] +score = 0.7613602839010494 +operational_component = 0.7017003548763115 +counter_age_component = 1 + +[derived.comprehensive_fitness.spm_10] +score = 0.7795491789821194 +operational_component = 0.7244364737276492 +counter_age_component = 1 + +[derived.comprehensive_fitness.spm_12] +score = 0.792613809331681 +operational_component = 0.7407672616646013 +counter_age_component = 1 + +[derived.comprehensive_fitness.spm_15] +score = 0.8101427031576505 +operational_component = 0.7626783789470629 +counter_age_component = 1 + +[derived.comprehensive_fitness.spm_20] +score = 0.895916000039265 +operational_component = 0.8698950000490812 +counter_age_component = 1 + +[derived.comprehensive_fitness.spm_25] +score = 0.9049824324047602 +operational_component = 0.8812280405059502 +counter_age_component = 1 + +[derived.comprehensive_fitness.spm_30] +score = 0.878965920398985 +operational_component = 0.8487074004987312 +counter_age_component = 1 + +[derived.decoupling_score.spm_6] +score = 0.871 +score_ci_low = 0.7729309931391235 +score_ci_high = 0.8917759075469641 + +[derived.decoupling_score.spm_8] +score = 0.923 +score_ci_low = 0.9064764908811718 +score_ci_high = 0.9395235091188283 + +[derived.decoupling_score.spm_10] +score = 0.8797058823529411 +score_ci_low = 0.8694089919125195 +score_ci_high = 0.8823529411764706 + +[derived.decoupling_score.spm_12] +score = 0.8973 +score_ci_low = 0.8890197210534034 +score_ci_high = 0.9 + +[derived.decoupling_score.spm_15] +score = 0.998 +score_ci_low = 0.9122950051083439 +score_ci_high = 1 + +[derived.decoupling_score.spm_20] +score = 0.999 +score_ci_low = 0.9970409802451226 +score_ci_high = 1 + +[derived.decoupling_score.spm_25] +score = 0.999 +score_ci_low = 0.9970409802451226 +score_ci_high = 1 + +[derived.decoupling_score.spm_30] +score = 0.999 +score_ci_low = 0.9970409802451226 +score_ci_high = 1 + +[derived.reaction_asymmetry.spm_6] +asymmetry_at_5 = 0.025999999999999968 +asymmetry_at_5_ci_low = -0.030335132454539337 +asymmetry_at_5_ci_high = 0.08233513245453927 +asymmetry_at_10 = 0.025999999999999968 +asymmetry_at_10_ci_low = -0.032780166238163266 +asymmetry_at_10_ci_high = 0.0847801662381632 +asymmetry_at_25 = 0.0030000000000000027 +asymmetry_at_25_ci_low = -0.058973389917116315 +asymmetry_at_25_ci_high = 0.06497338991711638 +asymmetry_at_50 = -0.03700000000000003 +asymmetry_at_50_ci_low = -0.0808377043199825 +asymmetry_at_50_ci_high = 0.0068377043199824294 +max_abs_asymmetry = 0.03700000000000003 +max_abs_asymmetry_ci_low = 0 +max_abs_asymmetry_ci_high = 0.0808377043199825 + +[derived.reaction_asymmetry.spm_8] +asymmetry_at_5 = 0.008000000000000007 +asymmetry_at_5_ci_low = -0.049277661338871126 +asymmetry_at_5_ci_high = 0.06527766133887114 +asymmetry_at_10 = 0.064 +asymmetry_at_10_ci_low = 0.005775000792978102 +asymmetry_at_10_ci_high = 0.1222249992070219 +asymmetry_at_25 = 0.030000000000000027 +asymmetry_at_25_ci_low = -0.03098388747202152 +asymmetry_at_25_ci_high = 0.09098388747202157 +asymmetry_at_50 = -0.051000000000000045 +asymmetry_at_50_ci_low = -0.08823060996853682 +asymmetry_at_50_ci_high = -0.013769390031463269 +max_abs_asymmetry = 0.064 +max_abs_asymmetry_ci_low = 0.005775000792978102 +max_abs_asymmetry_ci_high = 0.1222249992070219 + +[derived.reaction_asymmetry.spm_10] +asymmetry_at_5 = -0.10000000000000003 +asymmetry_at_5_ci_low = -0.16034588190389554 +asymmetry_at_5_ci_high = -0.03965411809610453 +asymmetry_at_10 = -0.19400000000000006 +asymmetry_at_10_ci_low = -0.25447381887307113 +asymmetry_at_10_ci_high = -0.133526181126929 +asymmetry_at_25 = -0.376 +asymmetry_at_25_ci_low = -0.4291372036534051 +asymmetry_at_25_ci_high = -0.322862796346595 +asymmetry_at_50 = -0.19299999999999995 +asymmetry_at_50_ci_low = -0.22060436332035438 +asymmetry_at_50_ci_high = -0.16500591315109636 +max_abs_asymmetry = 0.376 +max_abs_asymmetry_ci_low = 0.322862796346595 +max_abs_asymmetry_ci_high = 0.429137203653405 + +[derived.reaction_asymmetry.spm_12] +asymmetry_at_5 = -0.11699999999999999 +asymmetry_at_5_ci_low = -0.17573330066517995 +asymmetry_at_5_ci_high = -0.05826669933482004 +asymmetry_at_10 = -0.23800000000000004 +asymmetry_at_10_ci_low = -0.2968825546503414 +asymmetry_at_10_ci_high = -0.17911744534965862 +asymmetry_at_25 = -0.46799999999999997 +asymmetry_at_25_ci_low = -0.52068010256903 +asymmetry_at_25_ci_high = -0.4153198974309699 +asymmetry_at_50 = -0.22599999999999998 +asymmetry_at_50_ci_low = -0.2550435991061143 +asymmetry_at_50_ci_high = -0.1965666773653365 +max_abs_asymmetry = 0.46799999999999997 +max_abs_asymmetry_ci_low = 0.41531989743097 +max_abs_asymmetry_ci_high = 0.52068010256903 + +[derived.reaction_asymmetry.spm_15] +asymmetry_at_5 = -0.22299999999999998 +asymmetry_at_5_ci_low = -0.2775281323721519 +asymmetry_at_5_ci_high = -0.16847186762784805 +asymmetry_at_10 = -0.31999999999999995 +asymmetry_at_10_ci_low = -0.3743215675931142 +asymmetry_at_10_ci_high = -0.26567843240688577 +asymmetry_at_25 = -0.5269999999999999 +asymmetry_at_25_ci_low = -0.5783978739838999 +asymmetry_at_25_ci_high = -0.4756021260161001 +asymmetry_at_50 = -0.26 +asymmetry_at_50_ci_low = -0.2892542915813272 +asymmetry_at_50_ci_high = -0.2299766230823208 +max_abs_asymmetry = 0.5269999999999999 +max_abs_asymmetry_ci_low = 0.4756021260161 +max_abs_asymmetry_ci_high = 0.5783978739838997 + +[derived.reaction_asymmetry.spm_20] +asymmetry_at_5 = -0.16899999999999998 +asymmetry_at_5_ci_low = -0.2222121477823748 +asymmetry_at_5_ci_high = -0.11578785221762516 +asymmetry_at_10 = -0.40800000000000003 +asymmetry_at_10_ci_low = -0.45782238699610084 +asymmetry_at_10_ci_high = -0.3581776130038992 +asymmetry_at_25 = -0.599 +asymmetry_at_25_ci_low = -0.6483067076060481 +asymmetry_at_25_ci_high = -0.5496932923939518 +asymmetry_at_50 = -0.243 +asymmetry_at_50_ci_low = -0.27062023482991837 +asymmetry_at_50_ci_high = -0.21442074541520417 +max_abs_asymmetry = 0.599 +max_abs_asymmetry_ci_low = 0.5496932923939518 +max_abs_asymmetry_ci_high = 0.6483067076060481 + +[derived.reaction_asymmetry.spm_25] +asymmetry_at_5 = -0.244 +asymmetry_at_5_ci_low = -0.29331846844876386 +asymmetry_at_5_ci_high = -0.19468153155123613 +asymmetry_at_10 = -0.47200000000000003 +asymmetry_at_10_ci_low = -0.518392428735504 +asymmetry_at_10_ci_high = -0.4256075712644961 +asymmetry_at_25 = -0.709 +asymmetry_at_25_ci_low = -0.7525449602429961 +asymmetry_at_25_ci_high = -0.6654550397570038 +asymmetry_at_50 = -0.23099999999999998 +asymmetry_at_50_ci_low = -0.2581625862941721 +asymmetry_at_50_ci_high = -0.20287839395095042 +max_abs_asymmetry = 0.709 +max_abs_asymmetry_ci_low = 0.6654550397570038 +max_abs_asymmetry_ci_high = 0.7525449602429961 + +[derived.reaction_asymmetry.spm_30] +asymmetry_at_5 = -0.22500000000000003 +asymmetry_at_5_ci_low = -0.27334764293425606 +asymmetry_at_5_ci_high = -0.17665235706574395 +asymmetry_at_10 = -0.461 +asymmetry_at_10_ci_low = -0.5045625422225989 +asymmetry_at_10_ci_high = -0.4174374577774011 +asymmetry_at_25 = -0.762 +asymmetry_at_25_ci_low = -0.8021354136698043 +asymmetry_at_25_ci_high = -0.7218645863301956 +asymmetry_at_50 = -0.22899999999999998 +asymmetry_at_50_ci_low = -0.25608346909442836 +asymmetry_at_50_ci_high = -0.20095751115069416 +max_abs_asymmetry = 0.762 +max_abs_asymmetry_ci_low = 0.7218645863301956 +max_abs_asymmetry_ci_high = 0.8021354136698045 + diff --git a/sv2/channels-sv2/sim/docs/CKPOOL_INVESTIGATION.md b/sv2/channels-sv2/sim/docs/CKPOOL_INVESTIGATION.md new file mode 100644 index 0000000000..e0d8c58f4f --- /dev/null +++ b/sv2/channels-sv2/sim/docs/CKPOOL_INVESTIGATION.md @@ -0,0 +1,344 @@ +# Ckpool Vardiff Investigation + +## Background + +[ckpool](https://github.com/ckolivas/ckpool) is a mature Stratum V1 pool +by Con Kolivas with a well-regarded vardiff implementation. A [Rust +reimplementation](https://github.com/parasitepool/para/blob/master/src/vardiff.rs) +by @paratoxicdev made the algorithm more configurable. This investigation +ports ckpool's core ideas to our tick-based SV2 framework, benchmarks +them against the existing roster, and identifies which ideas transfer +and which are context-dependent. + +## Ckpool's Algorithm (src/stratifier.c) + +### Core: Exponentially Decaying Shares-Per-Second + +ckpool tracks `dsps` (difficulty-weighted shares per second) using an EMA +updated on every share submission via `decay_time()`: + +```c +fprop = 1 - e^(-elapsed / interval) +f += (share_diff / elapsed) * fprop +f /= (1 + fprop) +``` + +Five parallel EMAs with different time constants (1m, 5m, 1h, 1d, 1w) are +maintained per client. + +### Adaptive Window Switching + +When shares flood in (`ssdc >= 72`), the 1-minute EMA is used for +evaluation — enabling rapid ramp-up. Otherwise the 5-minute EMA provides +conservative steady-state tracking. The threshold 72 = `240s / 3.33s` +(shares expected in 80% of the long window at target rate). + +### Hysteresis Band + +No retarget if the diff-rate-ratio (`drr = dsps / current_diff`) falls +within [0.15, 0.4] around the target 0.3 (~1 share per 3.33s). The band +is asymmetric: 0.5× below target, 1.33× above. + +### Oscillation Guard + +Suppress difficulty decrease if only 1 share has been observed since the +last change — prevents premature drops after idle periods. + +### Time-Bias Warmup Correction + +`bias = 1 - e^(-elapsed/period)` compensates for EMA suppression when the +client has been active for less than one full window period. + +## Mapping to the Three-Stage Pipeline + +### First Attempt: Direct Translation (Batch EMA + Time-Bias) + +The initial port treated one tick as one "observation" — batching all shares +into a single EMA step, then dividing by the time-bias factor to compensate +for warmup: + +| Stage | Component | +|-------|-----------| +| Estimator | Dual-window EWMA (τ_short=60s, τ_long=300s) with time-bias correction | +| Boundary | HysteresisGate [0.5, 1.33] with data gate (72 shares OR 240s) | +| Update | CkpoolRetarget (full retarget + oscillation guard) | + +**Result: Catastrophic.** The hysteresis band was too wide for 60s-tick +evaluation — rate ratios wandered far from 1.0 while staying "inside" the +band. Settled accuracy 59-73% at SPM 6-12. Overshoot 100-200%. + +### CkpoolRemedy (ckpool estimator + FullRemedy boundary/update) + +Kept ckpool's estimator but replaced the boundary and update with proven +components (PoissonCI + PartialRetarget η=0.2): + +**Result: Also bad.** Settled accuracy 177-275%, overshoot 350-427%. +The time-bias correction (`1 / (1 - e^(-60/300)) ≈ 1/0.18 ≈ 5.5×`) +massively amplified the rate estimate on every tick after a fire. + +### Root Cause: Time-Bias Is Not Portable + +The time-bias formula was calibrated for per-share evaluation (~3.33s +intervals) where `dt` grows smoothly. In the tick-based framework, +`dt` after a fire is always exactly 60s. With τ=300s: + +``` +time_bias(60, 300) = 1 - e^(-0.2) ≈ 0.18 +correction = rate / 0.18 = rate × 5.5 +``` + +This amplification is the overshoot source: the EMA is naturally low +after a fire (only one tick of data), and dividing by 0.18 inflates it +by 5.5× — a 450% bias on the first tick after every retarget. + +## The Fix: Per-Share `decay_time()` Simulation + +Instead of batch updates with post-hoc bias correction, we simulate +ckpool's exact per-share EMA updates within `snapshot()`: + +When N shares arrive in a 60s tick, run N individual `decay_time()` calls +with `elapsed = 60/N` seconds each. This faithfully reproduces what +ckpool's EMA would have seen — the decay accumulates organically through +per-share updates rather than needing artificial amplification. + +```rust +fn snapshot(&self, dt_secs: u64, ctx: &EstimatorContext) -> EstimatorSnapshot { + // ... + if pending > 0 { + let inter_share_secs = self.tick_secs as f64 / pending as f64; + for _ in 0..pending { + dsps_s = Self::decay_time(dsps_s, 1.0, inter_share_secs, self.tau_short as f64); + dsps_l = Self::decay_time(dsps_l, 1.0, inter_share_secs, self.tau_long as f64); + } + } + // ... +} +``` + +**Result:** Completely fixed the bias. Settled accuracy dropped from +177% to 4.6-7.5% — matching FullRemedy. Overshoot collapsed from 350% +to 0-9%. + +### Lesson + +When porting a continuous-time algorithm (per-share evaluation) to a +discrete-time framework (per-tick evaluation), the correct approach is to +simulate the original update cadence within each tick, not to apply a +time-domain correction factor. The `on_fire()` feedback mechanism of +the Estimator trait enables this: the estimator knows when retargets +happened and can simulate share arrivals between ticks accordingly. + +## Parameter Sweep + +With the per-share simulation working correctly, we swept the key axes: + +| Variant | τ_short | τ_long | ft | Boundary | η | Key insight | +|---------|---------|--------|-----|----------|-----|-------------| +| CkpoolRemedy | 60 | 300 | 72 | PoissonCI | 0.2 | Zero overshoot, weak reaction | +| CkpoolRemedy-ft12 | 60 | 300 | 12 | PoissonCI | 0.2 | Better reaction, more overshoot | +| Ck-tl120-eta20 | 60 | 120 | 12 | PoissonCI | 0.2 | **Best balanced** | +| Ck-tl120-eta35 | 60 | 120 | 12 | PoissonCI | 0.35 | Accuracy/overshoot degrades | +| Ck-cusum-eta20 | 60 | 300 | 12 | AsymCUSUM | 0.2 | 96-98% reaction, high jitter | +| Ck-tl120-cusum-eta30 | 60 | 120 | 12 | AsymCUSUM | 0.3 | Reaction good, fitness poor | +| Ck-ts30-tl120-eta30 | 30 | 120 | 8 | PoissonCI | 0.3 | Shorter τ_short helps ramp | +| Ck-tl120-accel | 60 | 120 | 12 | PoissonCI | 0.2→0.6 | Overshoot too high from η ramp | + +### Results at SPM 4-5 (where ckpool's ideas matter most) + +| Variant | Reaction -50% | Accuracy p50 | Overshoot p99 | Jitter | Fitness | +|---------|:---:|:---:|:---:|:---:|:---:| +| FullRemedy | 70 / 82% | 7.6 / 7.4% | 7.7 / 7.1% | 0.042 / 0.032 | **0.691 / 0.732** | +| Ck-cusum-eta20 | **96 / 98%** | 9.3 / 9.1% | 24.5 / 15.1% | 0.158 / 0.140 | 0.612 / 0.644 | +| Ck-tl120-eta20 | 67 / 77% | 9.7 / 7.4% | 20.1 / 19.3% | 0.065 / 0.057 | 0.656 / 0.675 | +| CkpoolRemedy | 55 / 53% | 9.1 / 7.7% | **0 / 0%** | **0.009 / 0.031** | 0.679 / 0.682 | +| VardiffState | **99 / 99%** | 12.3 / 11.8% | 44.4 / 32.4% | 0.143 / 0.118 | 0.626 / 0.658 | +| AdaCUSUM η=0.2 | **99 / 99%** | 8.4 / 6.4% | 29.5 / 28.2% | 0.220 / 0.192 | 0.633 / 0.662 | + +### Key Findings + +1. **The boundary is the decisive axis.** CUSUM gives 96-99% reaction at + the cost of 3-5× jitter. PoissonCI gives low jitter at the cost of + 67-77% reaction. No ckpool estimator tuning escapes this trade-off — + it's the same fundamental boundary-axis trade-off that differentiates + FullRemedy from AdaCUSUM. + +2. **Shorter τ_long (120s) helps more than lower fast-threshold.** Once + the long-window EMA is responsive enough (τ=120s), the dual-window + switching becomes redundant — you're effectively running a single + EWMA(120s) that happens to have slightly different decay dynamics. + +3. **Higher η degrades everything except reaction rate.** η=0.35 improves + reaction by ~3% but costs 7% accuracy and 15% overshoot. The + AcceleratingPartialRetarget variant is even worse (91% overshoot) because + it ramps η during cold-start when the estimator is already noisy. + +4. **CkpoolRemedy (default ft=72) achieves zero overshoot** because the + long-window EMA (τ=300s) dampens cold-start ramp so aggressively that + the target never overshoots truth. But this same conservatism kills + reaction rate (55% at SPM 4). + +## What Transfers and What Doesn't + +### Transfers (worth keeping) + +- **Per-share `decay_time()` simulation** — the correct technique for + porting continuous-time EMAs to tick-based evaluation. Available via + `CkpoolEstimator` for future composition experiments. + +- **Oscillation guard** — `CkpoolRetarget`'s suppression of difficulty + decrease on insufficient data is a sound principle, though + PartialRetarget's damping (η=0.2) already limits per-fire moves enough + to make the guard redundant in practice. + +### Does not transfer + +- **Time-bias warmup correction** — calibrated for per-share evaluation + intervals (~3.33s); catastrophic at 60s ticks. The per-share simulation + makes it unnecessary. + +- **Wide hysteresis band [0.5, 1.33]** — designed for a context where the + estimator converges tightly before the gate opens. At 60s ticks, the + estimator is noisier when evaluated, so the band must be narrower or + replaced entirely with a statistical boundary. + +- **Dual-window adaptive switching** — an elegant idea in ckpool's native + context (short window for fast ramp-up, long window for stability), but + once τ_long is shortened to match the tick cadence, the switching adds + complexity without performance benefit. A single EWMA(120s) achieves the + same balance. + +- **Share-count data gate (72 shares)** — meaningless in the tick framework + where evaluation happens on a fixed schedule regardless of share arrival. + +## Hysteresis Boundary Sweep + +The original investigation only tested ckpool's native hysteresis [0.5, 1.33] +and one narrowed variant [0.8, 1.2]. A proper parameter sweep was run across +band widths from [0.5, 1.33] (native) through [0.9, 1.1] (very narrow), with +data gates of 2/4/6 shares, paired with both PartialRetarget(0.2) and +AcceleratingPartialRetarget(0.2, 0.4, 0.2). + +### Results (comprehensive fitness, SPM 4 / 10 / 20 / 30) + +| Boundary | SPM 4 | SPM 10 | SPM 20 | SPM 30 | +|----------|:---:|:---:|:---:|:---:| +| AdaptiveBoundary-spm10 (production) | 0.689 | 0.774 | 0.882 | 0.869 | +| VardiffState (CUSUM) | 0.706 | 0.783 | 0.894 | 0.874 | +| Hyst [0.7, 1.3] gate4 | 0.621 | 0.695 | 0.666 | 0.608 | +| Hyst [0.8, 1.2] gate4 | 0.572 | 0.675 | 0.723 | 0.726 | +| Hyst [0.85, 1.15] gate4 | 0.578 | 0.634 | 0.706 | 0.730 | +| Hyst [0.9, 1.1] gate4 | 0.582 | 0.615 | 0.637 | 0.669 | +| Hyst [0.8, 1.2] + AccelRetarget | 0.487 | 0.664 | 0.740 | 0.758 | +| Hyst [0.5, 1.33] gate4 (native) | 0.630 | 0.542 | 0.508 | 0.504 | + +### Key Finding: Hysteresis trades reaction for jitter + +Narrowing the band improves reaction rate dramatically — `Hyst [0.8, 1.2]` +achieves 96–100% reaction across all SPMs (better than any statistical +boundary). But jitter explodes to 0.15–0.32 fires/min at mid-SPMs vs +0.03/min for PoissonCI. The fundamental issue: hysteresis fires whenever +the rate ratio crosses the band threshold, with no evidence accumulation. +Statistical boundaries (PoissonCI, CUSUM) distinguish real changes from +noise by requiring cumulative evidence before firing. + +No hysteresis parameterization achieved competitive comprehensive fitness. +The best variant (`Hyst [0.7, 1.3]`) peaked at 0.706 at SPM 15 but +averaged 0.644 across the range vs 0.798 for the adaptive boundary. + +## Estimator Equivalence Test (Revised) + +The initial investigation claimed "estimation quality is equivalent" +between `CkpoolEstimator` (per-share `decay_time()` simulation) and +`EwmaEstimator(120s)`. This was tested under PoissonCI + PartialRetarget, +where the two estimators produce similar comprehensive fitness (~5% gap). + +A follow-up test paired `CkpoolEstimator` with the production-tuned +boundary and update (`AdaptivePoissonCusum(10) + AcceleratingPartialRetarget +(0.2, 0.4, 0.2)`) to confirm equivalence under the more demanding +composition: + +### Results: Not equivalent under CUSUM + +| Composition | SPM 4 | SPM 8 | SPM 12 | SPM 20 | SPM 30 | +|-------------|:---:|:---:|:---:|:---:|:---:| +| EWMA(120s) + AdpBnd + AccelRet (production) | 0.689 | 0.768 | 0.787 | 0.882 | 0.869 | +| CkpoolEstimator(60,300) + same bnd/update | 0.698 | 0.638 | 0.696 | 0.777 | 0.858 | +| CkpoolEstimator(60,120) + same bnd/update | 0.598 | 0.688 | 0.764 | 0.805 | 0.858 | + +The ckpool estimator underperforms EWMA(120s) significantly at mid-SPMs +(0.638–0.696 vs 0.768–0.787). Jitter is 2–3× higher (0.06–0.09/min vs +0.03/min), and reaction rate at low SPM drops to 48–57% (vs 73–94%). + +### Root cause: per-share simulation is noisier per tick + +The per-share `decay_time()` simulation runs N separate EMA decay steps +per tick (one per simulated share arrival). Each step introduces rounding +and the uniform inter-share spacing assumption adds variance. A single +batch EWMA update (`α × old + (1-α) × new`) produces a cleaner signal +per tick because it avoids the N-step accumulation error. + +Under PoissonCI (which requires large deviations to fire), both estimators +are "good enough" — the boundary's conservatism masks the noise difference. +Under CUSUM (which fires on smaller accumulated deviations), the ckpool +estimator's per-tick noise triggers more false fires → higher jitter → +lower fitness. + +### Revised conclusion on evaluation cadence + +The original claim "the evaluation cadence is just scheduling, not +information" was too strong. While the *information content* of N shares +in T seconds is identical regardless of evaluation cadence, the +*numerical stability* of the estimate depends on how that information is +processed. A single batch update is numerically cleaner than N simulated +updates, and this difference is operationally significant under aggressive +boundaries. + +## Conclusion + +ckpool's vardiff is well-optimized for its native per-share evaluation +context. When ported to the tick-based SV2 framework: + +1. **Estimator**: The per-share `decay_time()` simulation produces noisier + estimates than a batch EWMA(120s) under aggressive boundaries. The + simpler `EwmaEstimator(120s)` is preferred for production. + +2. **Boundary**: Hysteresis [0.5, 1.33] does not transfer — too wide for + 60s ticks. Narrower bands trade reaction for jitter without achieving + competitive fitness. Statistical boundaries (PoissonCI, CUSUM) dominate. + +3. **Update rule**: ckpool's full retarget is equivalent to η=1.0 in the + partial retarget framework. The damped AcceleratingPartialRetarget + (η capped at 0.4) outperforms full retarget on overshoot and jitter. + +The production recommendation: + +```rust +Composed::new( + EwmaEstimator::new(120), + AdaptivePoissonCusum::new(10), + AcceleratingPartialRetarget::new(0.2, 0.4, 0.2), + min_allowed_hashrate, + clock, +) +``` + +The `CkpoolEstimator` is preserved in the codebase for reference and as +a benchmark contender in the simulation grid. + +## Files Added + +### Production components (`src/vardiff/composed/`) + +- `estimator.rs` — `CkpoolEstimator` (per-share `decay_time()` simulation), + `TimeBiasEwmaEstimator` (single-window EWMA with time-bias correction) +- `boundary.rs` — `HysteresisGate` (ckpool's binary fire/no-fire gate) +- `update.rs` — `CkpoolRetarget` (full retarget with oscillation guard) + +### Grid registrations (`sim/src/grid.rs`) + +- `AlgorithmSpec::ckpool()` — native ckpool composition +- `AlgorithmSpec::ckpool_remedy()` — ckpool estimator + PoissonCI + PartialRetarget +- `AlgorithmSpec::ckpool_remedy_ft(n)` — with custom fast-threshold +- `AlgorithmSpec::ckpool_narrow_hyst()` — tightened hysteresis variant +- `AlgorithmSpec::ckpool_with(τs, τl, lo, hi)` — parametric exploration +- `AlgorithmSpec::time_bias_remedy()` — isolated time-bias test diff --git a/sv2/channels-sv2/sim/docs/DESIGN.md b/sv2/channels-sv2/sim/docs/DESIGN.md new file mode 100644 index 0000000000..9e643501e1 --- /dev/null +++ b/sv2/channels-sv2/sim/docs/DESIGN.md @@ -0,0 +1,678 @@ +# Vardiff simulation framework — design + +Architectural reference for `sv2/channels-sv2/sim`. Defines the +three-stage pipeline decomposition, the explicit inter-stage handoff +contracts, the `Composed` adapter, the algorithm registry, and the +simulation infrastructure. + +Empirical results are in [`FINDINGS.md`](./FINDINGS.md) and +[`pareto.md`](../pareto.md). + +## What this framework is + +A deterministic in-process harness for characterizing vardiff algorithm +behavior. Given an algorithm and a specification of share arrival +(Poisson with configurable rate) plus true hashrate evolution (piecewise +schedule), the framework runs many independent trials and reports +convergence time, settled accuracy, jitter, reaction time, estimator +bias/variance, peak excursion, ramp overshoot, and the cross-cutting +decoupling score. + +The framework's distinctive feature: it characterizes algorithms as +**compositions of three sequential stages** with explicit handoff +contracts between them, enabling controlled single-axis interventions +and principled cross-axis information flow. + +## The three-stage pipeline + +A vardiff algorithm answers three questions in sequence: + +1. **What is happening?** (Estimator — state estimation) +2. **Should I act?** (Boundary — decision theory) +3. **How should I act?** (UpdateRule — control theory) + +The deviation computation (`|h_estimate / current_h - 1| × 100`) is a +fixed normalization step performed by the `Composed` adapter between +stages 1 and 2 — not a configurable axis. It exists as arithmetic, not +as a trait. + +### Pipeline execution model + +``` +shares arrive → Estimator → Belief → [delta] → Boundary → fire? → UpdateRule → new target + ↑ │ + └──────────────── on_fire(new, old) ◄────────────────────────────┘ +``` + +On each tick, the `Composed` adapter executes: + +```rust +fn try_vardiff(&mut self, hashrate, target, spm) -> Option { + // Stage 1: Estimator produces its belief + let snap = self.estimator.snapshot(dt, &ctx); + + // Fixed normalization: deviation from target as percentage + let delta = |snap.h_estimate / hashrate - 1.0| × 100; + + // Stage 2: Boundary decides threshold (sees the full belief) + let threshold = self.boundary.threshold(dt, spm, &snap); + if delta < threshold { + return None; + } + + // Stage 3: UpdateRule computes the new target + let new_hashrate = self.update.next_hashrate(&snap, hashrate, delta, spm); + + // Feedback: notify estimator of the target change (NOT a forced reset) + self.estimator.on_fire(new_hashrate, hashrate); + Some(new_hashrate) +} +``` + +### Why sequential handoffs (not independence) + +The previous design claimed the axes were "input-domain-disjoint" +— each a pure function with its own inputs, swappable without affecting +the others. This is true at the *interface* level but false at the +*behavioral* level: + +- PoissonCI boundary was calibrated for EWMA's noise profile. Swapping + in CumulativeCounter (heavier tails) or Bayesian (slower deviation + from 1.0 after reset) produces pathological behavior. +- The (τ, η, z) parameter sweep is really a joint optimization over a + coupled system — each parameter's optimal value depends on the others. +- The boundary uses `dt_secs` as a *proxy* for estimator confidence. + For EWMA, this proxy is wrong (effective memory is τ, not dt). For + Bayesian, it's catastrophically wrong. + +The new design makes these couplings **explicit and principled**: + +1. The Estimator reports its confidence (not just a point estimate). +2. The Boundary uses that confidence directly (no proxy inference). +3. The UpdateRule knows how decisive the fire was (no blind η). +4. The Estimator is *notified* of fires, not *forced* to reset. + +This preserves composability (any Estimator works with any Boundary) +while enabling self-calibrating compositions where the Boundary +*adapts* to whatever noise the Estimator reports. + +## Stage 1: Estimator + +**Question:** Given a stream of share arrivals, what is the miner's +hashrate, and how confident am I? + +**Input:** Raw share count per tick, elapsed time, current target context. + +**Output:** `Belief` — a point estimate plus optional uncertainty. + +```rust +pub struct Belief { + /// Point estimate of miner's true hashrate (H/s). + pub h_estimate: f32, + /// Realized share rate over the observation window (shares/min). + pub realized_spm: f64, + /// Raw share count in the current window. + pub n_shares: u32, + /// Time elapsed since last fire (seconds). + pub dt_secs: u64, + /// Optional: how confident the estimator is. + /// None for estimators that don't track uncertainty. + pub uncertainty: Option, +} + +pub struct Uncertainty { + /// Standard deviation of the ratio estimate (h_estimate / current_h). + /// Dimensionless. Smaller = more confident. + pub ratio_std: f64, + /// Effective independent sample count informing this estimate. + /// Analogous to 1/(1-discount) for Bayesian, tau/tick for EWMA. + pub effective_n: f64, +} +``` + +**Trait:** + +```rust +pub trait Estimator: Debug + Send + Sync { + /// Accumulate one tick's worth of share observations. + fn observe(&mut self, n_shares: u32); + + /// Produce the current belief about the miner's hashrate. + fn belief(&self, dt_secs: u64, ctx: &EstimatorContext) -> Belief; + + /// Notification that the algorithm fired and changed the target. + /// `new_hashrate` is the new target; `old_hashrate` is what it was. + /// + /// Estimators choose how to respond: + /// - CumulativeCounter/EWMA: full reset (old absolute-rate data is + /// invalid under new target) + /// - Bayesian: rescale posterior to new baseline, preserving confidence + fn on_fire(&mut self, new_hashrate: f32, old_hashrate: f32); + + /// Raw share count since last fire (for Vardiff trait compatibility). + fn shares_count(&self) -> u32; +} +``` + +**Why `on_fire` instead of `reset`:** + +`reset()` imposes amnesia. For absolute-rate estimators (CumulativeCounter, +EWMA), amnesia is correct — their internal state is expressed relative +to the old target and becomes invalid after a retarget. + +For ratio-based estimators (Bayesian), the internal state is a belief +about `true_hashrate / assigned_hashrate`. After a fire, `assigned_hashrate` +changes to approximately `h_estimate`, so the new ratio should be +approximately 1.0. But the estimator's *confidence* in that ratio — +how many observations it's accumulated, how tight the posterior is — +is still valid information. Forced amnesia discards this, requiring +many ticks to rebuild confidence from scratch. + +`on_fire(new, old)` lets each estimator choose the appropriate response: +- Absolute-rate estimators: full reset (identical to old `reset()`) +- Ratio-based estimators: shift center to 1.0, preserve posterior mass + +### Shipped estimators + +| Estimator | Memory model | Uncertainty | on_fire behavior | +|-----------|-------------|-------------|-----------------| +| `CumulativeCounter` | Since last fire | None | Full reset | +| `EwmaEstimator(τ)` | Exponential decay | None (future: derive from τ) | Full reset | +| `SlidingWindowEstimator(N)` | Rectangular window | None | Full reset | +| `BayesianEstimator(discount, prior)` | Gamma posterior | `Some(Uncertainty)` | Rescale posterior, preserve confidence | + +### Fundamental trade-off: Memory vs Responsiveness + +All estimators face: short memory → responsive but noisy; long memory → +smooth but laggy. The Bayesian model adds a third option: uncertainty-aware +memory that *reports its own noise level* to downstream stages, +enabling the boundary to auto-calibrate. + +Rule of thumb: choose memory ≈ 2× the timescale of noise you want to +reject. At SPM=6 (41% per-tick RSD), that's τ=60–120s for EWMA, or +discount=0.85–0.95 for Bayesian. + +## Stage 2: Boundary + +**Question:** Given the deviation magnitude AND the estimator's +confidence, is this deviation real (signal) or noise? + +**Input:** `Belief` + `Deviation` + time + share rate. + +**Output:** Threshold θ. The algorithm fires iff `magnitude ≥ θ`. + +```rust +pub trait Boundary: Debug + Send + Sync { + /// Compute the threshold that deviation.magnitude must exceed to fire. + /// Receives the full Belief so uncertainty-aware boundaries can adapt. + fn threshold(&self, dt_secs: u64, spm: f32, belief: &Belief) -> f64; +} +``` + +**Why the Boundary sees the Belief:** + +The boundary's job is to separate signal from noise. To do this well, +it needs to know *how noisy the estimate is*. Currently: + +- `StepFunction` ignores noise entirely (rate-blind, time-based ladder) +- `PoissonCI` infers noise from `dt_secs × SPM` (a proxy that assumes + CumulativeCounter semantics) + +Neither adapts to the actual estimator. With access to `belief.uncertainty`: + +- `CredibleIntervalBoundary` fires when the posterior's credible + interval excludes ratio=1.0. This is self-calibrating: a confident + estimate (small `ratio_std`) triggers on small deviations; an + uncertain estimate (large `ratio_std`) requires large deviations. + +The backward-compatibility story: `StepFunction` and `PoissonCI` ignore +`belief.uncertainty` (it's `None` for all existing estimators). Their +behavior is byte-identical to the previous design. + +### Shipped boundaries + +| Boundary | Rate-aware? | Uncertainty-aware? | Behavior | +|----------|:-----------:|:------------------:|----------| +| `StepFunction` | No | No | Fixed lookup table from dt_secs | +| `PoissonCI(z, margin)` | Yes | No | Threshold from Poisson CI on expected share count | +| `CredibleIntervalBoundary(level)` | Yes | **Yes** | Fires when posterior CI excludes 1.0; falls back to PoissonCI when uncertainty unavailable | + +### Fundamental trade-off: Sensitivity vs Stability (Type I vs Type II) + +- Tight boundary (low θ): detects small changes, but fires on noise +- Loose boundary (high θ): ignores noise, but misses real changes +- Uncertainty-aware boundary: auto-calibrates θ based on estimator confidence + +Rule of thumb: pair noisy estimators with loose boundaries, smooth +estimators with tight boundaries. Or: use an uncertainty-reporting +estimator with a credible-interval boundary, and the pairing is automatic. + +## Stage 3: UpdateRule + +**Question:** The algorithm decided to fire. How far should the new +target move toward the estimate? + +**Input:** `Belief` + `Deviation` + fire margin + current hashrate + SPM. + +**Output:** New hashrate target. + +```rust +pub trait UpdateRule: Debug + Send + Sync { + fn act( + &self, + belief: &Belief, + current_hashrate: f32, + deviation: &Deviation, + margin: f64, // how far above threshold (deviation.magnitude - threshold) + spm: f32, + ) -> f32; +} +``` + +**Why the UpdateRule sees the margin:** + +A fire with `margin = 500%` (overwhelming evidence) should move more +aggressively than a fire with `margin = 0.1%` (barely triggered). The +existing `PartialRetarget` always moves η=20% regardless. With margin +visible, a future `AdaptivePartialRetarget` could scale η by confidence: + +``` +η_effective = η_base × clamp(margin / reference_margin, 0.5, 2.0) +``` + +Existing update rules ignore `margin` (backward compatible). + +### Shipped update rules + +| UpdateRule | Per-fire magnitude | Behavior | +|-----------|-------------------|----------| +| `FullRetargetWithClamp` | 100% (clamped) | Classic: jump to estimate, clamp to [/4, ×4] or [/2, ×2] | +| `PartialRetarget(η)` | η × gap | Move η fraction toward estimate | +| `FullRetargetNoClamp` | 100% | Jump directly to estimate | + +### Fundamental trade-off: Convergence vs Stability + +- Aggressive (high η): fast convergence, but amplifies estimation noise +- Damped (low η): stable, but slow convergence +- Margin-aware: aggressive when confident, damped when marginal + +Rule of thumb: pair η with boundary tightness. Tight boundary (frequent +fires) → small η. Loose boundary (rare fires) → large η. + +## Cross-stage coupling rules + +The three stages are *compositionally independent* (any combination of +impls compiles and runs) but *behaviorally coupled* (not all +combinations perform well). The couplings are: + +| Rule | Coupling | Why | +|------|----------|-----| +| 1 | Estimator noise ↔ Boundary width | Noisy estimator + tight boundary = false fires | +| 2 | Boundary tightness ↔ UpdateRule η | Tight boundary + aggressive update = oscillation | +| 3 | Estimator lag ↔ UpdateRule damping | Lagged estimate + aggressive update = undershoot | +| 4 | Share rate range ↔ Boundary type | Wide SPM range → need rate-aware boundary | +| 5 | Estimator uncertainty ↔ Boundary adaptation | **NEW**: uncertainty-reporting estimator + CI boundary = self-calibrating | + +Rule 5 is the key insight of the redesign: if the Estimator reports its +own noise level, the Boundary doesn't need to infer it from proxies +(dt_secs, SPM). The composition is automatically well-matched because +the information flow is explicit. + +## The `Composed` adapter + +```rust +pub struct Composed { + pub estimator: E, + pub statistic: S, + pub boundary: B, + pub update: U, + pub min_allowed_hashrate: f32, + pub clock: Arc, + timestamp_of_last_update: u64, + last_decision: Option, +} +``` + +`Composed` carries a blanket `impl Vardiff` and is a +drop-in replacement at any production call site that accepts +`Box`. + +The adapter holds no algorithm logic — it sequences the three stages +and manages the inter-fire timestamp. The only policy it imposes: +- The 15-second minimum inter-fire guard (matching VardiffState) +- The `min_allowed_hashrate` floor + +## Algorithm registry + +| Algorithm | Estimator | Boundary | UpdateRule | +|-----------|-----------|----------|-----------| +| `VardiffState` | (production reference, not introspectable) | — | — | +| `ClassicComposed` | `CumulativeCounter` | `StepFunction::classic_table()` | `FullRetargetWithClamp::classic()` | +| `Parametric` | `CumulativeCounter` | `PoissonCI(z=2.576, margin=0.05)` | `FullRetargetWithClamp::classic()` | +| `FullRemedy` | `EwmaEstimator(120s)` | `PoissonCI(z=2.576, margin=0.05)` | `PartialRetarget(η=0.2)` | +| **`AdaCUSUM`** | **`EwmaEstimator(120s)`** | **`AdaptiveCusumBoundary(s=1.5, f=0.05)`** | **`PartialRetarget(η=0.2)`** | +| `BayesianCI` | `BayesianEstimator(d=0.85, p=4.0)` | `CredibleIntervalBoundary(0.95)` | `PartialRetarget(η=0.3)` | + +`ClassicComposed` is asserted fire-for-fire equivalent to `VardiffState` +by the equivalence test suite. + +## Belief flow through the pipeline (worked example) + +**Setup:** SPM=6, stable load, BayesianEstimator, tick 10 after last fire. + +``` +Estimator state: alpha=47.3, beta=48.1 (10 ticks of ~6 shares each) + → ratio_mean = 0.983 + → ratio_std = 0.143 + → effective_n = 10.0 + +Belief: + h_estimate = current_h × 0.983 = 9.83e14 + uncertainty = Some(Uncertainty { ratio_std: 0.143, effective_n: 10.0 }) + +Deviation (fixed normalization): + delta = |0.983 - 1.0| × 100 = 1.7% + +Boundary (CredibleIntervalBoundary, level=0.95): + // 95% CI: ratio_mean ± 1.96 × ratio_std = [0.703, 1.263] + // Does CI exclude 1.0? No (1.0 ∈ [0.703, 1.263]) + // → threshold set HIGH (don't fire) + threshold = |ratio_mean - 1.0| + 1.96 × ratio_std = 1.7% + 28.0% = 29.7% + +Decision: 1.7% < 29.7% → HOLD. Correct: the miner IS on target. +``` + +**Same setup but after a -50% step, tick 5 after step:** + +``` +Estimator state: alpha=12.8, beta=25.1 (5 ticks of ~3 shares, prior from before) + → ratio_mean = 0.510 + → ratio_std = 0.144 + → effective_n = 5.0 + +Belief: + h_estimate = current_h × 0.510 = 5.10e14 + uncertainty = Some(Uncertainty { ratio_std: 0.144, effective_n: 5.0 }) + +Deviation (fixed normalization): + delta = |0.510 - 1.0| × 100 = 49.0% + +Boundary (CredibleIntervalBoundary, level=0.95): + // 95% CI: [0.228, 0.792] + // Does CI exclude 1.0? YES (1.0 > 0.792) + // → threshold set to the CI edge: |1.0 - upper_bound| × 100 = 20.8% + threshold = 20.8% + +Decision: 49.0% ≥ 20.8% → FIRE. +Margin: 49.0% - 20.8% = 28.2% (decisive) + +UpdateRule (PartialRetarget, η=0.3): + new_hashrate = current_h + 0.3 × (h_estimate - current_h) + = 1e15 + 0.3 × (5.1e14 - 1e15) + = 8.53e14 +``` + +## Trial recording + +Every tick of every trial is recorded as a `TickRecord`: + +```rust +pub struct TickRecord { + pub t_secs: u64, + pub n_shares: u32, + pub current_hashrate_before: f32, + pub delta: Option, + pub threshold: Option, + pub h_estimate: Option, + pub uncertainty: Option, // NEW: per-tick confidence + pub fired: bool, + pub new_hashrate: Option, +} +``` + +The optional fields are populated by `run_trial_observed` for algorithms +implementing the `Observable` trait. `Composed` implements +`Observable` natively via the `last_decision` field. + +## Scenarios + +```rust +pub enum Phase { + Hold { duration_secs: u64, h: f32 }, + Ramp { duration_secs: u64, from: f32, to: f32 }, + Stall { duration_secs: u64 }, +} +``` + +Named scenarios: `ColdStart` (10 GH/s → 1 PH/s), `Stable` (1 PH/s), +`Step { delta_pct }` (step change at 15 min). + +## Grid + +`Grid` is a Cartesian product over `algorithms × share_rates × scenarios`. +`Grid::run_paired` strips the algorithm index from the seed so all +algorithms see identical trial inputs — metric differences are +attributable to the algorithm alone. + +## Evaluation framework + +The metrics are organized by **what information is available at each +pipeline stage**, and what question each metric answers about that stage's +contribution. + +### Ground truth available at every tick + +The simulation knows `true_hashrate(t)` at every tick — real +production doesn't. This god's-eye view lets us measure things +algorithms can never measure about themselves: + +``` +true_hashrate(t) — from the HashrateSchedule +current_hashrate(t) — the target the algorithm has set +h_estimate(t) — the estimator's belief +ratio_std(t) — the estimator's self-reported uncertainty +delta(t) — the statistic's score +threshold(t) — the boundary's threshold +fired(t) — whether the algorithm acted +new_hashrate(t) — what the UpdateRule produced (if fired) +``` + +### Stage 1 metrics: Estimator quality + +These metrics evaluate the estimator IN ISOLATION — how well does it +track truth, independent of whether the rest of the pipeline acts on +that information? + +**Available data:** `h_estimate(t)`, `true_hashrate(t)`, `uncertainty(t)` + +| Metric | Formula | What it tells you | +|--------|---------|-------------------| +| **Bias** | `E[(h_estimate - true_h) / true_h]` post-settle | Systematic over/under-estimation | +| **Variance** | `Var[h_estimate / true_h]` post-settle | How noisy the belief is | +| **Tracking error** | `RMSE(h_estimate, true_h)` over full trial | Aggregate estimation quality | +| **Uncertainty calibration** | `P(true_h ∈ CI_reported)` vs nominal level | Does the estimator know what it doesn't know? | +| **Confidence recovery** | Ticks after fire until `ratio_std < X` | How fast the estimator rebuilds certainty | + +**Uncertainty calibration** is new and critical for the pipeline design. +If the Bayesian estimator reports `ratio_std = 0.14` (claiming 95% CI +of [0.73, 1.27]), we check what fraction of the time `true_h / current_h` +actually falls in that interval. An over-confident estimator (actual +coverage < 95%) causes the CI boundary to fire prematurely. An +under-confident estimator (actual coverage > 95%) causes missed detections. + +**Confidence recovery** measures the "post-fire blindness window" — +how long the estimator takes to build enough confidence for the boundary +to start making meaningful decisions. This is the BayesianCI's Achilles +heel at low SPM: after a fire resets the posterior, ratio_std is large, +so the CI boundary's threshold is wide, and several ticks must pass +before the posterior tightens enough to detect a new deviation. + +Applicable scenarios: all (bias/variance on Stable, tracking on Step/ColdStart, +calibration on all, confidence recovery on ColdStart). + +### Stage 2 metrics: Boundary decision quality + +The boundary is where signal/noise separation happens. Its metrics +measure the quality of its fire/no-fire decisions against ground truth. + +**Available data:** `fired(t)`, `delta(t)`, `threshold(t)`, +`true_hashrate(t)`, `current_hashrate(t)`, `uncertainty(t)` + +| Metric | Formula | What it tells you | +|--------|---------|-------------------| +| **Selectivity** (formerly "decoupling") | `reaction_rate × clamp(1 − jitter / J_max, 0, 1)` | Can it fire on signal AND stay quiet on noise? | +| **Reaction rate** | `P[fire within 5 min of step]` | Detection sensitivity | +| **Jitter** | Fires/min under stable load | False-positive rate | +| **Fire decisiveness** | `E[delta − threshold \| fired]` | How clearly signal exceeds threshold at fire time | +| **Threshold adaptiveness** | `Corr(threshold, 1/√effective_n)` | Does the boundary properly adapt to estimator confidence? | +| **False fire rate** | Fires under stable load / total ticks stable | Type I error rate | +| **Missed detection rate** | `1 − reaction_rate` at various step sizes | Type II error rate | + +**Selectivity** (renamed from "decoupling") is the composite operational +score. A selectivity of 1.0 means "fires on every real -50% step AND +never fires on noise." This is the primary comparison metric between +algorithms. + +**Fire decisiveness** distinguishes "barely squeaked past threshold" +fires (marginal evidence, likely to be wrong) from "overwhelming +evidence" fires. An algorithm that fires decisively is more trustworthy +— its fires are less likely to be Poisson flukes. + +**Threshold adaptiveness** is specific to uncertainty-aware boundaries +(CredibleIntervalBoundary). It checks whether the threshold actually +responds to the estimator's reported confidence. For PoissonCI this is +always 0 (threshold ignores uncertainty). For CI boundary it should be +strongly positive (threshold shrinks as confidence grows). + +Applicable scenarios: Step (reaction rate, decisiveness), Stable +(jitter, false fire rate), both (selectivity). + +### Stage 3 metrics: UpdateRule outcome quality + +The UpdateRule transforms a fire decision into an action. Its metrics +measure whether that action was appropriate given what was known. + +**Available data:** `new_hashrate(t)`, `h_estimate(t)`, +`true_hashrate(t)`, `current_hashrate(t)`, `delta(t)`, `threshold(t)` + +| Metric | Formula | What it tells you | +|--------|---------|-------------------| +| **Overshoot** | `max(new_h / true_h − 1)` over cold start | Did the update rule push the target past truth? | +| **Convergence rate** | `P[reaches within 10% of truth within 30 min]` | Does the algorithm settle? | +| **Convergence time** | Ticks to first fire followed by stable window | How fast does it settle? | +| **Step correction** | `(new_h − current_h) / (true_h − current_h)` at first fire after step | What fraction of the needed correction did the first fire accomplish? | +| **Oscillation** | `sign_changes(new_h − true_h) / N_fires` post-settle | Is the algorithm alternating over/under? | + +**Step correction** is a new metric that directly evaluates the +UpdateRule's aggressiveness against the ideal. A value of 1.0 means +"perfectly corrected in one fire." Below 1.0 means under-correction +(multiple fires needed). Above 1.0 means over-correction (oscillation). +The ideal depends on the composition — PartialRetarget(η=0.3) should +produce ~0.3 by design, and we verify it does. + +**Oscillation** detects the pathological case where the algorithm +alternates between over-target and under-target on successive fires. +This indicates the UpdateRule is too aggressive for the estimator's +noise, or the boundary is too tight (fires on noise, then the UpdateRule +chases the noise). + +Applicable scenarios: ColdStart (overshoot, convergence), Step +(step correction), Stable (oscillation). + +### End-to-end metrics: Operational outcome + +These metrics don't attribute to any single stage — they measure the +composition's overall operational fitness. + +| Metric | Formula | What it tells you | +|--------|---------|-------------------| +| **Settled accuracy (active)** | `\|final_h / true_h − 1\|` only in trials where algorithm fired post-settle | Tracking accuracy for algorithms that actively correct | +| **Settled accuracy (inert)** | `\|final_h / true_h − 1\|` only in trials where algorithm never fired | Accuracy when the algorithm chose inaction | +| **Reaction asymmetry** | `reaction_rate(+δ%) − reaction_rate(−δ%)` | Does it detect up-steps and down-steps equally? | +| **Time-to-target** | Time from trial start until `\|current_h / true_h − 1\| < 10%` and stays | End-to-end convergence including all pipeline stages | + +**Settled accuracy split** resolves the ambiguity where "0% error" can +mean either "perfect tracking" or "never moved from initial target." +By separating trials into active (fired at least once post-settle) and +inert (never fired), we can see: +- FullRemedy: active accuracy ~6% (tracks, with some jitter cost) +- BayesianCI at SPM=6: mostly inert (0% error because it never moved) + +This split reveals whether low error comes from genuine accuracy or +from failure to act. + +### Metric applicability by scenario + +| Scenario | Stage 1 (Estimator) | Stage 2 (Boundary) | Stage 3 (UpdateRule) | End-to-end | +|----------|-------------------|-------------------|---------------------|-----------| +| ColdStart | tracking error, confidence recovery | convergence | overshoot, convergence time | time-to-target | +| Stable | bias, variance, calibration | jitter, false fire rate | oscillation | settled accuracy | +| Step +/- | tracking error | selectivity, reaction rate, decisiveness | step correction | reaction asymmetry | + +### Observable vs non-observable algorithms + +Metrics that require per-tick introspection (h_estimate, delta, +threshold, uncertainty) are only available for algorithms implementing +`Observable` — which is all `Composed` algorithms. + +The production `VardiffState` doesn't implement Observable, so +introspection metrics gracefully return `None`. End-to-end metrics +(convergence, settled accuracy, reaction rate) work for all algorithms +because they only need `fired` and `new_hashrate`. + +| Metric class | VardiffState | Composed algorithms | +|-------------|:---:|:---:| +| End-to-end (convergence, selectivity, settled accuracy) | Yes | Yes | +| Stage 2 (fire decisiveness, threshold adaptiveness) | No | Yes | +| Stage 1 (bias, variance, calibration, confidence recovery) | No | Yes | + +### The evaluation question + +The old framework asked: "Which algorithm is best?" (single ranking). + +The new framework asks three more precise questions: + +1. **Per-stage diagnosis:** "Which stage is the bottleneck?" If + BayesianCI has poor selectivity at SPM=6, is it because the + estimator is slow to build confidence (Stage 1: confidence recovery), + or because the boundary threshold isn't adapting properly (Stage 2: + threshold adaptiveness), or because the update rule over-corrects + (Stage 4: oscillation)? + +2. **Composition validation:** "Are the stages well-matched?" If the + estimator reports high uncertainty but the boundary fires anyway, + that's a calibration mismatch. If the estimator reports low + uncertainty but the boundary still holds, the boundary is ignoring + the uncertainty signal. + +3. **Operational fitness:** "Does this composition meet production + requirements?" The end-to-end metrics (selectivity, convergence, + settled accuracy) give the final answer, but now we can explain + *why* an algorithm fails or succeeds at each SPM. + +## Determinism + +Every trial is fully deterministic given `(config, schedule, seed)`. +`XorShift64` RNG, reproducible across machines. + +## Production migration + +The `Vardiff` trait and `Clock` injection are unchanged. `Composed` +implements `Vardiff`, so any composition is a drop-in replacement: + +```rust +// Recommended composition (AdaCUSUM): +let vardiff = Composed::new( + EwmaEstimator::new(120), + AdaptiveCusumBoundary::new(1.5, 0.05), + PartialRetarget::new(0.2), + min_hashrate, + clock, +); +``` + +This dominates the previous FullRemedy (PoissonCI boundary) at every +share rate in the operational range (SPM=6-30) under the +`operational_fitness` metric. The improvement comes from 2-3x better +detection of small hashrate changes (-10% steps) enabled by the +sequential-testing boundary's evidence accumulation. diff --git a/sv2/channels-sv2/sim/docs/FINDINGS.md b/sv2/channels-sv2/sim/docs/FINDINGS.md new file mode 100644 index 0000000000..be5aa40e59 --- /dev/null +++ b/sv2/channels-sv2/sim/docs/FINDINGS.md @@ -0,0 +1,310 @@ +# Vardiff characterization findings + +How we arrived at FullRemedy: a stage-by-stage derivation from the +Classic algorithm, guided by per-stage diagnostics at each step. + +The architectural framework for understanding these results is in +[`DESIGN.md`](./DESIGN.md). The full cross-algorithm comparison data +lives in [`pareto.md`](../pareto.md). + +## The iteration protocol + +Starting from the production algorithm (ClassicComposed), we: +1. Identify the bottleneck stage using per-stage metrics +2. Replace ONLY that stage with a better implementation +3. Verify the fix improves the target metric without creating regressions +4. Repeat until no single-stage change yields further improvement + +Each iteration below shows the diagnosis, the intervention, and +the measured outcome. 1000 trials per cell, `base_seed = 0xDEADBEEFCAFEF00D`, +paired seeding so cross-algorithm differences are attributable to the +algorithm alone. + +## Iteration 0: Baseline (ClassicComposed) + +**Composition:** `CumulativeCounter + AbsoluteRatio + StepFunction + FullRetargetWithClamp` + +| SPM | Selectivity | Reaction -50% | Jitter | Convergence | Overshoot p99 | +|-----|-------------|---------------|--------|-------------|---------------| +| 6 | 0.696 | 69.6% | 0.059 | 83.2% | 145.2% | +| 12 | 0.549 | 54.9% | 0.018 | 95.5% | 86.6% | +| 30 | 0.336 | 33.6% | 0.002 | 99.7% | 23.4% | +| 60 | 0.188 | 18.8% | 0.000 | 100% | 13.8% | +| 120 | 0.098 | 9.8% | 0.000 | 100% | 9.9% | + +### Diagnosis: Stage 3 (Boundary) is the bottleneck + +**Evidence:** Selectivity degrades monotonically with SPM (0.70 → 0.10). +The StepFunction boundary uses a fixed 15% threshold at dt>=300s +regardless of share rate. At SPM=120, Poisson noise is only 9% RSD, +so a real -50% step produces a ~50% deviation — well above what the +boundary should require. Yet the algorithm detects it only 9.8% of the +time. Why? + +The CumulativeCounter's observation window grows with dt (time since +last fire). Post-convergence at SPM=120, the algorithm rarely fires, +so dt grows to 1000s+. The cumulative average over 1000s of stable +shares dilutes a 500s-old step signal. The boundary fires at 15% but +the signal is diluted to <15% by the long averaging window. + +**Root cause:** The boundary is share-rate-blind. It doesn't tighten +as SPM increases (where noise shrinks and smaller deviations become +detectable). + +**Fire decisiveness at -50% step:** 2543% at SPM=6 (fires are +overwhelmingly decisive — but rare). 478% at SPM=120 (when the +algorithm does fire, the signal is massive — but it only fires 9.8% of +the time). + +**Step correction:** 143% at SPM=6 (over-corrects), 31.5% at SPM=120 +(reasonable). The FullRetargetWithClamp at SPM=6 during cold start +produces wild overshoot (the 145.2% p99). + +## Iteration 1: Fix Boundary (StepFunction -> PoissonCI) + +**Composition:** `CumulativeCounter + AbsoluteRatio + PoissonCI(z=2.576) + FullRetargetWithClamp` + +**Hypothesis:** A rate-aware boundary that tightens with SPM will fix +the high-SPM blindness. + +| SPM | Selectivity | Reaction -50% | Jitter | Convergence | Overshoot p99 | +|-----|-------------|---------------|--------|-------------|---------------| +| 6 | 0.023 | 2.3% | 0.000 | 100% | 91.9% | +| 12 | 0.073 | 7.3% | 0.000 | 100% | 53.0% | +| 30 | 0.226 | 22.6% | 0.000 | 100% | 30.4% | +| 60 | 0.505 | 50.5% | 0.000 | 100% | 18.0% | +| 120 | 0.866 | 86.6% | 0.000 | 100% | 11.7% | + +### Outcome: high-SPM detection fixed, low-SPM detection destroyed + +PoissonCI fixes high-SPM blindness beautifully: selectivity rises +from 0.098 to 0.866 at SPM=120. But it collapses at low SPM: 2.3% +reaction rate at SPM=6 (down from 69.6%). + +**Why:** At SPM=6, the PoissonCI threshold at dt=60s is 118.5%. The +CumulativeCounter produces noisy single-window estimates that rarely +exceed 118.5% on a genuine -50% step — because with only 3 expected +shares per tick (SPM=6 x 0.5), Poisson noise makes the deviation +unreliable. The boundary is correctly calibrated for Type I error +control (zero jitter!), but at the cost of catastrophic Type II error +at low SPM. + +**Diagnosis: Stage 1 (Estimator) is now the bottleneck.** The +CumulativeCounter's single-window estimate is too noisy at low SPM for +the rate-aware boundary to detect real changes. The estimator needs +smoothing to reduce variance so that genuine deviations present as +clear, persistent signals rather than one-tick noise bursts. + +## Iteration 2: Fix Estimator (CumulativeCounter -> EwmaEstimator(120s)) + +**Composition:** `EwmaEstimator(120s) + AbsoluteRatio + PoissonCI(z=2.576) + FullRetargetWithClamp` + +**Hypothesis:** An EWMA with 120s time constant smooths Poisson noise +across multiple ticks. A genuine -50% step persists across many ticks +and will accumulate in the EWMA, while single-tick noise spikes are +diluted. + +| SPM | Selectivity | Reaction -50% | Jitter | Convergence | Overshoot p99 | +|-----|-------------|---------------|--------|-------------|---------------| +| 6 | 0.745 | 86.9% | 0.070 | 99.9% | 106.2% | +| 12 | 0.803 | 91.8% | 0.062 | 100% | 57.4% | +| 30 | 0.993 | 99.3% | 0.037 | 99.9% | 33.8% | +| 60 | 1.000 | 100% | 0.019 | 100% | 23.4% | +| 120 | 1.000 | 100% | 0.005 | 100% | 15.8% | + +### Outcome: detection restored across all SPM, but jitter and overshoot regressed + +The EWMA fix is dramatic: selectivity jumps from 0.023 to 0.745 at +SPM=6 and achieves 1.000 at SPM>=30. Reaction rate is 86.9-100% +across all share rates. The estimator smoothing lets genuine step +signals accumulate and cross the PoissonCI threshold reliably. + +**But two regressions:** + +1. **Jitter increased** (0.000 to 0.070 at SPM=6). The EWMA's smoothed + estimate drifts slightly under stable load, occasionally crossing + the PoissonCI threshold. This is the "active tracking" cost — the + algorithm is now sensitive enough to detect small real deviations, + but can't perfectly distinguish them from drift. + +2. **Overshoot p99 exploded** (91.9% to 106.2% at SPM=6). When the + EWMA detects a deviation and fires, the `FullRetargetWithClamp` + jumps directly to the estimate. During cold-start ramp or after a + step, the EWMA estimate can transiently overshoot truth (because + it averages recent high-rate observations with the ramp trajectory). + The full retarget amplifies this overshoot into the target. + +**Diagnosis: Stage 4 (UpdateRule) is now the bottleneck.** The +FullRetargetWithClamp is too aggressive for the EWMA estimator's +noise characteristics. The EWMA occasionally overshoots truth +transiently; an aggressive update rule converts that into a permanent +target overshoot. We need a damped update rule that moves only +partially toward the estimate, bounding overshoot at the cost of +requiring multiple fires to converge. + +**Step correction:** 108.1% at SPM=6 (over-corrects — the first fire +moves MORE than the needed amount, confirming the update rule is too +aggressive). + +## Iteration 3: Fix UpdateRule (FullRetargetWithClamp -> PartialRetarget(0.2)) + +**Composition:** `EwmaEstimator(120s) + AbsoluteRatio + PoissonCI(z=2.576) + PartialRetarget(0.2)` + +This is **FullRemedy**. + +**Hypothesis:** Moving only 20% of the gap toward the estimate on each +fire bounds overshoot (each fire causes at most 20% of the error) while +still converging over multiple fires. The damping also reduces jitter +under stable load (each noise-induced fire moves the target only 20% +of the noise magnitude, a self-correcting loop). + +| SPM | Selectivity | Reaction -50% | Jitter | Convergence | Overshoot p99 | +|-----|-------------|---------------|--------|-------------|---------------| +| 6 | 0.877 | 87.7% | 0.034 | 100% | 10.0% | +| 12 | 0.974 | 97.4% | 0.028 | 100% | 5.9% | +| 30 | 1.000 | 100% | 0.016 | 99.8% | 0.7% | +| 60 | 1.000 | 100% | 0.006 | 99.9% | 0.0% | +| 120 | 1.000 | 100% | 0.000 | 99.9% | 0.0% | + +### Outcome: all metrics improve or hold + +The PartialRetarget fix closes the last failure modes: + +- **Overshoot:** 106.2% to 10.0% at SPM=6. The 20% cap bounds each + fire's damage. Even if the EWMA transiently overshoots truth, the + target moves only 20% toward the overshoot. + +- **Jitter:** 0.070 to 0.034 at SPM=6. Each noise-induced fire now + moves the target only 20% of the noise magnitude. The target stays + near truth and subsequent ticks see small deviations that don't + cross the boundary again. + +- **Selectivity:** 0.745 to 0.877 at SPM=6. Better jitter control + improves the composite score. + +- **Reaction rate:** 86.9% to 87.7% at SPM=6 (maintained). The damping + doesn't prevent detection — it only reduces the magnitude of each + correction. + +**Step correction:** 0.176 at SPM=6 (approximately eta=0.2, confirming the +UpdateRule behaves as designed — each fire closes ~20% of the gap). + +## Summary: the three-fix derivation + +| Step | Stage fixed | Key metric improved | Key metric value | +|------|-------------|---------------------|------------------| +| 0->1 | Boundary | Reaction at SPM=120 | 9.8% to 86.6% | +| 1->2 | Estimator | Reaction at SPM=6 | 2.3% to 86.9% | +| 2->3 | UpdateRule | Overshoot p99 at SPM=6 | 106.2% to 10.0% | + +Each iteration diagnosed a specific stage as the bottleneck, applied a +targeted fix to that stage alone, and verified the improvement without +introducing new failure modes. The result is FullRemedy — the +composition that dominates every other algorithm in the registry on +every operationally meaningful metric. + +## Why this ordering matters + +The ordering is NOT arbitrary. Each fix depends on the previous one: + +1. **Boundary must be fixed first** because a rate-blind boundary masks + all other problems at high SPM. With StepFunction, you can't tell + whether the estimator is good or bad — the boundary won't fire + regardless. + +2. **Estimator must be fixed before UpdateRule** because PartialRetarget + with a noisy CumulativeCounter would produce slow, oscillating + convergence (each fire moves only 20% toward a noisy estimate, + requiring many fires to converge, with the estimate jittering + between fires). + +3. **UpdateRule is fixed last** because its failure mode (overshoot) + only manifests when the estimator is smooth enough and the boundary + is tight enough for the algorithm to fire frequently during + transients. With Classic's rare-fire regime, the aggressive update + rule was actually appropriate. + +## Iteration 4: Fix Boundary (PoissonCI -> AdaptiveCusumBoundary) + +**Composition:** `EwmaEstimator(120s) + AdaptiveCusumBoundary(s=1.5, floor=0.05) + PartialRetarget(0.2)` + +This is **AdaCUSUM** — the new recommended composition. + +**Diagnosis from FullRemedy:** Under the `operational_fitness` metric +(which weights small-change detection at 30%), FullRemedy's PoissonCI +boundary treats each tick independently — it doesn't accumulate +evidence that recent ticks have been consistently off-target. A -10% +hashrate decline produces a persistent signal across many ticks, but +PoissonCI evaluates each tick in isolation and requires a large +single-tick deviation to fire. At SPM=6-12, this means only 33% of +real -10% declines are detected within 5 minutes. + +**The fix:** AdaptiveCusumBoundary uses sequential evidence +accumulation — its threshold decreases as 1/n_ticks, meaning persistent +small deviations that individually wouldn't cross a per-tick threshold +accumulate until the boundary fires. The rate-adaptive sensitivity +(`sqrt(SPM/30)` scaling) ensures appropriate conservatism at low SPM. + +**Operational fitness across SPM=6-30 (1000 trials/cell):** + +| SPM | FullRemedy | AdaCUSUM | Improvement | +|-----|-----------|----------|-------------| +| 6 | 0.746 | 0.795 | +4.9% | +| 8 | 0.752 | 0.806 | +5.4% | +| 10 | 0.768 | 0.807 | +3.9% | +| 12 | 0.777 | 0.802 | +2.5% | +| 15 | 0.784 | 0.801 | +1.7% | +| 20 | 0.793 | 0.799 | +0.6% | +| 25 | 0.802 | 0.823 | +2.1% | +| 30 | 0.801 | 0.828 | +2.7% | + +AdaCUSUM dominates FullRemedy at every share rate in the operational +range. The improvement is largest at low SPM (where sequential evidence +accumulation matters most) and smallest at mid-range SPM (where both +boundaries perform well). + +**Small-change detection (-10% step reaction rate):** + +| SPM | FullRemedy | AdaCUSUM | +|-----|-----------|----------| +| 6 | 33% | 85% | +| 8 | 30% | 75% | +| 10 | 33% | 67% | +| 12 | 34% | 61% | + +AdaCUSUM detects 10% hashrate declines 2-3x more reliably than +FullRemedy. This is the primary operational value — catching failing +ASICs, thermal throttling, and firmware issues before they accumulate +into significant revenue loss. + +## The operational_fitness metric + +The composite metric that drives algorithm selection: + +``` +fitness = 0.30 x reaction_rate(-10%) [small-change detection] + + 0.20 x reaction_rate(-50%) [large-change detection] + + 0.20 x clamp(1 - jitter/0.30, 0, 1) [share stability] + + 0.20 x convergence_rate [cold-start reliability] + + 0.10 x (1 - overshoot_p99) [ramp safety] +``` + +Jitter ceiling is 0.30 fires/min (~18 retargets/hour). Retargets are +cheap (one ~50 byte message, no work disruption, no share loss) while +missed hashrate declines are expensive (wasted pool infrastructure, +delayed failure detection). The ceiling reflects this cost asymmetry. + +## Reproducing these results + +```bash +cd sv2/channels-sv2/sim + +# Full evaluation at operational SPM range (1000 trials, ~6 minutes) +cargo run --release --bin iterative-eval + +# Single-trial trace for investigation +cargo run --release --bin trace-trial -- \ + --algorithm full_remedy --scenario cold_start --spm 6 --seed 0xCAFE +``` + +All results are deterministic given the base seed `0xDEADBEEFCAFEF00D`. diff --git a/sv2/channels-sv2/sim/docs/METRIC_DERIVATION.md b/sv2/channels-sv2/sim/docs/METRIC_DERIVATION.md new file mode 100644 index 0000000000..9d08736683 --- /dev/null +++ b/sv2/channels-sv2/sim/docs/METRIC_DERIVATION.md @@ -0,0 +1,371 @@ +# A Derivation of the Vardiff Evaluation Metric + +**Abstract.** A variable-difficulty (vardiff) controller is unusual: the +only thing it can measure is its own tracking error. From that one fact we +derive the quantities used to score vardiff algorithms in this crate. Two +theorems (the measurement identity and an information floor) show the +problem reduces to two coordinates — tracking error and control effort. +One lemma shows the obvious error norm (squared) is blind to the failure +operators care about most, forcing a linear norm plus a separate detection +term. A short asymmetry argument fixes the directional weights. The result +is: **linear log-error regret (split by sign) + quadratic effort (split by +direction) + a detection rate, scored per scenario class.** + +Convention: *theorems and lemmas* are proved from the model; *definitions +and choices* are our decisions; *observations* are facts about particular +algorithms established in simulation (named inline). Mathematical claims +are never "validated numerically" — they are proved or they are not. + +--- + +## 1. Setup + +A **miner** has true hashrate `H > 0`. The **controller** holds a belief +`Ĥ > 0` and sets difficulty `D = Ĥ/r*`, where `r*` is the target share +rate (shares/min). Shares then arrive as a Poisson process of rate + +``` + r_obs = r* · H/Ĥ. (1) +``` + +Over a window of `τ` minutes the controller sees a single number: the +share count `N ~ Poisson(λ)`, `λ = r_obs·τ`. It periodically **fires** — +rescales `Ĥ` by a factor, i.e. adds a **log-step** `s = ln(Ĥ⁺/Ĥ⁻)` to its +belief; `s > 0` *tightens*, `s < 0` *eases*. + +**Definition 1 (error coordinate).** The controller acts multiplicatively +(it scales `Ĥ`) and, by (1), the observable depends on `Ĥ` only through the +ratio `H/Ĥ`. A multiplicative quantity is linearized by its logarithm, and +only in log coordinates are an over- and an under-shoot by the same +*factor* equidistant from the target. So work in + +``` + e = ln(Ĥ/H), so that r_obs/r* = e^{−e}. (2) +``` + +`e = 0` is exact; `e > 0` is over-difficulty, `e < 0` under-difficulty. The +control goal is `e → 0`. + +A **scenario** specifies `H(t)` and the initial belief; the named classes +(`baseline.rs`) are *cold-start*, *stable*, *step ±p%*, and *settled-aged +drop* (truth holds long enough to mature the share counter, then drops). A +**metric** ranks algorithms by averaging over a fixed ensemble of classes. + +--- + +## 2. The controller measures only its own error + +**Theorem 1.** *The sole observable `N` has a distribution depending on `H` +and `Ĥ` only through the error `e`.* + +*Proof.* By (1)–(2), `N ~ Poisson(r*τ·e^{−e})`. The parameter is a function +of `e` alone. ∎ + +There is no measurement of the miner separate from the error being +controlled. Every familiar quality statistic — accuracy, jitter, reaction, +overshoot — is therefore a functional of the one scalar process `e(t)` +together with the fire sequence the controller derives from it. This is +why a small set of `e`-based terms can suffice, and why the metric is +written entirely in `e` and `s`. + +--- + +## 3. Precision costs time, and time costs agility + +**Theorem 2 (information floor).** *Any unbiased estimate of `e` from a +window of `τ` minutes has `Var(ê) ≥ 1/(r*τ)`.* + +*Proof.* The window's count is `N ~ Poisson(λ)`, `λ = r*τ·e^{−e}`. For a +Poisson observation the log-likelihood in `e` is `N ln λ − λ`, with score +`∂_e(N ln λ − λ) = (N/λ − 1)·λ' = λ − N` since `λ' = −λ`. The Fisher +information is `E[(λ−N)²] = Var(N) = λ`; at the operating point `e≈0`, +`λ = r*τ`. Cramér–Rao gives `Var(ê) ≥ 1/(r*τ)`. ∎ + +(The crate encodes this as `SettledAccuracy::poisson_floor`, +`metrics.rs:864` — `1/√(r*τ)` as a percentile.) + +**Corollary (the central trade-off).** Steady-state precision improves +only by enlarging the averaging window `τ`; but the same `τ` is the lag in +following a real change. **Accuracy and agility are bought from one budget +at a fixed rate `r*`.** Two consequences: + +- *The apparent quality axes are one trade-off.* The estimator's window + trades accuracy against lag; the fire threshold trades false alarms + against detection delay; the retarget gain trades convergence against + overshoot. Each is one knob on the same accuracy-vs-agility line. + Scoring six such projections with equal weight (the deprecated + `EqualWeightFitness`) rewards the *middle* of the trade-off curve, not + the *frontier*. **Observation (commit `31a9dbc1`):** four independent + parameterizations of the pipeline all saturate at the same quality + ≈0.55 — one wall seen four ways. So score the frontier's own + coordinates: **tracking error** and **control effort**, nothing derived + from them. +- *A steady offset has a price, not a defect.* An algorithm sitting short + of the floor is paying for it elsewhere (agility, effort); §7 uses this. + +--- + +## 4. The error norm: squared is blind, linear is not + +Tracking cost is `∫ f(e) dt` for some norm `f`. The choice of `f` is a +judgment about how harm scales with error — but one judgment is +inadmissible. + +**Lemma (blindness of the square).** *A persistent, undetected fractional +hashrate drop of size `g` produces a steady error `e = −ln(1−g) = g + +O(g²)`. Under `f(e)=e²` it costs `e² = g² + O(g³)`; under `f(e)=|e|` it +costs `|e| = g + O(g²)`.* + +*Proof.* The drop sends `H → (1−g)H` with `Ĥ` fixed, so `e = ln(Ĥ/((1−g)H)) += −ln(1−g)`; expand. ∎ + +Operational harm from a difficulty error (lost or excess work) scales with +its **magnitude** `g`, i.e. linearly. The squared norm undervalues it by a +factor `1/g`, which diverges as `g → 0`: a small *persistent* leak — a +failing or throttling ASIC, the case operators care about most — is +essentially free under `e²`. **Observation (`regret-effort`):** an +algorithm that detects a −10% drop ~1% of the time scores *better* on `e²` +than one that detects it always, because the miss costs only `(ln0.9)² ≈ +0.01`/min. The linear norm removes this blind spot (the same miss costs +`≈0.10`/min) and only reorders the middle of the ranking, never the top. + +**Choice 1.** Use `f(e) = |e|`. Report it split by sign, since the two +signs carry different harm (§6): + +``` + regret_over = ⟨|e|⟩ over time with e > 0 (over-difficulty) + regret_under = ⟨|e|⟩ over time with e < 0 (under-difficulty) +``` + +--- + +## 5. Detection is a separate axis, not a smaller `f` + +Linear regret narrows the blind spot but does not close it: a fast +algorithm with occasional large errors can still outscore a chronically +blind one on `∫|e|`. The deeper reason is structural. + +**Theorem 3 (detection is not a functional of the scored error paths).** +*The probability of catching a small drop on the settled-aged scenario is +independent of the regret terms computed on the stable and step +scenarios.* + +*Proof.* Catching a small drop requires the share counter to be *young* +when the drop lands: a matured counter averages the weak post-drop signal +against a long pre-drop baseline and never crosses threshold. Counter age +at the drop is determined by the fire history of a *matured, on-target* +loop — a state the stable scenario (never perturbed) and the step +scenarios (perturbed while young or with a large signal) never enter. A +functional of `e(t)` on scenarios that avoid that state cannot constrain +behavior in it. ∎ + +So detection must be carried explicitly: + +``` + detection = P[ fire within W min | counter matured, then −g drop ]. +``` + +It is an absolute probability — reported raw, never normalized against the +candidate set. **Choice 2.** Operationalize as the `settled 60min, −10%` +cell (`settled_reaction_rate`); **observation (commit `70fcb260`):** this +reproduces the known counter-age failure (one algorithm 30%→1% across +share rates, another ~0%), so it measures the real mode. + +--- + +## 6. The two directions are not symmetric + +**Proposition.** *Over-difficulty is worse than under-difficulty, and +tightening is worse than easing.* + +*Proof.* (i) `e < 0` (difficulty low): shares run a little fast; all work +stays valid; cost is mild inefficiency. `e > 0` (difficulty high): the +miner is starved of valid work, and if its hashrate is genuinely falling, +raising difficulty further removes its remaining valid work — a runaway. +(ii) A tightening fire (`s>0`) invalidates in-flight shares aimed at the +old, easier target — fraction `1 − e^{−s} > 0` lost; an easing fire leaves +prior work valid. ∎ + +This proves the *direction* of the asymmetry. Its *magnitude* is a +judgment. **Choice 3:** weight both at `3:1` (over:under and up:down), +matching the production `tighten_multiplier = 3` (commit `a1d3fa7b`). +**Observation (`champion-weights`):** the best algorithm is the same for +every ratio in `[1:1, 4:1]`; only an ungrounded `5:1` changes it. So the +ranking does not hinge on the exact value. + +--- + +## 7. The metric + +Per scenario class, from the trajectory `{(e, fired, s)}` alone — hence +computable for every algorithm, transparent or opaque +(`LogErrorRegret`, `metrics.rs`): + +``` + regret_over, regret_under = ⟨|e|⟩, split by sign of e (§4) + effort_up, effort_down = Σ s², split by sign of s (below) + detection = P[fire | matured, small drop] (§5) +``` + +scalarized, when needed, as + +``` + cost = 3·regret_over + 1·regret_under + + ρ·(3·effort_up + 1·effort_down) + + w·(1 − detection), ρ = w = ½ (overridable). +``` + +**Effort, and an honest note on its shape.** `effort = Σ s²` penalizes +churning the difficulty. Squared is the right shape *here* — opposite to +§4 — because the two terms answer different questions: regret asks "how +bad is being wrong?" (must not vanish as `e→0`, hence linear), while effort +asks "how should we charge for actuation?" A square makes one large +retarget cost more than several small ones summing to the same total +(`S² > k(S/k)²`), i.e. it prefers gentle, distributed correction. It is +*not* a model of work lost to a tighten — that loss is `1−e^{−s} ≈ s`, +linear in the step; the lost-work *asymmetry*, not its size, is what the +directional split carries. + +**Per class, never pooled.** Cold-start cost dwarfs steady-state cost, so a +pooled average erases every distinction that matters; each class is +reported on its own. + +This metric meets its obligations: it is computable from the trajectory +for any algorithm; the detection term blocks the blind-but-numerically-fine +algorithm that defeats a pure-regret score; the asymmetry prices the +runaway direction; and it contains no free constants beyond the three +declared `3:1`/`½` weights, which are shown not to swing the ranking. + +--- + +## 8. Reading the metric: two plots + +The metric is a five-vector per scenario class. A table of five numbers +times five classes times a dozen algorithms is unreadable, and it hides +the one thing the scalar `cost` integrates away: *behavior over time*. Two +plots recover both — one for the trade-off **shape**, one for the +time-domain **story**. Both are built only from the trajectory `{(e, +fired, s)}`, so they apply to every algorithm. + +### 8.1 The trade-off radar (`regret-radar`) + +Five axes, each a real cost from §7, each oriented so outward = better: +**tracking** (`−regret`), **gentleness** (`−effort`), **detection**, +**over-difficulty safety** (`−regret_over`), **tighten-care** +(`−effort_up`). The §3 corollary is what licenses a radar at all: these +are not arbitrary axes but the frontier coordinates the six old ones +collapsed into. + +*Why it reads cleanly.* Each axis is scored `ref/(ref+cost)` against a +**fixed reference algorithm** — the real upstream classic vardiff — so the +reference sits on a mid-ring and every contender reads directly as "beats +/ loses to it" on each axis. This is deliberately not hull (best-in-set) +normalization, which would rescale every vertex whenever the candidate set +changes and would need a deliberately-bad strawman to show any spread. The +reference is fixed, the picture is stable run-to-run, and there are no +arbitrary axis ceilings (the O4 obligation). Detection is plotted raw, as +a probability, since normalizing it would force the best-in-set to 1. + +*Companion panel.* Beside it, the same algorithms on the **familiar** +measurements operators already trust — convergence time, settled accuracy, +reaction, jitter — on a per-axis log scale (each axis spans the observed +range), purely as an intuition bridge from the abstract regret/effort axes +to quantities people have priors about. + +*What it shows.* The champion encloses the classic reference on every +axis, with its area concentrated in gentleness and tighten-care — it +corrects in small, distributed steps — while merely matching on raw +tracking. That shape *is* the §6 asymmetry made visible: it spends its +budget avoiding the costly direction, not chasing the last percent of +accuracy. + +### 8.2 The trajectory plot (`trajectory-plot`) + +A single run on one timeline that visits three regimes in sequence: +**cold-start** (belief far from truth), **settle** (counter matures), then +a **−10% aged drop**. Plotted: each algorithm's implied hashrate `Ĥ(t)` +(median over trials), the true `H(t)` (dashed), an **accuracy-ceiling** +line, a **cost-optimal corridor**, and a **fire raster** beneath. + +*Why this is the honest picture.* The scalar metric is a time-integral; it +cannot show *when* error or effort occurs. But the three regimes map +one-to-one onto the theory: cold-start speed is **agility** (§3), the +settle offset is the **§3 price / §6 asymmetry**, and the drop response is +**detection** (§5). One plot exercises all three forces the metric is +built from, in the order an operator would experience them. + +*Two reference marks, and why they are not the same thing.* +- The **accuracy-ceiling** is a policy-free estimator that fires every + tick — it reaches the §3 information floor (≈−0.8% offset) but at + unbounded effort. It is labeled an accuracy *bound*, not a target: + reaching it is possible only by paying effort the metric charges for. +- The **cost-optimal corridor** marks where §7's objective actually wants + the algorithm to sit. Drawing both, separated, is the visual statement + that *minimum error ≠ minimum cost* — the central trade-off of the whole + document. + +*The fire raster* draws one tick mark per fire, height `∝ |s|`. It makes +"violent vs gentle" literal: classic fires rarely but in large jumps (few +tall marks); the champion fires often in small steps (many short marks). +A scalar `effort` says the champion is gentler; the raster shows *how*. + +*What it shows — the finding.* The picture separates the algorithms +exactly where the theory says it should: + +| regime | classic (real vardiff) | champion | +| --- | --- | --- | +| cold-start ramp | ~11 min | ~15 min | +| settle offset | ≈0% | ≈−7% (cost-optimal, §9) | +| aged −10% drop | **never detects** (in window) | detects ~9 min | + +Classic tracks truth tightly in steady state and rejects the champion's +small offset — but it **never reacts** to the slow drop, because a +matured counter has diluted the signal (Theorem 3 made flesh). The +champion accepts a small, deliberate, cost-optimal under-difficulty offset +and in exchange catches the drift that is the operator's real loss. No +single scalar conveys "tracks tighter yet is operationally blind"; the +trajectory plot does, at a glance. + +--- + +## 9. One consistency check, and how to break the result + +**The offset is optimal, not a defect (`confirm-debias`).** The best +algorithm sits at a steady ≈−7% under-difficulty, short of the ≈−0.8% +floor a policy-free estimator reaches by firing every tick. Multiplying its +belief by `b ≥ 1` closes the offset smoothly (to 0 near `b≈1.10`), but the +cost rises monotonically from `b = 1`: `regret_under` falls while +`regret_over` rises faster under the `3:1` weight. The unbiased belief is +the cost minimum, so the offset is the deliberate price of the asymmetry +(§6), not an error — exactly as §3 predicts. An independent knob that +*could* push accuracy toward the floor is correctly scored *worse*, which +is the metric being self-consistent. + +**Falsifiers.** The result should be revised if: (a) some `∫f(e)` on the +scored scenarios reproduces the detection ranking, refuting Theorem 3; +(b) an estimator beats `1/(r*τ)`, refuting Theorem 2; (c) the best +algorithm changes within `w_over:w_under ∈ [1:1,4:1]`, breaking §6's +robustness; or (d) a real failure mode falls outside the scored ensemble — +a coverage gap to declare, not a soundness error. + +--- + +## 10. Status of each claim + +| Claim | Kind | Source | +| --- | --- | --- | +| Observable depends only on `e` | Theorem 1 | §2 | +| Precision floor `1/(r*τ)` | Theorem 2 | §3 | +| Quality axes are one trade-off | Corollary + obs. | §3, `31a9dbc1` | +| Squared norm blind to small drops | Lemma | §4 | +| …a 1%-detector scores well on `e²` | Observation | `regret-effort` | +| Detection not a functional of `e(t)` | Theorem 3 | §5 | +| …real algorithms go blind | Observation | `70fcb260` | +| Over>under, tighten>ease | Proposition | §6 | +| `3:1` weight; robust over `[1:1,4:1]` | Choice + obs. | `a1d3fa7b`, `champion-weights` | +| −7% offset is cost-optimal | Observation | `confirm-debias` | + +Every clause of the metric — linear sign-split regret, quadratic +direction-split effort, an explicit detection rate, per class, `3:1` +weights — is proved from §§2–3, forced by §§4–5, or a judgment shown +robust in §6. diff --git a/sv2/channels-sv2/sim/docs/PID_INVESTIGATION.md b/sv2/channels-sv2/sim/docs/PID_INVESTIGATION.md new file mode 100644 index 0000000000..92cc33daba --- /dev/null +++ b/sv2/channels-sv2/sim/docs/PID_INVESTIGATION.md @@ -0,0 +1,206 @@ +# PID Vardiff Investigation + +## Background + +Some open-source pool implementations use a PID controller for variable +difficulty, operating in difficulty-space with power-of-2 quantization. +This document records our investigation of the PID approach, comparison +to our three-stage pipeline, and the improvements derived from the analysis. + +## The Pow2-PID Pattern + +A common open-source pattern uses the `pid` crate (v4.0.0) with: + +- **Setpoint**: shares per minute target (typically 10.0) +- **Kp**: `-difficulty × 0.01` (negative: over-target SPM → lower difficulty) +- **Ki**: `0.0` (disabled in production) +- **Kd**: `0.0` (disabled in production) +- **Output limit**: `difficulty × 10.0` +- **Quantization**: `nearest_power_of_2()` on every retarget +- **Interval**: 120s (configurable) +- **Measurement window**: 20-60s sliding window of share timestamps +- **On retarget**: rebuilds PID with gains proportional to new difficulty + +### Critical Flaw: Power-of-2 Dead Zone + +The quantization creates a ~41% dead zone. For difficulty to change, the PID +output must push past the geometric midpoint between adjacent powers of 2: + +``` +|pid_output| > 0.414 × current_difficulty +With Kp = -0.01 × diff: + |SPM_target - realized| > 41.4 +``` + +At SPM target of 10, realized SPM must exceed ~51 or drop to ~0 to trigger +a retarget. This means **hashrate changes of ≤5× go undetected**. + +### Simulation Results + +Across all 50 cells (5 SPM × 10 scenarios), Pow2-PID: +- Reaction rate: **0.000** — never fires on any step ≤ ±50% +- Jitter: **0.000** — never fires at all +- Effectively a fixed-difficulty system + +## Why PID Fails: Lack of Stage Separation + +A PID controller conflates all three pipeline stages into a single +feedback loop, making it impossible to diagnose or fix individual +failure modes: + +| PID Term | Conflated Stages | Problem | +|----------|-----------------|---------| +| P (proportional) | Estimator + Boundary | Gain (`Kp`) simultaneously controls how noisy the "belief" is AND how much deviation triggers action. Tuning Kp for low jitter (small gain) kills reaction rate. Tuning for fast reaction (large gain) causes noise-driven fires. | +| I (integral) | Boundary (persistence) + Update (magnitude) | Accumulates sub-threshold error — a boundary concern (evidence strength) — but its output adds directly to the control signal — an update concern (move magnitude). Anti-windup limits are simultaneously clamping "how much evidence to accumulate" and "how far to move." | +| D (derivative) | Estimator (smoothing) + Update (damping) | Acts as both a noise filter on the measurement AND a damping term on the actuator. Cannot tune measurement smoothing independently of move damping. | + +### The Dead Zone as a Stage Confusion + +The 41% dead zone from power-of-2 quantization is instructive. In our +framework, this is clearly a *boundary* problem — the threshold for +action is too high. But in the PID implementation, the dead zone arises +from the interaction of: +1. Gain magnitude (Kp = -0.01 × diff) — an estimator/boundary concern +2. Quantization rounding — a post-update concern +3. Output limit (10 × diff) — an update concern + +Because these aren't separated, the developer cannot identify "the boundary +is too wide" as the root cause. They would instead try to increase Kp +(breaking jitter), add integral (breaking stability), or reduce the +quantization (breaking the power-of-2 invariant the system depends on). + +### The Well-Tuned PID (`pid_tuned.rs`) + +Our `PidTunedVardiff` implementation with all three terms active +demonstrates the ceiling of the PID approach when carefully tuned: +- Rate-aware gain scheduling (√SPM noise scaling) +- Anti-windup with exponential decay + hard clamp +- Dead zone to suppress noise-driven fires +- Configurable presets (balanced, aggressive, conservative) + +Even with these improvements, it cannot escape the fundamental coupling: +the dead zone (a boundary parameter) interacts with the integral +accumulation (a persistence parameter) which interacts with the gain +schedule (an estimator parameter). Tuning one axis shifts the others. +The three-stage pipeline makes these interactions explicit and allows +each to be optimized independently. + +## What We Learned From PID + +Despite the broken quantization, the PID *concept* revealed gaps in our +framework. Crucially, decomposing each PID term into the three-stage +pipeline let us evaluate each idea **in isolation** — something the +conflated PID design fundamentally cannot do. Three candidates were +extracted; only one survived rigorous re-evaluation. + +### 1. Integral Term → AcceleratingPartialRetarget *(transferred)* + +PID's integral term accelerates correction when error persists in one +direction. Our `PartialRetarget(η=0.2)` always moves exactly 20% of the +gap regardless of history. The new `AcceleratingPartialRetarget` captures +this insight: η ramps from 0.2 → 0.4 → 0.6 on consecutive same-direction +fires. + +**Parameter sweep results** (500 trials, 5 SPM × 10 scenarios): +- `acceleration=0.2, eta_max=0.6` is optimal +- Convergence improved 9-40% across SPM=6-30 +- Jitter: zero cost (identical to baseline) + +This idea transferred cleanly because it addresses a concern within a +single stage (update-rule magnitude over time). No cross-stage calibration +is involved. + +### 2. Operating in SPM-Space → SpmRatioEstimator *(discarded)* + +PID operates on `realized_spm` directly without converting through +hashrate/target. Our `SpmRatioEstimator` did the same: EWMA smoothing +on the raw SPM signal, then `h_estimate = current_h × (realized/expected)`. + +**Initial result**: Behaviourally indistinguishable from `EwmaEstimator` +on the head-to-head benchmark — the supposed benefit was code +simplification. + +**Re-evaluation**: Further scenarios exposed regressions that the +paired-simulation harness missed. The component is retained in the +codebase as an experimental alternative but is **not** part of any +production composition. + +### 3. Sub-threshold Persistence → SignPersistenceCusumBoundary *(discarded)* + +In PID, errors below the dead zone still accumulate in the integral. Our +`SignPersistenceCusumBoundary` adapted this: when deviation sign persists +across ticks, the threshold decreases slightly. + +**Initial result**: +6% detection rate on ±10% steps at the cost of +23% +jitter on stable load. + +**Re-evaluation**: The jitter penalty outweighed the detection gain across +the full grid; tuning attempts could not move the Pareto frontier. The +component is retained for reference but is **not** part of any production +composition. + +### Meta-observation + +Decomposition into three stages is what *made the failure modes visible*. +Two of three extracted ideas looked promising in narrow tests and were +ultimately rejected only because each could be exercised on its own +boundary, estimator, or update axis without confounding the others. The +PID's monolithic structure offers no such diagnosis — its dead zone, gain +schedule, and integral windup all interact, so a failing parameter sweep +gives no actionable signal about which concern is broken. + +## Proposed Composition (not adopted) + +A speculative "BestOfBest" composition combined all three extracted ideas: + +```rust +Composed::new( + SpmRatioEstimator::new(120), + AsymmetricCusumBoundary::new(1.5, 0.05, 3.0), + AcceleratingPartialRetarget::new(0.2, 0.6, 0.2), + min_allowed_hashrate, + clock, +) +``` + +Head-to-head (1000 trials, 8 SPM × 10 scenarios) showed a tradeoff — +~2 min slower cold start for 2-3× better steady-state accuracy — that +initially looked favourable. However, once `SpmRatioEstimator` and +`SignPersistenceCusumBoundary` were independently rejected (see above), +this composition was abandoned. The production recommendation lives in +[`CKPOOL_INVESTIGATION.md`](./CKPOOL_INVESTIGATION.md): `EwmaEstimator` + +`PoissonCI` + `PartialRetarget(η=0.2)`. `AcceleratingPartialRetarget` +remains available for ad-hoc composition where extra cold-start +aggression is desired. + +## Files Added + +### Production components (`src/vardiff/`) + +- `composed/update.rs` — `AcceleratingPartialRetarget` (new UpdateRule) — the + single PID-derived idea that survived isolated re-evaluation + +### Experimental / reference components (`src/vardiff/`) + +- `pow2_pid.rs` — Reference Pow2-PID implementation for simulation +- `pid_tuned.rs` — Well-tuned PID implementation (P+I+D active) +- `composed/estimator.rs` — `SpmRatioEstimator` — discarded after + re-evaluation; kept for reference +- `composed/boundary.rs` — `SignPersistenceCusumBoundary` — discarded after + re-evaluation; kept for reference + +### Simulation binaries (`sim/src/bin/`) + +- `compare-pid.rs` — Pow2-PID and tuned-PID vs all algorithms +- `compare-best.rs` — BestOfBest vs production (final comparison) +- `convergence-time.rs` — Convergence time measurement +- `sweep-accelerating.rs` — Parameter sweep for AcceleratingPartialRetarget + +### Grid registrations (`sim/src/grid.rs`) + +- `AlgorithmSpec::pow2_pid(spm, hashrate)` / `pow2_pid_default()` +- `AlgorithmSpec::pid_balanced(spm)` / `pid_aggressive(spm)` / `pid_conservative(spm)` +- `AlgorithmSpec::ada_cusum_accelerating(tau, s, f, t, eta_base, eta_max, acc)` +- `AlgorithmSpec::spm_ratio_cusum(tau, s, f, t, eta)` +- `AlgorithmSpec::ewma_sign_persistence(tau, s, f, t, sd, md, eta)` +- `AlgorithmSpec::best_of_best()` diff --git a/sv2/channels-sv2/sim/docs/THEORY.md b/sv2/channels-sv2/sim/docs/THEORY.md new file mode 100644 index 0000000000..0667df3d4e --- /dev/null +++ b/sv2/channels-sv2/sim/docs/THEORY.md @@ -0,0 +1,1021 @@ +# A conservation-law theory of vardiff quality + +*Status: design note / proposal. No code in this crate implements the +metrics below yet. The intent is to decide whether this framing should +replace the six-axis `EqualWeightFitness` radar and the maximin sort +that currently drive the algorithm shootout.* + +This note (1) derives what vardiff is mathematically trying to do from +the plant model, (2) states the conservation law that the model +implies, (3) proposes a single principled objective and the secondary +stats needed to make it legible, and — most importantly — (4) +**tries to break its own theory**. Read §5 (Holes) before believing §3. + +--- + +## 1. The plant is one identity + +Strip `run_trial_with_observer` (`src/trial.rs:294`) to its mechanics. +The algorithm commits to a hashrate estimate `H_est`, which sets the +difficulty `D = H_est / r*` (with `r*` the target shares/min). The +simulator then draws the share count for a tick from + +``` +λ = (H_true / H_est) · r* · (Δt / 60), N ~ Poisson(λ) +``` + +so the *observed* share rate relative to setpoint is + +``` + r_obs / r* = H_true / H_est. (★) +``` + +This single identity is the whole problem. **The quantity the +algorithm can observe (its share rate vs. setpoint) is exactly the +reciprocal of the quantity it is trying to control (its difficulty +error).** There is no separate "plant output" and "error signal" — they +are the same signal. Every vardiff is a feedback controller whose +*measurement is its tracking error*. + +Work in the natural error coordinate — logarithmic, because difficulty +is multiplicative and (per `PID_INVESTIGATION.md`) quantized in powers +of two: + +``` +e(t) = log( H_est(t) / H_true(t) ) = − log( r_obs / r* ). +``` + +A 2× over-difficulty and a 2× under-difficulty are symmetric in `e`. +Everything vardiff wants is `e(t) → 0`. Note for later that (★) +rewrites as + +``` + r_obs = r* · e^(−e). (★★) +``` + +## 2. The conservation law: information rate is pinned to r* + +For a Poisson stream, the Fisher information an interval carries about +`log H_true` equals its expected count, `λ`. When the loop is on +target (`e ≈ 0`, so `λ ≈ r*·Δt/60`), information arrives at a **constant +rate of `r*` nats per minute — independent of `H`, of difficulty, of +the miner's size.** That is not an accident; pinning `r_obs` to `r*` is +*precisely what setting `D = H_est/r*` does*. The algorithm fixes its +own sensory bandwidth by policy. + +This is the conserved quantity, and it has a hard consequence. The +Cramér–Rao bound on any unbiased estimate of `e` over an effective +window `τ_eff` is + +``` + Var(ê) ≥ 1 / (r* · τ_eff). (1) +``` + +The crate already encodes the special case of (1) — see +`SettledAccuracy::poisson_floor` (`src/metrics.rs:863`), which is +exactly `1/√(r*·τ)` dressed as a half-normal percentile. **Quality is +not free: it is bought with observation time, at a fixed exchange rate +`r*` set by policy, not by algorithmic cleverness.** No estimator beats +`1/√(r*·τ)`. + +## 3. The algebraic consequence: every "axis" is one trade-off + +The window `τ` that buys steady-state precision in (1) is the *same* `τ` +that delays the response to a real change. Push this through the +crate's four-axis decomposition and the six radar axes collapse into +three faces of one law: + +**Estimator — bias vs. variance.** Steady error `~ 1/(r*·τ)` shrinks +with `τ`; post-step lag `~ τ` grows with `τ`. One knob. + +**Boundary — Type I vs. Type II (the sequential-detection bound).** A +likelihood-ratio detector firing at evidence `log(1/α)` against a step +of size `δ` waits + +``` + T_d(δ) ≈ 2·log(1/α) / (r* · δ²). (2) +``` + +Jitter (false fires under stable load) *is* `α` per unit time; reaction +time *is* `T_d`. They are not two axes — they are one ROC operating +point chosen by `α`. + +**Update rule — overshoot vs. convergence.** Partial retarget `η` gives +`e_k ≈ e_0·(1−η)^k`: convergence time `∝ 1/η`, per-fire overshoot +exposure `∝ η`. One knob. (`FINDINGS.md` iteration 3 is this exact +trade: `η: 1.0 → 0.2` moved overshoot 106% → 10% at the cost of slower +convergence.) + +All three are **speed vs. stability, bounded by the conserved rate +`r*`.** The four-axis split is engineering-real and worth keeping for +*attribution*; informationally there is ~one knob per axis and they all +spend the same currency. + +**Empirical confirmation already in the tree.** Commit `31a9dbc1` +found a "~0.55 maximin ceiling for the three-stage architecture … +small-drop reaction and convergence trade against each other on a +shared agility budget, confirmed from four independent directions." +That "shared agility budget" *is* the conserved `r*` of (1)–(2). Four +unrelated parameterizations hitting the same wall is what a +conservation law looks like from the outside. + +### 3a. The magnitude-cancellation result *(REFUTED by data — see §5.8)* + +> **This subsection's conclusion is empirically false.** The validation +> pass (§5.8) shows post-step regret rises ~`∝ δ²`, not flat. It is kept +> here because the *derivation* is instructive about what assumption +> fails (near-SPRT detection, §5.3). Do not act on it. + +Watch the cost of a step. Pre-detection regret = (error)² × (dwell +time) = `δ² · T_d`. Substitute (2): + +``` + δ² · T_d ≈ δ² · 2log(1/α)/(r*·δ²) = 2log(1/α)/r*. +``` + +**The `δ²` cancels.** To leading order every step change costs the same +integrated tracking error, because larger changes are detected +proportionally faster. If true, this is decisive for the shootout: it +means splitting reactivity into **React −10%** and **React −50%** axes +*double-counts a single conserved quantity*, and equal-weighting them +with jitter rewards the midpoint of a trade-off curve ("balanced") +rather than distance to the frontier. (§5 shows where this result +breaks.) + +## 4. The proposed objective + +Because regret is additive over time, the six axes are all projections +of one functional — the integrated squared log-error, i.e. an LQ +tracking cost with a control-effort penalty: + +``` + 1 T ┌ ┐² + J = ─── ∫ ( log H_est/H_true )² dt + ρ·Σ │ Δ log D │ + T 0 fires └ (per fire) ┘ + └──────── tracking regret ────────┘ └── control effort ──┘ +``` + +- The regret term absorbs **convergence + reaction + settled-accuracy + + overshoot** with relative weights *derived from the model*, not + hand-chosen ceilings. A run that never converges simply keeps + accruing `e²` — so the survivor bias and trial-length dependence of + the current time-to-event metrics vanish (a non-finisher is the + worst score, not a dropped sample). +- The effort term absorbs **jitter** (many small fires) and + **step-safety / overshoot** (few big fires) in one quadratic. + Retargets cost a message plus a miner re-tune, so `ρ` is the system's + one real trade-off knob. +- `ρ` replaces all six arbitrary ceilings (`/0.30`, `/0.5`, `/600s`, …) + with a single interpretable Lagrange multiplier: *how many units of + difficulty-error-variance is one retarget worth?* + +**Normalization via the conservation law.** The minimum achievable `J` +over a scenario is set by `r*` and the process-noise statistics (a +Wiener/Kalman bound), not by the algorithm. So the headline can be a +unit-free efficiency + +``` + E = J_optimal / J_algorithm ∈ (0, 1], +``` + +with `E = 1` meaning information-theoretically optimal. This is +automatically SPM-aware (the floor scales with `r*`) and has no +arbitrary ceilings — the root fix for the "skewed scales" complaint. +(§5.4 disputes whether `J_optimal` is actually computable.) + +## 5. Holes in the theory (read this part) + +The framing above is clean, which is suspicious. Here is where it is +wrong or incomplete. + +### 5.1 The cost is asymmetric — symmetric `e²` is the biggest error + +The single most important hole. Commit `a1d3fa7b` (AsymmetricCusum) and +`5d871ed3` ("never surprise the miner") establish that the two +directions of error are *not* equally costly: + +- **Tightening** (raising difficulty, `e` driven up): invalidates + shares miners already have in flight, and at the extreme triggers the + "timeout death spiral" seen with physical miners — the miner submits + nothing, looks dead, and the loop can't recover. +- **Easing** (lowering difficulty, `e` driven down): old, harder work + is still valid; the only cost is slightly more share traffic and pool + variance. Nearly free. + +A symmetric quadratic `e²` averages this away entirely. The honest loss +is asymmetric, and probably has a *barrier* on the over-difficulty side +rather than a quadratic — being 3× over-difficulty is not 9× as bad as +1×, it is potentially catastrophic (disconnect). **Minimum viable fix:** +split the regret into over- and under-difficulty halves with +`w_over ≫ w_under`, and split the effort term into up- and down-fires +with `ρ_up > ρ_down`. The LQ elegance is real but it is the *linearized, +symmetric* shadow of an asymmetric, possibly constrained problem. + +### 5.2 The conservation law is only local — and that *is* the death spiral + +§2 claims information arrives at constant rate `r*`. By (★★) the actual +rate is `r* · e^(−e)`: + +- Over-difficulty (`e > 0`): `r_obs` collapses → **information starves + exactly when you most need it to detect the error.** Positive + feedback: too-high difficulty → fewer shares → slower detection → + stays too-high. This *is* the death spiral, and it is endogenous to + the Poisson observation model. +- Under-difficulty (`e < 0`): `r_obs` floods → more information → fast + self-correction. + +So "constant `r*`" is the conservation law *at the setpoint only* — the +basis for the CRLB (1) and for steady-state accuracy. It does **not** +hold during the transients that the reaction/convergence metrics +measure. This both *limits* the clean theory and *explains* the +asymmetry of §5.1 from first principles: the same `e^(−e)` factor that +makes over-difficulty harmful also makes it harder to observe. A good +shootout objective must reward escaping the starved region fast, which +plain symmetric regret under-weights (it integrates `e²`, but the +*observability* penalty for `e>0` is extra and not captured by `e²`). + +### 5.3 The `δ²` cancellation is fragile + +§3a assumes (a) an essentially optimal sequential detector, (b) that +the correction-phase regret (which *does* scale with `δ²`) is dominated +by the detection-phase regret, and (c) that `δ` is in the regime where +(2) holds — not so small that the estimator window saturates and `T_d` +exceeds the trial. Real boundaries (PoissonCI, CUSUM) are not SPRT, and +at small `δ` detection time is capped by the window, not by `2/δ²`. +So "every step costs the same" is a leading-order idealization for +moderate `δ`. It still kills the *equal-weighting* of React-10/50, but +it does not justify dropping small-step sensitivity entirely — the +catching of slow `−10%` declines (failing ASICs) is a real, separately +valuable capability (`FINDINGS.md` iteration 4; the whole point of +AdaCUSUM). + +### 5.4 `J_optimal` is probably not computable + +The efficiency `E = J_optimal/J` needs the Bayes-optimal +filter+controller for each scenario, under Poisson observation, +*asymmetric* cost (§5.1), *and* power-of-two quantization. That is not +closed-form. The CRLB floor (1) gives a *lower bound* on the regret +term (hence an *upper* bound on `E`), and pow2 quantization adds a hard +regret floor of `(½ log 2)² ≈ 0.12` that no algorithm can beat — but +the true optimum sits somewhere above the CRLB and is unknown. **`E` +should be reported as "fraction of a known lower bound," explicitly a +bound, not "fraction of optimal."** Otherwise it overstates how much +headroom remains. + +### 5.5 Quantization breaks continuous LQ + +Difficulty moves in powers of two; `e` cannot be driven to 0. There is +a floor `e_min ≈ ½ log 2` and the system limit-cycles within one +quantum rather than settling. Continuous LQ has no notion of this. In +practice it means: (a) a regret floor as in §5.4, and (b) jitter has an +irreducible component (toggling across a quantum boundary) that is not +a tuning failure. The effort metric must not punish this. + +### 5.6 The score is only as good as the scenario ensemble + +Regret is additive, so summing across scenarios is legitimate — but the +*weights* are the empirical frequency of cold-starts vs. steps vs. +stable operation vs. aged-counter steps (`SettledStep`, commit +`70fcb260`, which showed reaction time is dominated by counter age, not +SPM). A single mean regret hides which regime an algorithm fails in. +This is no worse than the current radar (which also averages over a +chosen grid), but it is not better either: **the objective does not +free us from choosing a representative workload.** It only makes the +within-workload aggregation principled. + +### 5.7 Non-stationary truth + +The step/cold-start scenarios are idealized. Real hashrate drifts +(diurnal, thermal) and fails (ASIC dropout, on/off). Integrated regret +handles arbitrary `H_true(t)` fine in principle, but the *test* +trajectories must include drift and partial failure for the number to +mean anything. The current grid is mostly steps; that is a workload +gap, orthogonal to the metric choice. + +## 5.8 What the validation pass actually found + +`src/bin/regret-effort.rs` computes the regret/effort decomposition +over 1000-trial trajectories for the three contenders (production +monolith `Cumul/Step/FullClamp*`, `balanced`, `react_priority`) and +tests the three decisive predictions. Results (full table in the +binary's output; `cargo run --release --bin regret-effort`): + +**Q1 — Is the conservation law binding? NO (it is true but slack).** +Settled steady-state mean-`e²` runs at **0.02–0.20× the single-tick +Poisson floor `1/r*`** across every algorithm and share rate — i.e. +*far below* the one-tick floor, because the estimators average over +`τ_eff ≫ 1` tick, exactly as (1) permits. The CRLB is a real lower +bound but it is **not where the cost lives**: steady-state tracking is +nowhere near the information limit, it is comfortably inside it. The +"~0.55 maximin ceiling" of `31a9dbc1` is therefore **not** the CRLB +wall I claimed in §3 — it is a property of the *control architecture +and the old metric's normalization*, not of the observation channel. +That plank of the theory is **withdrawn**. + +**Q2 — Does the `δ²` cancellation hold? NO — refuted.** Post-step +integrated regret rises **monotonically and steeply with `|δ|`**: for +the production algorithm at SPM=6 it goes 0.21 (−10%) → 0.98 (−25%) → +4.58 (−50%) nats²·min — roughly `∝ δ²`, the *opposite* of flat. Larger +steps are not detected fast enough to cancel their larger error. So +React−10 and React−50 measure **genuinely different-magnitude costs**; +they do *not* double-count one conserved quantity. §3a is **wrong as +stated** (it assumed near-SPRT detection, which §5.3 flagged; the data +confirms real boundaries are far from that ideal). The practical +consequence flips: keeping a small-step and a large-step term is +**justified**, though they should be weighted by *cost* (regret), not +counted as equal rates. + +**Q2′ — The directional asymmetry is real and large.** For equal +`|δ|`, **drops cost ~3–4× more than rises**: production at SPM=6, −50% += 4.58 vs +50% = 1.20 nats²·min. And the sign split confirms the +mechanism precisely — a drop's regret is **>99% over-difficulty** +(`reg_over`), a rise's is **>97% under-difficulty**. Over-difficulty +(the death-spiral side, §5.1–5.2) is both the costlier *and* the +self-reinforcing direction, exactly as `r_obs = r*·e^(−e)` predicts. +This is the **strongest-confirmed** part of the theory: the model's +directional structure shows up cleanly in the data. + +**Q3 — Is there a real trade-off wall? Inconclusive from this pass, +and the aggregate is workload-dominated.** Cold-start regret +(~4.5 nats², ~100 effort) **dwarfs every other scenario by ~50–1000×**, +so any all-scenarios mean is just a cold-start measurement in disguise +(confirms §5.6 with a vengeance). Broken out by class, the three +contenders are nearly tied on cold-start and stable, and differ only +modestly on drop/rise — the production monolith actually shows the +*lowest* drop-regret (0.080) but it pays elsewhere (it is the algorithm +the whole `FINDINGS.md` derivation was built to replace, so a single +post-hoc regret number under-rates its known low-SPM detection +failures, which live in the `SettledStep`/counter-age regime this pass +didn't include). **No clean frontier emerged at three points** — and +the cold-start confound means the `(regret, effort)` plane must be +reported *per scenario class*, never pooled. + +**Net effect on the theory.** The *foundation* survives and the +*directional/asymmetric* claims are confirmed with hard numbers. The +two claims that would have justified the most aggressive +simplification — "the conservation law is the binding constraint" and +"magnitude cancels, so collapse the reactivity axes" — are **both +refuted by the data**. The theory is real physics but it is *not* +tight: algorithms operate well inside the information bound, so quality +differences are dominated by control-structure choices and by the +asymmetric, magnitude-dependent transient costs — not by a single +conserved budget. This is the honest, less elegant picture, and it is +the one the metric redesign must be built on. + +## 6. Does this give us everything to redo the shootout? + +**Partly — and after the validation pass the answer is more +constrained than the elegant version promised.** + +What survives and *is* worth building the shootout on: + +- A principled **primary objective** — but it must be the **asymmetric, + magnitude-weighted** regret, not a symmetric `e²`. The data (§5.8) + forces both the over/under split (drops cost 3–4× rises) and a real + dependence on `|δ|` (regret `∝ δ²`). One quadratic with two direction + weights, scored separately by scenario class. +- A **direction-split effort** term (`effort_up` for costly tightening, + `effort_down` for near-free easing) — confirmed meaningful: the + monolith's stable effort is ~50/50 up/down while the EWMA contenders + fire more, and the up/down ratio is exactly the tightening-cost knob + `a1d3fa7b` cared about. +- A **survivor-bias-free, trial-length-robust** treatment of + convergence and reaction (a non-finisher accrues maximal regret + instead of being dropped). This needs no theory to be true — it + follows from integrating `e²` — and it is the single most defensible + improvement over the status quo. +- The right **picture**, with one mandatory caveat: algorithms as points + in the `(regret, effort)` plane **per scenario class**, never pooled. + Cold-start regret dwarfs everything ~50–1000× (§5.8 Q3), so a pooled + plane is a cold-start plane in disguise. + +What the data **took away** from the elegant version: + +- **The CRLB floor is not a useful normalizer.** Algorithms run at + 0.02–0.20× the floor (§5.8 Q1) — it is slack, so `E = J_opt/J` would + be a ratio of two small numbers far from the bound and would not + discriminate. SPM-awareness has to come from per-SPM reporting, not + from dividing by `1/(r*τ)`. +- **You cannot collapse React-10 and React-50.** §3a is refuted; small- + and large-step costs are different and both real. Keep both, weight + by regret (cost), not by equal rate. +- **There is no single magic number** — for the original reasons (the + asymmetry §5.1, the observability trap §5.2, the un-knowable optimum + §5.4) *and* the new one: the cold-start confound means any scalar + that pools scenarios is dominated by one regime. +- Regret and effort are **not intuitive** to a human reviewer the way + "converges in 4 minutes" and "fires 0.03×/min" are. They are correct + but illegible. + +So the proposal for the shootout is: **rank on the per-scenario-class +`(drop-regret, rise-regret, effort_up, effort_down)` profile, and +report these secondary stats as context.** Every one is a projection or +derivative of the *same* trajectory `e(t)`, so they cannot contradict +the primary objective — they only make it legible: + +| Secondary stat | What it is, in `e(t)` terms | Why a human wants it | +|---|---|---| +| **Reaction half-life** | time for transient `e²` to decay 50% after a step | the intuitive "responsiveness," in seconds | +| **Convergence time** | duration of the cold-start transient-regret tail | intuitive, unchanged from today | +| **Jitter (fire rate, stable)** | count rate of the effort term at `e ≈ 0` | intuitive; also the irreducible-quantum check (§5.5) | +| **Peak over-difficulty & dwell** | `max(e>0)` and time spent there | the death-spiral / disconnect proxy (§5.1–5.2) | +| **Up/down effort split** | effort term partitioned by fire direction | exposes the tightening cost (§5.1) | + +These five are the legible shadows of the two-or-three primary numbers. +The radar, if kept at all, should plot *these* — each already +higher-is-better and each tied to a real cost — rather than six +arbitrarily-normalized fitness components. + +## 7. Status and next steps + +**Done:** the regret/effort decomposition is implemented as +`src/bin/regret-effort.rs` (a pure post-process of existing +trajectories — no new simulation, works for the opaque monolith too) +and run at 1000 trials over the three contenders. It produced the §5.8 +findings that refuted two of the theory's claims and confirmed the +asymmetric/directional core. + +**Next, if we proceed to rebuild the shootout on this basis:** + +1. Promote `regret_over` / `regret_under` / `effort_up` / `effort_down` + from the standalone bin into a `DerivedMetric` so they sit alongside + the existing registry and feed the regression harness. +2. Report them **per scenario class** (cold / stable / drop / rise), + never pooled — the cold-start confound (§5.8 Q3) is not optional to + handle. +3. Add the `SettledStep` / counter-age scenarios (`70fcb260`) to the + regret pass before drawing any "which algorithm wins" conclusion — + this pass omitted them, and they are where the monolith's known + detection failures live (§5.8 Q3 caveat). +4. Replace the radar/maximin with the per-class `(regret, effort)` + profile plus the five legible secondary stats; drop `E = J_opt/J` + (the floor is slack, §5.8 Q1). +5. Decide the direction-weight ratios (`w_over/w_under`, `ρ_up/ρ_down`) + from the share-rejection cost model in `a1d3fa7b` — this is a + product/values call, not something the math settles. + +**Honest bottom line.** The theory's *foundation* (the plant identity, +the log-error coordinate, the directional asymmetry, the death-spiral +observability trap) held up and is confirmed in data. Its *elegant +simplifications* (binding conservation law, magnitude cancellation, +efficiency-vs-optimal) did **not** survive contact with the +trajectories. What we are left with is still a real improvement over +the six-axis radar — it deletes the arbitrary ceilings, fixes survivor +bias, and grounds the weights in measurable cost — but it is a +multi-number, per-scenario profile, not a single conserved budget. +The shootout can be redone on this basis; it cannot be reduced to one +elegant scalar. + +## 8. Reformulating the law to fit the observations + +§5.8 refuted the law *as stated*. But a refuted prediction usually +means the law was **applied wrong**, not absent. Both refutations point +at the same omitted variable — the effective window `τ`, which the +algorithm *chooses* and *spends* — so this section reformulates the law +around `τ` and tests two specific tweaks (Q4, Q5 in the binary). Both +candidate reformulations are *also* quantitatively wrong, but the +**pattern** of their failure is what finally locates the real +structure. + +### 8.1 Why the original failed: `τ` is endogenous + +- **Q1 looked slack only because I used the wrong `τ`.** I compared + settled `e²` to the *one-tick* floor `1/r*`. But a stable algorithm + lets its window grow (cumulative counter; EWMA integration), so its + *actual* `τ_eff ≫ 1` tick and `1/(r*·τ_eff)` is 5–50× smaller — right + where the algorithms sit. The law isn't beaten; **the algorithm + spends `τ` to buy precision.** +- **Q2's `δ²` scaling is the signature of window-limited detection.** + SPRT (evidence-limited) gives `T_d ∝ 1/δ²` and regret flat in `δ`. + The data's regret `∝ δ²` is exactly `regret = δ²·T_d` with + **`T_d ≈ const`** — detection waits ~`τ` regardless of step size. + Real boundaries are window-limited, not evidence-limited. + +Both roads lead to `τ`. So the conserved quantity, if any, is a +relationship *between* the two things `τ` trades. + +### 8.2 Tweak 1 — a bandwidth–variance *product* (tested as Q5) + +Reformulate from "precision floor" to "product law": + +``` + V_ss ≈ c₁/(r*·τ) steady error, shrinks with τ + K ≡ regret/δ² ≈ c₂·τ transient cost coeff, grows with τ + ⇒ V_ss · K ≈ c₁c₂/r* τ cancels → V_ss·K·r* ~ const +``` + +A Bode/uncertainty-principle form: *steady precision × transient +agility is bounded, and `τ` only slides you along the curve.* + +**Result (Q5): refuted as a conservation law — `V_ss·K·r*` does NOT +cluster.** The monolith sits at 0.14–0.34, the EWMA contenders at +0.49–0.90 — a systematic ~2–3× split, stable across SPM. **But this is +more useful than conservation would have been:** a non-constant product +means algorithms achieve *genuinely different trade-off efficiency*, so +`V_ss·K·r*` is a **scalar figure of merit** (lower = closer to the +frontier), not a law. The frontier is its minimum achievable value. + +**Critical caveat (same trap as §5.8 Q3).** The monolith's *low* +product is a **false positive**. Its `V_ss` is tiny because it barely +fires when stable (high threshold → near-zero jitter), and `K` is +measured on a *fresh* counter — but that same sluggishness is exactly +why it fails *aged-counter* detection (`70fcb260`). Both `V_ss` and `K` +are measured on young counters, so the product **flatters the monolith +for the very defect the whole derivation set out to fix.** The figure +of merit is only valid once `SettledStep`/counter-age cells are folded +in. Until then it is actively misleading. + +### 8.3 Tweak 2 — state-dependent information rate (tested as Q4) + +Put (★★) *into* the law instead of leaving it as a footnote: + +``` + dI/dt = r* · e^(−e(t)) +``` + +Information starves at over-difficulty (`e>0`), floods at +under-difficulty (`e<0`). For a log-symmetric perturbation `|e_step|=a`, +a drop lands at `+a` and a matched rise at `−a`, giving the falsifiable +prediction + +``` + regret_drop / regret_rise ≈ e^(2a). (matched |e_step|) +``` + +**Result (Q4): refuted as stated, but the *failure mode* is the real +finding.** Predicted 4.0 at `a=ln2`; measured **1.78 at SPM=6 and it +INVERTS to ~0.8 at SPM≥12** (rises cost *more* there). So: + +- At **low SPM** detection is the bottleneck → the starvation asymmetry + shows (drops cost more, qualitatively as predicted, just smaller than + `e^(2a)`). +- At **high SPM** detection is cheap for both → what's left is + *correction dynamics*, and a large rise (+100%) **overshoots into + over-difficulty**, so the rise transient now spends time at `e>0` too. + +### 8.4 A synthesis attempt — *REFUTED by Q6, see §9.1* + +> **The `⟨e⟩⁺` mechanism below is empirically false.** Q6 (§9.1) shows +> upward steps sit at ~0% over-difficulty at *every* SPM — overshoot +> does **not** manufacture `e>0` — yet they still cost more at high SPM. +> So over-difficulty fraction does not predict cost. The reasoning is +> kept because its *refutation* (§9) is what finally separates "cost +> driver" from "directional label." Do not act on this subsection. + +Q4's inversion is the punchline: the penalty attaches to +**over-difficulty as a *state*, not to a drop as an *event*.** You reach +`e>0` either by a downward step *or* by overshooting an upward +correction. So the corrected law is: + +``` + regret ∝ e_step² · exp( 2·⟨e⟩⁺_transient ) +``` + +where `⟨e⟩⁺_transient` is the time-averaged *signed, over-difficulty- +weighted* error during the transient — not a function of step +direction. This unifies three observations under one mechanism: +the confirmed drop>rise asymmetry (§5.8 Q2′), Q4's high-SPM inversion +(overshoot manufactures over-difficulty), and the death-spiral +(over-difficulty is self-reinforcing because `dI/dt` falls there). + +**Directly testable next:** the `reg_over` fraction of the **+100% rise +transient at high SPM** should be elevated (overshoot signature). If it +is, the state-dependent-`⟨e⟩⁺` law is confirmed and replaces both the +naive `e²` and the directional fudge with one physically-grounded term. + +### 8.5 Net: what the law becomes + +| Original claim | Verdict | Replacement | +|---|---|---| +| `Var ≥ 1/(r*τ)` is the *binding* floor | slack (wrong τ) | `τ` is endogenous; precision is *bought* with it | +| Quality = closeness to that floor | refuted | `V_ss·K·r*` figure of merit (not conserved) — *valid only with aged-counter cells* | +| Every step costs the same (`δ²` cancels) | refuted | window-limited detection ⇒ `regret ∝ δ²·T_d`, keep both step sizes | +| Drops cost `e^(2a)`× rises | refuted (inverts at high SPM) | penalty tracks **over-difficulty state** `⟨e⟩⁺`, not step direction | + +The conservation *instinct* was right — there is a real, `r*`-anchored +trade-off between steady precision and transient agility — but it is a +**product/efficiency relationship, not a budget**, and the dominant cost +term is **state-dependent (over-difficulty), not magnitude- or +direction-dependent**. That is a tighter, falsifiable theory than §1–4, +and it is the one to build the shootout metric on — *after* the +counter-age cells are added, without which every steady-state-anchored +number (including the new product) systematically flatters the +sluggish production monolith. + +## 9. Two more refinements tested — both surprised + +§8 ended with two falsifiable predictions and a known gap. Q6 tests the +`⟨e⟩⁺` overshoot mechanism; Q7 adds the counter-age regime. **Both +returned the opposite of what the theory predicted**, and the second +appears to *contradict a committed empirical finding* — which makes the +metric itself the next thing to interrogate. + +### 9.1 Q6 — the overshoot mechanism is false; the split is still a clean label + +§8.4 predicted the over-difficulty fraction of a **+100% upward** step +would *climb with SPM* as correction overshoot manufactures `e>0`. +Measured fraction: + +``` + −50% drop: 1.00 / 1.00 / 1.00 / 1.00 (SPM 4 / 8 / 15 / 30) + +100% rise: 0.04 / 0.01 / 0.00 / 0.00 +``` + +The rise over-fraction is **~0 and *falling*, not climbing.** Upward +steps stay under-difficulty for essentially the whole transient — the +damped update rules (`PartialRetarget`, `AcceleratingPartialRetarget`, +`FullRetargetWithClamp`) approach from below and do **not** overshoot +into `e>0`. So: + +- **§8.4's unifying law `regret ∝ e²·exp(2⟨e⟩⁺)` is refuted.** Rises + cost *more* at high SPM (Q4) while sitting at ~0% over-difficulty; + over-difficulty fraction therefore cannot be the cost driver. The + attempt to make over-difficulty *state* the single explanatory + variable fails. +- **But the over/under split is an excellent *directional classifier*** — + perfectly clean (1.00 vs 0.00) and SPM-stable. It reliably says *which + way* an algorithm erred; it just does not, by itself, say *how much it + cost*. Keep it as a label, not as the cost model. + +What actually drives the high-SPM "rises cost more" inversion, then? +Not overshoot. The remaining candidate is the **under-difficulty +correction tail**: a +100% step needs a large multiplicative climb +(`ln2` of headroom), and the damped, quantized update takes several +fires to get there, accruing under-difficulty regret the whole way — +*more* total than a −50% drop whose correction is a single bounded +clamp. I.e. the asymmetry at high SPM is an **update-rule/convergence** +effect, not an observation/information effect. That is a different axis +of the §3 decomposition than §8.3 assumed, and it means the drop/rise +asymmetry has **two distinct causes** that swap dominance with SPM: +information-starvation (low SPM, favors drop-cost) and +correction-tail-length (high SPM, favors rise-cost). No single +exponential captures both. + +### 9.2 Q7 — counter-age regret is flat (and §8.5 mis-named the culprit) + +§8.5 asserted that steady-state-anchored metrics flatter the monolith +because they miss aged-counter detection failure. Prediction: monolith +post-step regret should **explode** with counter age. Measured +integrated regret (nats²·min, −50% drop): + +``` + monolith SPM6: 6.04 / 5.77 / 5.76 / 5.79 (settle 5 / 30 / 60 / 120 min) + monolith SPM30: 4.64 / 4.03 / 3.63 / 3.59 + EWMA SPM6: 4.96 / 4.80 / 4.75 / 4.66 +``` + +**Regret is flat-to-slightly-*decreasing* with counter age, for every +algorithm — the opposite of the prediction.** Two readings, and they +have very different consequences: + +1. **The regret integral saturates (metric limitation, most likely).** + The post-step window is fixed at 60 min and the drop is to half-rate + (`e_step = ln2 ≈ 0.69`, `e² ≈ 0.48`). If the algorithm has *not* + reacted, regret accrues at ≈0.48/min → ~29 over 60 min. The observed + ~3–6 means it reacts within roughly the first ~10 min in the *mean*, + and a tail of slow trials is **diluted by the mean and capped by the + window**. A 51-min reaction and a 12-min reaction both just read + "high regret for this trial," and averaged with fast trials the + age signal washes out. This is the **same survivor/window artifact + the regret metric was supposed to *fix* — but it only fixes it for + *non-detection*, not for *slow* detection within a bounded window.** + If so, integrated regret needs either an unbounded (or much longer) + window, or a per-trial *reaction-latency* companion stat to expose + the slow tail. **This is a real limitation of the proposed metric and + must be resolved before it can rank algorithms on detection.** + +2. **The monolith genuinely reacts fine here and `70fcb260`'s 51-min + figure was jitter-capped / counter-age-specific** in a way these + cells don't reproduce (different SPM, the actual-counter-age vs + intended-settle gap that commit itself flagged). Less likely given + the commit's care, but not excludable from this pass alone. + +**Q8 adjudicates it: reading (2).** A direct reaction-latency +companion (mean minutes to first fire after the step, non-reactors +counted at the 60-min cap, no survivor drop) is **flat across counter +age** for every algorithm: + +``` + monolith SPM6: 3.9 / 3.5 / 3.6 / 3.6 min (settle 5 / 30 / 60 / 120) + monolith SPM12: 1.8 / 2.0 / 2.1 / 2.1 + EWMA SPM6: 3.4 / 3.3 / 3.4 / 3.3 +``` + +Latency does **not** grow with age — so the flat regret in Q7 is *not* +a metric-saturation artifact (that would have shown growing latency +under flat regret). In these cells **the monolith genuinely reacts in +2–4 min regardless of counter age.** Two consequences, one reassuring +and one that demands follow-up: + +- *Reassuring for the metric:* bounded-window regret and the latency + companion **agree**, so the regret profile is not blind here. The + §9.5 worry about saturation is real in principle but does not bite in + this regime. +- *Resolved by Q9 — there was never a contradiction; I tested the wrong + algorithm.* Re-reading `70fcb260`: the age-blindness it reports is for + **ClassicComposed** (3–30%, "functionally blind at high SPM") and + **Parametric** (<1%) — *not* the monolith, which the commit itself + lists as "100% age-independent." Q7/Q8 tested the monolith, so flat + regret/latency *agrees* with the commit, it doesn't contradict it. + §8.5's "flatters the monolith" framing named the wrong culprit. Q9 + (§9.4) tests the algorithms the commit actually flagged. + +### 9.3 Updated scorecard + +| Refinement | Predicted | Measured | Status | +|---|---|---|---| +| §8.4 `⟨e⟩⁺` overshoot drives cost | rise over-fraction climbs with SPM | ~0 at all SPM, falling | **refuted**; split is a label, not a cost model | +| high-SPM rise-cost cause | overshoot → over-difficulty | under-difficulty correction tail | **reattributed** to update-rule/convergence | +| §8.5 counter-age regret blow-up | monolith regret explodes with age | flat regret AND flat latency (Q8) | **mis-aimed** — monolith isn't the blind one; §8.5 named the wrong algorithm | +| `70fcb260` reproduces? (Q9) | ClassicComposed/Parametric go age-blind | CC 30→1%, Param 1→0% across SPM | **confirmed** — no contradiction; but regret *under-weights* it (§9.4) | + +### 9.4 Q9 — the cross-check reproduces `70fcb260`, and exposes the regret metric's worst flaw + +Testing the algorithms the commit actually flagged, with its +methodology (detection rate = P[fire within 60min], plus actual counter +age at the step), on the `settle=60min, −10%` headline cell: + +``` + algo SPM det% actual_age(min) regret(nats²·min) + ClassicComposed Cumul/Step 6 30% 34.6 1.328 + " 12 9% 50.7 0.801 + " 30 1% 58.6 0.685 + Parametric Cumul/Poisson 6 1% 59.3 0.676 + " 12 1% 59.7 0.665 + " 30 0% 59.9 0.666 + monolith Cumul/Step/* 6 100% 9.8 0.902 + " 12 100% 8.7 0.558 + " 30 100% 19.6 0.204 +``` + +**`70fcb260` reproduces exactly.** ClassicComposed's detection falls +30%→9%→1% across SPM (the commit's "3–30%, functionally blind at high +SPM"); Parametric is ~0% (its "<1%"). The mechanism is visible in the +`actual_age` column: the blind algorithms let the counter mature to +35–60 min (they don't jitter), so the cumulative window dilutes the +−10% signal below threshold — exactly the FINDINGS.md iteration-0 +mechanism. The monolith jitters its counter young (10–20 min) and so +detects 100% — the commit was right to call it age-independent. **There +was no contradiction; my §8.5/§9.2 alarm was a misreading of which +algorithm the commit indicted.** + +**But the `regret` column is the real discovery — and it is bad news +for the proposed metric.** ClassicComposed at SPM30 detects a −10% +degradation **1% of the time** yet has the *lowest* regret of its row +(0.685). As it goes more blind (30%→1%), its regret *falls* +(1.328→0.685). The reason is structural and damning: + +``` + a −10% drop is e_step = ln(0.9) = −0.105, e_step² ≈ 0.011 +``` + +A 10% degradation is a **tiny** error in `e²`. Missing it entirely +costs ~`0.011/min` of regret — nearly nothing. So **the `e²` regret +functional is almost blind to small-magnitude degradation by +construction** — which is precisely the failure mode (slow ASIC death, +thermal throttle, partial dropout) that `70fcb260` built +`CounterAgeSensitivity` to catch and that operators care about most. A +quadratic loss says "a 10% revenue leak is 1% as bad as a 50% one"; +operationally a *persistent undetected* 10% leak is arguably *worse* +than a transient 50% one, because it runs forever. + +This is the **sharpest limitation found in the whole investigation.** +It is not a measurement artifact (Q8 ruled that out) — it is the +**choice of `e²` as the loss**. Quadratic regret correctly ranks +transient tracking but **systematically under-weights small persistent +biases**, and "detect slow degradation" cannot be recovered from it at +any window length. The detection objective is a genuinely separate +dimension, not a projection of the regret trajectory — contradicting +the §6 hope that all secondary stats are "shadows of the same `e(t)`." + +**Consequence for the metric.** Detection of small persistent drops +must be a **first-class term**, not derived from regret: + +- either weight the loss by a **revenue/persistence** factor — e.g. + integrate `|e|` (linear, `∝0.105/min`) or a *time-since-divergence* + penalty rather than `e²`, so a small error that persists accrues + unboundedly; or +- carry the commit's `CounterAgeSensitivity` detection-rate as an + explicit, co-equal axis alongside regret/effort. + +The linear-vs-quadratic choice is itself a values call (how does +disruption scale with error size?), and it interacts with the +asymmetry of §5.1. This is the key open design decision for the +shootout metric. + +### 9.5 Where the theory now stands + +The plant identity, the log-error coordinate, the `r*`-anchored +precision↔agility trade-off (as a *product/efficiency* relation, §8.2), +and the low-SPM information-starvation asymmetry **survive**. What has +fallen away with each test is every attempt to compress *all* cost into +one closed-form term. The transient cost is genuinely **two mechanisms** +(information-limited detection at low SPM; convergence-tail length at +high SPM, §9.1) that trade dominance. And §9.4 found the deeper limit: +**small-magnitude persistent degradation is invisible to an `e²` loss**, +so detection is a separate dimension, not a projection of the regret +trajectory. The bounded-window *measurement* worry (Q7) turned out not +to bite — Q7 and Q8 agree — but that was the lesser problem; the +*loss-shape* problem (§9.4) is the real one. + +The metric for the shootout therefore needs, at minimum: + +1. per-scenario-class `(regret_over, regret_under, effort_up, + effort_down)` — the directional labels are clean and SPM-stable + (§9.1); +2. a **first-class small-degradation detection term** — either a + persistence-weighted loss (integrate `|e|`, or a + time-since-divergence penalty) or the commit's + `CounterAgeSensitivity` detection-rate carried as a co-equal axis. + `e²` regret **cannot** supply this (§9.4); +3. a **companion reaction-latency / non-detection stat** as a cheap + guardrail — it is what adjudicated Q7 (§9.2). + +The `70fcb260` "discrepancy" is **resolved**: Q9 reproduces the commit +exactly (ClassicComposed 30→1%, Parametric ~0%), and there was no +contradiction — my earlier alarm tested the monolith, which the commit +never indicted. That is now closed, not open. + +The conservation law is real but **diagnostic, not sufficient**: it +explains the *shape* of the transient trade-offs and kills the arbitrary +six-axis ceilings, but (a) the transient cost is a small vector of +mechanism-specific terms, not one scalar, and (b) the operationally +critical "catch slow degradation" objective lives **outside** the +quadratic-regret picture entirely. The single elegant scalar of §1–4 is +not recoverable; the honest metric is regret/effort **plus** an explicit +detection axis. That is the theory's resting point, and the +linear-vs-quadratic loss-shape choice (§9.4) is the key remaining design +decision — a values call, not a math one. + +## 10. Synopsis and the loss-shape decision + +This section is the standalone summary: the current best model, the +metric sketch it implies, and a cheap empirical comparison of the three +loss-shape options — including how each changes the algorithm ranking +and what the comparison *looks like* (radar, plane, scalar). + +### 10.1 Current best model (one paragraph) + +A vardiff algorithm is a feedback controller whose **measurement is its +own tracking error**: the observed share rate relative to setpoint is +exactly `H_true/H_est` (★). Work in `e = ln(H_est/H_true)`; the goal is +`e → 0`. Quality lives in two ledgers — **tracking error** `e(t)` and +**control effort** (retargets). The conservation instinct (a fixed +information rate `r*` bounding precision vs. agility) is *real but +diagnostic*: it explains the shape of the trade-offs and kills the +arbitrary six-axis ceilings, but it is **not** a binding budget +(§5.8 Q1: algorithms run far inside it) and the cost does **not** +collapse to one scalar. Three things refused to be unified: transient +cost is two SPM-dependent mechanisms (detection-limited low-SPM, +convergence-tail high-SPM, §9.1); the error is **asymmetric** (over- +difficulty is costlier and self-starving, §5.8 Q2′); and — the sharpest +finding — **a quadratic loss is structurally blind to small persistent +degradation** (§9.4), the exact failing-ASIC case operators care about. + +### 10.2 Metric sketch + +Per trial, from the universal trajectory `(H_est, H_true, fires)` — no +introspection, works for every algorithm: + +``` + regret_over = ⟨e²⟩ over ticks with e>0 (over-difficulty; death-spiral side) + regret_under = ⟨e²⟩ over ticks with e<0 (under-difficulty; cheap side) + effort_up = Σ(Δln D)² on tightening fires (costly: rejects in-flight shares) + effort_down = Σ(Δln D)² on easing fires (≈free) + detection = P[fire within window | small persistent drop] (SEPARATE axis, §9.4) +``` + +Reported **per scenario class** (cold / stable / drop / rise / aged- +counter), never pooled (cold-start dominance, §5.8 Q3). The four +regret/effort terms are clean, model-derived, ceiling-free. `detection` +is the one term that is *not* a projection of `e(t)` and must be carried +explicitly. + +### 10.3 The decision: how does disruption scale with error size? + +The open choice is the **loss shape** on `e`. It is a values call (how +bad is a small persistent bias vs. a large transient one?), and it +determines whether slow degradation is visible. Three options, scored on +the same data (`regret-effort` §10, 600 trials, SPM {6,12,20,30}, mix = +stable + ±50%/±10% steps + aged-counter −10%): + +| algo | Rq (e²) | Rl (\|e\|) | Det% | Eff | +| --- | --- | --- | --- | --- | +| monolith(prod) | 0.0748 | 0.1952 | 100% | 0.027 | +| balanced | 0.0564 | 0.1674 | 100% | 0.059 | +| react_priority | 0.0540 | 0.1609 | 100% | 0.060 | +| ClassicComposed | 0.0818 | 0.1935 | **10%** | 0.438 | +| Parametric | 0.0999 | 0.2181 | **1%** | 0.087 | + +**Option A — Quadratic only (`∫e²`, the LQ-pure metric).** +*Implies:* disruption scales with the square of error; big transient +excursions dominate, small biases are negligible. *Ranking:* +`react_priority > balanced > monolith > ClassicComposed > Parametric`. +*Problem:* ClassicComposed detects the −10% drop **10% of the time** yet +scores *better than the monolith* on Rq (0.082 vs 0.075 — within noise), +because a 10% miss costs `(ln0.9)² ≈ 0.011`/min — nearly nothing. +Detection failure is invisible. **Visualization:** a single +`(regret, effort)` Pareto plane; one dot per algo; lower-left wins. Clean +and legible — but it would green-light a functionally-blind algorithm. + +**Option B — Linear (`∫|e|`).** +*Implies:* disruption scales with error magnitude; a 10% bias is 1/5 as +bad as a 50% one (not 1/25). Small persistent errors get ~2.3× more +relative weight than under quadratic. *Ranking:* reorders the mid-tier — +`… ClassicComposed > monolith > Parametric` (ClassicComposed *rises* +above the monolith on Rl, the opposite of Rq). *Problem:* still does not +*solve* detection — a 10%-blind algo only accrues `0.105`/min, so a fast +algo with occasional larger errors can still out-score it. Linear +narrows the blindness gap but does not close it. **Visualization:** same +plane, different axis scaling; the dots reshuffle but the picture is the +same shape. + +**Option C — Regret + explicit detection axis (recommended).** +*Implies:* small-persistent-degradation detection is its **own +objective**, not derivable from any `∫f(e)` (the §9.4 result). Carry +`detection` as a co-equal term. *Ranking (detection-first):* +`balanced > react_priority > monolith > ClassicComposed > Parametric` — +and now the 10%/1% detectors are correctly pinned to the bottom *by the +metric itself*, not by luck. This is what `70fcb260`'s +`CounterAgeSensitivity` already encodes; the regret work doesn't replace +it, it **joins** it. **Visualization:** a small **radar is justified +again here** — but a *principled* one, 3–5 axes that are real +independent costs, each higher-is-better and ceiling-free: +`{tracking (−Rq or −Rl), gentleness (−Eff), detection (Det), over- +difficulty safety (−regret_over)}`. Unlike the current six-axis radar +(correlated projections + arbitrary `/0.30`-style ceilings), these axes +are genuinely orthogonal — §9.1 showed the over/under and detection +terms move independently. + +### 10.4 What the comparison shows + +The rankings **do diverge**, and exactly where the theory predicts: + +- The **top tier is robust** — `react_priority`/`balanced` beat the + monolith under every philosophy. That ordering is trustworthy. +- The **mid-tier flips on loss shape** — ClassicComposed vs monolith + swaps between Rq and Rl (the small-error reweighting bites). +- Only the **detection axis** (Option C) correctly identifies + ClassicComposed (10%) and Parametric (1%) as operationally broken; + pure regret (A or B) rates them mid-pack because their *steady-state* + tracking is fine and they fire rarely (low effort). **A metric without + an explicit detection term will recommend a blind algorithm.** + +**Bottom line for the shootout.** Use **Option C**: per-class +`(regret_over, regret_under, effort_up, effort_down)` + an explicit +`detection` axis, shown as a 4–5-axis principled radar *and* a +`(regret, effort)` plane per class. Pick **linear** over quadratic for +the regret term itself (it is the more defensible disruption model and +narrows — though does not close — the small-error gap that detection +then finishes). Drop the single-scalar ambition and `E = J_opt/J` +entirely. This is cheap to build: every number above came from one +post-processing binary over existing trajectories. + +### 10.5 What was implemented (and decided) + +Built and committed: + +- **`LogErrorRegret`** (`metrics.rs`, in `registry()`, `ReportOnly`) — + per-cell `regret_over` / `regret_under` (time-averaged **linear** + `|e|`), `regret_lin`, `effort_up` / `effort_down` / `effort`, from the + universal trajectory (works for the opaque monolith). Renders per + scenario class. Unit-tested on the sign split. +- **`bin/regret-radar`** — the five-axis principled radar (tracking, + gentleness, detection, over-diff safety, tighten-care). + +**Normalization decision: against the production incumbent, not a +candidate-set hull.** Each cost axis is scored `ref/(ref+cost)`, so the +monolith lands at exactly the **0.5 mid-ring** (drawn bold); beating it +pushes outward, losing pulls inward, bounded in (0,1). Detection is an +absolute probability and is plotted **raw** (normalizing a probability +by the set max would falsely promote the best candidate to 1.0). + +Why incumbent-reference beats hull-normalization (the original sketch): + +- **Stable run-to-run.** Hull = best-in-set makes every vertex depend on + *who else you plotted*; a new contender silently rescales everyone. + The incumbent is fixed. +- **No strawman needed.** Hull-normalization has no spread unless a + bad candidate is present (among only-good algos it amplifies noise and + the all-100% detection axis goes flat-uninformative). Incumbent- + reference reads directly as "beats / loses to prod" per axis with just + the real contenders. (A flat detection axis is then *correct + information* — "these all detect fine" — not a defect; a blind algo + added to the panel simply plots near center.) +- **Still ceiling-free and principled.** The reference is the thing we + are trying to beat, not a hand-picked `/0.30`. + +At 1000 trials the three contenders vs the monolith reference: tracking +0.50/0.51/0.52, over-diff safety 0.50/0.56/0.56 (contenders beat prod), +gentleness 0.50/0.30/0.30 and tighten-care 0.50/0.27/0.26 (contenders +**worse** — they fire more), detection all 1.00. The honest tradeoff: +the contenders track better and are safer on over-difficulty, paid for +in retarget frequency. + +**Retired:** the old `bin/radar-chart` and its four generated SVGs +(`radar_chart`, `radar_contenders`, `radar_pareto`, +`radar_symmetric_comparison`). `EqualWeightFitness` is marked +**deprecated** but kept until the maximin sweep bins +(`sweep-balanced` / `-estimators` / `-signpersist*` / `-voladapt`) +migrate to regret/effort scoring — that migration is part of the +retune, not done here. diff --git a/sv2/channels-sv2/sim/docs/TODO-CLI-ERGONOMICS.md b/sv2/channels-sv2/sim/docs/TODO-CLI-ERGONOMICS.md new file mode 100644 index 0000000000..815974201a --- /dev/null +++ b/sv2/channels-sv2/sim/docs/TODO-CLI-ERGONOMICS.md @@ -0,0 +1,87 @@ +# Follow-up: CLI ergonomics overhaul + +The current workflow for running vardiff investigations requires +editing binary source code, recompiling, and reading raw markdown. +This should be replaced with a config-driven CLI. + +## Proposed interface + +```bash +# Compare algorithms (sorted by fitness, winners highlighted) +cargo run --release --bin vardiff-compare -- \ + --algorithms full_remedy,ada_cusum_050,ada_cusum_020 \ + --spm 6,8,10,12,15,20,30 \ + --trials 1000 \ + --format table # or: json, csv, markdown + +# Sweep a parameter +cargo run --release --bin vardiff-sweep -- \ + --base ada_cusum \ + --vary eta=0.2,0.3,0.4,0.5 \ + --spm 6,12,30 \ + --trials 500 + +# Regenerate baselines for all registered algorithms +cargo run --release --bin vardiff-baseline -- --all + +# Single-trial trace +cargo run --release --bin vardiff-trace -- \ + ada_cusum_050 cold_start --spm 12 --seed 0xCAFE +``` + +## Algorithm registry (name → factory) + +Algorithms should be addressable by short name rather than requiring +the user to know the full factory function signature: + +``` +full_remedy → EwmaEstimator(120) + PoissonCI + PartialRetarget(0.2) +ada_cusum_020 → EwmaEstimator(120) + AdaptiveCusum(1.5, 0.05) + PartialRetarget(0.2) +ada_cusum_050 → EwmaEstimator(120) + AdaptiveCusum(1.5, 0.05) + PartialRetarget(0.5) +classic → CumulativeCounter + StepFunction + FullRetargetWithClamp +parametric → CumulativeCounter + PoissonCI + FullRetargetWithClamp +vardiff_state → VardiffState (production reference) +``` + +Custom compositions via inline spec: +```bash +--algorithm "ewma(60)+cusum(2.0,0.05)+partial(0.3)" +``` + +## Share rate presets + +```bash +--spm operational # 6,8,10,12,15,20,30 (default) +--spm low # 2,3,4,6 +--spm full # 2,3,4,6,8,10,12,15,20,25,30 +--spm 6,12 # explicit +``` + +## Output improvements + +- Sort algorithms by operational_fitness (best first) +- Bold per-metric winners at each SPM +- Show rank delta vs baseline (e.g., "+3.2pp" vs FullRemedy) +- Summary line: "Algorithm X dominates at SPM Y-Z, loses at SPM W" +- Optional: terminal color output for quick scanning + +## Baseline management + +```bash +# Show which baselines are stale (different from current code) +vardiff-baseline --check + +# Regenerate only stale baselines +vardiff-baseline --update + +# Regenerate all +vardiff-baseline --all +``` + +## Implementation priority + +1. Algorithm name registry (lookup table: name → AlgorithmSpec) +2. CLI argument parsing for compare/sweep/trace +3. Output formatting (sort + bold + rank) +4. Share rate presets +5. Baseline management commands diff --git a/sv2/channels-sv2/sim/eta_sweep.md b/sv2/channels-sv2/sim/eta_sweep.md new file mode 100644 index 0000000000..4a7e8abf7e --- /dev/null +++ b/sv2/channels-sv2/sim/eta_sweep.md @@ -0,0 +1,100 @@ +# FullRemedy η sweep (1000 trials/cell, base_seed = 0xdeadbeefcafef00d) + +Pareto-explore the PartialRetarget η parameter on the FullRemedy family. Holds the other two FullRemedy axes fixed (`EwmaEstimator(τ = 120s)`, `PoissonCI(z = 2.576, margin = 0.05)`) and varies only η. Smaller η means each fire moves a smaller fraction of the gap from `current_h` to the estimator's belief — tighter overshoot bounds at the cost of slower reaction to large step changes. + +## Decoupling score (higher = better) + +`reaction_rate(Step−50) × clamp(1 − jitter_p50 / J_max, 0, 1)`, J_max = 0.50 fires/min. 1.0 = perfect; > 0.8 = strong; < 0.3 = poor. + +| SPM | η=0.10 | η=0.20 | η=0.30 | η=0.50 | η=0.70 | η=1.00 | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.884 | 0.877 | 0.796 | 0.772 | 0.754 | 0.745 | +| 12 | 0.974 | 0.974 | 0.970 | 0.868 | 0.835 | 0.803 | +| 30 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | 0.993 | +| 60 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | +| 120 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | + +## Jitter mean under stable load (lower = better) + +Fires per minute, post-convergence. Smaller = less active stable-load tracking. FullRemedy by design fires under stable load (the cost of active tracking) so absolute jitter scales with η as well as with the boundary. + +| SPM | η=0.10 | η=0.20 | η=0.30 | η=0.50 | η=0.70 | η=1.00 | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.029 | 0.034 | 0.036 | 0.046 | 0.055 | 0.070 | +| 12 | 0.026 | 0.028 | 0.031 | 0.042 | 0.050 | 0.062 | +| 30 | 0.011 | 0.016 | 0.019 | 0.026 | 0.031 | 0.037 | +| 60 | 0.004 | 0.006 | 0.008 | 0.014 | 0.017 | 0.019 | +| 120 | 0.001 | 0.001 | 0.002 | 0.004 | 0.006 | 0.005 | + +## Reaction rate at −50% step (higher = better) + +Fraction of trials that fire within 5 min of a 50% drop in true hashrate. Smaller η damps the per-fire move so multiple fires may be needed to traverse the post-step gap — this table captures whether smaller η costs reactive sensitivity. + +| SPM | η=0.10 | η=0.20 | η=0.30 | η=0.50 | η=0.70 | η=1.00 | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.88 | 0.88 | 0.88 | 0.87 | 0.86 | 0.87 | +| 12 | 0.97 | 0.97 | 0.97 | 0.96 | 0.95 | 0.92 | +| 30 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 0.99 | +| 60 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | +| 120 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | + +## Reaction rate at −10% step (higher = better) + +Small-step sensitivity: a 10% drop is closer to Poisson noise and harder to distinguish from chance. Smaller η means each fire moves less, requiring more fires to traverse the gap — which costs sensitivity on shallow steps. + +| SPM | η=0.10 | η=0.20 | η=0.30 | η=0.50 | η=0.70 | η=1.00 | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.32 | 0.33 | 0.35 | 0.37 | 0.40 | 0.44 | +| 12 | 0.35 | 0.36 | 0.38 | 0.41 | 0.43 | 0.47 | +| 30 | 0.37 | 0.38 | 0.39 | 0.40 | 0.42 | 0.45 | +| 60 | 0.45 | 0.45 | 0.45 | 0.46 | 0.47 | 0.51 | +| 120 | 0.57 | 0.57 | 0.57 | 0.58 | 0.58 | 0.59 | + +## Settled accuracy p50 under stable load (lower = better) + +`|final_hashrate / true_hashrate − 1|` at trial end. Smaller = closer to truth. + +| SPM | η=0.10 | η=0.20 | η=0.30 | η=0.50 | η=0.70 | η=1.00 | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 3.5% | 6.5% | 9.2% | 13.7% | 16.7% | 21.9% | +| 12 | 2.5% | 4.8% | 6.9% | 10.3% | 11.5% | 15.1% | +| 30 | 1.7% | 3.3% | 4.7% | 6.3% | 6.0% | 8.2% | +| 60 | 1.2% | 2.3% | 2.1% | 1.2% | 1.7% | 2.8% | +| 120 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | + +## Ramp target overshoot p50 — cold start (lower = better) + +`max(new_hashrate over fires) / H_true − 1`. Smaller η directly caps the per-fire jump; this is the metric η was introduced to bound. + +| SPM | η=0.10 | η=0.20 | η=0.30 | η=0.50 | η=0.70 | η=1.00 | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.0% | 0.0% | 0.0% | 7.8% | 13.7% | 25.7% | +| 12 | 0.0% | 0.0% | 0.0% | 4.2% | 9.7% | 25.0% | +| 30 | 0.0% | 0.0% | 0.0% | 1.3% | 40.0% | 100.0% | +| 60 | 0.0% | 0.0% | 0.0% | 0.0% | 2.9% | 0.1% | +| 120 | 0.0% | 0.0% | 0.0% | 0.0% | 1.3% | 0.0% | + +## Ramp target overshoot p90 — cold start (lower = better) + +Tail of the same distribution. Captures unlucky-Poisson ramp trajectories. The η-sensitivity headline metric. + +| SPM | η=0.10 | η=0.20 | η=0.30 | η=0.50 | η=0.70 | η=1.00 | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.0% | 0.0% | 10.4% | 27.7% | 40.7% | 57.3% | +| 12 | 0.0% | 0.0% | 5.7% | 16.3% | 24.2% | 36.4% | +| 30 | 0.0% | 0.0% | 1.9% | 10.5% | 40.0% | 100.0% | +| 60 | 0.0% | 0.0% | 0.1% | 5.1% | 10.0% | 16.1% | +| 120 | 0.0% | 0.0% | 0.0% | 3.1% | 6.4% | 11.3% | + +## Ramp target overshoot p99 — cold start (lower = better) + +Worst-trial tail. This is the metric that the original axis analysis identified PartialRetarget as the closure for. + +| SPM | η=0.10 | η=0.20 | η=0.30 | η=0.50 | η=0.70 | η=1.00 | +| --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.0% | 10.0% | 26.9% | 50.5% | 70.6% | 95.9% | +| 12 | 0.0% | 5.9% | 15.3% | 31.3% | 48.8% | 66.5% | +| 30 | 0.0% | 0.7% | 7.4% | 16.7% | 40.0% | 100.0% | +| 60 | 0.0% | 0.0% | 5.6% | 11.1% | 16.9% | 25.5% | +| 120 | 0.0% | 0.0% | 2.7% | 7.1% | 11.6% | 16.7% | + diff --git a/sv2/channels-sv2/sim/eta_z_joint_sweep.md b/sv2/channels-sv2/sim/eta_z_joint_sweep.md new file mode 100644 index 0000000000..e9d208726a --- /dev/null +++ b/sv2/channels-sv2/sim/eta_z_joint_sweep.md @@ -0,0 +1,116 @@ +# FullRemedy joint (η, z) sweep (1000 trials/cell, base_seed = 0xdeadbeefcafef00d) + +Joint Pareto exploration of the PartialRetarget η and PoissonCI z axes on the FullRemedy family. Holds `EwmaEstimator(τ = 120s)` fixed and varies (η, z) over a 3 × 3 grid. Each row in the per-metric tables is a share rate; each column is one (η, z) point. The single-axis sweeps (`eta_sweep.md`, `z_sweep.md`) characterize the marginal effects; this report surfaces any cross-axis coupling — specifically, whether the joint optimum differs from the per-axis marginal optima. + +## Decoupling score + +`reaction_rate(Step−50) × clamp(1 − jitter_p50 / J_max, 0, 1)`, J_max = 0.50 fires/min. + +| SPM | η0.10/z2.576 | η0.10/z3.000 | η0.10/z3.500 | η0.20/z2.576 | η0.20/z3.000 | η0.20/z3.500 | η0.30/z2.576 | η0.30/z3.000 | η0.30/z3.500 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.884 | 0.832 | 0.801 | 0.877 | 0.844 | 0.808 | 0.796 | 0.843 | 0.815 | +| 12 | 0.974 | 0.969 | 0.960 | 0.974 | 0.967 | 0.959 | 0.970 | 0.965 | 0.961 | +| 30 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | +| 60 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | +| 120 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | + +## Jitter mean (stable load) + +Fires per minute, post-convergence. + +| SPM | η0.10/z2.576 | η0.10/z3.000 | η0.10/z3.500 | η0.20/z2.576 | η0.20/z3.000 | η0.20/z3.500 | η0.30/z2.576 | η0.30/z3.000 | η0.30/z3.500 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.029 | 0.012 | 0.003 | 0.034 | 0.016 | 0.005 | 0.036 | 0.020 | 0.006 | +| 12 | 0.026 | 0.010 | 0.003 | 0.028 | 0.011 | 0.003 | 0.031 | 0.014 | 0.005 | +| 30 | 0.011 | 0.004 | 0.001 | 0.016 | 0.005 | 0.001 | 0.019 | 0.009 | 0.003 | +| 60 | 0.004 | 0.001 | 0.001 | 0.006 | 0.002 | 0.001 | 0.008 | 0.003 | 0.001 | +| 120 | 0.001 | 0.000 | 0.000 | 0.001 | 0.001 | 0.000 | 0.002 | 0.001 | 0.000 | + +## Reaction rate at −50% step + +Fraction of trials that fire within 5 min of a 50% drop in true hashrate. + +| SPM | η0.10/z2.576 | η0.10/z3.000 | η0.10/z3.500 | η0.20/z2.576 | η0.20/z3.000 | η0.20/z3.500 | η0.30/z2.576 | η0.30/z3.000 | η0.30/z3.500 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.88 | 0.83 | 0.80 | 0.88 | 0.84 | 0.81 | 0.88 | 0.84 | 0.81 | +| 12 | 0.97 | 0.97 | 0.96 | 0.97 | 0.97 | 0.96 | 0.97 | 0.96 | 0.96 | +| 30 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | +| 60 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | +| 120 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | + +## Reaction rate at −10% step + +Small-step sensitivity: a 10% drop is closer to Poisson noise. + +| SPM | η0.10/z2.576 | η0.10/z3.000 | η0.10/z3.500 | η0.20/z2.576 | η0.20/z3.000 | η0.20/z3.500 | η0.30/z2.576 | η0.30/z3.000 | η0.30/z3.500 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.32 | 0.27 | 0.20 | 0.33 | 0.27 | 0.20 | 0.35 | 0.27 | 0.20 | +| 12 | 0.35 | 0.27 | 0.20 | 0.36 | 0.28 | 0.20 | 0.38 | 0.28 | 0.20 | +| 30 | 0.37 | 0.30 | 0.23 | 0.38 | 0.30 | 0.23 | 0.39 | 0.31 | 0.23 | +| 60 | 0.45 | 0.38 | 0.30 | 0.45 | 0.38 | 0.30 | 0.45 | 0.38 | 0.30 | +| 120 | 0.57 | 0.48 | 0.39 | 0.57 | 0.48 | 0.39 | 0.57 | 0.48 | 0.39 | + +## Settled accuracy p50 (stable) + +`|final_hashrate / true_hashrate − 1|` at trial end. + +| SPM | η0.10/z2.576 | η0.10/z3.000 | η0.10/z3.500 | η0.20/z2.576 | η0.20/z3.000 | η0.20/z3.500 | η0.30/z2.576 | η0.30/z3.000 | η0.30/z3.500 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 3.5% | 3.6% | 3.8% | 6.5% | 7.1% | 7.4% | 9.2% | 10.3% | 11.0% | +| 12 | 2.5% | 2.6% | 2.6% | 4.8% | 5.1% | 5.1% | 6.9% | 7.5% | 7.5% | +| 30 | 1.7% | 1.7% | 0.0% | 3.3% | 3.4% | 0.0% | 4.7% | 4.9% | 0.0% | +| 60 | 1.2% | 0.0% | 0.0% | 2.3% | 0.0% | 0.0% | 2.1% | 0.0% | 0.0% | +| 120 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | + +## Ramp target overshoot p90 (cold start) + +`max(new_hashrate over fires) / H_true − 1` — tail of the distribution. + +| SPM | η0.10/z2.576 | η0.10/z3.000 | η0.10/z3.500 | η0.20/z2.576 | η0.20/z3.000 | η0.20/z3.500 | η0.30/z2.576 | η0.30/z3.000 | η0.30/z3.500 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | 10.4% | 7.3% | 4.1% | +| 12 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | 5.7% | 3.2% | 0.3% | +| 30 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | 1.9% | 0.0% | 0.0% | +| 60 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | 0.1% | 0.0% | 0.0% | +| 120 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | + +## Ramp target overshoot p99 (cold start) + +Worst-trial tail of the ramp overshoot distribution. + +| SPM | η0.10/z2.576 | η0.10/z3.000 | η0.10/z3.500 | η0.20/z2.576 | η0.20/z3.000 | η0.20/z3.500 | η0.30/z2.576 | η0.30/z3.000 | η0.30/z3.500 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.0% | 0.0% | 0.0% | 10.0% | 7.0% | 3.0% | 26.9% | 18.7% | 18.0% | +| 12 | 0.0% | 0.0% | 0.0% | 5.9% | 2.6% | 0.0% | 15.3% | 11.3% | 9.5% | +| 30 | 0.0% | 0.0% | 0.0% | 0.7% | 0.1% | 0.0% | 7.4% | 4.8% | 3.2% | +| 60 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | 5.6% | 2.9% | 1.3% | +| 120 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | 2.7% | 1.0% | 0.2% | + +## Pareto summary at SPM=6 + +Concentrates the trade-off picture at the cell where the FullRemedy parameters have the largest cross-axis coupling (SPM=6 is the hardest cell — sparsest Poisson signal, longest ramp, widest threshold band). For each metric, the table lists the (η, z) point that wins. Reading down: if one (η, z) point wins multiple rows, it is a strong candidate for the new default. + +| Metric | Best (η, z) at SPM=6 | Value | +| --- | --- | --- | +| Decoupling score | η=0.10, z=2.576 | 0.884 | +| Jitter mean (stable load) | η=0.10, z=3.500 | 0.003 | +| Reaction rate at −50% step | η=0.10, z=2.576 | 0.88 | +| Reaction rate at −10% step | η=0.30, z=2.576 | 0.35 | +| Settled accuracy p50 (stable) | η=0.10, z=2.576 | 3.5% | +| Ramp target overshoot p90 (cold start) | η=0.10, z=2.576 | 0.0% | +| Ramp target overshoot p99 (cold start) | η=0.10, z=2.576 | 0.0% | + +## Pareto summary at SPM=120 + +The high-SPM cell. Small-step sensitivity matters most here (the reaction-rate tables in this section drive the operational small-step floor). A new default must not regress meaningfully on the SPM=120 metrics — particularly `reaction rate at −10% step`, which `sweep-z` showed is the canary for excessive z. + +| Metric | Best (η, z) at SPM=120 | Value | +| --- | --- | --- | +| Decoupling score | η=0.10, z=2.576 | 1.000 | +| Jitter mean (stable load) | η=0.10, z=3.500 | 0.000 | +| Reaction rate at −50% step | η=0.10, z=2.576 | 1.00 | +| Reaction rate at −10% step | η=0.30, z=2.576 | 0.57 | +| Settled accuracy p50 (stable) | η=0.10, z=2.576 | 0.0% | +| Ramp target overshoot p90 (cold start) | η=0.10, z=2.576 | 0.0% | +| Ramp target overshoot p99 (cold start) | η=0.10, z=2.576 | 0.0% | + diff --git a/sv2/channels-sv2/sim/ewma_tau_sweep.md b/sv2/channels-sv2/sim/ewma_tau_sweep.md new file mode 100644 index 0000000000..d74916703f --- /dev/null +++ b/sv2/channels-sv2/sim/ewma_tau_sweep.md @@ -0,0 +1,88 @@ +# EWMA τ sweep (1000 trials/cell, base_seed = 0xdeadbeefcafef00d) + +Pareto-explore the EWMA time constant τ. Lower τ → more responsive but more jittery; higher τ → smoother but slower to react. The right τ is the one that maximizes decoupling score without inflating settled accuracy beyond your tolerance. + +## Decoupling score (higher = better) + +`reaction_rate(Step−50) × clamp(1 − jitter_p50 / J_max, 0, 1)`, J_max = 0.50 fires/min. 1.0 = perfect; > 0.8 = strong; < 0.3 = poor. + +| SPM | τ=30s | τ=60s | τ=120s | τ=300s | τ=600s | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.665 | 0.710 | 0.772 | 0.657 | 0.201 | +| 12 | 0.736 | 0.811 | 0.868 | 0.913 | 0.437 | +| 30 | 0.765 | 0.846 | 1.000 | 0.996 | 0.759 | +| 60 | 0.789 | 0.867 | 1.000 | 1.000 | 0.973 | +| 120 | 0.833 | 0.895 | 1.000 | 1.000 | 0.999 | + +## Jitter p50 under stable load (lower = better) + +Fires per minute, post-convergence. Smaller is better; 0 = no fires under stable load. + +| SPM | τ=30s | τ=60s | τ=120s | τ=300s | τ=600s | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.130 | 0.091 | 0.056 | 0.000 | 0.000 | +| 12 | 0.125 | 0.083 | 0.050 | 0.000 | 0.000 | +| 30 | 0.118 | 0.077 | 0.000 | 0.000 | 0.000 | +| 60 | 0.105 | 0.067 | 0.000 | 0.000 | 0.000 | +| 120 | 0.083 | 0.053 | 0.000 | 0.000 | 0.000 | + +## Reaction rate at −50% step (higher = better) + +Fraction of trials that fire within 5 min of a 50% drop in true hashrate. + +| SPM | τ=30s | τ=60s | τ=120s | τ=300s | τ=600s | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.90 | 0.87 | 0.87 | 0.66 | 0.20 | +| 12 | 0.98 | 0.97 | 0.96 | 0.91 | 0.44 | +| 30 | 1.00 | 1.00 | 1.00 | 1.00 | 0.76 | +| 60 | 1.00 | 1.00 | 1.00 | 1.00 | 0.97 | +| 120 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | + +## Settled accuracy p50 (lower = better) + +`|final_hashrate / true_hashrate − 1|` at trial end. Smaller = closer to truth. + +| SPM | τ=30s | τ=60s | τ=120s | τ=300s | τ=600s | +| --- | --- | --- | --- | --- | --- | +| 6 | 16.4% | 12.9% | 13.7% | 0.0% | 0.0% | +| 12 | 10.8% | 8.7% | 10.3% | 0.0% | 0.0% | +| 30 | 6.8% | 5.5% | 6.3% | 0.0% | 0.0% | +| 60 | 4.8% | 4.2% | 1.2% | 0.0% | 0.0% | +| 120 | 3.6% | 2.9% | 0.0% | 0.0% | 0.0% | + +## Estimator variance p50 under stable load (lower = better) + +Population variance of `H̃ / H_true` over post-settle ticks. Indicates how noisy the estimator's belief is. + +| SPM | τ=30s | τ=60s | τ=120s | τ=300s | τ=600s | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.1208 | 0.0736 | 0.0373 | 0.0091 | 0.0032 | +| 12 | 0.0594 | 0.0355 | 0.0174 | 0.0044 | 0.0016 | +| 30 | 0.0239 | 0.0142 | 0.0066 | 0.0017 | 0.0008 | +| 60 | 0.0118 | 0.0071 | 0.0032 | 0.0009 | 0.0004 | +| 120 | 0.0058 | 0.0034 | 0.0015 | 0.0004 | 0.0002 | + +## Ramp target overshoot p50 — cold start (lower = better) + +`max(new_hashrate over fires) / H_true − 1`. Independent of the estimator-noise tails that affect `Phase1Overshoot`. Larger τ → more smoothing → larger overshoot when the EWMA finally catches up; this table quantifies that trade-off. + +| SPM | τ=30s | τ=60s | τ=120s | τ=300s | τ=600s | +| --- | --- | --- | --- | --- | --- | +| 6 | 29.6% | 19.6% | 7.8% | 0.0% | 0.0% | +| 12 | 19.4% | 12.5% | 4.2% | 0.0% | 0.0% | +| 30 | 12.0% | 8.4% | 1.3% | 0.0% | 0.0% | +| 60 | 7.0% | 3.8% | 0.0% | 0.0% | 0.0% | +| 120 | 4.5% | 2.1% | 0.0% | 0.0% | 0.0% | + +## Ramp target overshoot p90 — cold start (lower = better) + +Tail of the same distribution. Captures unlucky-Poisson ramp trajectories. + +| SPM | τ=30s | τ=60s | τ=120s | τ=300s | τ=600s | +| --- | --- | --- | --- | --- | --- | +| 6 | 58.3% | 43.8% | 27.7% | 15.8% | 16.5% | +| 12 | 36.8% | 26.5% | 16.3% | 9.9% | 10.6% | +| 30 | 22.0% | 16.4% | 10.5% | 3.4% | 3.2% | +| 60 | 14.0% | 9.9% | 5.1% | 2.5% | 2.3% | +| 120 | 9.5% | 6.4% | 3.1% | 0.7% | 0.8% | + diff --git a/sv2/channels-sv2/sim/iterative_eval.md b/sv2/channels-sv2/sim/iterative_eval.md new file mode 100644 index 0000000000..25a71796c9 --- /dev/null +++ b/sv2/channels-sv2/sim/iterative_eval.md @@ -0,0 +1,99 @@ +# Algorithm comparison (1000 trials/cell, SPM=6–30) + +Algorithms sorted by mean operational fitness (best first). +**Bold** = best value at that SPM for that metric. + +## Overall ranking + +| Rank | Algorithm | Mean Fitness | +| --- | --- | --- | +| 1 | EWMA-AsymCUSUM-tau120-s15-f5-t30-eta50 ★ | 0.751 | +| 2 | EWMA-AsymCUSUM-tau120-s15-f5-t20-eta50 | 0.727 | +| 3 | EWMA-AsymCUSUM-tau120-s15-f5-t15-eta50 | 0.707 | +| 4 | EWMA-AdaCUSUM-tau120-s15-f5-eta50 | 0.676 | +| 5 | FullRemedy | 0.565 | + +## Reaction rate at -10% step (higher = better) + +| SPM | EWMA-AsymCUSUM-tau120-s15-f5-t30-eta50 | EWMA-AsymCUSUM-tau120-s15-f5-t20-eta50 | EWMA-AsymCUSUM-tau120-s15-f5-t15-eta50 | EWMA-AdaCUSUM-tau120-s15-f5-eta50 | FullRemedy | +| --- | --- | --- | --- | --- | --- | +| 6 | 64.7% | 74.5% | 77.8% | **85.9%** | 32.9% | +| 8 | 56.3% | 68.3% | 70.5% | **76.1%** | 30.0% | +| 10 | 47.6% | 56.8% | 62.3% | **67.5%** | 33.0% | +| 12 | 44.3% | 49.3% | 56.1% | **61.9%** | 34.1% | +| 15 | 42.8% | 46.9% | 49.3% | **55.2%** | 34.2% | +| 20 | 47.4% | 47.7% | 47.6% | **49.6%** | 35.9% | +| 30 | **49.9%** | **49.9%** | **50.0%** | 48.7% | 37.0% | + +## Reaction rate at -50% step (higher = better) + +| SPM | EWMA-AsymCUSUM-tau120-s15-f5-t30-eta50 | EWMA-AsymCUSUM-tau120-s15-f5-t20-eta50 | EWMA-AsymCUSUM-tau120-s15-f5-t15-eta50 | EWMA-AdaCUSUM-tau120-s15-f5-eta50 | FullRemedy | +| --- | --- | --- | --- | --- | --- | +| 6 | **98.4%** | **98.5%** | **98.7%** | **98.7%** | 87.1% | +| 8 | **98.7%** | **98.8%** | **99.1%** | **99.1%** | 92.3% | +| 10 | **99.0%** | **99.1%** | **99.4%** | **99.4%** | 95.4% | +| 12 | **99.0%** | **99.0%** | **99.0%** | **99.2%** | 97.5% | +| 15 | **99.8%** | **99.8%** | **99.8%** | **99.9%** | **99.6%** | +| 20 | **99.4%** | **99.4%** | **99.4%** | **99.3%** | **99.9%** | +| 30 | **99.3%** | **99.3%** | **99.3%** | **99.2%** | **100.0%** | + +## Cold-start convergence time p50 (lower = better) + +| SPM | EWMA-AsymCUSUM-tau120-s15-f5-t30-eta50 | EWMA-AsymCUSUM-tau120-s15-f5-t20-eta50 | EWMA-AsymCUSUM-tau120-s15-f5-t15-eta50 | EWMA-AdaCUSUM-tau120-s15-f5-eta50 | FullRemedy | +| --- | --- | --- | --- | --- | --- | +| 6 | **4m** | 5m | 7m | 8m | 9m | +| 8 | 5m | **4m** | 6m | 6m | 9m | +| 10 | 5m | **4m** | 5m | 6m | 10m | +| 12 | **4m** | **4m** | **4m** | 6m | 10m | +| 15 | **1m** | 4m | 4m | 5m | 11m | +| 20 | **1m** | 4m | 3m | 5m | 11m | +| 30 | **1m** | **1m** | **1m** | **1m** | 11m | + +## Cold-start convergence rate (higher = better) + +| SPM | EWMA-AsymCUSUM-tau120-s15-f5-t30-eta50 | EWMA-AsymCUSUM-tau120-s15-f5-t20-eta50 | EWMA-AsymCUSUM-tau120-s15-f5-t15-eta50 | EWMA-AdaCUSUM-tau120-s15-f5-eta50 | FullRemedy | +| --- | --- | --- | --- | --- | --- | +| 6 | **100.0%** | **99.4%** | 98.3% | 93.7% | **99.9%** | +| 8 | **100.0%** | **100.0%** | **99.9%** | 98.6% | **100.0%** | +| 10 | **100.0%** | **100.0%** | **100.0%** | **100.0%** | **100.0%** | +| 12 | **100.0%** | **100.0%** | **100.0%** | **100.0%** | **99.9%** | +| 15 | **100.0%** | **100.0%** | **100.0%** | **100.0%** | **100.0%** | +| 20 | **100.0%** | **100.0%** | **100.0%** | **100.0%** | **100.0%** | +| 30 | **100.0%** | **100.0%** | **100.0%** | **100.0%** | **100.0%** | + +## Stable-load jitter (fires/min) (lower = better) + +| SPM | EWMA-AsymCUSUM-tau120-s15-f5-t30-eta50 | EWMA-AsymCUSUM-tau120-s15-f5-t20-eta50 | EWMA-AsymCUSUM-tau120-s15-f5-t15-eta50 | EWMA-AdaCUSUM-tau120-s15-f5-eta50 | FullRemedy | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.108 | 0.132 | 0.150 | 0.175 | **0.032** | +| 8 | 0.084 | 0.107 | 0.122 | 0.143 | **0.030** | +| 10 | 0.063 | 0.088 | 0.103 | 0.125 | **0.027** | +| 12 | 0.045 | 0.071 | 0.087 | 0.107 | **0.026** | +| 15 | 0.026 | 0.054 | 0.071 | 0.088 | **0.023** | +| 20 | **0.008** | 0.029 | 0.049 | 0.068 | 0.020 | +| 30 | **0.001** | 0.003 | 0.014 | 0.039 | 0.014 | + +## Ramp target overshoot p99 (lower = better) + +| SPM | EWMA-AsymCUSUM-tau120-s15-f5-t30-eta50 | EWMA-AsymCUSUM-tau120-s15-f5-t20-eta50 | EWMA-AsymCUSUM-tau120-s15-f5-t15-eta50 | EWMA-AdaCUSUM-tau120-s15-f5-eta50 | FullRemedy | +| --- | --- | --- | --- | --- | --- | +| 6 | 36.1% | 40.9% | 43.4% | 45.6% | **5.5%** | +| 8 | 26.5% | 31.3% | 33.4% | 35.6% | **2.3%** | +| 10 | 18.4% | 25.2% | 26.7% | 30.5% | **3.3%** | +| 12 | 16.6% | 20.9% | 24.3% | 26.4% | **3.2%** | +| 15 | 14.1% | 15.4% | 19.5% | 24.1% | **2.5%** | +| 20 | 5.8% | 13.3% | 14.6% | 18.0% | **1.3%** | +| 30 | **0.0%** | 13.7% | 12.9% | 13.0% | **0.0%** | + +## Settled accuracy p50 (lower = better) + +| SPM | EWMA-AsymCUSUM-tau120-s15-f5-t30-eta50 | EWMA-AsymCUSUM-tau120-s15-f5-t20-eta50 | EWMA-AsymCUSUM-tau120-s15-f5-t15-eta50 | EWMA-AdaCUSUM-tau120-s15-f5-eta50 | FullRemedy | +| --- | --- | --- | --- | --- | --- | +| 6 | 10.5% | 9.6% | 9.2% | 9.0% | **6.6%** | +| 8 | 9.1% | 8.2% | 8.1% | 7.7% | **5.7%** | +| 10 | 9.4% | 7.0% | 6.7% | 7.7% | **5.3%** | +| 12 | 8.9% | 6.9% | 6.3% | 6.7% | **4.8%** | +| 15 | 8.4% | 7.2% | 5.9% | 5.8% | **4.3%** | +| 20 | 7.7% | 7.4% | 6.4% | 4.7% | **3.9%** | +| 30 | 6.7% | 6.8% | 7.1% | 6.6% | **3.3%** | + diff --git a/sv2/channels-sv2/sim/pareto.md b/sv2/channels-sv2/sim/pareto.md new file mode 100644 index 0000000000..4392ac85ff --- /dev/null +++ b/sv2/channels-sv2/sim/pareto.md @@ -0,0 +1,162 @@ +# Cross-algorithm Pareto comparison + +*Generated by `cargo run --release --bin compare-algorithms`. 1000 trials per cell, base seed `0xdeadbeefcafef00d`.* + +One section per headline metric. Each row is a share rate; each column is one algorithm. The **bold** entry per row is the winner in that metric's direction-of-improvement; entries within 5% (relative) of the winner are also bolded as effective ties. Algorithms are ordered: production reference → axis-swap variants → recommendation (`FullRemedy`). + +## cold-start convergence rate (↑ higher is better) + +| SPM | VardiffState | ClassicComposed | Parametric | ParametricStrict | ClassicPartialRetarget-30 | EWMA-60s | SlidingWindow-10t | FullRemedy | EWMA-AdaCUSUM-tau120-s15-f5-eta20 | EWMA-AdaCUSUM-tau120-s15-f5-eta50 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | **100.0%** | 86.6% | **100.0%** | **100.0%** | 94.3% | **100.0%** | **100.0%** | **100.0%** | 85.7% | 94.2% | +| 8 | **100.0%** | 89.9% | **100.0%** | **100.0%** | **96.2%** | **100.0%** | **100.0%** | **100.0%** | 93.8% | **99.0%** | +| 10 | **100.0%** | 93.8% | **100.0%** | **100.0%** | **97.1%** | **100.0%** | **100.0%** | **99.9%** | **96.3%** | **100.0%** | +| 12 | **100.0%** | 95.0% | **100.0%** | **100.0%** | **97.5%** | **100.0%** | **100.0%** | **100.0%** | **97.6%** | **100.0%** | +| 15 | **100.0%** | **96.7%** | **100.0%** | **100.0%** | **98.7%** | **100.0%** | **100.0%** | **99.9%** | **97.3%** | **100.0%** | +| 20 | **100.0%** | **98.0%** | **100.0%** | **100.0%** | **98.5%** | **100.0%** | **100.0%** | **100.0%** | **98.5%** | **100.0%** | +| 25 | **100.0%** | **99.2%** | **100.0%** | **100.0%** | **98.8%** | **100.0%** | **100.0%** | **99.8%** | **99.6%** | **100.0%** | +| 30 | **100.0%** | **99.2%** | **100.0%** | **100.0%** | **97.9%** | **100.0%** | **100.0%** | **99.9%** | **99.8%** | **100.0%** | + +## cold-start p90 time (↓ lower is better) + +| SPM | VardiffState | ClassicComposed | Parametric | ParametricStrict | ClassicPartialRetarget-30 | EWMA-60s | SlidingWindow-10t | FullRemedy | EWMA-AdaCUSUM-tau120-s15-f5-eta20 | EWMA-AdaCUSUM-tau120-s15-f5-eta50 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 9m | 21m | 10m | 10m | 18m | 8m | **1m** | 15m | 22m | 18m | +| 8 | 6m | 20m | 10m | 10m | 18m | 8m | **1m** | 15m | 21m | 14m | +| 10 | 6m | 20m | 10m | 10m | 17m | 8m | **1m** | 16m | 21m | 12m | +| 12 | 6m | 20m | 10m | 10m | 18m | 8m | **1m** | 16m | 21m | 11m | +| 15 | 6m | 18m | 10m | 10m | 17m | 9m | **1m** | 16m | 21m | 10m | +| 20 | **6m** | 18m | 10m | 10m | 18m | 8m | **6m** | 16m | 20m | 8m | +| 25 | **1m** | 15m | 10m | 10m | 18m | 8m | **1m** | 17m | 20m | 9m | +| 30 | 6m | 15m | 10m | 10m | 18m | 7m | **4m** | 17m | 18m | 8m | + +## settled accuracy p50 (stable) (↓ lower is better) + +| SPM | VardiffState | ClassicComposed | Parametric | ParametricStrict | ClassicPartialRetarget-30 | EWMA-60s | SlidingWindow-10t | FullRemedy | EWMA-AdaCUSUM-tau120-s15-f5-eta20 | EWMA-AdaCUSUM-tau120-s15-f5-eta50 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 10.5% | 4.3% | **0.0%** | **0.0%** | 4.4% | 13.3% | **0.0%** | 6.4% | 5.7% | 8.9% | +| 8 | 9.1% | 1.7% | **0.0%** | **0.0%** | 1.4% | 11.2% | **0.0%** | 5.8% | 4.8% | 7.7% | +| 10 | 9.4% | **0.0%** | **0.0%** | **0.0%** | **0.0%** | 9.7% | **0.0%** | 5.0% | 4.1% | 7.0% | +| 12 | 8.9% | **0.0%** | **0.0%** | **0.0%** | **0.0%** | 8.4% | **0.0%** | 4.8% | 3.7% | 6.8% | +| 15 | 8.4% | **0.0%** | **0.0%** | **0.0%** | **0.0%** | 7.8% | **0.0%** | 4.3% | 3.1% | 5.8% | +| 20 | 7.7% | **0.0%** | **0.0%** | **0.0%** | **0.0%** | 6.5% | **0.0%** | 3.9% | 2.7% | 4.8% | +| 25 | 7.0% | **0.0%** | **0.0%** | **0.0%** | **0.0%** | 6.0% | **0.0%** | 3.4% | 2.8% | 6.1% | +| 30 | 6.7% | **0.0%** | **0.0%** | **0.0%** | **0.0%** | 5.3% | **0.0%** | 3.2% | 3.0% | 6.5% | + +## settled accuracy p99 (stable) (↓ lower is better) + +| SPM | VardiffState | ClassicComposed | Parametric | ParametricStrict | ClassicPartialRetarget-30 | EWMA-60s | SlidingWindow-10t | FullRemedy | EWMA-AdaCUSUM-tau120-s15-f5-eta20 | EWMA-AdaCUSUM-tau120-s15-f5-eta50 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 32.6% | 60.0% | 9.1% | **0.0%** | 25.6% | 46.8% | 41.7% | 19.3% | 23.2% | 34.4% | +| 8 | 28.6% | 65.9% | **0.4%** | **0.0%** | 21.5% | 44.6% | 32.5% | 17.2% | 18.0% | 27.9% | +| 10 | 23.7% | 44.7% | 1.5% | **0.0%** | 18.0% | 36.2% | 30.0% | 13.9% | 15.8% | 24.9% | +| 12 | 23.5% | 23.7% | **0.0%** | **0.0%** | 15.9% | 35.0% | 27.0% | 13.9% | 14.2% | 24.6% | +| 15 | 21.3% | 20.3% | **0.0%** | **0.0%** | 12.9% | 30.3% | 24.0% | 12.1% | 12.3% | 21.1% | +| 20 | 18.7% | 16.7% | **0.0%** | **0.0%** | 7.8% | 27.2% | 20.0% | 10.1% | 10.3% | 20.1% | +| 25 | 17.3% | 15.2% | **0.0%** | **0.0%** | 6.5% | 22.8% | 18.7% | 9.5% | 8.5% | 18.2% | +| 30 | 13.9% | 16.3% | **0.9%** | **0.0%** | 6.6% | 21.9% | 16.3% | 8.4% | 8.2% | 12.7% | + +## stable-load jitter (mean) (↓ lower is better) + +| SPM | VardiffState | ClassicComposed | Parametric | ParametricStrict | ClassicPartialRetarget-30 | EWMA-60s | SlidingWindow-10t | FullRemedy | EWMA-AdaCUSUM-tau120-s15-f5-eta20 | EWMA-AdaCUSUM-tau120-s15-f5-eta50 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.108/min | 0.052/min | **0.000/min** | **0.000/min** | 0.044/min | 0.089/min | **0.003/min** | 0.031/min | 0.169/min | 0.175/min | +| 8 | 0.084/min | 0.036/min | **0.000/min** | **0.000/min** | 0.023/min | 0.087/min | **0.002/min** | 0.029/min | 0.138/min | 0.144/min | +| 10 | 0.063/min | 0.024/min | **0.001/min** | **0.000/min** | 0.012/min | 0.087/min | **0.002/min** | 0.028/min | 0.115/min | 0.123/min | +| 12 | 0.045/min | 0.014/min | **0.000/min** | **0.000/min** | **0.010/min** | 0.085/min | **0.001/min** | 0.025/min | 0.098/min | 0.107/min | +| 15 | 0.026/min | **0.009/min** | **0.000/min** | **0.000/min** | **0.005/min** | 0.086/min | **0.001/min** | 0.025/min | 0.078/min | 0.088/min | +| 20 | **0.008/min** | **0.005/min** | **0.000/min** | **0.000/min** | **0.002/min** | 0.083/min | **0.001/min** | 0.018/min | 0.055/min | 0.068/min | +| 25 | **0.002/min** | **0.003/min** | **0.000/min** | **0.000/min** | **0.001/min** | 0.081/min | **0.001/min** | 0.018/min | 0.041/min | 0.052/min | +| 30 | **0.001/min** | **0.002/min** | **0.000/min** | **0.000/min** | **0.001/min** | 0.076/min | **0.001/min** | 0.014/min | 0.024/min | 0.037/min | + +## reaction rate at −50% step (↑ higher is better) + +| SPM | VardiffState | ClassicComposed | Parametric | ParametricStrict | ClassicPartialRetarget-30 | EWMA-60s | SlidingWindow-10t | FullRemedy | EWMA-AdaCUSUM-tau120-s15-f5-eta20 | EWMA-AdaCUSUM-tau120-s15-f5-eta50 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | **98.4%** | 70.2% | 3.7% | 1.0% | 66.8% | 85.3% | 40.5% | 84.5% | **99.7%** | **99.3%** | +| 8 | **98.7%** | 59.0% | 3.6% | 0.7% | 58.4% | 92.2% | 51.5% | 92.6% | **99.4%** | **99.6%** | +| 10 | **99.0%** | 57.9% | 6.4% | 2.3% | 57.2% | 94.1% | 59.5% | **96.2%** | **99.6%** | **99.5%** | +| 12 | **99.0%** | 52.0% | 6.3% | 3.9% | 50.3% | **96.5%** | 68.5% | **98.1%** | **99.8%** | **99.6%** | +| 15 | **99.8%** | 46.3% | 8.7% | 3.0% | 41.9% | **98.5%** | 75.4% | **99.4%** | **100.0%** | **99.7%** | +| 20 | **99.4%** | 38.4% | 14.2% | 5.4% | 40.8% | **99.4%** | 86.7% | **99.8%** | **99.7%** | **99.9%** | +| 25 | **99.7%** | 34.7% | 18.4% | 7.2% | 33.0% | **100.0%** | 94.1% | **100.0%** | **99.9%** | **99.6%** | +| 30 | **99.6%** | 30.8% | 21.4% | 12.6% | 27.7% | **99.9%** | **97.2%** | **100.0%** | **99.5%** | **99.7%** | + +## reaction rate at +50% step (↑ higher is better) + +| SPM | VardiffState | ClassicComposed | Parametric | ParametricStrict | ClassicPartialRetarget-30 | EWMA-60s | SlidingWindow-10t | FullRemedy | EWMA-AdaCUSUM-tau120-s15-f5-eta20 | EWMA-AdaCUSUM-tau120-s15-f5-eta50 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 82.2% | 64.3% | 4.0% | 1.6% | 63.8% | 78.9% | 39.2% | 81.9% | **98.2%** | **96.6%** | +| 8 | 83.6% | 57.8% | 4.2% | 1.8% | 56.2% | 83.9% | 48.6% | 88.6% | **97.3%** | **95.9%** | +| 10 | 84.0% | 54.2% | 7.0% | 2.2% | 53.0% | 85.1% | 56.1% | 89.3% | **97.9%** | **97.0%** | +| 12 | 84.7% | 51.5% | 7.7% | 3.6% | 45.7% | 90.0% | 57.7% | **94.9%** | **98.5%** | **97.1%** | +| 15 | 82.3% | 43.6% | 10.5% | 4.5% | 44.2% | 92.0% | 70.7% | **95.5%** | **98.0%** | **96.1%** | +| 20 | 79.8% | 38.9% | 13.2% | 7.9% | 37.5% | **96.9%** | 80.9% | **98.1%** | **98.6%** | **96.4%** | +| 25 | 80.2% | 33.0% | 18.0% | 8.4% | 34.8% | **98.3%** | 87.8% | **99.1%** | **98.4%** | **96.6%** | +| 30 | 79.0% | 35.3% | 23.9% | 14.5% | 33.4% | **98.9%** | 93.5% | **100.0%** | **98.8%** | **97.1%** | + +## ramp target overshoot p99 (cold start) (↓ lower is better) + +| SPM | VardiffState | ClassicComposed | Parametric | ParametricStrict | ClassicPartialRetarget-30 | EWMA-60s | SlidingWindow-10t | FullRemedy | EWMA-AdaCUSUM-tau120-s15-f5-eta20 | EWMA-AdaCUSUM-tau120-s15-f5-eta50 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 36.1% | 132.6% | 69.1% | 70.9% | 40.4% | 63.8% | 55.6% | **7.0%** | 19.8% | 49.2% | +| 8 | 26.5% | 106.7% | 63.1% | 53.6% | 37.9% | 51.7% | 54.0% | **3.7%** | 12.9% | 36.2% | +| 10 | 18.4% | 89.0% | 56.1% | 39.7% | 26.7% | 46.0% | 70.0% | **4.5%** | 10.7% | 31.1% | +| 12 | 16.6% | 79.1% | 50.1% | 44.3% | 19.7% | 41.0% | 58.3% | **3.0%** | 5.7% | 25.8% | +| 15 | 14.1% | 61.7% | 48.7% | 42.2% | 18.5% | 34.3% | 58.1% | **2.7%** | **2.9%** | 23.3% | +| 20 | 5.8% | 52.7% | 35.8% | 42.1% | 11.7% | 29.2% | 50.0% | **0.0%** | **0.0%** | 17.6% | +| 25 | 5.8% | 39.3% | 33.8% | 22.8% | 7.7% | 25.7% | 45.6% | **0.3%** | **0.0%** | 17.1% | +| 30 | **0.0%** | 25.8% | 23.6% | 22.0% | 5.2% | 26.0% | 100.0% | **0.0%** | **0.0%** | 14.7% | + +## upward step magnitude p95 (stable) (↓ lower is better) + +| SPM | VardiffState | ClassicComposed | Parametric | ParametricStrict | ClassicPartialRetarget-30 | EWMA-60s | SlidingWindow-10t | FullRemedy | EWMA-AdaCUSUM-tau120-s15-f5-eta20 | EWMA-AdaCUSUM-tau120-s15-f5-eta50 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 1.384 | 4.000 | **1.000** | **1.000** | 1.300 | 1.522 | 1.476 | 1.124 | 1.126 | 1.341 | +| 8 | 1.342 | 3.250 | **1.000** | **1.000** | 1.225 | 1.445 | 1.325 | 1.104 | 1.109 | 1.287 | +| 10 | 1.298 | 2.400 | **1.000** | **1.000** | 1.180 | 1.394 | 1.350 | 1.091 | 1.092 | 1.251 | +| 12 | 1.258 | 1.833 | **1.000** | **1.000** | 1.119 | 1.353 | 1.250 | 1.081 | 1.085 | 1.232 | +| 15 | 1.223 | 1.500 | **1.000** | **1.000** | 1.090 | 1.312 | 1.220 | 1.075 | 1.072 | 1.204 | +| 20 | 1.167 | 1.325 | **1.000** | **1.000** | 1.057 | 1.273 | 1.185 | 1.065 | 1.064 | 1.170 | +| 25 | **1.000** | 1.216 | **1.000** | **1.000** | **1.048** | 1.239 | 1.168 | 1.058 | 1.055 | 1.154 | +| 30 | **1.000** | 1.220 | **1.000** | **1.000** | **1.048** | 1.215 | 1.147 | 1.052 | **1.048** | 1.138 | + +## operational fitness (↑ higher is better) + +| SPM | VardiffState | ClassicComposed | Parametric | ParametricStrict | ClassicPartialRetarget-30 | EWMA-60s | SlidingWindow-10t | FullRemedy | EWMA-AdaCUSUM-tau120-s15-f5-eta20 | EWMA-AdaCUSUM-tau120-s15-f5-eta50 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.568 | 0.335 | 0.535 | 0.530 | 0.500 | 0.467 | 0.485 | **0.653** | 0.601 | 0.504 | +| 8 | 0.591 | 0.322 | 0.541 | 0.547 | 0.534 | 0.535 | 0.576 | **0.661** | **0.630** | 0.571 | +| 10 | 0.625 | 0.329 | 0.550 | 0.562 | 0.566 | 0.547 | 0.556 | **0.673** | **0.648** | 0.599 | +| 12 | **0.672** | 0.333 | 0.557 | 0.559 | 0.589 | 0.578 | 0.627 | **0.686** | **0.663** | 0.621 | +| 15 | **0.751** | 0.344 | 0.560 | 0.561 | 0.582 | 0.615 | 0.647 | 0.685 | 0.675 | 0.644 | +| 20 | **0.810** | 0.430 | 0.579 | 0.563 | 0.602 | 0.636 | 0.684 | 0.706 | 0.692 | 0.690 | +| 25 | **0.906** | 0.491 | 0.585 | 0.585 | 0.602 | 0.647 | 0.707 | 0.707 | 0.705 | 0.728 | +| 30 | **0.909** | 0.497 | 0.598 | 0.591 | 0.599 | 0.708 | 0.648 | 0.719 | 0.723 | 0.795 | + +## decoupling score (↑ higher is better) + +| SPM | VardiffState | ClassicComposed | Parametric | ParametricStrict | ClassicPartialRetarget-30 | EWMA-60s | SlidingWindow-10t | FullRemedy | EWMA-AdaCUSUM-tau120-s15-f5-eta20 | EWMA-AdaCUSUM-tau120-s15-f5-eta50 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.777 | 0.702 | 0.037 | 0.010 | 0.668 | 0.705 | 0.405 | **0.845** | 0.665 | 0.648 | +| 8 | 0.823 | 0.590 | 0.036 | 0.007 | 0.584 | 0.768 | 0.515 | **0.926** | 0.723 | 0.711 | +| 10 | 0.866 | 0.579 | 0.064 | 0.023 | 0.572 | 0.777 | 0.595 | **0.962** | 0.775 | 0.746 | +| 12 | 0.891 | 0.520 | 0.063 | 0.039 | 0.503 | 0.804 | 0.685 | **0.981** | 0.798 | 0.786 | +| 15 | **0.998** | 0.463 | 0.087 | 0.030 | 0.419 | 0.821 | 0.754 | **0.994** | 0.846 | 0.824 | +| 20 | **0.994** | 0.384 | 0.142 | 0.054 | 0.408 | 0.828 | 0.867 | **0.998** | 0.880 | 0.866 | +| 25 | **0.997** | 0.347 | 0.184 | 0.072 | 0.330 | 0.846 | 0.941 | **1.000** | 0.894 | 0.871 | +| 30 | **0.996** | 0.308 | 0.214 | 0.126 | 0.277 | 0.856 | **0.972** | **1.000** | **0.995** | 0.892 | + +## max |reaction asymmetry| (↓ lower is better) + +| SPM | VardiffState | ClassicComposed | Parametric | ParametricStrict | ClassicPartialRetarget-30 | EWMA-60s | SlidingWindow-10t | FullRemedy | EWMA-AdaCUSUM-tau120-s15-f5-eta20 | EWMA-AdaCUSUM-tau120-s15-f5-eta50 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 6 | 0.162 | 0.059 | **0.003** | **0.006** | 0.030 | 0.064 | 0.037 | 0.037 | 0.028 | 0.027 | +| 8 | 0.151 | 0.023 | **0.006** | **0.011** | 0.057 | 0.083 | 0.045 | 0.043 | 0.021 | 0.037 | +| 10 | 0.198 | 0.037 | **0.006** | **0.001** | 0.042 | 0.090 | 0.034 | 0.069 | 0.051 | 0.033 | +| 12 | 0.268 | 0.025 | 0.014 | **0.003** | 0.053 | 0.065 | 0.108 | 0.066 | 0.020 | 0.036 | +| 15 | 0.333 | 0.027 | **0.018** | **0.015** | 0.049 | 0.065 | 0.047 | 0.040 | 0.041 | 0.036 | +| 20 | 0.498 | **0.012** | **0.010** | 0.025 | 0.033 | 0.046 | 0.058 | 0.028 | 0.025 | 0.035 | +| 25 | 0.660 | 0.017 | **0.004** | **0.012** | 0.018 | 0.047 | 0.063 | 0.041 | 0.034 | 0.045 | +| 30 | 0.733 | 0.045 | **0.025** | **0.019** | 0.057 | 0.033 | 0.048 | 0.070 | 0.047 | 0.030 | + diff --git a/sv2/channels-sv2/sim/src/baseline.rs b/sv2/channels-sv2/sim/src/baseline.rs new file mode 100644 index 0000000000..cd705512ff --- /dev/null +++ b/sv2/channels-sv2/sim/src/baseline.rs @@ -0,0 +1,1144 @@ +//! Baseline characterization: parameterized sweep of cells × trials, +//! producing a structured result that can be serialized to TOML +//! (machine-readable, for regression assertions) and Markdown +//! (human-readable, for PR review). +//! +//! A **cell** is one tuple of `(algorithm, share_rate, scenario)`. The +//! default grid is 8 share rates × 10 scenarios = 80 cells. With +//! `N=1000` trials per cell that's 80,000 trials and ~30 seconds of +//! wall clock at release-mode speed. +//! +//! ## Step-3 refactor +//! +//! Metric computation and tolerance policy now live in the [`crate::metrics`] +//! module. This file is responsible for: +//! +//! - Scenario / Cell / Grid definitions +//! - Driving trials per cell +//! - Calling each registry metric on those trials and storing the +//! results in [`CellResult::metrics`] +//! - Serializing the (cell, metric values) bag to TOML and Markdown +//! +//! All per-metric switch statements have moved out of this file. The +//! serializers do iterate metrics by id (because Markdown wants +//! section-by-section grouping), but they read values through the +//! key-based accessor [`CellResult::get`] rather than through hardcoded +//! struct fields. + +use std::collections::HashMap; +use std::sync::Arc; + +use channels_sv2::vardiff::MockClock; +use channels_sv2::VardiffState; + +use crate::metrics::{self, MetricValues}; +use crate::schedule::HashrateSchedule; +use crate::trial::{run_trial, Trial, TrialConfig}; + +/// Default trial-count per cell. Overridable via the +/// `VARDIFF_BASELINE_TRIALS` environment variable when running +/// `generate-baseline`. +pub const DEFAULT_TRIAL_COUNT: usize = 1000; + +/// Default base seed. Overridable via `VARDIFF_BASELINE_SEED`. +pub const DEFAULT_BASELINE_SEED: u64 = 0xDEAD_BEEF_CAFE_F00D; + +/// Quiet-window for convergence detection (seconds). +pub const QUIET_WINDOW_SECS: u64 = 300; + +/// Settle-buffer for jitter measurement (seconds). +pub const SETTLE_BUFFER_SECS: u64 = 120; + +/// Minimum settled-window for jitter to be reported (seconds). +pub const MIN_SETTLED_WINDOW_SECS: u64 = 600; + +/// Reaction window for step-change scenarios (seconds). +pub const REACT_WINDOW_SECS: u64 = 300; + +/// Step-change scenarios fire their event at this offset from trial +/// start. +pub const STEP_EVENT_AT_SECS: u64 = 15 * 60; + +/// Trial duration (seconds). +pub const TRIAL_DURATION_SECS: u64 = 30 * 60; + +/// The "true" miner hashrate used by every scenario (1 PH/s). This is +/// held constant across the grid so cells differ only in share rate +/// and scenario shape, not in absolute scale. +pub const TRUE_HASHRATE: f32 = 1.0e15; + +/// Default initial estimate for cold-start scenarios (10 GH/s — five +/// orders of magnitude below truth). +pub const COLD_START_INITIAL_HASHRATE: f32 = 1.0e10; + +/// A primitive of the scenario DSL. Phases compose into a +/// piecewise-constant (or piecewise-linear, for [`Phase::Ramp`]) +/// hashrate trajectory over a trial. The [`Phase::build`] path turns a +/// `Vec` into a [`HashrateSchedule`]. +/// +/// The named scenarios ([`Scenario::ColdStart`], [`Scenario::Stable`], +/// [`Scenario::Step`]) are implemented as predefined phase lists. The +/// trial-level output is byte-identical to a hand-coded `build` arm +/// for each scenario (asserted by `tests::phase_dsl_matches_legacy_*`). +/// +/// New scenarios (stall recovery, sustained noise, transient spike, +/// slow ramp) compose the same primitives without requiring a new +/// `Scenario` variant. Use [`Scenario::Custom`] for those. +#[derive(Debug, Clone, PartialEq)] +pub enum Phase { + /// Constant hashrate `h` for `secs` seconds. + Hold { secs: u64, h: f32 }, + /// Linear ramp from `from` to `to` over `secs` seconds. Approximated + /// as `RAMP_SEGMENTS`-many piecewise-constant segments inside + /// `HashrateSchedule`, which is itself piecewise-constant. + /// + /// Discretization: each segment is `secs / RAMP_SEGMENTS` long + /// (integer division). If `secs % RAMP_SEGMENTS != 0` the + /// remainder is silently truncated and the ramp ends slightly + /// short of `secs`. Aligning `secs` to a multiple of + /// `RAMP_SEGMENTS` (e.g., 600s, 1200s) avoids this entirely. + Ramp { secs: u64, from: f32, to: f32 }, + /// Zero hashrate for `secs` seconds. Tests the algorithm's stall + /// detection — the share rate goes to zero and the algorithm has + /// to react via the zero-shares branch. + Stall { secs: u64 }, +} + +/// Number of piecewise-constant segments used to approximate a +/// [`Phase::Ramp`]. Larger = smoother but more segments in the +/// schedule. 10 is enough for the tick-interval-aligned scenarios used +/// in characterization. +pub const RAMP_SEGMENTS: u64 = 10; + +/// Converts a phase list into a `(TrialConfig, HashrateSchedule)` pair. +/// The total duration is the sum of phase durations. `initial_estimate` +/// becomes `TrialConfig::initial_hashrate`; `None` defaults to +/// `TRUE_HASHRATE` (used by the `Stable` and `Step` named scenarios, +/// which start aligned with truth). +pub fn phases_to_trial( + phases: &[Phase], + initial_estimate: Option, + shares_per_minute: f32, +) -> (TrialConfig, HashrateSchedule) { + let mut segments: Vec<(u64, f32)> = Vec::new(); + let mut t: u64 = 0; + for phase in phases { + match *phase { + Phase::Hold { secs, h } => { + segments.push((t, h)); + t = t.saturating_add(secs); + } + Phase::Stall { secs } => { + // True hashrate = 0 → λ = 0 → no shares are sampled. + // The algorithm sees an empty window and reacts via + // its zero-shares branch. + segments.push((t, 0.0)); + t = t.saturating_add(secs); + } + Phase::Ramp { secs, from, to } => { + // Approximate as N piecewise-constant segments. Each + // covers secs/N of the ramp. Sample N points evenly + // across [from, to]; segment k starts at `t + k * step` + // and runs to the next segment's start. + let n = RAMP_SEGMENTS.max(2); + let step_secs = secs / n; + for k in 0..n { + let alpha = k as f32 / (n - 1) as f32; + let h = from + (to - from) * alpha; + segments.push((t, h)); + t = t.saturating_add(step_secs); + } + } + } + } + + let initial_hashrate = initial_estimate.unwrap_or(TRUE_HASHRATE); + let total_duration = t; + + let config = TrialConfig { + duration_secs: total_duration, + initial_hashrate, + shares_per_minute, + tick_interval_secs: 60, + }; + let schedule = HashrateSchedule::new(segments); + (config, schedule) +} + +/// What kind of trial to run. The `Default` impl picks `Stable` so +/// `CellResult::default()` is well-formed. +/// +/// ## Implementation note: phase-DSL backed +/// +/// The named variants (`ColdStart`, `Stable`, `Step`) are kept for +/// ergonomics — they're how `default_cells()` and the regression +/// baseline name themselves. Internally each variant is just a +/// shorthand for a predefined `Vec` plus an optional initial +/// estimate; the `build` method routes through [`phases_to_trial`] +/// uniformly. `tests::phase_dsl_matches_*` asserts the phase-list +/// path produces the same `(TrialConfig, HashrateSchedule)` a +/// hand-coded `build` arm would. +/// +/// `Custom { name, phases, initial_estimate }` lets new scenarios +/// compose primitives directly without adding a variant. A +/// stall-recovery scenario, for example, is: +/// +/// ```text +/// Scenario::Custom { +/// name: "stall_recovery_5min".into(), +/// phases: vec![ +/// Phase::Hold { secs: 600, h: TRUE_HASHRATE }, +/// Phase::Stall { secs: 300 }, +/// Phase::Hold { secs: 900, h: TRUE_HASHRATE }, +/// ], +/// initial_estimate: None, +/// } +/// ``` +#[derive(Debug, Clone, PartialEq, Default)] +pub enum Scenario { + /// Algorithm's initial belief is far below true hashrate; tests + /// convergence. + ColdStart, + /// Algorithm starts aligned with truth; tests steady-state jitter. + #[default] + Stable, + /// Hashrate steps by `delta_pct` at [`STEP_EVENT_AT_SECS`]; tests + /// reaction time and sensitivity. + Step { delta_pct: i32 }, + /// Hashrate is stable for `settle_minutes` (creating a counter of + /// that age since the algorithm won't fire during steady-state), + /// then steps by `delta_pct`. Tests reaction time as a function of + /// counter age — the key variable identified during calibration. + SettledStep { settle_minutes: u64, delta_pct: i32 }, + /// A scenario described directly as a phase list. Lets new + /// scenarios (stall, sustained noise, transient spike, slow ramp) + /// compose the [`Phase`] primitives without adding a new variant + /// to this enum. + Custom { + name: String, + phases: Vec, + initial_estimate: Option, + }, +} + +impl Scenario { + /// Translates a scenario into its (phases, initial_estimate) form. + /// Named variants expand to predefined phase lists; `Custom` + /// returns its stored phases directly. + fn to_phases_and_initial(&self) -> (Vec, Option) { + match self { + Scenario::ColdStart => ( + vec![Phase::Hold { + secs: TRIAL_DURATION_SECS, + h: TRUE_HASHRATE, + }], + Some(COLD_START_INITIAL_HASHRATE), + ), + Scenario::Stable => ( + vec![Phase::Hold { + secs: TRIAL_DURATION_SECS, + h: TRUE_HASHRATE, + }], + None, + ), + Scenario::Step { delta_pct } => { + let post = TRUE_HASHRATE * (1.0 + *delta_pct as f32 / 100.0); + ( + vec![ + Phase::Hold { + secs: STEP_EVENT_AT_SECS, + h: TRUE_HASHRATE, + }, + Phase::Hold { + secs: TRIAL_DURATION_SECS - STEP_EVENT_AT_SECS, + h: post, + }, + ], + None, + ) + } + Scenario::SettledStep { + settle_minutes, + delta_pct, + } => { + let settle_secs = settle_minutes * 60; + let observation_window = 60 * 60; // 60 min post-step + let post = TRUE_HASHRATE * (1.0 + *delta_pct as f32 / 100.0); + ( + vec![ + Phase::Hold { + secs: settle_secs, + h: TRUE_HASHRATE, + }, + Phase::Hold { + secs: observation_window, + h: post, + }, + ], + None, + ) + } + Scenario::Custom { + phases, + initial_estimate, + .. + } => (phases.clone(), *initial_estimate), + } + } + + /// Stable, machine-readable identifier suitable for use as a key + /// in the TOML output. + pub fn key(&self) -> String { + match self { + Scenario::ColdStart => "cold_start_10gh_to_1ph".to_string(), + Scenario::Stable => "stable_1ph".to_string(), + Scenario::Step { delta_pct } => { + if *delta_pct >= 0 { + format!("step_plus_{}_at_15min", delta_pct.unsigned_abs()) + } else { + format!("step_minus_{}_at_15min", delta_pct.unsigned_abs()) + } + } + Scenario::SettledStep { + settle_minutes, + delta_pct, + } => { + let sign = if *delta_pct >= 0 { "plus" } else { "minus" }; + format!( + "settled_{}min_step_{}_{}", + settle_minutes, + sign, + delta_pct.unsigned_abs() + ) + } + Scenario::Custom { name, .. } => name.clone(), + } + } + + /// Reverse of [`Scenario::key`] for the named variants. Used by the + /// regression comparator to reconstruct `Cell` from a baseline TOML + /// cell-key. Returns `None` for unrecognized strings; `Custom` + /// scenarios that the framework didn't generate are not + /// reconstructible from a key alone (the phase list would be lost). + pub fn from_key(s: &str) -> Option { + if s == "cold_start_10gh_to_1ph" { + return Some(Self::ColdStart); + } + if s == "stable_1ph" { + return Some(Self::Stable); + } + if let Some(rest) = s.strip_prefix("step_plus_") { + let num = rest.split('_').next()?; + let d: u32 = num.parse().ok()?; + return Some(Self::Step { + delta_pct: d as i32, + }); + } + if let Some(rest) = s.strip_prefix("step_minus_") { + let num = rest.split('_').next()?; + let d: u32 = num.parse().ok()?; + return Some(Self::Step { + delta_pct: -(d as i32), + }); + } + // settled_min_step_plus_ or settled_min_step_minus_ + if let Some(rest) = s.strip_prefix("settled_") { + let (mins_str, after_min) = rest.split_once("min_step_")?; + let settle_minutes: u64 = mins_str.parse().ok()?; + if let Some(d_str) = after_min.strip_prefix("plus_") { + let d: u32 = d_str.parse().ok()?; + return Some(Self::SettledStep { + settle_minutes, + delta_pct: d as i32, + }); + } + if let Some(d_str) = after_min.strip_prefix("minus_") { + let d: u32 = d_str.parse().ok()?; + return Some(Self::SettledStep { + settle_minutes, + delta_pct: -(d as i32), + }); + } + } + None + } + + /// Builds the `TrialConfig` and `HashrateSchedule` for this + /// scenario at a given share rate. Routes through + /// [`phases_to_trial`] for all variants. + pub fn build(&self, shares_per_minute: f32) -> (TrialConfig, HashrateSchedule) { + let (phases, initial) = self.to_phases_and_initial(); + phases_to_trial(&phases, initial, shares_per_minute) + } +} + +/// A single (algorithm, share_rate, scenario) cell. The algorithm is +/// currently implicit — only `VardiffState` is characterized by this +/// build of the framework — but the cell key in the output baseline +/// carries scenario and rate explicitly. +#[derive(Debug, Clone)] +pub struct Cell { + pub shares_per_minute: f32, + pub scenario: Scenario, +} + +impl Cell { + /// Stable, machine-readable identifier in the form + /// `spm_.`. + pub fn key(&self) -> String { + format!( + "spm_{}.{}", + self.shares_per_minute as u32, + self.scenario.key() + ) + } +} + +/// The full set of metric values computed for one cell. +/// +/// Metric-keyed rather than field-flat: each registered metric stores +/// its emitted values under its own id (e.g. `convergence_time`, +/// `jitter`). Look up specific values by key with [`CellResult::get`] +/// (which searches across all metrics — keys are unique by convention). +#[derive(Debug, Clone, Default)] +pub struct CellResult { + pub shares_per_minute: f32, + pub scenario: Scenario, + /// Metric id → emitted values. Populated by [`run_cell`] from the + /// [`crate::metrics::registry`]. + pub metrics: HashMap<&'static str, MetricValues>, +} + +impl CellResult { + /// Constructs an empty CellResult for the given cell coordinates. + /// Convenience for tests; production code uses [`run_cell`]. + pub fn new(shares_per_minute: f32, scenario: Scenario) -> Self { + Self { + shares_per_minute, + scenario, + metrics: HashMap::new(), + } + } + + /// Looks up a metric value by key. Searches across all stored + /// metrics; returns the first hit. Keys are unique by convention + /// (`convergence_rate`, `jitter_p50_per_min`, etc.) so order is + /// irrelevant in practice. + pub fn get(&self, key: &str) -> Option { + self.metrics.values().find_map(|m| m.get(key)) + } + + /// Looks up the bootstrap CI bounds for a key across all metrics + /// in this cell. Returns `None` if no metric recorded a CI for + /// the given key. + pub fn get_ci(&self, key: &str) -> Option<(f64, f64)> { + self.metrics.values().find_map(|m| m.get_ci(key)) + } + + /// String key form of the scenario for output paths. + pub fn scenario_key(&self) -> String { + self.scenario.key() + } + + /// Inserts a metric's emitted values. Convenience for tests. + pub fn insert(&mut self, metric_id: &'static str, values: MetricValues) { + self.metrics.insert(metric_id, values); + } +} + +/// Runs a single cell: builds the scenario, runs `trial_count` trials +/// with deterministic seeds, computes each registered metric, returns +/// a [`CellResult`]. Metric impls in [`crate::metrics::registry`] +/// decide which cells they apply to. +pub fn run_cell(cell: &Cell, trial_count: usize, base_seed: u64, cell_index: u64) -> CellResult { + let (config, schedule) = cell.scenario.build(cell.shares_per_minute); + + let mut trials: Vec = Vec::with_capacity(trial_count); + for trial_index in 0..trial_count { + let seed = base_seed + .wrapping_add(cell_index.wrapping_shl(20)) + .wrapping_add(trial_index as u64); + let clock = Arc::new(MockClock::new(0)); + let vardiff = VardiffState::new_with_clock(1.0, clock.clone()) + .expect("VardiffState construction should never fail"); + let trial = run_trial(vardiff, clock, config.clone(), &schedule, seed); + trials.push(trial); + } + + let mut result = CellResult::new(cell.shares_per_minute, cell.scenario.clone()); + for metric in metrics::registry() { + if metric.applies_to(cell) { + let values = metric.compute(&trials, cell); + result.metrics.insert(metric.id(), values); + } + } + result +} + +/// The default characterization grid: 8 share rates × 10 scenarios = +/// 80 cells. +pub fn default_cells() -> Vec { + let rates: [f32; 8] = [6.0, 8.0, 10.0, 12.0, 15.0, 20.0, 25.0, 30.0]; + let deltas: [i32; 8] = [-50, -25, -10, -5, 5, 10, 25, 50]; + let mut cells = Vec::new(); + for &spm in &rates { + cells.push(Cell { + shares_per_minute: spm, + scenario: Scenario::ColdStart, + }); + cells.push(Cell { + shares_per_minute: spm, + scenario: Scenario::Stable, + }); + for &delta_pct in &deltas { + cells.push(Cell { + shares_per_minute: spm, + scenario: Scenario::Step { delta_pct }, + }); + } + } + cells +} + +/// Runs every cell in `cells` against the classic [`VardiffState`] +/// algorithm. Sequential; rayon parallelism is a future optimization. +pub fn run_baseline(cells: &[Cell], trial_count: usize, base_seed: u64) -> Vec { + cells + .iter() + .enumerate() + .map(|(idx, cell)| run_cell(cell, trial_count, base_seed, idx as u64)) + .collect() +} + +// ============================================================================ +// Serialization: TOML +// ============================================================================ + +/// Serializes a baseline result set to TOML. The key order matches +/// the registry's metric order, and within each metric the key order +/// matches the metric impl's insertion order. The output ordering is +/// stable across runs given the same registry and the same algorithm +/// — relevant when diffing baselines. +pub fn serialize_toml( + results: &[CellResult], + meta_algorithm: &str, + trial_count: usize, + base_seed: u64, +) -> String { + let mut out = String::new(); + + out.push_str("# Vardiff baseline characterization. Regenerate with\n"); + out.push_str("# `cargo run --release --bin generate-baseline` from the sim crate.\n\n"); + + out.push_str("[meta]\n"); + out.push_str(&format!("algorithm = \"{}\"\n", meta_algorithm)); + out.push_str(&format!("trial_count = {}\n", trial_count)); + out.push_str(&format!("base_seed = {}\n", base_seed)); + out.push_str(&format!("quiet_window_secs = {}\n", QUIET_WINDOW_SECS)); + out.push_str(&format!("settle_buffer_secs = {}\n", SETTLE_BUFFER_SECS)); + out.push_str(&format!( + "min_settled_window_secs = {}\n", + MIN_SETTLED_WINDOW_SECS + )); + out.push_str(&format!("react_window_secs = {}\n", REACT_WINDOW_SECS)); + out.push_str(&format!("step_event_at_secs = {}\n", STEP_EVENT_AT_SECS)); + out.push_str(&format!("trial_duration_secs = {}\n", TRIAL_DURATION_SECS)); + out.push('\n'); + + let registry = metrics::registry(); + + for result in results { + let scenario_key = result.scenario_key(); + out.push_str(&format!( + "[cell.spm_{}.{}]\n", + result.shares_per_minute as u32, scenario_key + )); + out.push_str(&format!( + "shares_per_minute = {}\n", + result.shares_per_minute + )); + out.push_str(&format!("scenario = \"{}\"\n", scenario_key)); + + for metric in ®istry { + if let Some(mv) = result.metrics.get(metric.id()) { + for (key, value, ci) in mv.iter() { + if let Some(v) = value { + out.push_str(&format!("{} = {}\n", key, v)); + } + if let Some((lo, hi)) = ci { + out.push_str(&format!("{}_ci_low = {}\n", key, lo)); + out.push_str(&format!("{}_ci_high = {}\n", key, hi)); + } + // `None` values are omitted; the parser treats + // an absent key as `None` on the read side. + } + } + } + out.push('\n'); + } + + // Derived metrics — per-share-rate cross-cell aggregations + // (decoupling score, reaction asymmetry). One section per + // (metric_id, spm) pair. + for derived in metrics::derived_registry() { + for (spm, mv) in derived.compute(results) { + out.push_str(&format!("[derived.{}.spm_{}]\n", derived.id(), spm as u32)); + for (key, value, ci) in mv.iter() { + if let Some(v) = value { + out.push_str(&format!("{} = {}\n", key, v)); + } + if let Some((lo, hi)) = ci { + out.push_str(&format!("{}_ci_low = {}\n", key, lo)); + out.push_str(&format!("{}_ci_high = {}\n", key, hi)); + } + } + out.push('\n'); + } + } + + out +} + +// ============================================================================ +// Serialization: Markdown +// ============================================================================ + +/// Serializes a baseline result set to a human-readable Markdown +/// summary. +/// +/// Registry-driven: iterates `metrics::registry()` and calls each +/// metric's `Metric::render_markdown` to emit its section(s), then +/// iterates `metrics::derived_registry()` for the cross-cell sections +/// (decoupling score, reaction asymmetry). +/// +/// Adding a new metric to either registry automatically adds its +/// section to the report — no edits to this function required. +pub fn serialize_markdown( + results: &[CellResult], + meta_algorithm: &str, + trial_count: usize, + base_seed: u64, +) -> String { + let mut out = String::new(); + + out.push_str(&format!( + "# Vardiff baseline characterization — `{}`\n\n", + meta_algorithm + )); + out.push_str(&format!( + "*Generated by `cargo run --release --bin generate-baseline` from the \ + vardiff_sim crate. {} trials per cell, base seed `{:#x}`.*\n\n", + trial_count, base_seed + )); + + render_summary(results, &mut out); + + for metric in metrics::registry() { + metric.render_markdown(results, &mut out); + } + + for derived in metrics::derived_registry() { + derived.render_markdown(results, &mut out); + } + + out +} + +/// Renders the TL;DR "## Summary" section at the top of the report. +/// Each row is a headline declared by a metric or derived metric via +/// `summary_specs`. For each spec we scan all matching cells and +/// emit the best / worst values across share rates. +fn render_summary(results: &[CellResult], w: &mut String) { + use metrics::{Direction, ScenarioFilter, SummarySpec}; + + /// `(spm, value, floor_at_that_cell)`. `floor` is `None` for + /// derived metrics (which don't have a `fundamental_limit`) and + /// for per-cell metrics whose `fundamental_limit` returns `None` + /// for this (cell, key) pair. + type Candidate = (f32, f64, Option); + + // Collect (spec, best, worst) for every spec across both + // registries. `best` and `worst` carry the candidate plus a + // fundamental_limit floor at the corresponding cell when known. + let mut rows: Vec<(SummarySpec, Option, Option)> = Vec::new(); + + let cell_matches = |scen: &Scenario, f: &ScenarioFilter| match f { + ScenarioFilter::Any => true, + ScenarioFilter::Stable => matches!(scen, Scenario::Stable), + ScenarioFilter::ColdStart => matches!(scen, Scenario::ColdStart), + ScenarioFilter::StepDelta(d) => { + matches!(scen, Scenario::Step { delta_pct } if delta_pct == d) + } + ScenarioFilter::SettledStepDelta { settle_minutes: sm, delta_pct: d } => { + matches!(scen, Scenario::SettledStep { settle_minutes, delta_pct } + if *settle_minutes == *sm && *delta_pct == *d) + } + }; + + // `Option::is_none_or` would be cleaner but requires Rust 1.82+; + // the workspace toolchain is 1.75. Using map_or(true, ...) here + // for MSRV compatibility and silencing the clippy suggestion. + #[allow(clippy::unnecessary_map_or)] + let collect = |spec: SummarySpec, candidates: Vec| { + let mut best: Option = None; + let mut worst: Option = None; + for c in candidates { + let (_spm, v, _floor) = c; + match spec.direction { + Direction::HigherIsBetter => { + if best.map_or(true, |(_, b, _)| v > b) { + best = Some(c); + } + if worst.map_or(true, |(_, w, _)| v < w) { + worst = Some(c); + } + } + Direction::LowerIsBetter => { + if best.map_or(true, |(_, b, _)| v < b) { + best = Some(c); + } + if worst.map_or(true, |(_, w, _)| v > w) { + worst = Some(c); + } + } + Direction::Either => { + if best.map_or(true, |(_, b, _)| v.abs() < b.abs()) { + best = Some(c); + } + if worst.map_or(true, |(_, w, _)| v.abs() > w.abs()) { + worst = Some(c); + } + } + } + } + (spec, best, worst) + }; + + // Per-cell metrics — query fundamental_limit per candidate cell. + for metric in metrics::registry() { + for spec in metric.summary_specs() { + let candidates: Vec = results + .iter() + .filter(|r| cell_matches(&r.scenario, &spec.scenario_filter)) + .filter_map(|r| { + r.get(spec.key).map(|v| { + let cell = Cell { + shares_per_minute: r.shares_per_minute, + scenario: r.scenario.clone(), + }; + let floor = metric.fundamental_limit(&cell, spec.key); + (r.shares_per_minute, v, floor) + }) + }) + .collect(); + if !candidates.is_empty() { + rows.push(collect(spec, candidates)); + } + } + } + + // Derived metrics — no fundamental_limit; floor stays None. + for derived in metrics::derived_registry() { + let computed = derived.compute(results); + for spec in derived.summary_specs() { + let candidates: Vec = computed + .iter() + .filter_map(|(spm, mv)| mv.get(spec.key).map(|v| (*spm, v, None))) + .collect(); + if !candidates.is_empty() { + rows.push(collect(spec, candidates)); + } + } + } + + if rows.is_empty() { + return; + } + + w.push_str("## Summary\n\n"); + w.push_str( + "Headline per-metric values at each share rate's best and \ + worst cells. ↑ = higher is better; ↓ = lower is better; \ + ↔ = near-zero is better. Where a `(floor: X.X%)` annotation \ + appears, it's the Poisson-noise lower bound on that metric at \ + that share rate — the algorithm cannot do better than this \ + without exotic estimation techniques.\n\n", + ); + w.push_str("| Metric | Dir | Best | Worst |\n"); + w.push_str("| --- | :-: | --- | --- |\n"); + for (spec, best, worst) in rows { + let arrow = match spec.direction { + Direction::HigherIsBetter => "↑", + Direction::LowerIsBetter => "↓", + Direction::Either => "↔", + }; + w.push_str(&format!( + "| {} | {} | {} | {} |\n", + spec.label, + arrow, + fmt_summary_cell(best, spec.fmt), + fmt_summary_cell(worst, spec.fmt), + )); + } + w.push('\n'); +} + +fn fmt_summary_cell(v: Option<(f32, f64, Option)>, fmt: metrics::SummaryFmt) -> String { + use metrics::SummaryFmt; + let Some((spm, value, floor)) = v else { + return "—".to_string(); + }; + let format_one = |x: f64| -> String { + match fmt { + SummaryFmt::Percentage => format!("{:.1}%", x * 100.0), + SummaryFmt::Duration => fmt_duration(Some(x)), + SummaryFmt::Float3 => format!("{:.3}", x), + SummaryFmt::RatePerMin => format!("{:.3}/min", x), + } + }; + let main = format!("{} @ SPM={}", format_one(value), spm as u32); + if let Some(f) = floor { + format!("{} (floor: {})", main, format_one(f)) + } else { + main + } +} + +/// Returns the distinct share rates present in `results`, sorted +/// ascending. Used by metric `render_markdown` impls to build column +/// headers for per-rate tables. Public so metric impls (which live in +/// `crate::metrics`) can call it. +pub fn unique_rates(results: &[CellResult]) -> Vec { + let mut rates: Vec = results.iter().map(|r| r.shares_per_minute as u32).collect(); + rates.sort_unstable(); + rates.dedup(); + rates +} + +/// Finds the cell at `(spm, scenario_key)` in a result set. Used by +/// metric `render_markdown` impls to locate the specific cells they +/// render. Public so metric impls can call it. +pub fn find_cell<'a>( + results: &'a [CellResult], + spm: u32, + scenario_key: &str, +) -> Option<&'a CellResult> { + results + .iter() + .find(|r| r.shares_per_minute as u32 == spm && r.scenario_key() == scenario_key) +} + +/// Formats a duration in seconds as a human-readable string ("30s", +/// "5m", "5m30s"). `None` renders as "—". Public for metric impls. +pub fn fmt_duration(secs: Option) -> String { + match secs { + None => "—".to_string(), + Some(s) => { + let total = s.round() as u64; + if total < 60 { + format!("{}s", total) + } else { + let m = total / 60; + let s = total % 60; + if s == 0 { + format!("{}m", m) + } else { + format!("{}m{:02}s", m, s) + } + } + } + } +} + +/// Formats a fractional value as a percentage with one decimal place +/// ("12.3%"). `None` renders as "—". For values *already* in +/// percentage points use [`fmt_f`] (or divide by 100 first). +pub fn fmt_pct(v: Option) -> String { + match v { + None => "—".to_string(), + Some(f) => format!("{:.1}%", f * 100.0), + } +} + +/// Formats a bare float with three decimal places ("0.123"). `None` +/// renders as "—". +pub fn fmt_f(v: Option) -> String { + match v { + None => "—".to_string(), + Some(f) => format!("{:.3}", f), + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn default_cells_has_80_entries() { + assert_eq!(default_cells().len(), 80); + } + + #[test] + fn scenario_keys_are_distinct() { + let cells = default_cells(); + let mut keys: Vec = cells.iter().map(|c| c.key()).collect(); + let total = keys.len(); + keys.sort(); + keys.dedup(); + assert_eq!(keys.len(), total, "cell keys must be unique"); + } + + #[test] + fn scenario_from_key_round_trips() { + for cell in default_cells() { + let key = cell.scenario.key(); + let parsed = Scenario::from_key(&key).expect("should parse"); + assert_eq!(parsed, cell.scenario, "round-trip failed for {key}"); + } + } + + #[test] + fn small_cell_run_produces_reasonable_results() { + let cells = vec![ + Cell { + shares_per_minute: 12.0, + scenario: Scenario::Stable, + }, + Cell { + shares_per_minute: 12.0, + scenario: Scenario::Step { delta_pct: -50 }, + }, + ]; + let results = run_baseline(&cells, 3, 0xCAFE); + assert_eq!(results.len(), 2); + // Convergence rate is computed for every cell and is always + // present. + assert!(results[0].get("convergence_rate").is_some()); + // Stable doesn't emit reaction metrics. + assert!(results[0].get("reaction_rate").is_none()); + // Step does. + assert!(results[1].get("reaction_rate").is_some()); + } + + #[test] + fn toml_serialization_includes_meta_and_cells() { + let cells = vec![Cell { + shares_per_minute: 12.0, + scenario: Scenario::Stable, + }]; + let results = run_baseline(&cells, 3, 0xCAFE); + let toml = serialize_toml(&results, "VardiffState", 3, 0xCAFE); + assert!(toml.contains("[meta]")); + assert!(toml.contains("algorithm = \"VardiffState\"")); + assert!(toml.contains("[cell.spm_12.stable_1ph]")); + assert!(toml.contains("convergence_rate =")); + } + + #[test] + fn markdown_serialization_includes_section_headers() { + let cells = vec![ + Cell { + shares_per_minute: 12.0, + scenario: Scenario::ColdStart, + }, + Cell { + shares_per_minute: 12.0, + scenario: Scenario::Stable, + }, + Cell { + shares_per_minute: 12.0, + scenario: Scenario::Step { delta_pct: -50 }, + }, + ]; + let results = run_baseline(&cells, 3, 0xCAFE); + let md = serialize_markdown(&results, "VardiffState", 3, 0xCAFE); + assert!(md.contains("# Vardiff baseline characterization")); + assert!(md.contains("## Convergence time")); + assert!(md.contains("## Settled accuracy")); + assert!(md.contains("## Steady-state jitter")); + assert!(md.contains("## Reaction time")); + assert!(md.contains("## Reaction sensitivity")); + } + + #[test] + fn fmt_duration_renders_minutes_and_seconds() { + assert_eq!(fmt_duration(Some(30.0)), "30s"); + assert_eq!(fmt_duration(Some(60.0)), "1m"); + assert_eq!(fmt_duration(Some(125.0)), "2m05s"); + assert_eq!(fmt_duration(None), "—"); + } + + // ---- Phase DSL byte-equivalence ---- + + /// Helper: sample a schedule at the timestamps that matter for the + /// trial driver (every tick boundary plus the trial endpoints). + fn schedule_samples(s: &HashrateSchedule, duration: u64) -> Vec<(u64, f32)> { + let mut out = vec![]; + let mut t = 0u64; + while t <= duration { + out.push((t, s.at(t))); + t = t.saturating_add(60); + } + out + } + + #[test] + fn phase_dsl_matches_legacy_stable_schedule() { + let (config, schedule) = Scenario::Stable.build(12.0); + let legacy = HashrateSchedule::stable(TRUE_HASHRATE); + assert_eq!(config.duration_secs, TRIAL_DURATION_SECS); + assert_eq!(config.initial_hashrate, TRUE_HASHRATE); + assert_eq!( + schedule_samples(&schedule, TRIAL_DURATION_SECS), + schedule_samples(&legacy, TRIAL_DURATION_SECS), + ); + } + + #[test] + fn phase_dsl_matches_legacy_cold_start_schedule() { + let (config, schedule) = Scenario::ColdStart.build(12.0); + let legacy = HashrateSchedule::stable(TRUE_HASHRATE); + assert_eq!(config.duration_secs, TRIAL_DURATION_SECS); + assert_eq!(config.initial_hashrate, COLD_START_INITIAL_HASHRATE); + assert_eq!( + schedule_samples(&schedule, TRIAL_DURATION_SECS), + schedule_samples(&legacy, TRIAL_DURATION_SECS), + ); + } + + #[test] + fn phase_dsl_matches_legacy_step_schedule_negative() { + let (config, schedule) = Scenario::Step { delta_pct: -50 }.build(12.0); + let post = TRUE_HASHRATE * 0.5; + let legacy = HashrateSchedule::step(TRUE_HASHRATE, post, STEP_EVENT_AT_SECS); + assert_eq!(config.duration_secs, TRIAL_DURATION_SECS); + assert_eq!(config.initial_hashrate, TRUE_HASHRATE); + assert_eq!( + schedule_samples(&schedule, TRIAL_DURATION_SECS), + schedule_samples(&legacy, TRIAL_DURATION_SECS), + ); + } + + #[test] + fn phase_dsl_matches_legacy_step_schedule_positive() { + let (_, schedule) = Scenario::Step { delta_pct: 25 }.build(12.0); + let post = TRUE_HASHRATE * 1.25; + let legacy = HashrateSchedule::step(TRUE_HASHRATE, post, STEP_EVENT_AT_SECS); + assert_eq!( + schedule_samples(&schedule, TRIAL_DURATION_SECS), + schedule_samples(&legacy, TRIAL_DURATION_SECS), + ); + } + + #[test] + fn custom_scenario_with_stall_phase_produces_zero_hashrate_window() { + let scenario = Scenario::Custom { + name: "stall_recovery".to_string(), + phases: vec![ + Phase::Hold { + secs: 600, + h: TRUE_HASHRATE, + }, + Phase::Stall { secs: 300 }, + Phase::Hold { + secs: 900, + h: TRUE_HASHRATE, + }, + ], + initial_estimate: None, + }; + let (config, schedule) = scenario.build(12.0); + assert_eq!(config.duration_secs, 1800); + assert_eq!(config.initial_hashrate, TRUE_HASHRATE); + // Before stall: true hashrate. + assert_eq!(schedule.at(0), TRUE_HASHRATE); + assert_eq!(schedule.at(599), TRUE_HASHRATE); + // During stall: zero. + assert_eq!(schedule.at(600), 0.0); + assert_eq!(schedule.at(899), 0.0); + // After recovery: back to true hashrate. + assert_eq!(schedule.at(900), TRUE_HASHRATE); + assert_eq!(schedule.at(1799), TRUE_HASHRATE); + } + + #[test] + fn custom_scenario_with_ramp_phase_interpolates_linearly() { + let scenario = Scenario::Custom { + name: "linear_ramp".to_string(), + phases: vec![Phase::Ramp { + secs: 1000, + from: 0.0, + to: 1000.0, + }], + initial_estimate: None, + }; + let (_, schedule) = scenario.build(12.0); + // RAMP_SEGMENTS = 10. Each segment is 100s. Values evenly + // spaced from 0.0 to 1000.0 across the N samples. + // First sample: alpha = 0/9 = 0 → 0.0. + // Last sample: alpha = 9/9 = 1 → 1000.0. + assert_eq!(schedule.at(0), 0.0); + // At the boundary just before the last segment. + assert!(schedule.at(900) > 800.0); + assert!(schedule.at(900) <= 1000.0); + // At the last segment's start (t=900), value should be the + // ramp's terminal value. + assert_eq!(schedule.at(900), 1000.0); + } + + #[test] + fn custom_scenario_carries_initial_estimate_through_to_trial_config() { + let scenario = Scenario::Custom { + name: "cold_custom".to_string(), + phases: vec![Phase::Hold { + secs: 1800, + h: TRUE_HASHRATE, + }], + initial_estimate: Some(1.0e10), + }; + let (config, _) = scenario.build(12.0); + assert_eq!(config.initial_hashrate, 1.0e10); + } + + #[test] + fn custom_scenario_key_returns_name() { + let scenario = Scenario::Custom { + name: "my_unique_scenario_name".to_string(), + phases: vec![Phase::Hold { + secs: 60, + h: 1.0e15, + }], + initial_estimate: None, + }; + assert_eq!(scenario.key(), "my_unique_scenario_name"); + } + + #[test] + fn phases_to_trial_handles_mixed_phase_kinds() { + // A trial that does a hold, then ramps down, then stalls, then + // recovers. Exercises all three primitives in sequence. + let phases = vec![ + Phase::Hold { + secs: 300, + h: 1.0e15, + }, + Phase::Ramp { + secs: 200, + from: 1.0e15, + to: 5.0e14, + }, + Phase::Stall { secs: 200 }, + Phase::Hold { + secs: 300, + h: 1.0e15, + }, + ]; + let (config, schedule) = phases_to_trial(&phases, None, 12.0); + assert_eq!(config.duration_secs, 1000); + assert_eq!(schedule.at(0), 1.0e15); + // At t=500 we should be inside the stall (300 hold + 200 ramp = 500). + assert_eq!(schedule.at(500), 0.0); + // At t=700 we should be back to 1e15 (after stall). + assert_eq!(schedule.at(700), 1.0e15); + } +} diff --git a/sv2/channels-sv2/sim/src/bin/baseline-asymmetric.rs b/sv2/channels-sv2/sim/src/bin/baseline-asymmetric.rs new file mode 100644 index 0000000000..4f18151aa2 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/baseline-asymmetric.rs @@ -0,0 +1,206 @@ +//! Generate per-metric baseline for the asymmetric PoissonCI production composition. + +use std::env; +use std::time::Instant; + +use vardiff_sim::baseline::{Scenario, DEFAULT_BASELINE_SEED}; +use vardiff_sim::grid::{AlgorithmSpec, Grid, VardiffBox}; +use vardiff_sim::metrics; + +use channels_sv2::vardiff::composed::{ + AcceleratingPartialRetarget, AsymmetricCusumBoundary, AsymmetricPoissonCI, Boundary, Composed, + EstimatorSnapshot, EwmaEstimator, +}; + +#[derive(Debug, Clone)] +struct AdaptiveAsymPoissonCusum { + poisson: AsymmetricPoissonCI, + cusum: AsymmetricCusumBoundary, + spm_threshold: u32, +} + +impl Boundary for AdaptiveAsymPoissonCusum { + fn threshold(&self, dt_secs: u64, shares_per_minute: f32, snap: &EstimatorSnapshot) -> f64 { + if (shares_per_minute as u32) < self.spm_threshold { + self.poisson.threshold(dt_secs, shares_per_minute, snap) + } else { + self.cusum.threshold(dt_secs, shares_per_minute, snap) + } + } + + fn code(&self) -> String { + format!( + "AdaptAsymPC-spm{}[{}|{}]", + self.spm_threshold, + self.poisson.code(), + self.cusum.code() + ) + } +} + +fn main() -> std::io::Result<()> { + let trial_count: usize = env::var("VARDIFF_BASELINE_TRIALS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(1000); + let base_seed: u64 = env::var("VARDIFF_BASELINE_SEED") + .ok() + .and_then(|s| { + s.strip_prefix("0x") + .and_then(|h| u64::from_str_radix(h, 16).ok()) + .or_else(|| s.parse().ok()) + }) + .unwrap_or(DEFAULT_BASELINE_SEED); + + let algorithms = vec![ + AlgorithmSpec::new("AsymProduction", |clock| { + let boundary = AdaptiveAsymPoissonCusum { + poisson: AsymmetricPoissonCI::new(2.576, 0.05, 3.0), + cusum: AsymmetricCusumBoundary::new(1.5, 0.05, 3.0), + spm_threshold: 10, + }; + let inner = Composed::new( + EwmaEstimator::new(120), + boundary, + AcceleratingPartialRetarget::new(0.2, 0.4, 0.2), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }), + AlgorithmSpec::classic_vardiff_state(), + ]; + + let share_rates = vec![4.0, 6.0, 8.0, 10.0, 12.0, 15.0, 20.0, 25.0, 30.0]; + + let mut scenarios = vec![Scenario::ColdStart, Scenario::Stable]; + for &d in &[-50i32, -25, -10, -5, 5, 10, 25, 50] { + scenarios.push(Scenario::Step { delta_pct: d }); + } + + let grid = Grid { + algorithms, + share_rates, + scenarios, + trial_count, + base_seed, + }; + + eprintln!( + "Baseline comparison: {} algorithms × {} cells × {} trials", + grid.algorithms.len(), + grid.share_rates.len() * grid.scenarios.len(), + trial_count, + ); + + let started = Instant::now(); + let results = grid.run_paired(); + let elapsed = started.elapsed(); + eprintln!("Complete in {:.2}s", elapsed.as_secs_f64()); + + for (name, cells) in &results { + println!("\n# {}\n", name); + + let mut by_spm: std::collections::BTreeMap> = + std::collections::BTreeMap::new(); + for cell in cells { + by_spm.entry(cell.shares_per_minute as u32).or_default().push(cell); + } + + println!("## Settled accuracy (stable load)"); + println!("| SPM | p50 | p90 | p99 |"); + println!("| --- | --- | --- | --- |"); + for (&spm, spm_cells) in &by_spm { + for cell in spm_cells { + if matches!(cell.scenario, Scenario::Stable) { + if let Some(mv) = cell.metrics.get("settled_accuracy") { + let p50 = mv.get("settled_accuracy_p50").map(|v| format!("{:.1}%", v * 100.0)).unwrap_or("-".into()); + let p90 = mv.get("settled_accuracy_p90").map(|v| format!("{:.1}%", v * 100.0)).unwrap_or("-".into()); + let p99 = mv.get("settled_accuracy_p99").map(|v| format!("{:.1}%", v * 100.0)).unwrap_or("-".into()); + println!("| {} | {} | {} | {} |", spm, p50, p90, p99); + } + } + } + } + + println!("\n## Steady-state jitter (fires/min)"); + println!("| SPM | p50 | p90 | mean |"); + println!("| --- | --- | --- | --- |"); + for (&spm, spm_cells) in &by_spm { + for cell in spm_cells { + if matches!(cell.scenario, Scenario::Stable) { + if let Some(mv) = cell.metrics.get("jitter") { + let p50 = mv.get("jitter_p50_per_min").map(|v| format!("{:.3}", v)).unwrap_or("-".into()); + let p90 = mv.get("jitter_p90_per_min").map(|v| format!("{:.3}", v)).unwrap_or("-".into()); + let mean = mv.get("jitter_mean_per_min").map(|v| format!("{:.3}", v)).unwrap_or("-".into()); + println!("| {} | {} | {} | {} |", spm, p50, p90, mean); + } + } + } + } + + println!("\n## Cold-start overshoot"); + println!("| SPM | p50 | p90 | p99 |"); + println!("| --- | --- | --- | --- |"); + for (&spm, spm_cells) in &by_spm { + for cell in spm_cells { + if matches!(cell.scenario, Scenario::ColdStart) { + if let Some(mv) = cell.metrics.get("ramp_target_overshoot") { + let p50 = mv.get("ramp_target_overshoot_p50").map(|v| format!("{:.1}%", v * 100.0)).unwrap_or("-".into()); + let p90 = mv.get("ramp_target_overshoot_p90").map(|v| format!("{:.1}%", v * 100.0)).unwrap_or("-".into()); + let p99 = mv.get("ramp_target_overshoot_p99").map(|v| format!("{:.1}%", v * 100.0)).unwrap_or("-".into()); + println!("| {} | {} | {} | {} |", spm, p50, p90, p99); + } + } + } + } + + println!("\n## Reaction sensitivity (P[fire within 5 min])"); + println!("| Δ% | 4 | 6 | 8 | 10 | 12 | 15 | 20 | 30 |"); + println!("| --- | --- | --- | --- | --- | --- | --- | --- | --- |"); + for &delta in &[-50i32, -25, -10, -5, 5, 10, 25, 50] { + print!("| {:+}% |", delta); + for &spm in &[4u32, 6, 8, 10, 12, 15, 20, 30] { + let mut found = false; + if let Some(spm_cells) = by_spm.get(&spm) { + for cell in spm_cells { + let is_match = match cell.scenario { + Scenario::Step { delta_pct } => delta_pct == delta, + _ => false, + }; + if is_match { + if let Some(mv) = cell.metrics.get("reaction_time") { + if let Some(v) = mv.get("reaction_rate") { + print!(" {:.2} |", v); + found = true; + } + } + } + } + } + if !found { + print!(" - |"); + } + } + println!(); + } + + println!("\n## Convergence (cold start)"); + println!("| SPM | rate | p50 | p90 |"); + println!("| --- | --- | --- | --- |"); + for (&spm, spm_cells) in &by_spm { + for cell in spm_cells { + if matches!(cell.scenario, Scenario::ColdStart) { + if let Some(mv) = cell.metrics.get("convergence_time") { + let rate = mv.get("convergence_rate").map(|v| format!("{:.1}%", v * 100.0)).unwrap_or("-".into()); + let p50 = mv.get("convergence_p50_secs").map(|v| format!("{}m", (v as u32) / 60)).unwrap_or("-".into()); + let p90 = mv.get("convergence_p90_secs").map(|v| format!("{}m", (v as u32) / 60)).unwrap_or("-".into()); + println!("| {} | {} | {} | {} |", spm, rate, p50, p90); + } + } + } + } + } + + Ok(()) +} diff --git a/sv2/channels-sv2/sim/src/bin/champion-weights.rs b/sv2/channels-sv2/sim/src/bin/champion-weights.rs new file mode 100644 index 0000000000..1d27abaf24 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/champion-weights.rs @@ -0,0 +1,366 @@ +//! Corner pressure-test + weight-sensitivity analysis. +//! +//! `confirm-champions` (2000 trials) showed the edge-extension probes +//! (sensitivity 0.2/0.15, tighten 8/9) BEAT the in-box cluster — but won +//! in a suspicious way: as sensitivity ↓ and tighten ↑, `regret_over` +//! keeps shrinking while `regret_under` climbs and detection starts to +//! erode (100% → 99%). Total cost improves only because the 3:1 +//! over:under weight makes the over-reduction outweigh the under-increase. +//! +//! Hypothesis: this is NOT an interior optimum we haven't reached — it is +//! a FLAT SHOULDER sliding toward a degenerate "almost never tighten" +//! corner (sensitivity→0, tighten→∞ ⇒ sit permanently under-difficulty, +//! cheap regret, but never raise diff). Each box-widening "wins" by a +//! smaller margin until detection finally collapses. +//! +//! This bin tests that hypothesis two ways from ONE simulation pass (cost +//! is a linear combination of the stored components, so re-scoring under +//! any weights is free — no re-simulation): +//! +//! #2 CORNER PRESSURE-TEST: push the probe set deep into the corner +//! (sens ∈ {0.1,0.15,0.2,0.3}, tighten ∈ {6,7,8,10,12}). If cost +//! keeps creeping down WHILE detection breaks, the shoulder is +//! degenerate and the default-weight "winner" is an artifact. +//! +//! #3 WEIGHT SENSITIVITY: re-score every config across a grid of +//! w_over:w_under (1:1 … 5:1) and w_det (0.5,1,2,4). Report the +//! winner per weight setting and whether it is a CORNER config +//! (sens ≤ 0.15 or tighten ≥ 10) or INTERIOR. If gentler asymmetry +//! pulls the champion back to an interior point, the corner is a +//! weight artifact, not a real optimum. +//! +//! Usage: +//! ```text +//! cargo run --release --bin champion-weights # 2000 trials +//! VARDIFF_CW_TRIALS=4000 cargo run --release --bin champion-weights +//! ``` +//! Env: VARDIFF_CW_TRIALS (default 2000), VARDIFF_CW_THREADS, +//! VARDIFF_SWEEP_SEED, VARDIFF_CW_OUT_DIR (default "."). +//! Writes `champion_weights.md`. NOTE: this bin sweeps weights internally, +//! so it ignores the VARDIFF_W_* env overrides. + +use std::env; +use std::fs; +use std::path::PathBuf; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::Mutex; +use std::time::Instant; + +use channels_sv2::vardiff::composed::{ + AcceleratingPartialRetarget, AdaptivePoissonCusum, AsymmetricCusumBoundary, Composed, + EwmaEstimator, PoissonCI, +}; +use vardiff_sim::baseline::{Cell, Scenario, DEFAULT_BASELINE_SEED}; +use vardiff_sim::grid::{run_cell_with_algorithm, AlgorithmSpec, VardiffBox}; + +/// Raw, weight-independent cost components for one config — simulated +/// once, then scored under any number of weight settings. +#[derive(Clone)] +struct Components { + name: String, + sens: f64, // for corner classification + tighten: f64, // for corner classification + is_anchor: bool, + regret_over: f64, + regret_under: f64, + effort_up: f64, + effort_down: f64, + detection: f64, +} + +impl Components { + /// Same cost form as sweep-regret / sweep-regret-big. + fn cost(&self, w_over: f64, w_under: f64, rho: f64, rho_up: f64, rho_down: f64, w_det: f64) -> f64 { + w_over * self.regret_over + + w_under * self.regret_under + + rho * (rho_up * self.effort_up + rho_down * self.effort_down) + + w_det * (1.0 - self.detection) + } + /// A config is "in the corner" if it sits at/over the edge the + /// optimizer was sliding toward: very low sensitivity OR very high + /// tighten. Anchors are never corner. + fn is_corner(&self) -> bool { + !self.is_anchor && (self.sens <= 0.15 || self.tighten >= 10.0) + } +} + +#[derive(Clone, Copy)] +struct Params { + tau: u64, + sens: f64, + floor: f64, + tighten: f64, + spm: u32, + eta_base: f32, + eta_max: f32, + accel: f32, +} + +fn spec_for(p: Params) -> AlgorithmSpec { + let name = vardiff_sim::naming::triple_name( + &EwmaEstimator::new(p.tau), + &AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(p.sens, p.floor, p.tighten), + p.spm, + ), + &AcceleratingPartialRetarget::new(p.eta_base, p.eta_max, p.accel), + ); + AlgorithmSpec::new(name, move |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(p.tau), + AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(p.sens, p.floor, p.tighten), + p.spm, + ), + AcceleratingPartialRetarget::new(p.eta_base, p.eta_max, p.accel), + 1.0, + clock, + ))) + }) +} + +/// Champion skeleton: tau=150, floor=0.05, spm=5, eta_base=0.2, +/// eta_max=0.8, accel=0.05 — vary only sensitivity and tighten (the two +/// axes in question). +fn skel(sens: f64, tighten: f64) -> Params { + Params { + tau: 150, + sens, + floor: 0.05, + tighten, + spm: 5, + eta_base: 0.2, + eta_max: 0.8, + accel: 0.05, + } +} + +fn measure( + algo: &AlgorithmSpec, + idx: usize, + sens: f64, + tighten: f64, + is_anchor: bool, + share_rates: &[f32], + scenarios: &[Scenario], + trials: usize, + base_seed: u64, +) -> Option { + let (n_spm, n_scen) = (share_rates.len(), scenarios.len()); + let (mut ro, mut ru, mut eu, mut ed) = (0.0, 0.0, 0.0, 0.0); + let mut n = 0u32; + let (mut ds, mut dn) = (0.0, 0u32); + for (si, &spm) in share_rates.iter().enumerate() { + for (ci, scen) in scenarios.iter().enumerate() { + let cell = Cell { shares_per_minute: spm, scenario: scen.clone() }; + let cell_index = (idx * n_spm * n_scen + si * n_scen + ci) as u64; + let r = run_cell_with_algorithm(algo, &cell, trials, base_seed, cell_index); + if matches!(scen, Scenario::Stable | Scenario::Step { delta_pct: -50 | -10 | 10 | 50 }) { + ro += r.get("regret_over").unwrap_or(0.0); + ru += r.get("regret_under").unwrap_or(0.0); + eu += r.get("effort_up").unwrap_or(0.0); + ed += r.get("effort_down").unwrap_or(0.0); + n += 1; + } + if matches!(scen, Scenario::SettledStep { settle_minutes: 60, delta_pct: -10 }) { + if let Some(rate) = r.get("settled_reaction_rate") { + ds += rate; + dn += 1; + } + } + } + } + if n == 0 { + return None; + } + Some(Components { + name: algo.name.clone(), + sens, + tighten, + is_anchor, + regret_over: ro / n as f64, + regret_under: ru / n as f64, + effort_up: eu / n as f64, + effort_down: ed / n as f64, + detection: if dn > 0 { ds / dn as f64 } else { 0.0 }, + }) +} + +fn main() -> std::io::Result<()> { + let trials: usize = env::var("VARDIFF_CW_TRIALS").ok().and_then(|s| s.parse().ok()).unwrap_or(2000); + let base_seed: u64 = env::var("VARDIFF_SWEEP_SEED") + .ok() + .and_then(|s| s.strip_prefix("0x").and_then(|h| u64::from_str_radix(h, 16).ok()).or_else(|| s.parse().ok())) + .unwrap_or(DEFAULT_BASELINE_SEED); + let n_threads: usize = env::var("VARDIFF_CW_THREADS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or_else(|| std::thread::available_parallelism().map(|n| n.get()).unwrap_or(4)) + .max(1); + let out_dir = env::var("VARDIFF_CW_OUT_DIR").map(PathBuf::from).unwrap_or_else(|_| PathBuf::from(".")); + + // Candidate set: a sens × tighten grid on the champion skeleton that + // walks from a sane interior (sens 0.5, tighten 6) DEEP into the + // corner (sens 0.1, tighten 12), plus the three anchors. + let sens_axis = [0.1f64, 0.15, 0.2, 0.3, 0.5]; + let tighten_axis = [6.0f64, 7.0, 8.0, 10.0, 12.0]; + + // (spec, sens, tighten, is_anchor) + let mut entries: Vec<(AlgorithmSpec, f64, f64, bool)> = Vec::new(); + entries.push((AlgorithmSpec::classic_vardiff_state(), 0.0, 0.0, true)); + entries.push((AlgorithmSpec::balanced(), 0.0, 0.0, true)); + entries.push((AlgorithmSpec::react_priority(), 0.0, 0.0, true)); + for &s in &sens_axis { + for &t in &tighten_axis { + entries.push((spec_for(skel(s, t)), s, t, false)); + } + } + + let scenarios = vec![ + Scenario::Stable, + Scenario::Step { delta_pct: -50 }, + Scenario::Step { delta_pct: -10 }, + Scenario::Step { delta_pct: 10 }, + Scenario::Step { delta_pct: 50 }, + Scenario::SettledStep { settle_minutes: 60, delta_pct: -10 }, + ]; + let share_rates = vec![6.0f32, 8.0, 12.0, 20.0, 30.0]; + + let n = entries.len(); + eprintln!( + "Champion-weights: {} algos × {} cells × {} trials = {} runs, {} threads", + n, share_rates.len() * scenarios.len(), trials, + n * share_rates.len() * scenarios.len() * trials, n_threads + ); + + let started = Instant::now(); + let next = AtomicUsize::new(0); + let out: Mutex> = Mutex::new(Vec::with_capacity(n)); + std::thread::scope(|scope| { + for _ in 0..n_threads { + scope.spawn(|| loop { + let i = next.fetch_add(1, Ordering::Relaxed); + if i >= n { + break; + } + let (spec, s, t, anchor) = &entries[i]; + if let Some(c) = measure(spec, i, *s, *t, *anchor, &share_rates, &scenarios, trials, base_seed) { + out.lock().unwrap().push(c); + } + }); + } + }); + let comps = out.into_inner().unwrap(); + eprintln!("Simulated {} configs in {:.1}s", comps.len(), started.elapsed().as_secs_f64()); + + // Fixed (non-swept) weight pieces — the well-grounded directional + // asymmetries and the effort/regret tradeoff knob from §10. + let (rho, rho_up, rho_down) = (0.5, 3.0, 1.0); + + let mut md = String::new(); + md.push_str("# Corner pressure-test + weight sensitivity\n\n"); + md.push_str(&format!("{} configs, {} trials/cell, base_seed {:#x}. Skeleton: Ewma150/floor0.05/spm5/Accel-0.2-0.8-0.05; sens × tighten varied.\n\n", n, trials, base_seed)); + + // ---- #2 CORNER PRESSURE-TEST: raw components on the sens×tighten grid, + // at the DEFAULT weights, sorted by cost. Watch detection + regret_under. + md.push_str("## #2 Corner pressure-test (default weights 3:1, w_det 0.5)\n\n"); + md.push_str("As sens↓ / tighten↑ (deeper corner): does cost keep dropping while detection breaks and regret_under climbs?\n\n"); + md.push_str("| rank | corner? | config | cost | reg_over | reg_under | det% |\n| --- | --- | --- | --- | --- | --- | --- |\n"); + let mut by_default: Vec<&Components> = comps.iter().collect(); + by_default.sort_by(|a, b| a.cost(3.0, 1.0, rho, rho_up, rho_down, 0.5).partial_cmp(&b.cost(3.0, 1.0, rho, rho_up, rho_down, 0.5)).unwrap()); + for (i, c) in by_default.iter().enumerate() { + md.push_str(&format!( + "| {} | {} | {} | {:.4} | {:.4} | {:.4} | {:.0}% |\n", + i + 1, + if c.is_anchor { "anchor" } else if c.is_corner() { "**CORNER**" } else { "interior" }, + c.name, + c.cost(3.0, 1.0, rho, rho_up, rho_down, 0.5), + c.regret_over, c.regret_under, c.detection * 100.0, + )); + } + md.push('\n'); + + // ---- #3 WEIGHT SENSITIVITY: winner per (w_over:w_under, w_det) cell. + let w_over_axis = [1.0f64, 1.5, 2.0, 3.0, 4.0, 5.0]; + let w_det_axis = [0.5f64, 1.0, 2.0, 4.0]; + md.push_str("## #3 Weight sensitivity — champion vs over:under ratio and detection weight\n\n"); + md.push_str("Each cell: the winning config (lowest cost) under that weight setting, tagged CORNER / interior / anchor. "); + md.push_str("If gentler ratios or higher w_det pull the winner OUT of the corner, the corner is a weight artifact.\n\n"); + md.push_str("| w_over:w_under \\ w_det | "); + for wd in &w_det_axis { + md.push_str(&format!("w_det={} | ", wd)); + } + md.push('\n'); + md.push_str("| --- |"); + for _ in &w_det_axis { + md.push_str(" --- |"); + } + md.push('\n'); + // Also collect a parallel "detection-gated" winner (det ≥ 99.5%). + let mut gated_note = String::new(); + for &wo in &w_over_axis { + md.push_str(&format!("| {:.1}:1 | ", wo)); + for &wd in &w_det_axis { + let winner = comps + .iter() + .min_by(|a, b| a.cost(wo, 1.0, rho, rho_up, rho_down, wd).partial_cmp(&b.cost(wo, 1.0, rho, rho_up, rho_down, wd)).unwrap()) + .unwrap(); + let tag = if winner.is_anchor { "anchor" } else if winner.is_corner() { "CORNER" } else { "interior" }; + let label = if winner.is_anchor { + "anchor".to_string() + } else { + format!("s{}/t{}", winner.sens, winner.tighten) + }; + md.push_str(&format!("{} ({}) | ", label, tag)); + + // detection-gated winner for this same setting + let gated = comps + .iter() + .filter(|c| c.detection >= 0.995) + .min_by(|a, b| a.cost(wo, 1.0, rho, rho_up, rho_down, wd).partial_cmp(&b.cost(wo, 1.0, rho, rho_up, rho_down, wd)).unwrap()); + if let Some(g) = gated { + if !std::ptr::eq(g, winner) { + gated_note.push_str(&format!( + "- at w_over={:.1}, w_det={}: unconstrained winner s{}/t{} (det {:.0}%) → with det≥99.5% gate, winner becomes s{}/t{} (det {:.0}%)\n", + wo, wd, winner.sens, winner.tighten, winner.detection * 100.0, g.sens, g.tighten, g.detection * 100.0, + )); + } + } + } + md.push('\n'); + } + md.push('\n'); + if !gated_note.is_empty() { + md.push_str("### Where a detection gate (≥99.5%) changes the winner\n\n"); + md.push_str(&gated_note); + md.push('\n'); + } else { + md.push_str("_A 99.5% detection gate never changed the winner — detection is not the binding constraint in this set._\n\n"); + } + + let out_path = out_dir.join("champion_weights.md"); + fs::write(&out_path, &md)?; + eprintln!("Wrote {}", out_path.display()); + + // Console summary. + println!("\n=== #2 Corner pressure-test (default 3:1 weights), top 12 ==="); + println!("{:<4} {:<10} {:<8} {:<8} {:<8} {:<6}", "rank", "kind", "cost", "reg_ov", "reg_un", "det%"); + for (i, c) in by_default.iter().take(12).enumerate() { + let kind = if c.is_anchor { "anchor" } else if c.is_corner() { "CORNER" } else { "interior" }; + println!( + "{:<4} {:<10} {:<8.4} {:<8.4} {:<8.4} {:<6.0}", + i + 1, kind, c.cost(3.0, 1.0, rho, rho_up, rho_down, 0.5), c.regret_over, c.regret_under, c.detection * 100.0 + ); + } + println!("\n=== #3 Weight sensitivity: winner kind per w_over (w_det=0.5) ==="); + for &wo in &w_over_axis { + let winner = comps.iter().min_by(|a, b| a.cost(wo, 1.0, rho, rho_up, rho_down, 0.5).partial_cmp(&b.cost(wo, 1.0, rho, rho_up, rho_down, 0.5)).unwrap()).unwrap(); + let kind = if winner.is_anchor { "anchor" } else if winner.is_corner() { "CORNER" } else { "interior" }; + let label = if winner.is_anchor { "anchor".into() } else { format!("s{}/t{}", winner.sens, winner.tighten) }; + println!(" w_over {:.1}:1 → {} ({}), det {:.0}%", wo, label, kind, winner.detection * 100.0); + } + println!("\nFull tables in {}", out_path.display()); + Ok(()) +} diff --git a/sv2/channels-sv2/sim/src/bin/compare-algorithms.rs b/sv2/channels-sv2/sim/src/bin/compare-algorithms.rs new file mode 100644 index 0000000000..b99a105783 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/compare-algorithms.rs @@ -0,0 +1,758 @@ +//! Runs the canonical 5 × 10 cell grid against every shipped algorithm +//! and writes a per-algorithm `(toml, md)` pair for each. +//! +//! Algorithms covered: +//! - `VardiffState` — production reference. +//! - `ClassicComposed` — four-axis decomposition of `VardiffState`. +//! - `Parametric` — Classic with `PoissonCI` boundary. +//! - `ParametricStrict` — Parametric with z=3.0 (99.7% CI). +//! - `ClassicPartialRetarget-30` — Classic with `PartialRetarget(η=0.3)` +//! replacing `FullRetargetWithClamp`. +//! - `EWMA-60s` — `EwmaEstimator(60s)` + `PoissonCI` + +//! `PartialRetarget(η=0.5)`. +//! - `SlidingWindow-10t` — `SlidingWindowEstimator(10)` + `PoissonCI` + +//! `FullRetargetNoClamp`. +//! - `FullRemedy` — `EwmaEstimator(120s)` + `PoissonCI` + +//! `PartialRetarget(η=0.2)`. The "three-axis fix" composition. +//! The three parameters are each substantiated by their own Pareto +//! sweep (`sweep-ewma-tau`, `sweep-eta`, `sweep-z`, `sweep-eta-z`). +//! +//! Algorithm is a first-class grid axis, so a single command produces +//! all baselines that can be diff'd against each other to see, +//! axis-by-axis, where each algorithm wins or loses. +//! +//! ## Usage +//! +//! From the sim crate root: +//! +//! ```text +//! cargo run --release --bin compare-algorithms +//! ``` +//! +//! Output files (written to the current directory by default): +//! one `baseline_{AlgorithmName}.toml` / `.md` pair per algorithm. +//! +//! ## Configuration via environment +//! +//! - `VARDIFF_COMPARE_TRIALS` — trials per cell (default 1000). +//! - `VARDIFF_COMPARE_SEED` — base seed (default +//! `0xDEAD_BEEF_CAFE_F00D`). +//! - `VARDIFF_COMPARE_OUT_DIR` — output directory (default `.`). +//! - `VARDIFF_COMPARE_PAIRED` — when set to `1`/`true`, use +//! `Grid::run_paired` so all algorithms see the same trial inputs +//! per cell (smaller cross-algorithm noise, but baselines emitted +//! here are not directly comparable to the algo-indexed ones +//! produced by `generate-baseline`). +//! +//! ## Runtime +//! +//! 8 algos × 5 SPM × 10 scenarios × 1000 trials = 400,000 trials, +//! ~2–3 minutes at release speed. Debug mode is 5–10× slower. +//! Reduce `VARDIFF_COMPARE_TRIALS` to 50 for fast iteration. +//! +//! ## What's in the output +//! +//! Each algorithm's `.toml` carries the standard 7 metrics (convergence, +//! settled accuracy, jitter, reaction time, bias, variance, phase 1 +//! overshoot) per cell where applicable. The `.md` renders each metric +//! as a table plus the decoupling-score summary at the end. For +//! observable algorithms (everything except `VardiffState`), bias / +//! variance / overshoot show real values; for `VardiffState` they're +//! omitted (the algorithm doesn't expose introspection). +//! +//! For Pareto comparison, diff the per-algorithm `.md` files: +//! +//! ```text +//! diff baseline_VardiffState.md baseline_FullRemedy.md | less +//! diff baseline_Parametric.md baseline_FullRemedy.md | less +//! ``` + +use std::collections::HashMap; +use std::env; +use std::fs; +use std::path::PathBuf; +use std::time::Instant; + +use vardiff_sim::baseline::{ + fmt_duration, serialize_markdown, serialize_toml, CellResult, Scenario, DEFAULT_BASELINE_SEED, + DEFAULT_TRIAL_COUNT, +}; +use vardiff_sim::grid::{AlgorithmSpec, Grid, VardiffBox}; +use vardiff_sim::metrics::{self, Direction, ScenarioFilter, SummaryFmt, SummarySpec}; +use vardiff_sim::{ + AcceleratingPartialRetarget, AdaptivePoissonCusum, AsymmetricCusumBoundary, CkpoolEstimator, + Composed, EwmaEstimator, HysteresisGate, PartialRetarget, PoissonCI, +}; + +fn main() -> std::io::Result<()> { + let trial_count = env_or("VARDIFF_COMPARE_TRIALS", DEFAULT_TRIAL_COUNT); + let base_seed = env_or_seed("VARDIFF_COMPARE_SEED", DEFAULT_BASELINE_SEED); + let out_dir = env::var("VARDIFF_COMPARE_OUT_DIR") + .map(PathBuf::from) + .unwrap_or_else(|_| PathBuf::from(".")); + + // The canonical scenario set: cold start + stable + 8 step deltas + // + 4 counter-age scenarios for sensitivity characterization. + let mut scenarios = vec![Scenario::ColdStart, Scenario::Stable]; + for &delta in &[-50i32, -25, -10, -5, 5, 10, 25, 50] { + scenarios.push(Scenario::Step { delta_pct: delta }); + } + // Counter-age characterization: young (5min) vs mature (60min) counter + // at both large (-50%) and moderate (-10%) step magnitudes. + for &settle in &[5u64, 60] { + for &delta in &[-50i32, -10] { + scenarios.push(Scenario::SettledStep { + settle_minutes: settle, + delta_pct: delta, + }); + } + } + + let paired = env::var("VARDIFF_COMPARE_PAIRED") + .map(|s| matches!(s.as_str(), "1" | "true" | "TRUE" | "yes")) + .unwrap_or(false); + + let grid = Grid { + algorithms: vec![ + AlgorithmSpec::classic_vardiff_state(), + AlgorithmSpec::classic_composed(), + AlgorithmSpec::parametric(), + AlgorithmSpec::parametric_strict(), + AlgorithmSpec::classic_partial_retarget(0.3), + AlgorithmSpec::ewma_60s(), + AlgorithmSpec::sliding_window(10), + AlgorithmSpec::full_remedy(), + AlgorithmSpec::poisson_accel(), + // --- Winner: AdaptiveBoundary-spm10 (PoissonCI < 10 SPM, CUSUM >= 10) --- + AlgorithmSpec::adaptive_boundary(10), + // --- Phase 2: Update rule sweep with AdaptiveBoundary-spm10 locked --- + // Vary eta_base + AlgorithmSpec::new("Adp10-eta15", |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(120), + AdaptivePoissonCusum::new(10), + AcceleratingPartialRetarget::new(0.15, 0.6, 0.2), + 1.0, clock, + ))) + }), + AlgorithmSpec::new("Adp10-eta25", |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(120), + AdaptivePoissonCusum::new(10), + AcceleratingPartialRetarget::new(0.25, 0.6, 0.2), + 1.0, clock, + ))) + }), + AlgorithmSpec::new("Adp10-eta30", |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(120), + AdaptivePoissonCusum::new(10), + AcceleratingPartialRetarget::new(0.3, 0.6, 0.2), + 1.0, clock, + ))) + }), + // Vary eta_max + AlgorithmSpec::new("Adp10-max40", |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(120), + AdaptivePoissonCusum::new(10), + AcceleratingPartialRetarget::new(0.2, 0.4, 0.2), + 1.0, clock, + ))) + }), + AlgorithmSpec::new("Adp10-max80", |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(120), + AdaptivePoissonCusum::new(10), + AcceleratingPartialRetarget::new(0.2, 0.8, 0.2), + 1.0, clock, + ))) + }), + // Vary acceleration + AlgorithmSpec::new("Adp10-acc10", |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(120), + AdaptivePoissonCusum::new(10), + AcceleratingPartialRetarget::new(0.2, 0.6, 0.1), + 1.0, clock, + ))) + }), + AlgorithmSpec::new("Adp10-acc30", |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(120), + AdaptivePoissonCusum::new(10), + AcceleratingPartialRetarget::new(0.2, 0.6, 0.3), + 1.0, clock, + ))) + }), + // Fixed eta (no acceleration) for comparison + AlgorithmSpec::new("Adp10-fixed20", |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(120), + AdaptivePoissonCusum::new(10), + PartialRetarget::new(0.2), + 1.0, clock, + ))) + }), + AlgorithmSpec::new("Adp10-fixed30", |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(120), + AdaptivePoissonCusum::new(10), + PartialRetarget::new(0.3), + 1.0, clock, + ))) + }), + // --- Ckpool estimator + best boundary/update (equivalence check) --- + AlgorithmSpec::new("Ckpool-Adp10-max40", |clock| { + VardiffBox(Box::new(Composed::new( + CkpoolEstimator::new(60, 300), + AdaptivePoissonCusum::new(10), + AcceleratingPartialRetarget::new(0.2, 0.4, 0.2), + 1.0, clock, + ))) + }), + AlgorithmSpec::new("Ckpool120-Adp10-max40", |clock| { + VardiffBox(Box::new(Composed::new( + CkpoolEstimator::new(60, 120), + AdaptivePoissonCusum::new(10), + AcceleratingPartialRetarget::new(0.2, 0.4, 0.2), + 1.0, clock, + ))) + }), + // --- Hysteresis boundary sweep (tuned for 60s ticks) --- + // Native ckpool: too wide + AlgorithmSpec::new("Hyst-50-133-gate4", |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(120), + HysteresisGate::new(4, 60, 0.5, 1.33), + PartialRetarget::new(0.2), + 1.0, clock, + ))) + }), + // Narrower bands for 60s ticks + AlgorithmSpec::new("Hyst-70-130-gate4", |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(120), + HysteresisGate::new(4, 60, 0.7, 1.3), + PartialRetarget::new(0.2), + 1.0, clock, + ))) + }), + AlgorithmSpec::new("Hyst-80-120-gate4", |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(120), + HysteresisGate::new(4, 60, 0.8, 1.2), + PartialRetarget::new(0.2), + 1.0, clock, + ))) + }), + AlgorithmSpec::new("Hyst-85-115-gate4", |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(120), + HysteresisGate::new(4, 60, 0.85, 1.15), + PartialRetarget::new(0.2), + 1.0, clock, + ))) + }), + AlgorithmSpec::new("Hyst-90-110-gate4", |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(120), + HysteresisGate::new(4, 60, 0.9, 1.1), + PartialRetarget::new(0.2), + 1.0, clock, + ))) + }), + // Best narrow band + AcceleratingPartialRetarget + AlgorithmSpec::new("Hyst-85-115-accel", |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(120), + HysteresisGate::new(4, 60, 0.85, 1.15), + AcceleratingPartialRetarget::new(0.2, 0.4, 0.2), + 1.0, clock, + ))) + }), + AlgorithmSpec::new("Hyst-80-120-accel", |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(120), + HysteresisGate::new(4, 60, 0.8, 1.2), + AcceleratingPartialRetarget::new(0.2, 0.4, 0.2), + 1.0, clock, + ))) + }), + // Vary data gate (lower = more responsive at low SPM) + AlgorithmSpec::new("Hyst-85-115-gate2", |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(120), + HysteresisGate::new(2, 60, 0.85, 1.15), + PartialRetarget::new(0.2), + 1.0, clock, + ))) + }), + AlgorithmSpec::new("Hyst-85-115-gate6", |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(120), + HysteresisGate::new(6, 60, 0.85, 1.15), + PartialRetarget::new(0.2), + 1.0, clock, + ))) + }), + AlgorithmSpec::ewma_adaptive_cusum(120, 1.5, 0.05, 0.2), + AlgorithmSpec::ewma_adaptive_cusum(120, 1.5, 0.05, 0.5), + AlgorithmSpec::ckpool_remedy(), + AlgorithmSpec::ckpool_remedy_ft(12), + // --- Ckpool parameter sweep --- + // Axis 1: shorter tau_long (120s vs 300s default) + AlgorithmSpec::new("Ck-tl120-eta20", |clock| { + VardiffBox(Box::new(Composed::new( + CkpoolEstimator::with_fast_threshold(60, 120, 12), + PoissonCI::default_parametric(), + PartialRetarget::new(0.2), + 1.0, clock, + ))) + }), + // Axis 2: higher η (0.35) with shorter tau_long + AlgorithmSpec::new("Ck-tl120-eta35", |clock| { + VardiffBox(Box::new(Composed::new( + CkpoolEstimator::with_fast_threshold(60, 120, 12), + PoissonCI::default_parametric(), + PartialRetarget::new(0.35), + 1.0, clock, + ))) + }), + // Axis 3: CUSUM boundary instead of PoissonCI + AlgorithmSpec::new("Ck-cusum-eta20", |clock| { + VardiffBox(Box::new(Composed::new( + CkpoolEstimator::with_fast_threshold(60, 300, 12), + AsymmetricCusumBoundary::new(1.5, 0.05, 3.0), + PartialRetarget::new(0.2), + 1.0, clock, + ))) + }), + // Axis 4: CUSUM + shorter tau_long + moderate η + AlgorithmSpec::new("Ck-tl120-cusum-eta30", |clock| { + VardiffBox(Box::new(Composed::new( + CkpoolEstimator::with_fast_threshold(60, 120, 12), + AsymmetricCusumBoundary::new(1.5, 0.05, 3.0), + PartialRetarget::new(0.3), + 1.0, clock, + ))) + }), + // Axis 5: shorter tau_short (30s) for faster ramp-up + AlgorithmSpec::new("Ck-ts30-tl120-eta30", |clock| { + VardiffBox(Box::new(Composed::new( + CkpoolEstimator::with_fast_threshold(30, 120, 8), + PoissonCI::default_parametric(), + PartialRetarget::new(0.3), + 1.0, clock, + ))) + }), + // Axis 6: AcceleratingPartialRetarget (ramp η on consecutive fires) + AlgorithmSpec::new("Ck-tl120-accel", |clock| { + VardiffBox(Box::new(Composed::new( + CkpoolEstimator::with_fast_threshold(60, 120, 12), + PoissonCI::default_parametric(), + AcceleratingPartialRetarget::new(0.2, 0.6, 0.2), + 1.0, clock, + ))) + }), + ], + share_rates: vec![4.0, 5.0, 6.0, 8.0, 10.0, 12.0, 15.0, 20.0, 25.0, 30.0], + scenarios, + trial_count, + base_seed, + }; + + eprintln!( + "Comparing {} algorithms × {} cells × {} trials = {} total trials, base_seed = {:#x}", + grid.algorithms.len(), + grid.share_rates.len() * grid.scenarios.len(), + trial_count, + grid.total_runs() * trial_count, + base_seed, + ); + eprintln!("Output directory: {}", out_dir.display()); + eprintln!( + "Seeding mode: {}", + if paired { + "paired (Grid::run_paired)" + } else { + "algo-indexed (Grid::run)" + } + ); + + let started = Instant::now(); + let results = if paired { + grid.run_paired() + } else { + grid.run() + }; + let elapsed = started.elapsed(); + eprintln!("Sweep complete in {:.2}s", elapsed.as_secs_f64()); + + fs::create_dir_all(&out_dir)?; + + // Sorted for stable output ordering across runs. + let mut algo_names: Vec<&String> = results.keys().collect(); + algo_names.sort(); + + for name in &algo_names { + let cells = &results[*name]; + // The display name carries " / " separators and the monolith "*" + // marker; sanitize to a filesystem-safe stem for the on-disk files. + let file_stem = vardiff_sim::naming::sanitize_filename(name); + let toml_path = out_dir.join(format!("baseline_{}.toml", file_stem)); + let md_path = out_dir.join(format!("baseline_{}.md", file_stem)); + fs::write( + &toml_path, + serialize_toml(cells, name, trial_count, base_seed), + )?; + fs::write( + &md_path, + serialize_markdown(cells, name, trial_count, base_seed), + )?; + eprintln!(" {}", toml_path.display()); + eprintln!(" {}", md_path.display()); + } + + // Cross-algorithm Pareto report — per metric, per share rate, side + // by side. Winner bolded per row. Lets a reviewer see at a glance + // which algorithm wins on each metric without diff'ing N files. + let pareto_path = out_dir.join("pareto.md"); + let pareto_order = canonical_algorithm_order(&algo_names); + fs::write( + &pareto_path, + render_pareto_report(&results, &pareto_order, trial_count, base_seed), + )?; + eprintln!(" {}", pareto_path.display()); + + eprintln!("\nDone. Read pareto.md for the cross-algorithm summary; diff baseline_X.md against baseline_Y.md for per-algorithm deep-dives."); + Ok(()) +} + +/// Canonical algorithm display order for the Pareto report. Names are the +/// derived "Estimator / Boundary / Update" triples: +/// 1. Cumul / Step / FullClamp* — production monolith (VardiffState) +/// 2. Cumul / Step / FullClamp — composed equivalent (ClassicComposed) +/// 3. Cumul / Poisson-z2.58 / FullClamp, Cumul / Poisson-z3.00 / FullClamp — boundary swaps +/// 4. Cumul / Step / Partial-e0.3 — update-axis swap +/// 5. Ewma60s / Poisson-z2.58 / Partial-e0.5 — multi-axis swap +/// 6. Slide10t / Poisson-z2.58 / FullNoClamp — alt estimator +/// 7. Ewma120s / Poisson-z2.58 / Partial-e0.2 — recommendation at the right edge +/// +/// Falls back to alphabetical for any algorithm not in this list, +/// appended at the end. +fn canonical_algorithm_order(algo_names: &[&String]) -> Vec { + let preferred: &[&str] = &[ + "Cumul / Step / FullClamp*", + "Cumul / Step / FullClamp", + "Cumul / Poisson-z2.58 / FullClamp", + "Cumul / Poisson-z3.00 / FullClamp", + "Cumul / Step / Partial-e0.3", + "Ewma60s / Poisson-z2.58 / Partial-e0.5", + "Slide10t / Poisson-z2.58 / FullNoClamp", + "Ewma120s / Poisson-z2.58 / Partial-e0.2", + ]; + let mut order: Vec = Vec::new(); + let mut seen: std::collections::HashSet<&str> = std::collections::HashSet::new(); + for &p in preferred { + if algo_names.iter().any(|n| n.as_str() == p) { + order.push(p.to_string()); + seen.insert(p); + } + } + // Append any extras alphabetically. + let mut extras: Vec<&String> = algo_names + .iter() + .filter(|n| !seen.contains(n.as_str())) + .copied() + .collect(); + extras.sort(); + for e in extras { + order.push(e.clone()); + } + order +} + +/// Renders the side-by-side cross-algorithm Pareto report. One section +/// per `SummarySpec` declared across the per-cell and derived +/// registries; each section is one row per share rate × one column per +/// algorithm, with the winner bolded. +fn render_pareto_report( + results: &HashMap>, + algo_order: &[String], + trial_count: usize, + base_seed: u64, +) -> String { + let mut out = String::new(); + out.push_str("# Cross-algorithm Pareto comparison\n\n"); + out.push_str(&format!( + "*Generated by `cargo run --release --bin compare-algorithms`. {} trials per cell, base seed `{:#x}`.*\n\n", + trial_count, base_seed + )); + out.push_str( + "One section per headline metric. Each row is a share rate; \ + each column is one algorithm. The **bold** entry per row is the \ + winner in that metric's direction-of-improvement; entries \ + within 5% (relative) of the winner are also bolded as effective \ + ties. Algorithms are ordered: production reference → axis-swap \ + variants → recommendation (`FullRemedy`).\n\n", + ); + + // Per-cell metric sections. + for metric in metrics::registry() { + for spec in metric.summary_specs() { + render_pareto_section_per_cell(&mut out, &spec, results, algo_order); + } + } + + // Derived-metric sections. + for derived in metrics::derived_registry() { + for spec in derived.summary_specs() { + render_pareto_section_derived(&mut out, derived.as_ref(), &spec, results, algo_order); + } + } + + out +} + +/// Helper: find all share rates that any algorithm reports for this +/// metric's filter (so the column dimensions are consistent). +fn collect_share_rates( + results: &HashMap>, + filter: &ScenarioFilter, +) -> Vec { + let mut rates: Vec = Vec::new(); + for cells in results.values() { + for r in cells { + if !cell_matches(&r.scenario, filter) { + continue; + } + let spm = r.shares_per_minute as u32; + if !rates.contains(&spm) { + rates.push(spm); + } + } + } + rates.sort_unstable(); + rates +} + +fn cell_matches(scen: &Scenario, f: &ScenarioFilter) -> bool { + match f { + ScenarioFilter::Any => true, + ScenarioFilter::Stable => matches!(scen, Scenario::Stable), + ScenarioFilter::ColdStart => matches!(scen, Scenario::ColdStart), + ScenarioFilter::StepDelta(d) => { + matches!(scen, Scenario::Step { delta_pct } if delta_pct == d) + } + ScenarioFilter::SettledStepDelta { settle_minutes: sm, delta_pct: d } => { + matches!(scen, Scenario::SettledStep { settle_minutes, delta_pct } + if *settle_minutes == *sm && *delta_pct == *d) + } + } +} + +fn render_pareto_section_per_cell( + out: &mut String, + spec: &SummarySpec, + results: &HashMap>, + algo_order: &[String], +) { + let rates = collect_share_rates(results, &spec.scenario_filter); + if rates.is_empty() { + return; + } + + // Pull (spm, value) per algorithm. + let mut per_algo: HashMap<&str, HashMap> = HashMap::new(); + for algo in algo_order { + let cells = match results.get(algo) { + Some(c) => c, + None => continue, + }; + let mut by_spm: HashMap = HashMap::new(); + for r in cells { + if !cell_matches(&r.scenario, &spec.scenario_filter) { + continue; + } + if let Some(v) = r.get(spec.key) { + by_spm.insert(r.shares_per_minute as u32, v); + } + } + per_algo.insert(algo.as_str(), by_spm); + } + + if per_algo.values().all(|m| m.is_empty()) { + return; + } + + write_pareto_table(out, spec, &rates, &per_algo, algo_order); +} + +fn render_pareto_section_derived( + out: &mut String, + derived: &dyn metrics::DerivedMetric, + spec: &SummarySpec, + results: &HashMap>, + algo_order: &[String], +) { + // Derived metrics: compute per algorithm, then look up (spm, key). + let mut per_algo: HashMap<&str, HashMap> = HashMap::new(); + let mut rates: Vec = Vec::new(); + for algo in algo_order { + let cells = match results.get(algo) { + Some(c) => c, + None => continue, + }; + let computed = derived.compute(cells); + let mut by_spm: HashMap = HashMap::new(); + for (spm, mv) in computed { + if let Some(v) = mv.get(spec.key) { + let spm_u = spm as u32; + by_spm.insert(spm_u, v); + if !rates.contains(&spm_u) { + rates.push(spm_u); + } + } + } + per_algo.insert(algo.as_str(), by_spm); + } + rates.sort_unstable(); + if rates.is_empty() { + return; + } + write_pareto_table(out, spec, &rates, &per_algo, algo_order); +} + +fn write_pareto_table( + out: &mut String, + spec: &SummarySpec, + rates: &[u32], + per_algo: &HashMap<&str, HashMap>, + algo_order: &[String], +) { + let arrow = match spec.direction { + Direction::HigherIsBetter => "↑", + Direction::LowerIsBetter => "↓", + Direction::Either => "↔", + }; + out.push_str(&format!( + "## {} ({} {})\n\n", + spec.label, + arrow, + direction_label(spec.direction) + )); + + // Header row: | SPM | algo1 | algo2 | ... | + out.push_str("| SPM |"); + for algo in algo_order { + if per_algo.contains_key(algo.as_str()) { + out.push_str(&format!(" {} |", algo)); + } + } + out.push('\n'); + out.push_str("| ---"); + for algo in algo_order { + if per_algo.contains_key(algo.as_str()) { + out.push_str(" | ---"); + } + } + out.push_str(" |\n"); + + // Data rows. + for &spm in rates { + // Collect this row's values from each algorithm. + let row_vals: Vec<(&str, Option)> = algo_order + .iter() + .filter_map(|a| { + per_algo + .get(a.as_str()) + .map(|m| (a.as_str(), m.get(&spm).copied())) + }) + .collect(); + + // Determine the winner: best value given direction. Entries + // within 5% relative of the winner are also "tied". + let present: Vec = row_vals.iter().filter_map(|(_, v)| *v).collect(); + let winner: Option = match spec.direction { + Direction::HigherIsBetter => present + .iter() + .copied() + .fold(None, |acc, v| Some(acc.map_or(v, |a: f64| a.max(v)))), + Direction::LowerIsBetter => present + .iter() + .copied() + .fold(None, |acc, v| Some(acc.map_or(v, |a: f64| a.min(v)))), + Direction::Either => present.iter().copied().fold(None, |acc, v| { + Some(acc.map_or(v, |a: f64| if v.abs() < a.abs() { v } else { a })) + }), + }; + + out.push_str(&format!("| {} |", spm)); + for (_, v) in row_vals { + let cell_str = format_pareto_cell(v, winner, spec.direction, spec.fmt); + out.push_str(&format!(" {} |", cell_str)); + } + out.push('\n'); + } + out.push('\n'); +} + +fn direction_label(d: Direction) -> &'static str { + match d { + Direction::HigherIsBetter => "higher is better", + Direction::LowerIsBetter => "lower is better", + Direction::Either => "near zero is better", + } +} + +fn format_pareto_cell( + value: Option, + winner: Option, + direction: Direction, + fmt: SummaryFmt, +) -> String { + let Some(v) = value else { + return "—".to_string(); + }; + let formatted = match fmt { + SummaryFmt::Percentage => format!("{:.1}%", v * 100.0), + SummaryFmt::Duration => fmt_duration(Some(v)), + SummaryFmt::Float3 => format!("{:.3}", v), + SummaryFmt::RatePerMin => format!("{:.3}/min", v), + }; + // Bold if value is the winner or within 5% relative of it. + let is_winner = match (winner, direction) { + (Some(w), Direction::HigherIsBetter) => w > 0.0 && (w - v).abs() / w.abs() < 0.05, + (Some(w), Direction::LowerIsBetter) => { + // Tie window depends on magnitude. Use absolute floor of + // 0.01 plus 5% relative to handle near-zero baselines. + let tie = (w.abs() * 0.05).max(0.01); + (v - w).abs() < tie + } + (Some(w), Direction::Either) => (v.abs() - w.abs()).abs() < 0.05, + _ => false, + }; + if is_winner { + format!("**{}**", formatted) + } else { + formatted + } +} + +fn env_or(var: &str, default: T) -> T { + env::var(var) + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(default) +} + +fn env_or_seed(var: &str, default: u64) -> u64 { + if let Ok(s) = env::var(var) { + if let Some(hex) = s.strip_prefix("0x").or_else(|| s.strip_prefix("0X")) { + return u64::from_str_radix(hex, 16).unwrap_or(default); + } + return s.parse().unwrap_or(default); + } + default +} diff --git a/sv2/channels-sv2/sim/src/bin/compare-best.rs b/sv2/channels-sv2/sim/src/bin/compare-best.rs new file mode 100644 index 0000000000..e8b04e0df4 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/compare-best.rs @@ -0,0 +1,202 @@ +//! Head-to-head comparison of the new "best-of-best" composition against +//! the current production VardiffState (AdaCUSUM) and the previous +//! AsymCUSUM baseline. +//! +//! ```text +//! cargo run --release --bin compare-best +//! ``` + +use std::env; + +use vardiff_sim::{baseline::Scenario, grid::AlgorithmSpec, grid::Grid}; + +fn main() { + let trial_count: usize = env::var("VARDIFF_COMPARE_TRIALS") + .ok() + .and_then(|v| v.parse().ok()) + .unwrap_or(1000); + + let base_seed: u64 = 0xDEAD_BEEF_CAFE_F00D; + + let mut scenarios = vec![Scenario::ColdStart, Scenario::Stable]; + for &delta in &[-50, -25, -10, -5, 5, 10, 25, 50] { + scenarios.push(Scenario::Step { delta_pct: delta }); + } + + let grid = Grid { + algorithms: vec![ + AlgorithmSpec::classic_vardiff_state(), + AlgorithmSpec::ewma_asymmetric_cusum(120, 1.5, 0.05, 3.0, 0.2), + AlgorithmSpec::best_of_best(), + ], + share_rates: vec![6.0, 8.0, 10.0, 12.0, 15.0, 20.0, 25.0, 30.0], + scenarios, + trial_count, + base_seed, + }; + + eprintln!( + "Running {} algorithms × {} SPM × {} scenarios × {} trials = {} total", + grid.algorithms.len(), + grid.share_rates.len(), + grid.scenarios.len(), + grid.trial_count, + grid.total_runs() * grid.trial_count, + ); + + let results = grid.run_paired(); + + println!("# Best-of-Best vs Production — Final Comparison\n"); + println!("Trials per cell: {}\n", trial_count); + println!("## Compositions\n"); + println!("| Name | Estimator | Boundary | UpdateRule |"); + println!("|------|-----------|----------|------------|"); + println!("| VardiffState (prod) | EwmaEstimator(120s) | AsymCUSUM(s=1.5, f=0.05, t=3.0) | PartialRetarget(η=0.5) |"); + println!("| AsymCUSUM-baseline | EwmaEstimator(120s) | AsymCUSUM(s=1.5, f=0.05, t=3.0) | PartialRetarget(η=0.2) |"); + println!("| **BestOfBest** | SpmRatioEstimator(120s) | AsymCUSUM(s=1.5, f=0.05, t=3.0) | AcceleratingRetarget(base=0.2, max=0.6, acc=0.2) |"); + println!(); + + // Summary table + println!("## Summary (all SPM averaged)\n"); + println!("| Algorithm | Stable Jitter | ±50% React | ±50% Conv | ±25% React | ±25% Conv | ±10% React | ±10% Conv | ±5% React | Cold Conv |"); + println!("|-----------|---------------|------------|-----------|------------|-----------|------------|-----------|-----------|-----------|"); + + let mut algo_names: Vec<&String> = results.keys().collect(); + algo_names.sort(); + + for algo_name in &algo_names { + let cells = &results[*algo_name]; + + let mut stable_jitter = Vec::new(); + let mut step50_react = Vec::new(); + let mut step50_conv = Vec::new(); + let mut step25_react = Vec::new(); + let mut step25_conv = Vec::new(); + let mut step10_react = Vec::new(); + let mut step10_conv = Vec::new(); + let mut step5_react = Vec::new(); + let mut cold_conv = Vec::new(); + + for cell in cells { + match &cell.scenario { + Scenario::Stable => { + if let Some(v) = cell.get("jitter_mean_per_min") { + stable_jitter.push(v); + } + } + Scenario::Step { delta_pct: 50 } | Scenario::Step { delta_pct: -50 } => { + if let Some(v) = cell.get("reaction_rate") { step50_react.push(v); } + step50_conv.push(cell.get("convergence_rate").unwrap_or(0.0)); + } + Scenario::Step { delta_pct: 25 } | Scenario::Step { delta_pct: -25 } => { + if let Some(v) = cell.get("reaction_rate") { step25_react.push(v); } + step25_conv.push(cell.get("convergence_rate").unwrap_or(0.0)); + } + Scenario::Step { delta_pct: 10 } | Scenario::Step { delta_pct: -10 } => { + if let Some(v) = cell.get("reaction_rate") { step10_react.push(v); } + step10_conv.push(cell.get("convergence_rate").unwrap_or(0.0)); + } + Scenario::Step { delta_pct: 5 } | Scenario::Step { delta_pct: -5 } => { + if let Some(v) = cell.get("reaction_rate") { step5_react.push(v); } + } + Scenario::ColdStart => { + cold_conv.push(cell.get("convergence_rate").unwrap_or(0.0)); + } + _ => {} + } + } + + let mean = |v: &[f64]| -> f64 { + if v.is_empty() { f64::NAN } else { v.iter().sum::() / v.len() as f64 } + }; + + println!( + "| {} | {:.4} | {:.3} | {:.3} | {:.3} | {:.3} | {:.3} | {:.3} | {:.3} | {:.3} |", + algo_name, + mean(&stable_jitter), + mean(&step50_react), + mean(&step50_conv), + mean(&step25_react), + mean(&step25_conv), + mean(&step10_react), + mean(&step10_conv), + mean(&step5_react), + mean(&cold_conv), + ); + } + + // Per-SPM convergence on ±50% (the biggest improvement axis) + println!("\n## Step ±50% Convergence by SPM\n"); + println!("| Algorithm | SPM=6 | SPM=8 | SPM=10 | SPM=12 | SPM=15 | SPM=20 | SPM=25 | SPM=30 |"); + println!("|-----------|-------|-------|--------|--------|--------|--------|--------|--------|"); + + for algo_name in &algo_names { + let cells = &results[*algo_name]; + let mut row = format!("| {} ", algo_name); + + for &spm in &[6.0f32, 8.0, 10.0, 12.0, 15.0, 20.0, 25.0, 30.0] { + let values: Vec = cells + .iter() + .filter(|c| { + (c.shares_per_minute - spm).abs() < 0.1 + && matches!(c.scenario, Scenario::Step { delta_pct: 50 } | Scenario::Step { delta_pct: -50 }) + }) + .map(|c| c.get("convergence_rate").unwrap_or(0.0)) + .collect(); + let avg = if values.is_empty() { f64::NAN } else { values.iter().sum::() / values.len() as f64 }; + row.push_str(&format!("| {:.3} ", avg)); + } + row.push('|'); + println!("{}", row); + } + + // Per-SPM jitter + println!("\n## Stable-Load Jitter by SPM (fires/min)\n"); + println!("| Algorithm | SPM=6 | SPM=8 | SPM=10 | SPM=12 | SPM=15 | SPM=20 | SPM=25 | SPM=30 |"); + println!("|-----------|-------|-------|--------|--------|--------|--------|--------|--------|"); + + for algo_name in &algo_names { + let cells = &results[*algo_name]; + let mut row = format!("| {} ", algo_name); + + for &spm in &[6.0f32, 8.0, 10.0, 12.0, 15.0, 20.0, 25.0, 30.0] { + let values: Vec = cells + .iter() + .filter(|c| { + (c.shares_per_minute - spm).abs() < 0.1 + && matches!(c.scenario, Scenario::Stable) + }) + .filter_map(|c| c.get("jitter_mean_per_min")) + .collect(); + let avg = if values.is_empty() { f64::NAN } else { values.iter().sum::() / values.len() as f64 }; + row.push_str(&format!("| {:.4} ", avg)); + } + row.push('|'); + println!("{}", row); + } + + // Settled accuracy + println!("\n## Settled Accuracy p50 by SPM (Stable scenario)\n"); + println!("| Algorithm | SPM=6 | SPM=8 | SPM=10 | SPM=12 | SPM=15 | SPM=20 | SPM=25 | SPM=30 |"); + println!("|-----------|-------|-------|--------|--------|--------|--------|--------|--------|"); + + for algo_name in &algo_names { + let cells = &results[*algo_name]; + let mut row = format!("| {} ", algo_name); + + for &spm in &[6.0f32, 8.0, 10.0, 12.0, 15.0, 20.0, 25.0, 30.0] { + let values: Vec = cells + .iter() + .filter(|c| { + (c.shares_per_minute - spm).abs() < 0.1 + && matches!(c.scenario, Scenario::Stable) + }) + .filter_map(|c| c.get("settled_accuracy_p50")) + .collect(); + let avg = if values.is_empty() { f64::NAN } else { values.iter().sum::() / values.len() as f64 }; + row.push_str(&format!("| {:.4} ", avg)); + } + row.push('|'); + println!("{}", row); + } +} diff --git a/sv2/channels-sv2/sim/src/bin/compare-pid.rs b/sv2/channels-sv2/sim/src/bin/compare-pid.rs new file mode 100644 index 0000000000..850bb4a93c --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/compare-pid.rs @@ -0,0 +1,121 @@ +//! Compares PID-based vardiff approaches against the production AdaCUSUM +//! algorithm across the standard scenario grid. +//! +//! Demonstrates quantitatively how power-of-2 quantization creates a dead +//! zone that makes naive PID implementations unable to track normal hashrate +//! variance (±50%), while AdaCUSUM detects and adjusts within minutes. +//! +//! ## Usage +//! +//! ```text +//! cargo run --release --bin compare-pid +//! ``` +//! +//! ## Configuration +//! +//! - `VARDIFF_COMPARE_TRIALS` — trials per cell (default 1000). + +use std::env; + +use vardiff_sim::{baseline::Scenario, grid::AlgorithmSpec, grid::Grid}; + +fn main() { + let trial_count: usize = env::var("VARDIFF_COMPARE_TRIALS") + .ok() + .and_then(|v| v.parse().ok()) + .unwrap_or(1000); + + let base_seed: u64 = 0xDEAD_BEEF_CAFE_F00D; + + // Scenarios that exercise the algorithm's tracking ability + let mut scenarios = vec![Scenario::ColdStart, Scenario::Stable]; + for &delta in &[-50, -25, -10, -5, 5, 10, 25, 50] { + scenarios.push(Scenario::Step { delta_pct: delta }); + } + + let grid = Grid { + algorithms: vec![ + // Baselines + AlgorithmSpec::classic_vardiff_state(), + AlgorithmSpec::ewma_asymmetric_cusum(120, 1.5, 0.05, 3.0, 0.2), + // New idea #1: AcceleratingPartialRetarget + AlgorithmSpec::ada_cusum_accelerating(120, 1.5, 0.05, 3.0, 0.2, 0.6, 0.1), + // New idea #2: SpmRatio estimator (bypass U256) + AlgorithmSpec::spm_ratio_cusum(120, 1.5, 0.05, 3.0, 0.2), + // New idea #3: SignPersistence boundary + AlgorithmSpec::ewma_sign_persistence(120, 1.5, 0.05, 3.0, 0.03, 0.4, 0.2), + ], + share_rates: vec![6.0, 10.0, 12.0, 20.0, 30.0], + scenarios, + trial_count, + base_seed, + }; + + eprintln!( + "Running {} algorithms × {} SPM × {} scenarios × {} trials = {} total trials", + grid.algorithms.len(), + grid.share_rates.len(), + grid.scenarios.len(), + grid.trial_count, + grid.total_runs() * grid.trial_count, + ); + + let results = grid.run_paired(); + + println!("# PID Approaches vs Production Algorithms — Comparison\n"); + println!("Trial count: {}\n", trial_count); + + for algo_name in results.keys() { + println!("## {}\n", algo_name); + let cells = &results[algo_name]; + + println!( + "| SPM | Scenario | Conv.Rate | Settled.Acc.p50 | Jitter(fires/min) | React.Rate | React.p50(s) |" + ); + println!("|-----|----------|-----------|-----------------|-------------------|------------|--------------|"); + + for cell in cells { + let conv = cell.get("convergence_rate").unwrap_or(f64::NAN); + let acc = cell.get("settled_accuracy_p50").unwrap_or(f64::NAN); + let jitter = cell.get("jitter_mean_per_min").unwrap_or(f64::NAN); + let react_rate = cell.get("reaction_rate").unwrap_or(f64::NAN); + let react_time = cell.get("reaction_p50_secs").unwrap_or(f64::NAN); + + println!( + "| {:.0} | {:?} | {:.3} | {:.4} | {:.4} | {:.3} | {:.0} |", + cell.shares_per_minute, + cell.scenario, + conv, + acc, + jitter, + react_rate, + react_time, + ); + } + println!(); + } + + // Print focused comparison: Step scenarios only + println!("## Head-to-Head: Step ±50% Reaction\n"); + println!("| Algorithm | SPM | Step | Reaction Rate | Reaction p50 (s) | Convergence |"); + println!("|-----------|-----|------|---------------|------------------|-------------|"); + + for (algo_name, cells) in &results { + for cell in cells { + let is_step_50 = matches!( + cell.scenario, + Scenario::Step { delta_pct: 50 } | Scenario::Step { delta_pct: -50 } + ); + if !is_step_50 { + continue; + } + let react_rate = cell.get("reaction_rate").unwrap_or(f64::NAN); + let react_time = cell.get("reaction_p50_secs").unwrap_or(f64::NAN); + let conv = cell.get("convergence_rate").unwrap_or(f64::NAN); + println!( + "| {} | {:.0} | {:?} | {:.3} | {:.0} | {:.3} |", + algo_name, cell.shares_per_minute, cell.scenario, react_rate, react_time, conv, + ); + } + } +} diff --git a/sv2/channels-sv2/sim/src/bin/confirm-champions.rs b/sv2/channels-sv2/sim/src/bin/confirm-champions.rs new file mode 100644 index 0000000000..4efa937257 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/confirm-champions.rs @@ -0,0 +1,398 @@ +//! High-trial confirmation run for the big-sweep champion region. +//! +//! `sweep-regret-big` (9216 algos, 500 trials) returned a top-100 that was +//! statistically FLAT — rank 1 (0.2000) to rank 100 (0.2057) is a ~3% +//! spread, almost certainly inside the 500-trial noise band. So "rank 1" +//! is not meaningfully the winner; the top ~30 are a tie. This bin +//! resolves that tie by re-running a SMALL, curated set at high trial +//! count, where the noise band shrinks below the inter-config gap. +//! +//! The set is: +//! 1. The distinct top-20 configs from the big sweep (champion cluster). +//! 2. Edge-extension probes on the two axes that were STILL pegged at a +//! box edge in the big sweep — sensitivity (pegged low at 0.3) and +//! tighten (pegged high at 7). If a probe beats the cluster, the real +//! optimum is still outside the box and another widening is needed; +//! if the probes are no better, the edge-lean was noise and the +//! cluster is the true optimum. +//! 3. The three reference anchors (production-classic + current champs). +//! +//! Cost is IDENTICAL to sweep-regret / sweep-regret-big. +//! +//! Usage: +//! ```text +//! cargo run --release --bin confirm-champions # 2000 trials +//! VARDIFF_CONFIRM_TRIALS=4000 cargo run --release --bin confirm-champions +//! ``` +//! Env: VARDIFF_CONFIRM_TRIALS (default 2000), VARDIFF_CONFIRM_THREADS, +//! VARDIFF_SWEEP_SEED, VARDIFF_W_*/RHO_* weights, +//! VARDIFF_CONFIRM_OUT_DIR (default "."), writes `confirm_champions.md`. + +use std::env; +use std::fs; +use std::path::PathBuf; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::Mutex; +use std::time::Instant; + +use channels_sv2::vardiff::composed::{ + AcceleratingPartialRetarget, AdaptivePoissonCusum, AsymmetricCusumBoundary, Composed, + EwmaEstimator, PoissonCI, +}; +use vardiff_sim::baseline::{Cell, Scenario, DEFAULT_BASELINE_SEED}; +use vardiff_sim::grid::{run_cell_with_algorithm, AlgorithmSpec, VardiffBox}; + +struct Weights { + w_over: f64, + w_under: f64, + rho_up: f64, + rho_down: f64, + rho: f64, + w_det: f64, +} +impl Weights { + fn from_env() -> Self { + let g = |k: &str, d: f64| env::var(k).ok().and_then(|s| s.parse().ok()).unwrap_or(d); + Weights { + w_over: g("VARDIFF_W_OVER", 3.0), + w_under: g("VARDIFF_W_UNDER", 1.0), + rho_up: g("VARDIFF_RHO_UP", 3.0), + rho_down: g("VARDIFF_RHO_DOWN", 1.0), + rho: g("VARDIFF_RHO", 0.5), + w_det: g("VARDIFF_W_DET", 0.5), + } + } +} + +struct Profile { + name: String, + tag: &'static str, + regret_over: f64, + regret_under: f64, + effort_up: f64, + effort_down: f64, + detection: f64, + cost: f64, +} + +#[derive(Clone, Copy)] +struct Params { + tau: u64, + sens: f64, + floor: f64, + tighten: f64, + spm: u32, + eta_base: f32, + eta_max: f32, + accel: f32, +} + +fn spec_for(p: Params) -> AlgorithmSpec { + let name = vardiff_sim::naming::triple_name( + &EwmaEstimator::new(p.tau), + &AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(p.sens, p.floor, p.tighten), + p.spm, + ), + &AcceleratingPartialRetarget::new(p.eta_base, p.eta_max, p.accel), + ); + AlgorithmSpec::new(name, move |clock| { + let boundary = AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(p.sens, p.floor, p.tighten), + p.spm, + ); + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(p.tau), + boundary, + AcceleratingPartialRetarget::new(p.eta_base, p.eta_max, p.accel), + 1.0, + clock, + ))) + }) +} + +/// Shorthand for a champion-cluster point (all share tau=150, floor=0.05, +/// eta_base=0.2; only spm/sens/tighten/eta_max/accel vary). +fn champ(spm: u32, sens: f64, tighten: f64, eta_max: f32, accel: f32) -> Params { + Params { + tau: 150, + sens, + floor: 0.05, + tighten, + spm, + eta_base: 0.2, + eta_max, + accel, + } +} + +#[allow(clippy::too_many_arguments)] +fn profile_for( + algo: &AlgorithmSpec, + algo_idx: usize, + tag: &'static str, + share_rates: &[f32], + scenarios: &[Scenario], + trial_count: usize, + base_seed: u64, + w: &Weights, +) -> Option { + let n_spm = share_rates.len(); + let n_scen = scenarios.len(); + let (mut ro, mut ru, mut eu, mut ed) = (0.0, 0.0, 0.0, 0.0); + let mut n = 0u32; + let mut det_sum = 0.0; + let mut det_n = 0u32; + for (spm_idx, &spm) in share_rates.iter().enumerate() { + for (scen_idx, scen) in scenarios.iter().enumerate() { + let cell = Cell { + shares_per_minute: spm, + scenario: scen.clone(), + }; + let cell_index = (algo_idx * n_spm * n_scen + spm_idx * n_scen + scen_idx) as u64; + let r = run_cell_with_algorithm(algo, &cell, trial_count, base_seed, cell_index); + let is_mix = matches!( + scen, + Scenario::Stable + | Scenario::Step { + delta_pct: -50 | -10 | 10 | 50 + } + ); + if is_mix { + ro += r.get("regret_over").unwrap_or(0.0); + ru += r.get("regret_under").unwrap_or(0.0); + eu += r.get("effort_up").unwrap_or(0.0); + ed += r.get("effort_down").unwrap_or(0.0); + n += 1; + } + if matches!( + scen, + Scenario::SettledStep { + settle_minutes: 60, + delta_pct: -10 + } + ) { + if let Some(rate) = r.get("settled_reaction_rate") { + det_sum += rate; + det_n += 1; + } + } + } + } + if n == 0 { + return None; + } + let (regret_over, regret_under, effort_up, effort_down) = + (ro / n as f64, ru / n as f64, eu / n as f64, ed / n as f64); + let detection = if det_n > 0 { det_sum / det_n as f64 } else { 0.0 }; + let cost = w.w_over * regret_over + + w.w_under * regret_under + + w.rho * (w.rho_up * effort_up + w.rho_down * effort_down) + + w.w_det * (1.0 - detection); + Some(Profile { + name: algo.name.clone(), + tag, + regret_over, + regret_under, + effort_up, + effort_down, + detection, + cost, + }) +} + +fn main() -> std::io::Result<()> { + let trial_count: usize = env::var("VARDIFF_CONFIRM_TRIALS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(2000); + let base_seed: u64 = env::var("VARDIFF_SWEEP_SEED") + .ok() + .and_then(|s| { + s.strip_prefix("0x") + .and_then(|h| u64::from_str_radix(h, 16).ok()) + .or_else(|| s.parse().ok()) + }) + .unwrap_or(DEFAULT_BASELINE_SEED); + let n_threads: usize = env::var("VARDIFF_CONFIRM_THREADS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or_else(|| { + std::thread::available_parallelism() + .map(|n| n.get()) + .unwrap_or(4) + }) + .max(1); + let out_dir = env::var("VARDIFF_CONFIRM_OUT_DIR") + .map(PathBuf::from) + .unwrap_or_else(|_| PathBuf::from(".")); + let w = Weights::from_env(); + + // ---- The curated set. (spec, tag) — tag marks provenance in the table. + let mut entries: Vec<(AlgorithmSpec, &'static str)> = Vec::new(); + + // Anchors first (stable seed offsets). + entries.push((AlgorithmSpec::classic_vardiff_state(), "anchor")); + entries.push((AlgorithmSpec::balanced(), "anchor")); + entries.push((AlgorithmSpec::react_priority(), "anchor")); + + // (1) Distinct top-20 champion-cluster configs (tau=150, floor=0.05, + // eta_base=0.2). (spm, sens, tighten, eta_max, accel). + let cluster = [ + champ(5, 0.3, 7.0, 0.8, 0.05), + champ(3, 0.3, 7.0, 0.6, 0.05), + champ(3, 0.3, 7.0, 0.8, 0.05), + champ(6, 0.3, 7.0, 0.6, 0.05), + champ(6, 0.3, 7.0, 0.8, 0.05), + champ(5, 0.3, 7.0, 0.6, 0.05), + champ(6, 0.3, 7.0, 0.8, 0.1), + champ(5, 0.3, 6.0, 0.8, 0.05), + champ(4, 0.3, 7.0, 0.6, 0.05), + champ(5, 0.3, 7.0, 0.6, 0.1), + champ(6, 0.5, 6.0, 0.6, 0.1), + champ(6, 0.3, 6.0, 0.8, 0.1), + champ(4, 0.3, 7.0, 0.6, 0.1), + champ(3, 0.3, 7.0, 0.6, 0.1), + champ(5, 0.5, 6.0, 0.6, 0.1), + champ(4, 0.3, 7.0, 0.8, 0.1), + champ(3, 0.5, 7.0, 0.8, 0.1), + champ(4, 0.5, 7.0, 0.8, 0.1), + champ(6, 0.3, 6.0, 0.6, 0.05), + champ(6, 0.3, 7.0, 0.6, 0.1), + ]; + for p in cluster { + entries.push((spec_for(p), "cluster")); + } + + // (2) Edge-extension probes. Sensitivity pegged low (0.3) and tighten + // pegged high (7) in the big sweep — push both past the box on a + // representative champion skeleton (spm5, eta_max0.8, accel0.05). + let probes = [ + // sensitivity below the box floor of 0.3 + champ(5, 0.2, 7.0, 0.8, 0.05), + champ(5, 0.15, 7.0, 0.8, 0.05), + champ(3, 0.2, 7.0, 0.6, 0.05), + // tighten above the box ceiling of 7 + champ(5, 0.3, 8.0, 0.8, 0.05), + champ(5, 0.3, 9.0, 0.8, 0.05), + champ(3, 0.3, 8.0, 0.6, 0.05), + // both edges pushed at once + champ(5, 0.2, 8.0, 0.8, 0.05), + champ(5, 0.15, 9.0, 0.8, 0.05), + ]; + for p in probes { + entries.push((spec_for(p), "probe")); + } + + let scenarios = vec![ + Scenario::Stable, + Scenario::Step { delta_pct: -50 }, + Scenario::Step { delta_pct: -10 }, + Scenario::Step { delta_pct: 10 }, + Scenario::Step { delta_pct: 50 }, + Scenario::SettledStep { + settle_minutes: 60, + delta_pct: -10, + }, + ]; + let share_rates = vec![6.0f32, 8.0, 12.0, 20.0, 30.0]; + + let n = entries.len(); + eprintln!( + "Confirmation: {} algos × {} cells × {} trials = {} runs, {} threads", + n, + share_rates.len() * scenarios.len(), + trial_count, + n * share_rates.len() * scenarios.len() * trial_count, + n_threads + ); + + let started = Instant::now(); + let next = AtomicUsize::new(0); + let out: Mutex> = Mutex::new(Vec::with_capacity(n)); + std::thread::scope(|scope| { + for _ in 0..n_threads { + scope.spawn(|| loop { + let i = next.fetch_add(1, Ordering::Relaxed); + if i >= n { + break; + } + let (spec, tag) = &entries[i]; + if let Some(p) = profile_for( + spec, + i, + tag, + &share_rates, + &scenarios, + trial_count, + base_seed, + &w, + ) { + out.lock().unwrap().push(p); + } + }); + } + }); + let mut profiles = out.into_inner().unwrap(); + eprintln!("Done in {:.1}s", started.elapsed().as_secs_f64()); + profiles.sort_by(|a, b| a.cost.partial_cmp(&b.cost).unwrap()); + + let row = |i: usize, p: &Profile| { + format!( + "| {} | {} | {} | **{:.4}** | {:.4} | {:.4} | {:.4} | {:.4} | {:.0}% |\n", + i + 1, + p.tag, + p.name, + p.cost, + p.regret_over, + p.regret_under, + p.effort_up, + p.effort_down, + p.detection * 100.0, + ) + }; + + let mut md = String::new(); + md.push_str("# Champion confirmation run\n\n"); + md.push_str(&format!( + "Cost = {:.1}·regret_over + {:.1}·regret_under + {:.2}·({:.1}·effort_up + {:.1}·effort_down) + {:.2}·(1−detection). Lower is better.\n\n", + w.w_over, w.w_under, w.rho, w.rho_up, w.rho_down, w.w_det + )); + md.push_str(&format!( + "{} algos, {} trials/cell (high-trial tie-break), base_seed {:#x}.\n\n", + n, trial_count, base_seed + )); + md.push_str("Tags: `cluster` = big-sweep top-20, `probe` = edge-extension (sens<0.3 or tighten>7), `anchor` = reference.\n"); + md.push_str("**Verdict rule:** if no `probe` ranks above the `cluster`, the box edge-lean was noise and the cluster is the optimum; if a `probe` wins, widen the box again.\n\n"); + md.push_str("| rank | tag | algorithm | **cost** | reg_over | reg_under | eff_up | eff_down | det% |\n"); + md.push_str("| --- | --- | --- | --- | --- | --- | --- | --- | --- |\n"); + for (i, p) in profiles.iter().enumerate() { + md.push_str(&row(i, p)); + } + + let out_path = out_dir.join("confirm_champions.md"); + fs::write(&out_path, &md)?; + eprintln!("Wrote {}", out_path.display()); + + println!("\n## Champion confirmation — full ranking ({} trials)\n", trial_count); + println!("| rank | tag | algorithm | cost | reg_over | reg_under | eff_up | eff_down | det% |"); + println!("| --- | --- | --- | --- | --- | --- | --- | --- | --- |"); + for (i, p) in profiles.iter().enumerate() { + print!("{}", row(i, p)); + } + let best_probe = profiles.iter().position(|p| p.tag == "probe"); + let best_cluster = profiles.iter().position(|p| p.tag == "cluster"); + println!( + "\nBest cluster at rank {:?}, best probe at rank {:?} — {}", + best_cluster.map(|i| i + 1), + best_probe.map(|i| i + 1), + match (best_cluster, best_probe) { + (Some(c), Some(p)) if p < c => "PROBE WINS → widen the box again", + (Some(_), _) => "cluster holds → edge-lean was noise, cluster is the optimum", + _ => "inconclusive", + } + ); + Ok(()) +} diff --git a/sv2/channels-sv2/sim/src/bin/confirm-debias.rs b/sv2/channels-sv2/sim/src/bin/confirm-debias.rs new file mode 100644 index 0000000000..b4fad87eb5 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/confirm-debias.rs @@ -0,0 +1,261 @@ +//! Estimator-side debias: how much of the champion's −7% settle gap can a +//! belief multiplier recover, and at what §10-cost price? +//! +//! THEORY PREDICTION (docs/THEORY.md §5/§9): the SignPersist champion +//! equilibrates with a persistent under-difficulty offset because the +//! tighten threshold is high. Scaling h_estimate up by `bias>1` lifts that +//! equilibrium toward truth (shrinks regret_under), but the SAME scaled +//! belief is the retarget target, so it raises regret_over. With +//! w_over:w_under = 3:1 the trade is priced AGAINST accuracy, so debias is +//! expected to reduce the settle gap while INCREASING the §10 cost. This +//! bin quantifies that curve and confirms whether −7% is a defect or the +//! deliberate cost optimum (bias=1.0 wins => deliberate). +//! +//! Two readouts per bias level: +//! - §10 cost components (the regret/effort grid, champion = anchor). +//! - settle gap: signed % vs truth on a stable cell, so we SEE the +//! accuracy move even when the cost says don't. +//! +//! Usage: `cargo run --release --bin confirm-debias` +//! Env: VARDIFF_DB_TRIALS (default 1000), VARDIFF_DB_THREADS, +//! VARDIFF_SWEEP_SEED, VARDIFF_DB_OUT_DIR (default "."). + +use std::env; +use std::fs; +use std::path::PathBuf; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::Arc; +use std::sync::Mutex; +use std::time::Instant; + +use channels_sv2::vardiff::composed::{ + AcceleratingPartialRetarget, AdaptiveSignPersist, Composed, DebiasEstimator, EwmaEstimator, + SignPersistenceCusumBoundary, +}; +use channels_sv2::vardiff::MockClock; +use vardiff_sim::baseline::{Cell, Scenario, DEFAULT_BASELINE_SEED, TRUE_HASHRATE}; +use vardiff_sim::grid::{run_cell_with_algorithm, AlgorithmSpec, VardiffBox}; +use vardiff_sim::trial::run_trial_observed; + +const FLOOR: f64 = 0.05; +const ETA_BASE: f32 = 0.2; +const ETA_MAX: f32 = 0.8; +const ACCEL: f32 = 0.05; +const SENS: f64 = 0.3; +const TIGHTEN: f64 = 6.0; +const DISCOUNT: f64 = 0.06; +const MAX_DISCOUNT: f64 = 0.6; +const SPM_SWITCH: u32 = 6; +const TAU: u64 = 150; + +struct Weights { + w_over: f64, + w_under: f64, + rho_up: f64, + rho_down: f64, + rho: f64, + w_det: f64, +} +impl Weights { + fn from_env() -> Self { + let g = |k: &str, d: f64| env::var(k).ok().and_then(|s| s.parse().ok()).unwrap_or(d); + Weights { + w_over: g("VARDIFF_W_OVER", 3.0), + w_under: g("VARDIFF_W_UNDER", 1.0), + rho_up: g("VARDIFF_RHO_UP", 3.0), + rho_down: g("VARDIFF_RHO_DOWN", 1.0), + rho: g("VARDIFF_RHO", 0.5), + w_det: g("VARDIFF_W_DET", 0.5), + } + } +} + +fn champ_boundary() -> AdaptiveSignPersist { + AdaptiveSignPersist::sign_persist( + SignPersistenceCusumBoundary::new(SENS, FLOOR, TIGHTEN, DISCOUNT, MAX_DISCOUNT), + SPM_SWITCH, + ) +} + +/// Champion with an estimator debias factor (bias=1.0 == the champion). +fn debias_spec(bias: f32) -> AlgorithmSpec { + let name = vardiff_sim::naming::triple_name( + &DebiasEstimator::new(EwmaEstimator::new(TAU), bias), + &champ_boundary(), + &AcceleratingPartialRetarget::new(ETA_BASE, ETA_MAX, ACCEL), + ); + AlgorithmSpec::new(name, move |clock| { + VardiffBox(Box::new(Composed::new( + DebiasEstimator::new(EwmaEstimator::new(TAU), bias), + champ_boundary(), + AcceleratingPartialRetarget::new(ETA_BASE, ETA_MAX, ACCEL), + 1.0, + clock, + ))) + }) +} + +struct Row { + bias: f32, + cost: f64, + regret_over: f64, + regret_under: f64, + detection: f64, + settle_gap_pct: f64, +} + +fn cost(w: &Weights, ro: f64, ru: f64, eu: f64, ed: f64, det: f64) -> f64 { + w.w_over * ro + w.w_under * ru + w.rho * (w.rho_up * eu + w.rho_down * ed) + w.w_det * (1.0 - det) +} + +fn settle_gap_pct(bias: f32, trials: usize, base_seed: u64) -> f64 { + // Stable scenario at 12 spm; median estimate over the back half vs truth. + let spm = 12.0f32; + let scen = Scenario::Stable; + let (config, schedule) = scen.build(spm); + let algo = debias_spec(bias); + let n_ticks = (config.duration_secs / config.tick_interval_secs) as usize; + let start = n_ticks / 2; + let mut vals: Vec = Vec::with_capacity(trials); + for i in 0..trials { + let clock = Arc::new(MockClock::new(0)); + let v = (algo.factory)(clock.clone()); + let t = run_trial_observed(v, clock, config.clone(), &schedule, base_seed.wrapping_add(i as u64)); + let back: Vec = t.ticks.iter().skip(start).map(|tk| tk.current_hashrate_before as f64).collect(); + if !back.is_empty() { + let mut b = back.clone(); + b.sort_by(|a, c| a.partial_cmp(c).unwrap()); + vals.push(b[b.len() / 2]); + } + } + vals.sort_by(|a, c| a.partial_cmp(c).unwrap()); + let med = if vals.is_empty() { TRUE_HASHRATE as f64 } else { vals[vals.len() / 2] }; + (med / TRUE_HASHRATE as f64 - 1.0) * 100.0 +} + +fn main() -> std::io::Result<()> { + let trials: usize = env::var("VARDIFF_DB_TRIALS").ok().and_then(|s| s.parse().ok()).unwrap_or(1000); + let base_seed: u64 = env::var("VARDIFF_SWEEP_SEED") + .ok() + .and_then(|s| s.strip_prefix("0x").and_then(|h| u64::from_str_radix(h, 16).ok()).or_else(|| s.parse().ok())) + .unwrap_or(DEFAULT_BASELINE_SEED); + let n_threads: usize = env::var("VARDIFF_DB_THREADS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or_else(|| std::thread::available_parallelism().map(|n| n.get()).unwrap_or(4)) + .max(1); + let out_dir = env::var("VARDIFF_DB_OUT_DIR").map(PathBuf::from).unwrap_or_else(|_| PathBuf::from(".")); + let w = Weights::from_env(); + + let biases = [1.0f32, 1.02, 1.05, 1.08, 1.12, 1.18, 1.25]; + + let scenarios = vec![ + Scenario::Stable, + Scenario::Step { delta_pct: -50 }, + Scenario::Step { delta_pct: -10 }, + Scenario::Step { delta_pct: 10 }, + Scenario::Step { delta_pct: 50 }, + Scenario::SettledStep { settle_minutes: 60, delta_pct: -10 }, + ]; + let share_rates = vec![6.0f32, 8.0, 12.0, 20.0, 30.0]; + let n_spm = share_rates.len(); + let n_scen = scenarios.len(); + + eprintln!("confirm-debias: {} bias levels x {} cells x {} trials, {} threads", biases.len(), n_spm * n_scen, trials, n_threads); + let started = Instant::now(); + + let next = AtomicUsize::new(0); + let out: Mutex> = Mutex::new(Vec::with_capacity(biases.len())); + std::thread::scope(|scope| { + for _ in 0..n_threads { + scope.spawn(|| loop { + let bi = next.fetch_add(1, Ordering::Relaxed); + if bi >= biases.len() { + break; + } + let bias = biases[bi]; + let algo = debias_spec(bias); + let (mut ro, mut ru, mut eu, mut ed) = (0.0, 0.0, 0.0, 0.0); + let mut n = 0u32; + let (mut ds, mut dn) = (0.0, 0u32); + for (si, &spm) in share_rates.iter().enumerate() { + for (ci, scen) in scenarios.iter().enumerate() { + let cell = Cell { shares_per_minute: spm, scenario: scen.clone() }; + let cell_index = (bi * n_spm * n_scen + si * n_scen + ci) as u64; + let r = run_cell_with_algorithm(&algo, &cell, trials, base_seed, cell_index); + if matches!(scen, Scenario::Stable | Scenario::Step { delta_pct: -50 | -10 | 10 | 50 }) { + ro += r.get("regret_over").unwrap_or(0.0); + ru += r.get("regret_under").unwrap_or(0.0); + eu += r.get("effort_up").unwrap_or(0.0); + ed += r.get("effort_down").unwrap_or(0.0); + n += 1; + } + if matches!(scen, Scenario::SettledStep { settle_minutes: 60, delta_pct: -10 }) { + if let Some(rate) = r.get("settled_reaction_rate") { + ds += rate; + dn += 1; + } + } + } + } + let nf = n.max(1) as f64; + let (ro, ru, eu, ed) = (ro / nf, ru / nf, eu / nf, ed / nf); + let det = if dn > 0 { ds / dn as f64 } else { 0.0 }; + let gap = settle_gap_pct(bias, trials, base_seed ^ 0x5EeD); + let row = Row { + bias, + cost: cost(&w, ro, ru, eu, ed, det), + regret_over: ro, + regret_under: ru, + detection: det, + settle_gap_pct: gap, + }; + out.lock().unwrap().push(row); + }); + } + }); + let mut rows = out.into_inner().unwrap(); + eprintln!("Done in {:.1}s", started.elapsed().as_secs_f64()); + rows.sort_by(|a, b| a.bias.partial_cmp(&b.bias).unwrap()); + + let mut md = String::new(); + md.push_str("# Estimator debias sweep\n\n"); + md.push_str(&format!("{} trials/cell, base_seed {:#x}. bias=1.0 is the champion. Cost = §10 (3:1). settle_gap = signed % vs truth, stable@12spm back-half median.\n\n", trials, base_seed)); + md.push_str("| bias | cost | reg_over | reg_under | det% | settle gap |\n| --- | --- | --- | --- | --- | --- |\n"); + for r in &rows { + md.push_str(&format!( + "| {:.2} | {:.4} | {:.4} | {:.4} | {:.0}% | {:+.1}% |\n", + r.bias, r.cost, r.regret_over, r.regret_under, r.detection * 100.0, r.settle_gap_pct + )); + } + let best = rows.iter().enumerate().min_by(|a, b| a.1.cost.partial_cmp(&b.1.cost).unwrap()).unwrap(); + md.push_str(&format!("\nLowest §10 cost at bias={:.2}. ", rows[best.0].bias)); + if (rows[best.0].bias - 1.0).abs() < 1e-6 { + md.push_str("bias=1.0 wins => the −7% settle gap is the deliberate cost optimum; debias is cost-negative as theory predicted.\n"); + } else { + md.push_str("a debias > 1.0 wins => the settle offset was leaving cost on the table after all.\n"); + } + let out_path = out_dir.join("confirm_debias.md"); + fs::write(&out_path, &md)?; + eprintln!("Wrote {}", out_path.display()); + + println!("\n## Estimator debias sweep ({} trials) — cost vs settle-gap tradeoff\n", trials); + println!("| bias | cost | reg_over | reg_under | det% | settle gap |"); + println!("| --- | --- | --- | --- | --- | --- |"); + for r in &rows { + println!( + "| {:.2} | {:.4} | {:.4} | {:.4} | {:.0}% | {:+.1}% |", + r.bias, r.cost, r.regret_over, r.regret_under, r.detection * 100.0, r.settle_gap_pct + ); + } + println!( + "\nLowest §10 cost at bias={:.2} (cost {:.4}). {}", + rows[best.0].bias, rows[best.0].cost, + if (rows[best.0].bias - 1.0).abs() < 1e-6 { + "bias=1.0 wins -> -7% gap is the deliberate optimum; debias trades accuracy for cost as predicted." + } else { + "a debias>1 wins -> the settle offset was leaving cost on the table." + } + ); + Ok(()) +} diff --git a/sv2/channels-sv2/sim/src/bin/confirm-signpersist.rs b/sv2/channels-sv2/sim/src/bin/confirm-signpersist.rs new file mode 100644 index 0000000000..4d73054dd6 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/confirm-signpersist.rs @@ -0,0 +1,315 @@ +//! High-trial confirmation + weight-robustness for the SignPersist winner. +//! +//! sweep-signpersist-regret (973 algos, 500 trials) put 581 SignPersist +//! configs ahead of the champion (AsymCusum, rank 582). The win is the +//! predicted mechanism: regret_under drops 0.096->0.075 (settle bias +//! shrinks) while regret_over barely moves and detection holds 100%. But +//! the top ~20 are a flat tie (cost 0.1958..0.1984, ~1.3% spread) and the +//! winning discount d=0.06 sits at the LOW EDGE of the swept range -> the +//! optimum may want an even gentler discount. +//! +//! This bin settles both, the way confirm-champions / champion-weights did: +//! (1) re-run the top cluster at high trials to break the flat-top tie; +//! (2) add edge probes BELOW d=0.06 (0.02, 0.04) to test the box edge; +//! (3) re-score the one simulation pass under a w_over:w_under x w_det +//! weight grid (free) to confirm the winner is weight-robust. +//! Champion (AsymCusum) is the anchor throughout. +//! +//! Usage: `cargo run --release --bin confirm-signpersist` +//! Env: VARDIFF_CS_TRIALS (default 2000), VARDIFF_CS_THREADS, +//! VARDIFF_SWEEP_SEED, VARDIFF_CS_OUT_DIR (default "."). +//! Writes confirm_signpersist.md. Sweeps weights internally (ignores +//! VARDIFF_W_* overrides). + +use std::env; +use std::fs; +use std::path::PathBuf; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::Mutex; +use std::time::Instant; + +use channels_sv2::vardiff::composed::{ + AcceleratingPartialRetarget, AdaptivePoissonCusum, AdaptiveSignPersist, AsymmetricCusumBoundary, + Composed, EwmaEstimator, PoissonCI, SignPersistenceCusumBoundary, +}; +use vardiff_sim::baseline::{Cell, Scenario, DEFAULT_BASELINE_SEED}; +use vardiff_sim::grid::{run_cell_with_algorithm, AlgorithmSpec, VardiffBox}; + +const FLOOR: f64 = 0.05; +const ETA_BASE: f32 = 0.2; +const ETA_MAX: f32 = 0.8; +const ACCEL: f32 = 0.05; + +#[derive(Clone)] +struct Components { + name: String, + tag: &'static str, + discount: f64, // for edge classification + regret_over: f64, + regret_under: f64, + effort_up: f64, + effort_down: f64, + detection: f64, +} +impl Components { + fn cost(&self, w_over: f64, w_under: f64, rho: f64, rho_up: f64, rho_down: f64, w_det: f64) -> f64 { + w_over * self.regret_over + + w_under * self.regret_under + + rho * (rho_up * self.effort_up + rho_down * self.effort_down) + + w_det * (1.0 - self.detection) + } +} + +#[derive(Clone, Copy)] +struct Sp { + tau: u64, + sens: f64, + tighten: f64, + discount: f64, + max_discount: f64, + spm: u32, +} + +fn sp_spec(p: Sp) -> AlgorithmSpec { + let name = vardiff_sim::naming::triple_name( + &EwmaEstimator::new(p.tau), + &AdaptiveSignPersist::sign_persist( + SignPersistenceCusumBoundary::new(p.sens, FLOOR, p.tighten, p.discount, p.max_discount), + p.spm, + ), + &AcceleratingPartialRetarget::new(ETA_BASE, ETA_MAX, ACCEL), + ); + AlgorithmSpec::new(name, move |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(p.tau), + AdaptiveSignPersist::sign_persist( + SignPersistenceCusumBoundary::new(p.sens, FLOOR, p.tighten, p.discount, p.max_discount), + p.spm, + ), + AcceleratingPartialRetarget::new(ETA_BASE, ETA_MAX, ACCEL), + 1.0, + clock, + ))) + }) +} + +fn champion_spec() -> AlgorithmSpec { + let name = vardiff_sim::naming::triple_name( + &EwmaEstimator::new(150), + &AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(0.2, FLOOR, 6.0), + 5, + ), + &AcceleratingPartialRetarget::new(ETA_BASE, ETA_MAX, ACCEL), + ); + AlgorithmSpec::new(name, |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(150), + AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(0.2, FLOOR, 6.0), + 5, + ), + AcceleratingPartialRetarget::new(ETA_BASE, ETA_MAX, ACCEL), + 1.0, + clock, + ))) + }) +} + +fn sp(spm: u32, discount: f64, max_discount: f64) -> Sp { + // top-cluster skeleton: tau150, s0.3, t7. + Sp { tau: 150, sens: 0.3, tighten: 7.0, discount, max_discount, spm } +} + +#[allow(clippy::too_many_arguments)] +fn measure( + algo: &AlgorithmSpec, + idx: usize, + tag: &'static str, + discount: f64, + share_rates: &[f32], + scenarios: &[Scenario], + trials: usize, + base_seed: u64, +) -> Option { + let (n_spm, n_scen) = (share_rates.len(), scenarios.len()); + let (mut ro, mut ru, mut eu, mut ed) = (0.0, 0.0, 0.0, 0.0); + let mut n = 0u32; + let (mut ds, mut dn) = (0.0, 0u32); + for (si, &spm) in share_rates.iter().enumerate() { + for (ci, scen) in scenarios.iter().enumerate() { + let cell = Cell { shares_per_minute: spm, scenario: scen.clone() }; + let cell_index = (idx * n_spm * n_scen + si * n_scen + ci) as u64; + let r = run_cell_with_algorithm(algo, &cell, trials, base_seed, cell_index); + if matches!(scen, Scenario::Stable | Scenario::Step { delta_pct: -50 | -10 | 10 | 50 }) { + ro += r.get("regret_over").unwrap_or(0.0); + ru += r.get("regret_under").unwrap_or(0.0); + eu += r.get("effort_up").unwrap_or(0.0); + ed += r.get("effort_down").unwrap_or(0.0); + n += 1; + } + if matches!(scen, Scenario::SettledStep { settle_minutes: 60, delta_pct: -10 }) { + if let Some(rate) = r.get("settled_reaction_rate") { + ds += rate; + dn += 1; + } + } + } + } + if n == 0 { + return None; + } + Some(Components { + name: algo.name.clone(), + tag, + discount, + regret_over: ro / n as f64, + regret_under: ru / n as f64, + effort_up: eu / n as f64, + effort_down: ed / n as f64, + detection: if dn > 0 { ds / dn as f64 } else { 0.0 }, + }) +} + +fn main() -> std::io::Result<()> { + let trials: usize = env::var("VARDIFF_CS_TRIALS").ok().and_then(|s| s.parse().ok()).unwrap_or(2000); + let base_seed: u64 = env::var("VARDIFF_SWEEP_SEED") + .ok() + .and_then(|s| s.strip_prefix("0x").and_then(|h| u64::from_str_radix(h, 16).ok()).or_else(|| s.parse().ok())) + .unwrap_or(DEFAULT_BASELINE_SEED); + let n_threads: usize = env::var("VARDIFF_CS_THREADS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or_else(|| std::thread::available_parallelism().map(|n| n.get()).unwrap_or(4)) + .max(1); + let out_dir = env::var("VARDIFF_CS_OUT_DIR").map(PathBuf::from).unwrap_or_else(|_| PathBuf::from(".")); + + // (spec, tag, discount). Anchor first. + let mut entries: Vec<(AlgorithmSpec, &'static str, f64)> = Vec::new(); + entries.push((champion_spec(), "anchor", f64::NAN)); + + // (1) top cluster: s0.3/t7/d0.06, spm in {4,5,6}, dm in {0.4,0.6,0.8}. + for &spm in &[4u32, 5, 6] { + for &dm in &[0.4f64, 0.6, 0.8] { + entries.push((sp_spec(sp(spm, 0.06, dm)), "cluster", 0.06)); + } + } + // (2) edge probes BELOW d=0.06 on the representative skeleton (spm5). + for &d in &[0.02f64, 0.04] { + for &dm in &[0.4f64, 0.6, 0.8] { + entries.push((sp_spec(sp(5, d, dm)), "probe", d)); + } + } + + let scenarios = vec![ + Scenario::Stable, + Scenario::Step { delta_pct: -50 }, + Scenario::Step { delta_pct: -10 }, + Scenario::Step { delta_pct: 10 }, + Scenario::Step { delta_pct: 50 }, + Scenario::SettledStep { settle_minutes: 60, delta_pct: -10 }, + ]; + let share_rates = vec![6.0f32, 8.0, 12.0, 20.0, 30.0]; + + let n = entries.len(); + eprintln!( + "confirm-signpersist: {} algos x {} cells x {} trials = {} runs, {} threads", + n, share_rates.len() * scenarios.len(), trials, + n * share_rates.len() * scenarios.len() * trials, n_threads + ); + + let started = Instant::now(); + let next = AtomicUsize::new(0); + let out: Mutex> = Mutex::new(Vec::with_capacity(n)); + std::thread::scope(|scope| { + for _ in 0..n_threads { + scope.spawn(|| loop { + let i = next.fetch_add(1, Ordering::Relaxed); + if i >= n { + break; + } + let (spec, tag, d) = &entries[i]; + if let Some(c) = measure(spec, i, tag, *d, &share_rates, &scenarios, trials, base_seed) { + out.lock().unwrap().push(c); + } + }); + } + }); + let comps = out.into_inner().unwrap(); + eprintln!("Simulated {} configs in {:.1}s", comps.len(), started.elapsed().as_secs_f64()); + + let (rho, rho_up, rho_down) = (0.5, 3.0, 1.0); + + // (1)+(2): default-weight ranking. + let mut ranked: Vec<&Components> = comps.iter().collect(); + ranked.sort_by(|a, b| a.cost(3.0, 1.0, rho, rho_up, rho_down, 0.5).partial_cmp(&b.cost(3.0, 1.0, rho, rho_up, rho_down, 0.5)).unwrap()); + + let mut md = String::new(); + md.push_str("# SignPersist champion confirmation\n\n"); + md.push_str(&format!("{} configs, {} trials/cell, base_seed {:#x}. Skeleton tau150/s0.3/t7; cluster d=0.06, probes d<0.06.\n\n", n, trials, base_seed)); + md.push_str("## Default-weight ranking (3:1, w_det 0.5)\n\n"); + md.push_str("| rank | tag | config | cost | reg_over | reg_under | det% |\n| --- | --- | --- | --- | --- | --- | --- |\n"); + for (i, c) in ranked.iter().enumerate() { + md.push_str(&format!( + "| {} | {} | {} | {:.4} | {:.4} | {:.4} | {:.0}% |\n", + i + 1, c.tag, c.name, c.cost(3.0, 1.0, rho, rho_up, rho_down, 0.5), c.regret_over, c.regret_under, c.detection * 100.0, + )); + } + md.push('\n'); + + // (3) weight sensitivity: winner kind per (w_over, w_det). + let w_over_axis = [1.0f64, 2.0, 3.0, 4.0, 5.0]; + let w_det_axis = [0.5f64, 1.0, 2.0]; + md.push_str("## Weight sensitivity — winning config per (w_over:w_under, w_det)\n\n"); + md.push_str("Tagged anchor / cluster / probe(d). If probes (d<0.06) keep winning, the discount edge is real and we widen further.\n\n"); + md.push_str("| w_over:w_under \\ w_det |"); + for wd in &w_det_axis { + md.push_str(&format!(" w_det={} |", wd)); + } + md.push('\n'); + md.push_str("| --- |"); + for _ in &w_det_axis { + md.push_str(" --- |"); + } + md.push('\n'); + for &wo in &w_over_axis { + md.push_str(&format!("| {:.1}:1 |", wo)); + for &wd in &w_det_axis { + let win = comps.iter().min_by(|a, b| a.cost(wo, 1.0, rho, rho_up, rho_down, wd).partial_cmp(&b.cost(wo, 1.0, rho, rho_up, rho_down, wd)).unwrap()).unwrap(); + let tag = if win.tag == "probe" { format!("probe d{}", win.discount) } else { win.tag.to_string() }; + md.push_str(&format!(" {} |", tag)); + } + md.push('\n'); + } + let out_path = out_dir.join("confirm_signpersist.md"); + fs::write(&out_path, &md)?; + eprintln!("Wrote {}", out_path.display()); + + // Console summary. + println!("\n## SignPersist confirmation - default-weight top 12 ({} trials)\n", trials); + println!("| rank | tag | config | cost | reg_over | reg_under | det% |"); + println!("| --- | --- | --- | --- | --- | --- | --- |"); + for (i, c) in ranked.iter().take(12).enumerate() { + println!( + "| {} | {} | {} | {:.4} | {:.4} | {:.4} | {:.0}% |", + i + 1, c.tag, c.name, c.cost(3.0, 1.0, rho, rho_up, rho_down, 0.5), c.regret_over, c.regret_under, c.detection * 100.0, + ); + } + let champ = comps.iter().find(|c| c.tag == "anchor").unwrap(); + let champ_rank = ranked.iter().position(|c| c.tag == "anchor").unwrap() + 1; + let best_probe = ranked.iter().position(|c| c.tag == "probe").map(|i| i + 1); + let best_cluster = ranked.iter().position(|c| c.tag == "cluster").map(|i| i + 1); + println!("\nChampion (AsymCusum) at rank {}/{}, cost {:.4}.", champ_rank, n, champ.cost(3.0, 1.0, rho, rho_up, rho_down, 0.5)); + println!( + "Best cluster rank {:?}, best probe rank {:?} -> {}", + best_cluster, best_probe, + match (best_cluster, best_probe) { + (Some(c), Some(p)) if p < c => "PROBE WINS (d<0.06) -> widen discount lower", + (Some(_), _) => "cluster holds -> d=0.06 region is the optimum", + _ => "inconclusive", + } + ); + Ok(()) +} diff --git a/sv2/channels-sv2/sim/src/bin/confirm-warmup.rs b/sv2/channels-sv2/sim/src/bin/confirm-warmup.rs new file mode 100644 index 0000000000..0a4d972c3e --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/confirm-warmup.rs @@ -0,0 +1,277 @@ +//! Confirm the cold-start warm-up wrapper: does WarmupBoundary cut ramp-up +//! WITHOUT regressing the steady-state regret/effort cost, and what +//! converge_band is best? +//! +//! Trajectory spike showed c+warmup halves ramp-up (15->7 min) with settle +//! gap and detection essentially unchanged. But (a) the spike warmed the +//! bare SignPersist boundary (no low-SPM guard) and (b) converge_band=0.15 +//! was hand-picked. Here we wrap the boundary CORRECTLY as +//! WarmupBoundary (so sub-6-SPM miners keep the +//! PoissonCI guard after warm-up), sweep converge_band, and score on the +//! full §10 grid against the current SignPersist champion anchor. +//! +//! Cold start is EXCLUDED from the §10 cost (one-time, washes out), so the +//! steady-state cost SHOULD be ~identical to the champion's — this run's +//! job is to PROVE warm-up doesn't quietly regress it, and to pick the +//! band. Ramp-up itself is read from the trajectory bin, not here. +//! +//! Usage: `cargo run --release --bin confirm-warmup` +//! Env: VARDIFF_CW2_TRIALS (default 1000), VARDIFF_CW2_THREADS, +//! VARDIFF_SWEEP_SEED, VARDIFF_CW2_OUT_DIR (default "."). + +use std::env; +use std::fs; +use std::path::PathBuf; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::Mutex; +use std::time::Instant; + +use channels_sv2::vardiff::composed::{ + AcceleratingPartialRetarget, AdaptiveSignPersist, Composed, EwmaEstimator, + SignPersistenceCusumBoundary, WarmupBoundary, +}; +use vardiff_sim::baseline::{Cell, Scenario, DEFAULT_BASELINE_SEED}; +use vardiff_sim::grid::{run_cell_with_algorithm, AlgorithmSpec, VardiffBox}; + +const FLOOR: f64 = 0.05; +const ETA_BASE: f32 = 0.2; +const ETA_MAX: f32 = 0.8; +const ACCEL: f32 = 0.05; +// Champion SignPersist boundary params. +const SENS: f64 = 0.3; +const TIGHTEN: f64 = 6.0; +const DISCOUNT: f64 = 0.06; +const MAX_DISCOUNT: f64 = 0.6; +const SPM_SWITCH: u32 = 6; +const TAU: u64 = 150; + +struct Weights { + w_over: f64, + w_under: f64, + rho_up: f64, + rho_down: f64, + rho: f64, + w_det: f64, +} +impl Weights { + fn from_env() -> Self { + let g = |k: &str, d: f64| env::var(k).ok().and_then(|s| s.parse().ok()).unwrap_or(d); + Weights { + w_over: g("VARDIFF_W_OVER", 3.0), + w_under: g("VARDIFF_W_UNDER", 1.0), + rho_up: g("VARDIFF_RHO_UP", 3.0), + rho_down: g("VARDIFF_RHO_DOWN", 1.0), + rho: g("VARDIFF_RHO", 0.5), + w_det: g("VARDIFF_W_DET", 0.5), + } + } +} + +struct Profile { + name: String, + regret_over: f64, + regret_under: f64, + effort_up: f64, + effort_down: f64, + detection: f64, + cost: f64, + is_anchor: bool, +} + +fn champion_boundary() -> AdaptiveSignPersist { + AdaptiveSignPersist::sign_persist( + SignPersistenceCusumBoundary::new(SENS, FLOOR, TIGHTEN, DISCOUNT, MAX_DISCOUNT), + SPM_SWITCH, + ) +} + +/// The current champion (no warm-up) — anchor. +fn champion_spec() -> AlgorithmSpec { + let name = vardiff_sim::naming::triple_name( + &EwmaEstimator::new(TAU), + &champion_boundary(), + &AcceleratingPartialRetarget::new(ETA_BASE, ETA_MAX, ACCEL), + ); + AlgorithmSpec::new(name, |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(TAU), + champion_boundary(), + AcceleratingPartialRetarget::new(ETA_BASE, ETA_MAX, ACCEL), + 1.0, + clock, + ))) + }) +} + +/// Champion + warm-up at a given converge_band. WarmupBoundary wraps the +/// FULL AdaptiveSignPersist, so post-warmup the low-SPM PoissonCI guard is +/// preserved. +fn warmup_spec(band: f64) -> AlgorithmSpec { + let name = vardiff_sim::naming::triple_name( + &EwmaEstimator::new(TAU), + &WarmupBoundary::new(champion_boundary(), band), + &AcceleratingPartialRetarget::new(ETA_BASE, ETA_MAX, ACCEL), + ); + AlgorithmSpec::new(name, move |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(TAU), + WarmupBoundary::new(champion_boundary(), band), + AcceleratingPartialRetarget::new(ETA_BASE, ETA_MAX, ACCEL), + 1.0, + clock, + ))) + }) +} + +#[allow(clippy::too_many_arguments)] +fn profile_for( + algo: &AlgorithmSpec, + idx: usize, + share_rates: &[f32], + scenarios: &[Scenario], + trials: usize, + base_seed: u64, + w: &Weights, + is_anchor: bool, +) -> Option { + let (n_spm, n_scen) = (share_rates.len(), scenarios.len()); + let (mut ro, mut ru, mut eu, mut ed) = (0.0, 0.0, 0.0, 0.0); + let mut n = 0u32; + let (mut ds, mut dn) = (0.0, 0u32); + for (si, &spm) in share_rates.iter().enumerate() { + for (ci, scen) in scenarios.iter().enumerate() { + let cell = Cell { shares_per_minute: spm, scenario: scen.clone() }; + let cell_index = (idx * n_spm * n_scen + si * n_scen + ci) as u64; + let r = run_cell_with_algorithm(algo, &cell, trials, base_seed, cell_index); + if matches!(scen, Scenario::Stable | Scenario::Step { delta_pct: -50 | -10 | 10 | 50 }) { + ro += r.get("regret_over").unwrap_or(0.0); + ru += r.get("regret_under").unwrap_or(0.0); + eu += r.get("effort_up").unwrap_or(0.0); + ed += r.get("effort_down").unwrap_or(0.0); + n += 1; + } + if matches!(scen, Scenario::SettledStep { settle_minutes: 60, delta_pct: -10 }) { + if let Some(rate) = r.get("settled_reaction_rate") { + ds += rate; + dn += 1; + } + } + } + } + if n == 0 { + return None; + } + let (regret_over, regret_under, effort_up, effort_down) = + (ro / n as f64, ru / n as f64, eu / n as f64, ed / n as f64); + let detection = if dn > 0 { ds / dn as f64 } else { 0.0 }; + let cost = w.w_over * regret_over + + w.w_under * regret_under + + w.rho * (w.rho_up * effort_up + w.rho_down * effort_down) + + w.w_det * (1.0 - detection); + Some(Profile { + name: algo.name.clone(), + regret_over, + regret_under, + effort_up, + effort_down, + detection, + cost, + is_anchor, + }) +} + +fn main() -> std::io::Result<()> { + let trials: usize = env::var("VARDIFF_CW2_TRIALS").ok().and_then(|s| s.parse().ok()).unwrap_or(1000); + let base_seed: u64 = env::var("VARDIFF_SWEEP_SEED") + .ok() + .and_then(|s| s.strip_prefix("0x").and_then(|h| u64::from_str_radix(h, 16).ok()).or_else(|| s.parse().ok())) + .unwrap_or(DEFAULT_BASELINE_SEED); + let n_threads: usize = env::var("VARDIFF_CW2_THREADS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or_else(|| std::thread::available_parallelism().map(|n| n.get()).unwrap_or(4)) + .max(1); + let out_dir = env::var("VARDIFF_CW2_OUT_DIR").map(PathBuf::from).unwrap_or_else(|_| PathBuf::from(".")); + let w = Weights::from_env(); + + let bands = [0.08f64, 0.12, 0.15, 0.2, 0.3]; + let mut specs: Vec = vec![champion_spec()]; + let n_anchors = specs.len(); + for &b in &bands { + specs.push(warmup_spec(b)); + } + + let scenarios = vec![ + Scenario::Stable, + Scenario::Step { delta_pct: -50 }, + Scenario::Step { delta_pct: -10 }, + Scenario::Step { delta_pct: 10 }, + Scenario::Step { delta_pct: 50 }, + Scenario::SettledStep { settle_minutes: 60, delta_pct: -10 }, + ]; + let share_rates = vec![6.0f32, 8.0, 12.0, 20.0, 30.0]; + + let n = specs.len(); + eprintln!( + "confirm-warmup: {} algos x {} cells x {} trials = {} runs, {} threads", + n, share_rates.len() * scenarios.len(), trials, + n * share_rates.len() * scenarios.len() * trials, n_threads + ); + + let started = Instant::now(); + let next = AtomicUsize::new(0); + let out: Mutex> = Mutex::new(Vec::with_capacity(n)); + std::thread::scope(|scope| { + for _ in 0..n_threads { + scope.spawn(|| loop { + let i = next.fetch_add(1, Ordering::Relaxed); + if i >= n { + break; + } + if let Some(p) = profile_for(&specs[i], i, &share_rates, &scenarios, trials, base_seed, &w, i < n_anchors) { + out.lock().unwrap().push(p); + } + }); + } + }); + let mut profiles = out.into_inner().unwrap(); + eprintln!("Done in {:.1}s", started.elapsed().as_secs_f64()); + profiles.sort_by(|a, b| a.cost.partial_cmp(&b.cost).unwrap()); + + let row = |i: usize, p: &Profile| { + format!( + "| {} | {}{} | {:.4} | {:.4} | {:.4} | {:.4} | {:.4} | {:.0}% |\n", + i + 1, p.name, if p.is_anchor { " <-champion(no warmup)" } else { "" }, + p.cost, p.regret_over, p.regret_under, p.effort_up, p.effort_down, p.detection * 100.0, + ) + }; + + let mut md = String::new(); + md.push_str("# Warm-up confirmation (steady-state regret/effort)\n\n"); + md.push_str(&format!( + "{} algos, {} trials/cell, base_seed {:#x}. WarmupBoundary, converge_band swept. Cold start is excluded from the cost, so warm-up should NOT change steady-state cost; this proves it.\n\n", + n, trials, base_seed + )); + md.push_str("| rank | algorithm | cost | reg_over | reg_under | eff_up | eff_down | det% |\n"); + md.push_str("| --- | --- | --- | --- | --- | --- | --- | --- |\n"); + for (i, p) in profiles.iter().enumerate() { + md.push_str(&row(i, p)); + } + let out_path = out_dir.join("confirm_warmup.md"); + fs::write(&out_path, &md)?; + eprintln!("Wrote {}", out_path.display()); + + println!("\n## Warm-up confirmation ({} trials) - steady-state cost vs champion\n", trials); + println!("| rank | algorithm | cost | reg_over | reg_under | eff_up | eff_down | det% |"); + println!("| --- | --- | --- | --- | --- | --- | --- | --- |"); + for (i, p) in profiles.iter().enumerate() { + print!("{}", row(i, p)); + } + let champ = profiles.iter().find(|p| p.is_anchor).unwrap(); + let spread = profiles.iter().map(|p| (p.cost - champ.cost).abs()).fold(0.0f64, f64::max); + println!( + "\nMax |cost - champion| across all warm-up bands: {:.4} ({:.2}%). If tiny, warm-up is steady-state-neutral as intended.", + spread, 100.0 * spread / champ.cost + ); + Ok(()) +} diff --git a/sv2/channels-sv2/sim/src/bin/convergence-time.rs b/sv2/channels-sv2/sim/src/bin/convergence-time.rs new file mode 100644 index 0000000000..dae671cdd4 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/convergence-time.rs @@ -0,0 +1,130 @@ +//! Measures convergence TIME (in seconds) for BestOfBest vs production. + +use std::env; +use vardiff_sim::{baseline::Scenario, grid::AlgorithmSpec, grid::Grid}; + +fn main() { + let trial_count: usize = env::var("TRIALS") + .ok() + .and_then(|v| v.parse().ok()) + .unwrap_or(1000); + + let mut scenarios = vec![Scenario::ColdStart, Scenario::Stable]; + for &delta in &[-50, -25, -10, -5, 5, 10, 25, 50] { + scenarios.push(Scenario::Step { delta_pct: delta }); + } + + let grid = Grid { + algorithms: vec![ + AlgorithmSpec::classic_vardiff_state(), + AlgorithmSpec::ewma_asymmetric_cusum(120, 1.5, 0.05, 3.0, 0.2), + AlgorithmSpec::best_of_best(), + ], + share_rates: vec![6.0, 10.0, 12.0, 20.0, 30.0], + scenarios, + trial_count, + base_seed: 0xDEAD_BEEF_CAFE_F00D, + }; + + eprintln!("Running {} total trials...", grid.total_runs() * trial_count); + let results = grid.run_paired(); + + println!("# Convergence Time (seconds)\n"); + println!("## Cold Start (p50 / p90)\n"); + println!("| Algorithm | SPM=6 | SPM=10 | SPM=12 | SPM=20 | SPM=30 |"); + println!("|-----------|-------|--------|--------|--------|--------|"); + + let mut algo_names: Vec<&String> = results.keys().collect(); + algo_names.sort(); + + for algo_name in &algo_names { + let cells = &results[*algo_name]; + let mut row = format!("| {} ", algo_name); + for &spm in &[6.0f32, 10.0, 12.0, 20.0, 30.0] { + let cell = cells.iter().find(|c| { + (c.shares_per_minute - spm).abs() < 0.1 && c.scenario == Scenario::ColdStart + }); + if let Some(c) = cell { + let p50 = c.get("convergence_p50_secs").unwrap_or(f64::NAN); + let p90 = c.get("convergence_p90_secs").unwrap_or(f64::NAN); + row.push_str(&format!("| {:.0}/{:.0} ", p50, p90)); + } else { + row.push_str("| — "); + } + } + row.push('|'); + println!("{}", row); + } + + println!("\n## Step -50% (p50 / p90)\n"); + println!("| Algorithm | SPM=6 | SPM=10 | SPM=12 | SPM=20 | SPM=30 |"); + println!("|-----------|-------|--------|--------|--------|--------|"); + + for algo_name in &algo_names { + let cells = &results[*algo_name]; + let mut row = format!("| {} ", algo_name); + for &spm in &[6.0f32, 10.0, 12.0, 20.0, 30.0] { + let cell = cells.iter().find(|c| { + (c.shares_per_minute - spm).abs() < 0.1 + && c.scenario == Scenario::Step { delta_pct: -50 } + }); + if let Some(c) = cell { + let p50 = c.get("convergence_p50_secs").unwrap_or(f64::NAN); + let p90 = c.get("convergence_p90_secs").unwrap_or(f64::NAN); + row.push_str(&format!("| {:.0}/{:.0} ", p50, p90)); + } else { + row.push_str("| — "); + } + } + row.push('|'); + println!("{}", row); + } + + println!("\n## Step +50% (p50 / p90)\n"); + println!("| Algorithm | SPM=6 | SPM=10 | SPM=12 | SPM=20 | SPM=30 |"); + println!("|-----------|-------|--------|--------|--------|--------|"); + + for algo_name in &algo_names { + let cells = &results[*algo_name]; + let mut row = format!("| {} ", algo_name); + for &spm in &[6.0f32, 10.0, 12.0, 20.0, 30.0] { + let cell = cells.iter().find(|c| { + (c.shares_per_minute - spm).abs() < 0.1 + && c.scenario == Scenario::Step { delta_pct: 50 } + }); + if let Some(c) = cell { + let p50 = c.get("convergence_p50_secs").unwrap_or(f64::NAN); + let p90 = c.get("convergence_p90_secs").unwrap_or(f64::NAN); + row.push_str(&format!("| {:.0}/{:.0} ", p50, p90)); + } else { + row.push_str("| — "); + } + } + row.push('|'); + println!("{}", row); + } + + println!("\n## Step ±10% (p50 / p90)\n"); + println!("| Algorithm | SPM=6 | SPM=10 | SPM=12 | SPM=20 | SPM=30 |"); + println!("|-----------|-------|--------|--------|--------|--------|"); + + for algo_name in &algo_names { + let cells = &results[*algo_name]; + let mut row = format!("| {} ", algo_name); + for &spm in &[6.0f32, 10.0, 12.0, 20.0, 30.0] { + let cell = cells.iter().find(|c| { + (c.shares_per_minute - spm).abs() < 0.1 + && matches!(c.scenario, Scenario::Step { delta_pct: -10 } | Scenario::Step { delta_pct: 10 }) + }); + if let Some(c) = cell { + let p50 = c.get("convergence_p50_secs").unwrap_or(f64::NAN); + let p90 = c.get("convergence_p90_secs").unwrap_or(f64::NAN); + row.push_str(&format!("| {:.0}/{:.0} ", p50, p90)); + } else { + row.push_str("| — "); + } + } + row.push('|'); + println!("{}", row); + } +} diff --git a/sv2/channels-sv2/sim/src/bin/counter-age-sweep.rs b/sv2/channels-sv2/sim/src/bin/counter-age-sweep.rs new file mode 100644 index 0000000000..4c1204f262 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/counter-age-sweep.rs @@ -0,0 +1,87 @@ +//! Counter-age characterization: measures reaction time as a function +//! of how long the algorithm has been settled before a step change. +//! +//! This directly addresses the calibration gap: the default grid only +//! tests with a ~5-min counter, while real pools spend most time with +//! counters aged 20-120+ minutes. +//! +//! ## Usage +//! +//! ```text +//! cargo run --release --bin counter-age-sweep +//! ``` +//! +//! ## Configuration via environment +//! +//! - `VARDIFF_COUNTER_AGE_TRIALS` — trials per cell (default 1000). +//! - `VARDIFF_COUNTER_AGE_SEED` — base seed (default +//! `0xDEAD_BEEF_CAFE_F00D`). +//! - `VARDIFF_COUNTER_AGE_OUT_DIR` — output directory (default `.`). + +use std::env; +use std::fs; +use std::path::PathBuf; +use std::time::Instant; + +use vardiff_sim::baseline::{ + serialize_markdown, serialize_toml, DEFAULT_BASELINE_SEED, DEFAULT_TRIAL_COUNT, +}; +use vardiff_sim::grid::Grid; + +fn main() -> std::io::Result<()> { + let trial_count: usize = env_or("VARDIFF_COUNTER_AGE_TRIALS", DEFAULT_TRIAL_COUNT); + let base_seed = env_or_seed("VARDIFF_COUNTER_AGE_SEED", DEFAULT_BASELINE_SEED); + let out_dir = env::var("VARDIFF_COUNTER_AGE_OUT_DIR") + .map(PathBuf::from) + .unwrap_or_else(|_| PathBuf::from(".")); + + let mut grid = Grid::settled_step(); + grid.trial_count = trial_count; + grid.base_seed = base_seed; + + let cells = grid.cells(); + eprintln!( + "Counter-age sweep: {} cells × {} trials = {} total trials", + cells.len(), + trial_count, + cells.len() * trial_count, + ); + + let started = Instant::now(); + let results_by_algo = grid.run(); + let elapsed = started.elapsed(); + eprintln!("Sweep complete in {:.2}s", elapsed.as_secs_f64()); + + fs::create_dir_all(&out_dir)?; + + for (algo_name, results) in &results_by_algo { + let toml = serialize_toml(results, algo_name, trial_count, base_seed); + let md = serialize_markdown(results, algo_name, trial_count, base_seed); + + let toml_path = out_dir.join(format!("counter_age_{}.toml", algo_name)); + let md_path = out_dir.join(format!("counter_age_{}.md", algo_name)); + fs::write(&toml_path, &toml)?; + fs::write(&md_path, &md)?; + eprintln!("Wrote {}", toml_path.display()); + eprintln!("Wrote {}", md_path.display()); + } + + Ok(()) +} + +fn env_or(var: &str, default: T) -> T { + env::var(var) + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(default) +} + +fn env_or_seed(var: &str, default: u64) -> u64 { + if let Ok(s) = env::var(var) { + if let Some(hex) = s.strip_prefix("0x").or_else(|| s.strip_prefix("0X")) { + return u64::from_str_radix(hex, 16).unwrap_or(default); + } + return s.parse().unwrap_or(default); + } + default +} diff --git a/sv2/channels-sv2/sim/src/bin/generate-baseline.rs b/sv2/channels-sv2/sim/src/bin/generate-baseline.rs new file mode 100644 index 0000000000..0eebeb9a53 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/generate-baseline.rs @@ -0,0 +1,91 @@ +//! Runs the default baseline grid against the classic [`VardiffState`] +//! algorithm and writes `baseline_VardiffState.toml` (machine-readable, +//! consumed by regression assertions) and `baseline_VardiffState.md` +//! (human-readable summary) to the current working directory. +//! +//! ## Usage +//! +//! From the sim crate root: +//! +//! ```text +//! cargo run --release --bin generate-baseline +//! ``` +//! +//! ## Configuration via environment +//! +//! - `VARDIFF_BASELINE_TRIALS` — trials per cell (default 1000). Set to a +//! small number like 50 for fast local iteration. +//! - `VARDIFF_BASELINE_SEED` — base seed for trial derivation (default +//! `0xDEAD_BEEF_CAFE_F00D`). Change only when re-running for variance +//! inspection; the checked-in baseline assumes the default. +//! - `VARDIFF_BASELINE_OUT_DIR` — directory to write outputs (default `.`). +//! +//! ## Runtime +//! +//! At default 1000 trials per cell × 50 cells × ~360 µs per trial, +//! the sweep is ~18 seconds of wall clock plus a few hundred ms of +//! reporting. Use `--release` — debug-mode is 5–10× slower. + +use std::env; +use std::fs; +use std::path::PathBuf; +use std::time::Instant; + +use vardiff_sim::baseline::{ + default_cells, run_baseline, serialize_markdown, serialize_toml, DEFAULT_BASELINE_SEED, + DEFAULT_TRIAL_COUNT, +}; + +fn main() -> std::io::Result<()> { + let trial_count = env_or("VARDIFF_BASELINE_TRIALS", DEFAULT_TRIAL_COUNT); + let base_seed = env_or_seed("VARDIFF_BASELINE_SEED", DEFAULT_BASELINE_SEED); + let out_dir = env::var("VARDIFF_BASELINE_OUT_DIR") + .map(PathBuf::from) + .unwrap_or_else(|_| PathBuf::from(".")); + + let cells = default_cells(); + eprintln!( + "Running baseline: {} cells × {} trials = {} total trials, base_seed = {:#x}", + cells.len(), + trial_count, + cells.len() * trial_count, + base_seed, + ); + eprintln!("Output directory: {}", out_dir.display()); + + let started = Instant::now(); + let results = run_baseline(&cells, trial_count, base_seed); + let elapsed = started.elapsed(); + eprintln!("Baseline run complete in {:.2}s", elapsed.as_secs_f64()); + + let toml = serialize_toml(&results, "VardiffState", trial_count, base_seed); + let md = serialize_markdown(&results, "VardiffState", trial_count, base_seed); + + fs::create_dir_all(&out_dir)?; + let toml_path = out_dir.join("baseline_VardiffState.toml"); + let md_path = out_dir.join("baseline_VardiffState.md"); + fs::write(&toml_path, toml)?; + fs::write(&md_path, md)?; + eprintln!("Wrote {}", toml_path.display()); + eprintln!("Wrote {}", md_path.display()); + + Ok(()) +} + +fn env_or(var: &str, default: T) -> T { + env::var(var) + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(default) +} + +fn env_or_seed(var: &str, default: u64) -> u64 { + if let Ok(s) = env::var(var) { + // Accept either decimal or 0x-prefixed hex. + if let Some(hex) = s.strip_prefix("0x").or_else(|| s.strip_prefix("0X")) { + return u64::from_str_radix(hex, 16).unwrap_or(default); + } + return s.parse().unwrap_or(default); + } + default +} diff --git a/sv2/channels-sv2/sim/src/bin/iterative-eval.rs b/sv2/channels-sv2/sim/src/bin/iterative-eval.rs new file mode 100644 index 0000000000..f0c76d6ad2 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/iterative-eval.rs @@ -0,0 +1,319 @@ +//! Algorithm comparison report. Ranks algorithms by operational_fitness +//! and highlights per-metric winners at each share rate. +//! +//! ```text +//! cargo run --release --bin iterative-eval +//! ``` + +use std::collections::HashMap; +use std::env; +use std::fs; +use std::path::PathBuf; +use std::time::Instant; + +use vardiff_sim::baseline::{CellResult, Scenario, DEFAULT_BASELINE_SEED, DEFAULT_TRIAL_COUNT}; +use vardiff_sim::grid::{AlgorithmSpec, Grid}; +use vardiff_sim::metrics::{ComprehensiveFitness, DerivedMetric, OperationalFitness}; + +fn main() -> std::io::Result<()> { + let trial_count = env_or("VARDIFF_ITER_TRIALS", DEFAULT_TRIAL_COUNT); + let base_seed = env_or_seed("VARDIFF_ITER_SEED", DEFAULT_BASELINE_SEED); + let out_dir = env::var("VARDIFF_ITER_OUT_DIR") + .map(PathBuf::from) + .unwrap_or_else(|_| PathBuf::from(".")); + + let mut scenarios = vec![Scenario::ColdStart, Scenario::Stable]; + for &d in &[-50i32, -25, -10, -5, 5, 10, 25, 50] { + scenarios.push(Scenario::Step { delta_pct: d }); + } + for &settle in &[5u64, 60] { + for &delta in &[-50i32, -10] { + scenarios.push(Scenario::SettledStep { + settle_minutes: settle, + delta_pct: delta, + }); + } + } + let share_rates = vec![6.0, 8.0, 10.0, 12.0, 15.0, 20.0, 30.0]; + + let algorithms = vec![ + AlgorithmSpec::full_remedy(), + AlgorithmSpec::ewma_adaptive_cusum(120, 1.5, 0.05, 0.5), + // Asymmetric: cautious tighten, quick ease + AlgorithmSpec::ewma_asymmetric_cusum(120, 1.5, 0.05, 1.5, 0.5), + AlgorithmSpec::ewma_asymmetric_cusum(120, 1.5, 0.05, 2.0, 0.5), + AlgorithmSpec::ewma_asymmetric_cusum(120, 1.5, 0.05, 3.0, 0.5), + ]; + + let grid = Grid { + algorithms, + share_rates: share_rates.clone(), + scenarios, + trial_count, + base_seed, + }; + + eprintln!( + "Evaluation: {} algorithms × {} cells × {} trials", + grid.algorithms.len(), + grid.share_rates.len() * grid.scenarios.len(), + trial_count, + ); + + let started = Instant::now(); + let results = grid.run_paired(); + eprintln!("Complete in {:.2}s\n", started.elapsed().as_secs_f64()); + + fs::create_dir_all(&out_dir)?; + let out_path = out_dir.join("iterative_eval.md"); + let report = build_report(&share_rates, &results, trial_count); + fs::write(&out_path, &report)?; + eprintln!("Wrote {}", out_path.display()); + + Ok(()) +} + +struct MetricSpec { + title: &'static str, + higher_is_better: bool, + scenario: &'static str, + key: &'static str, + fmt: Fmt, +} + +#[derive(Clone, Copy)] +enum Fmt { + Frac3, + Pct1, + Secs, +} + +fn format_val(v: f64, fmt: Fmt) -> String { + match fmt { + Fmt::Frac3 => format!("{:.3}", v), + Fmt::Pct1 => format!("{:.1}%", v * 100.0), + Fmt::Secs => { + let mins = v as u64 / 60; + let secs = v as u64 % 60; + if secs == 0 { + format!("{}m", mins) + } else { + format!("{}m{:02}s", mins, secs) + } + } + } +} + +fn build_report( + share_rates: &[f32], + results: &HashMap>, + trial_count: usize, +) -> String { + // Compute average comprehensive fitness across all SPM to rank algorithms + let mut algo_fitness: Vec<(String, f64, f64)> = results + .keys() + .map(|name| { + let cells = &results[name]; + let comp_scores = ComprehensiveFitness.compute(cells); + let op_scores = OperationalFitness.compute(cells); + let comp_avg: f64 = if comp_scores.is_empty() { + 0.0 + } else { + comp_scores + .iter() + .filter_map(|(_, mv)| mv.get("score")) + .sum::() + / comp_scores.len() as f64 + }; + let op_avg: f64 = if op_scores.is_empty() { + 0.0 + } else { + op_scores + .iter() + .filter_map(|(_, mv)| mv.get("score")) + .sum::() + / op_scores.len() as f64 + }; + (name.clone(), comp_avg, op_avg) + }) + .collect(); + algo_fitness.sort_by(|a, b| b.1.partial_cmp(&a.1).unwrap()); + + let sorted_names: Vec<&str> = algo_fitness.iter().map(|(n, _, _)| n.as_str()).collect(); + + let mut out = String::new(); + out.push_str(&format!( + "# Algorithm comparison ({} trials/cell, SPM={}–{})\n\n", + trial_count, + share_rates.first().unwrap_or(&0.0) as &f32, + share_rates.last().unwrap_or(&0.0) as &f32, + )); + out.push_str("Algorithms sorted by mean comprehensive fitness (best first).\n"); + out.push_str("**Bold** = best value at that SPM for that metric.\n\n"); + + // Ranking table + out.push_str("## Overall ranking\n\n"); + out.push_str("| Rank | Algorithm | Comprehensive | Operational |\n"); + out.push_str("| --- | --- | --- | --- |\n"); + for (i, (name, comp, op)) in algo_fitness.iter().enumerate() { + let marker = if i == 0 { " ★" } else { "" }; + out.push_str(&format!( + "| {} | {}{} | {:.3} | {:.3} |\n", + i + 1, + name, + marker, + comp, + op + )); + } + out.push('\n'); + + // Metric tables + let metrics = vec![ + MetricSpec { + title: "Reaction rate at -10% step", + higher_is_better: true, + scenario: "step_minus_10_at_15min", + key: "reaction_rate", + fmt: Fmt::Pct1, + }, + MetricSpec { + title: "Reaction rate at -50% step", + higher_is_better: true, + scenario: "step_minus_50_at_15min", + key: "reaction_rate", + fmt: Fmt::Pct1, + }, + MetricSpec { + title: "Cold-start convergence time p50", + higher_is_better: false, + scenario: "cold_start_10gh_to_1ph", + key: "convergence_p50_secs", + fmt: Fmt::Secs, + }, + MetricSpec { + title: "Cold-start convergence rate", + higher_is_better: true, + scenario: "cold_start_10gh_to_1ph", + key: "convergence_rate", + fmt: Fmt::Pct1, + }, + MetricSpec { + title: "Stable-load jitter (fires/min)", + higher_is_better: false, + scenario: "stable_1ph", + key: "jitter_mean_per_min", + fmt: Fmt::Frac3, + }, + MetricSpec { + title: "Ramp target overshoot p99", + higher_is_better: false, + scenario: "cold_start_10gh_to_1ph", + key: "ramp_target_overshoot_p99", + fmt: Fmt::Pct1, + }, + MetricSpec { + title: "Settled accuracy p50", + higher_is_better: false, + scenario: "stable_1ph", + key: "settled_accuracy_p50", + fmt: Fmt::Pct1, + }, + ]; + + for spec in &metrics { + let dir = if spec.higher_is_better { + "higher = better" + } else { + "lower = better" + }; + out.push_str(&format!("## {} ({})\n\n", spec.title, dir)); + + // Header + out.push_str("| SPM |"); + for name in &sorted_names { + out.push_str(&format!(" {} |", name)); + } + out.push_str("\n| --- |"); + for _ in &sorted_names { + out.push_str(" --- |"); + } + out.push('\n'); + + // Rows + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + + // Collect values for this row to find the winner + let values: Vec> = sorted_names + .iter() + .map(|name| get_metric(results, name, spm, spec.scenario, spec.key)) + .collect(); + + let best = if spec.higher_is_better { + values + .iter() + .filter_map(|v| *v) + .fold(f64::NEG_INFINITY, f64::max) + } else { + values + .iter() + .filter_map(|v| *v) + .filter(|v| *v > 0.0 || spec.key == "jitter_mean_per_min") + .fold(f64::INFINITY, f64::min) + }; + + for v in &values { + match v { + Some(val) => { + let is_best = (val - best).abs() < 1e-6 + || (spec.higher_is_better && *val >= best * 0.99) + || (!spec.higher_is_better && *val <= best * 1.01); + let formatted = format_val(*val, spec.fmt); + if is_best { + out.push_str(&format!(" **{}** |", formatted)); + } else { + out.push_str(&format!(" {} |", formatted)); + } + } + None => out.push_str(" — |"), + } + } + out.push('\n'); + } + out.push('\n'); + } + + out +} + +fn get_metric( + results: &HashMap>, + name: &str, + spm: f32, + scenario_key: &str, + metric_key: &str, +) -> Option { + results + .get(name)? + .iter() + .find(|c| c.shares_per_minute == spm && c.scenario_key() == scenario_key) + .and_then(|c| c.get(metric_key)) +} + +fn env_or(var: &str, default: T) -> T { + env::var(var) + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(default) +} + +fn env_or_seed(var: &str, default: u64) -> u64 { + if let Ok(s) = env::var(var) { + if let Some(hex) = s.strip_prefix("0x").or_else(|| s.strip_prefix("0X")) { + return u64::from_str_radix(hex, 16).unwrap_or(default); + } + return s.parse().unwrap_or(default); + } + default +} diff --git a/sv2/channels-sv2/sim/src/bin/regret-effort.rs b/sv2/channels-sv2/sim/src/bin/regret-effort.rs new file mode 100644 index 0000000000..ce88b7f99f --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/regret-effort.rs @@ -0,0 +1,737 @@ +//! Empirical validation of the conservation-law theory in +//! `docs/THEORY.md`. Post-processes raw trial trajectories (no new +//! metric machinery) into: +//! +//! - regret = time-averaged e² where e = ln(H_est / H_true) +//! split into regret_over (e>0, over-difficulty) and +//! regret_under (e<0, under-difficulty) +//! - effort = Σ (Δ ln D)² over fires, where D = H_est / r*, so +//! Δ ln D = ln(new_hashrate / old_hashrate); split into +//! effort_up (tightening) and effort_down (easing). +//! +//! Both quantities use only the UNIVERSAL TickRecord fields +//! (`current_hashrate_before`, `new_hashrate`), so they are computed +//! identically for the introspectable Composed algorithms and the +//! opaque production monolith. +//! +//! It then answers the three decisive questions from the theory note: +//! +//! Q1 (binding?) settled mean-e² vs the Poisson information floor +//! 1/(r*·τ). If settled e² ≈ floor, the conservation +//! law is the operative constraint; if ≫ floor, the +//! law is true but slack and something else dominates. +//! Q2 (δ² cancel?) post-step transient regret as a function of |δ|. +//! Flat in δ ⇒ the magnitude-cancellation result holds +//! and React−10/React−50 double-count one quantity. +//! Q3 (real wall?) the contenders placed in the (regret, effort) +//! plane — do they pile against a frontier (a real +//! trade-off) or spread out (the 0.55 ceiling was a +//! metric artifact)? +//! +//! Usage: `cargo run --release --bin regret-effort` +//! Env: VARDIFF_RE_TRIALS (default 1000), VARDIFF_RE_SEED. + +use std::collections::BTreeMap; +use std::env; +use std::sync::Arc; + +use channels_sv2::vardiff::MockClock; +use vardiff_sim::baseline::{Scenario, DEFAULT_BASELINE_SEED, DEFAULT_TRIAL_COUNT}; +use vardiff_sim::grid::AlgorithmSpec; +use vardiff_sim::schedule::HashrateSchedule; +use vardiff_sim::trial::{run_trial_observed, Trial}; + +/// Time at which step scenarios change hashrate (mirrors +/// baseline::STEP_EVENT_AT_SECS). Pre-step is settled; post-step is +/// the transient we attribute the step's regret to. +const STEP_EVENT_AT_SECS: u64 = 15 * 60; +/// Settle cutoff for the stable scenario: ignore the first 12 min so +/// the convergence transient doesn't contaminate the steady-state +/// floor comparison (mirrors the introspection settle in metrics.rs). +const SETTLE_AFTER_SECS: u64 = 12 * 60; + +#[derive(Default, Clone, Copy)] +struct Quad { + regret_over: f64, + regret_under: f64, + effort_up: f64, + effort_down: f64, + // Linear-loss companions: time-averaged |e| (not e²), split by sign. + // Used by the §10 loss-shape comparison to show how a linear penalty + // re-weights small persistent errors vs the quadratic regret above. + lin_over: f64, + lin_under: f64, +} + +impl Quad { + fn regret(&self) -> f64 { + self.regret_over + self.regret_under + } + fn effort(&self) -> f64 { + self.effort_up + self.effort_down + } + fn lin(&self) -> f64 { + self.lin_over + self.lin_under + } + fn add(&mut self, o: &Quad) { + self.regret_over += o.regret_over; + self.regret_under += o.regret_under; + self.effort_up += o.effort_up; + self.effort_down += o.effort_down; + self.lin_over += o.lin_over; + self.lin_under += o.lin_under; + } + fn scale(&self, k: f64) -> Quad { + Quad { + regret_over: self.regret_over * k, + regret_under: self.regret_under * k, + effort_up: self.effort_up * k, + effort_down: self.effort_down * k, + lin_over: self.lin_over * k, + lin_under: self.lin_under * k, + } + } +} + +/// Computes time-averaged e² (split by sign) over the half-open +/// window `(t_lo, t_hi]`, plus fire effort (split by direction) over +/// the same window. Time-averaging (dividing by window length) +/// yields a dimensionless mean-square error directly comparable to a +/// variance floor. +fn analyze_window(trial: &Trial, schedule: &HashrateSchedule, t_lo: u64, t_hi: u64) -> Quad { + let mut q = Quad::default(); + let mut last_t = 0u64; + let mut covered_secs = 0.0f64; + for tick in &trial.ticks { + let interval_start = last_t; + let interval_end = tick.t_secs; + last_t = tick.t_secs; + // Clip the interval to the requested window. + let lo = interval_start.max(t_lo); + let hi = interval_end.min(t_hi); + if hi <= lo { + continue; + } + let dt = (hi - lo) as f64; + let mid = (interval_start + interval_end) / 2; + let h_true = schedule.at(mid) as f64; + let h_est = tick.current_hashrate_before as f64; + if h_true > 0.0 && h_est > 0.0 { + let e = (h_est / h_true).ln(); + let c = dt * e * e; + let cl = dt * e.abs(); + if e >= 0.0 { + q.regret_over += c; + q.lin_over += cl; + } else { + q.regret_under += c; + q.lin_under += cl; + } + covered_secs += dt; + } + // Effort: a fire is stamped at tick.t_secs; count it if that + // instant lies in the window. + if tick.fired && tick.t_secs > t_lo && tick.t_secs <= t_hi { + if let Some(nh) = tick.new_hashrate { + let old = tick.current_hashrate_before as f64; + if old > 0.0 && nh as f64 > 0.0 { + let dlog = (nh as f64 / old).ln(); + let c = dlog * dlog; + if dlog >= 0.0 { + q.effort_up += c; // tightening (raises difficulty) + } else { + q.effort_down += c; // easing (lowers difficulty) + } + } + } + } + } + // Convert the integrals to time-averages (mean e², mean |e|). + if covered_secs > 0.0 { + q.regret_over /= covered_secs; + q.regret_under /= covered_secs; + q.lin_over /= covered_secs; + q.lin_under /= covered_secs; + } + q +} + +fn mean_quad(trials: &[Trial], schedule: &HashrateSchedule, t_lo: u64, t_hi: u64) -> Quad { + let mut acc = Quad::default(); + for t in trials { + acc.add(&analyze_window(t, schedule, t_lo, t_hi)); + } + acc.scale(1.0 / trials.len() as f64) +} + +fn run_cell(algo: &AlgorithmSpec, scenario: &Scenario, spm: f32, trials: usize, seed: u64) -> Vec { + let (config, schedule) = scenario.build(spm); + let mut out = Vec::with_capacity(trials); + for i in 0..trials { + let s = seed.wrapping_add(i as u64); + let clock = Arc::new(MockClock::new(0)); + let vardiff = (algo.factory)(clock.clone()); + out.push(run_trial_observed(vardiff, clock, config.clone(), &schedule, s)); + } + out +} + +fn main() { + let trials: usize = env::var("VARDIFF_RE_TRIALS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(DEFAULT_TRIAL_COUNT); + let base_seed: u64 = env::var("VARDIFF_RE_SEED") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(DEFAULT_BASELINE_SEED); + + let algos = vec![ + AlgorithmSpec::classic_vardiff_state(), + AlgorithmSpec::balanced(), + AlgorithmSpec::react_priority(), + ]; + let spms: [f32; 7] = [4.0, 6.0, 8.0, 12.0, 15.0, 20.0, 30.0]; + let deltas: [i32; 8] = [-50, -25, -10, -5, 5, 10, 25, 50]; + + eprintln!( + "regret-effort: {} algos × {} SPM, {} trials/cell", + algos.len(), + spms.len(), + trials + ); + + // --- Q1: settled mean-e² vs Poisson floor (Stable scenario) ----------- + println!("\n## Q1 — Is the conservation law binding? (Stable scenario, t > {}min)\n", SETTLE_AFTER_SECS / 60); + println!("settled mean-e² (nats²) vs Poisson floors. floor_1t = 1/r* (single 1-min tick);"); + println!("floor_τ = 1/(r*·1.5) (a 90s effective window). e²/floor_1t ratio in brackets.\n"); + println!("| algo | SPM | settled e² | floor_1t | floor_τ | e²/floor_1t |"); + println!("| --- | --- | --- | --- | --- | --- |"); + let mut settle_ratio_by_algo: BTreeMap> = BTreeMap::new(); + for algo in &algos { + for &spm in &spms { + let seed = base_seed.wrapping_add(hash_label(&algo.name, spm, 1)); + let ts = run_cell(algo, &Scenario::Stable, spm, trials, seed); + let (_, sched) = Scenario::Stable.build(spm); + let q = mean_quad(&ts, &sched, SETTLE_AFTER_SECS, u64::MAX); + let e2 = q.regret(); + let floor_1t = 1.0 / spm as f64; + let floor_tau = 1.0 / (spm as f64 * 1.5); + let ratio = e2 / floor_1t; + settle_ratio_by_algo + .entry(algo.name.clone()) + .or_default() + .push(ratio); + println!( + "| {} | {} | {:.5} | {:.5} | {:.5} | {:.2}× |", + short(&algo.name), + spm as u32, + e2, + floor_1t, + floor_tau, + ratio + ); + } + } + + // --- Q2: post-step transient regret vs |δ| ---------------------------- + println!("\n## Q2 — Does δ² cancel? (post-step regret, integrated nats²·min, t > 15min)\n"); + println!("If detection time ∝ 1/δ², integrated post-step regret should be ~flat in |δ|."); + println!("Reported as the integral (not time-averaged) so it reflects total transient cost.\n"); + print!("| algo | SPM |"); + for d in &deltas { + print!(" δ={}% |", d); + } + println!(); + print!("| --- | --- |"); + for _ in &deltas { + print!(" --- |"); + } + println!(); + for algo in &algos { + for &spm in &[6.0f32, 12.0, 30.0] { + print!("| {} | {} |", short(&algo.name), spm as u32); + for &d in &deltas { + let scen = Scenario::Step { delta_pct: d }; + let seed = base_seed.wrapping_add(hash_label(&algo.name, spm, d as i64 + 1000)); + let ts = run_cell(algo, &scen, spm, trials, seed); + let (_, sched) = scen.build(spm); + // Integrated (un-averaged) post-step regret: multiply + // mean-e² by the post-step window length in minutes. + let q = mean_quad(&ts, &sched, STEP_EVENT_AT_SECS, u64::MAX); + let window_min = (vardiff_sim::baseline::TRIAL_DURATION_SECS - STEP_EVENT_AT_SECS) as f64 / 60.0; + print!(" {:.3} |", q.regret() * window_min); + } + println!(); + } + } + + // --- Q3 + asymmetry: (regret, effort) plane, BROKEN OUT by class ----- + // The smoke test showed a naive all-scenario aggregate is dominated + // by the one-time cold-start ramp (huge under-difficulty regret + + // upward effort), which hides the step asymmetry. So report four + // scenario classes separately: + // cold — ColdStart (one-time convergence ramp) + // stable — Stable settled steady state + // drop — mean over negative-δ steps (→ over-difficulty transient) + // rise — mean over positive-δ steps (→ under-difficulty transient) + println!("\n## Q3 — (regret, effort) by scenario class (mean over all SPM)\n"); + println!("regret = time-avg e² (nats²); effort = Σ(Δln D)² per trial. The death-spiral"); + println!("asymmetry (§5.2) predicts drop-regret ≫ rise-regret for equal |δ|.\n"); + println!("| algo | class | regret | reg_over | reg_under | effort | eff_up | eff_down |"); + println!("| --- | --- | --- | --- | --- | --- | --- | --- |"); + for algo in &algos { + let classes: [(&str, Vec); 4] = [ + ("cold", vec![Scenario::ColdStart]), + ("stable", vec![Scenario::Stable]), + ( + "drop", + deltas + .iter() + .filter(|&&d| d < 0) + .map(|&d| Scenario::Step { delta_pct: d }) + .collect(), + ), + ( + "rise", + deltas + .iter() + .filter(|&&d| d > 0) + .map(|&d| Scenario::Step { delta_pct: d }) + .collect(), + ), + ]; + for (label, scens) in &classes { + let mut agg = Quad::default(); + let mut n = 0u32; + for &spm in &spms { + for (si, scen) in scens.iter().enumerate() { + let seed = + base_seed.wrapping_add(hash_label(&algo.name, spm, si as i64 + 5000)); + let ts = run_cell(algo, scen, spm, trials, seed); + let (_, sched) = scen.build(spm); + // For steps, attribute only the post-step transient. + let t_lo = if matches!(scen, Scenario::Step { .. }) { + STEP_EVENT_AT_SECS + } else { + 0 + }; + agg.add(&mean_quad(&ts, &sched, t_lo, u64::MAX)); + n += 1; + } + } + let q = agg.scale(1.0 / n as f64); + println!( + "| {} | {} | {:.4} | {:.4} | {:.4} | {:.4} | {:.4} | {:.4} |", + short(&algo.name), + label, + q.regret(), + q.regret_over, + q.regret_under, + q.effort(), + q.effort_up, + q.effort_down, + ); + } + } + + // --- Q4: log-matched asymmetry — tests the e^(2a) prediction ---------- + // Tweak 2 (THEORY.md §8): if info rate is r*·e^(−e), a drop landing + // at e=+a and a LOG-MATCHED rise landing at e=−a have equal e_step² + // but regret ratio ≈ e^(2a). The default grid never tested matched + // pairs (−50% is ln2 but +50% is only ln1.5). These are matched: + // ×0.5 / ×2.0 → −50% / +100%, a=ln2 =0.693, predict ratio 4.00 + // ×0.667/ ×1.5 → −33% / +50%, a=ln1.5=0.405, predict ratio 2.25 + // ×0.8 / ×1.25 → −20% / +25%, a=ln1.25=0.223, predict ratio 1.56 + println!("\n## Q4 — Log-matched asymmetry: does regret_drop/regret_rise ≈ e^(2a)?\n"); + println!("Each row is a log-matched (drop, rise) pair with equal |e_step|=a."); + println!("Tweak-2 predicts the integrated-regret ratio ≈ e^(2a), independent of algo.\n"); + let matched: [(i32, i32); 3] = [(-50, 100), (-33, 50), (-20, 25)]; + let window_min = + (vardiff_sim::baseline::TRIAL_DURATION_SECS - STEP_EVENT_AT_SECS) as f64 / 60.0; + for algo in &algos { + println!("**{}**\n", short(&algo.name)); + println!("| drop% | rise% | a=|e_step| | predict e^2a | SPM6 | SPM12 | SPM30 |"); + println!("| --- | --- | --- | --- | --- | --- | --- |"); + for &(dn, up) in &matched { + let a = (1.0 + dn as f64 / 100.0).ln().abs(); + print!( + "| {} | +{} | {:.3} | {:.2} |", + dn, + up, + a, + (2.0 * a).exp() + ); + for &spm in &[6.0f32, 12.0, 30.0] { + let rd = step_regret(algo, dn, spm, trials, base_seed) * window_min; + let ru = step_regret(algo, up, spm, trials, base_seed) * window_min; + let ratio = if ru > 0.0 { rd / ru } else { f64::INFINITY }; + print!(" {:.2} |", ratio); + } + println!(); + } + println!(); + } + + // --- Q5: bandwidth–variance product — tests V_ss·K·r* ≈ const -------- + // Tweak 1 (THEORY.md §8): the law that survives the data is not a + // precision floor but a PRODUCT. V_ss = settled mean-e² (shrinks with + // the algorithm's chosen window τ). K = transient regret coefficient + // = integrated_regret / e_step² (grows with τ). If V_ss ∝ 1/(r*τ) and + // K ∝ τ, then V_ss·K·r* is independent of τ — i.e. ~constant across + // algorithms AT A FIXED SPM (and ∝ 1/r* across SPM). K is measured on + // the −25% drop (moderate, window-limited). Wide spread across algos + // ⇒ no product law; tight cluster ⇒ the conserved trade-off is real. + println!("\n## Q5 — Bandwidth–variance product: is V_ss·K·r* ~constant across algos?\n"); + println!("V_ss = settled mean-e² (stable). K = post-step regret(−25%)/e_step². "); + println!("Tweak-1 predicts V_ss·K·r* clusters across algos at each SPM.\n"); + println!("| SPM | algo | V_ss | K (min) | V_ss·K·r* |"); + println!("| --- | --- | --- | --- | --- |"); + let e25_sq = (1.0f64 + (-25.0) / 100.0).ln().powi(2); + for &spm in &[6.0f32, 12.0, 30.0] { + for algo in &algos { + let seed = base_seed.wrapping_add(hash_label(&algo.name, spm, 1)); + let ts = run_cell(algo, &Scenario::Stable, spm, trials, seed); + let (_, sched) = Scenario::Stable.build(spm); + let v_ss = mean_quad(&ts, &sched, SETTLE_AFTER_SECS, u64::MAX).regret(); + let k = step_regret(algo, -25, spm, trials, base_seed) * window_min / e25_sq; + println!( + "| {} | {} | {:.5} | {:.4} | {:.4} |", + spm as u32, + short(&algo.name), + v_ss, + k, + v_ss * k * spm as f64 + ); + } + } + + // --- Q6: overshoot signature — the §8.4 prediction -------------------- + // §8.4 corrected law: regret ∝ e_step²·exp(2·⟨e⟩⁺), penalty tracks + // OVER-DIFFICULTY STATE, not step direction. Falsifiable test: a big + // UPWARD step (+100%) should manufacture over-difficulty via correction + // overshoot, and that effect should GROW with SPM (detection cheap → + // correction dynamics dominate). Metric: reg_over / regret on the + // post-step transient. If over-fraction of +100% rises climbs with SPM + // while −50% drops stay ~all-over, the state-dependent law holds. + println!("\n## Q6 — Overshoot signature: over-difficulty fraction of the transient\n"); + println!("reg_over/regret on the post-step window. §8.4 predicts the +100% RISE"); + println!("over-fraction climbs with SPM (overshoot manufactures e>0); the −50% DROP"); + println!("stays ~1.0 at all SPM (a drop is over-difficulty by construction).\n"); + println!("| algo | step | SPM4 | SPM8 | SPM15 | SPM30 |"); + println!("| --- | --- | --- | --- | --- | --- |"); + for algo in &algos { + for &d in &[-50i32, 100] { + print!("| {} | {:+}% |", short(&algo.name), d); + for &spm in &[4.0f32, 8.0, 15.0, 30.0] { + let scen = Scenario::Step { delta_pct: d }; + let seed = base_seed.wrapping_add(hash_label(&algo.name, spm, d as i64 + 13000)); + let ts = run_cell(algo, &scen, spm, trials, seed); + let (_, sched) = scen.build(spm); + let q = mean_quad(&ts, &sched, STEP_EVENT_AT_SECS, u64::MAX); + let frac = if q.regret() > 0.0 { + q.regret_over / q.regret() + } else { + f64::NAN + }; + print!(" {:.2} |", frac); + } + println!(); + } + } + + // --- Q7: counter-age cells — the missing regime (§8.2/§8.5 caveat) ---- + // Every steady-state-anchored number flatters the sluggish monolith + // because it's measured on a YOUNG counter. SettledStep ages the + // counter `settle_minutes` before stepping, then observes 60 min. The + // monolith's reaction time is dominated by counter age (70fcb260): a + // −50% drop is fast at a 5-min counter, glacial at 120 min. Integrated + // post-step regret should EXPLODE for the monolith as the counter ages, + // and stay flat for the age-independent EWMA contenders. + println!("\n## Q7 — Counter-age regret (SettledStep −50%, integrated nats²·min over 60-min window)\n"); + println!("Ages the counter `settle` minutes, then drops 50%. §8.5: steady-state-anchored"); + println!("metrics miss this. Monolith regret should grow with counter age; EWMAs stay flat.\n"); + println!("| algo | SPM | settle=5m | settle=30m | settle=60m | settle=120m |"); + println!("| --- | --- | --- | --- | --- | --- |"); + let settles: [u64; 4] = [5, 30, 60, 120]; + for algo in &algos { + for &spm in &[6.0f32, 12.0, 30.0] { + print!("| {} | {} |", short(&algo.name), spm as u32); + for &settle in &settles { + let scen = Scenario::SettledStep { + settle_minutes: settle, + delta_pct: -50, + }; + let seed = + base_seed.wrapping_add(hash_label(&algo.name, spm, settle as i64 + 17000)); + let ts = run_cell(algo, &scen, spm, trials, seed); + let (_, sched) = scen.build(spm); + // Post-step window is the 60-min observation phase. + let event_at = settle * 60; + let q = mean_quad(&ts, &sched, event_at, u64::MAX); + print!(" {:.2} |", q.regret() * 60.0); + } + println!(); + } + } + + // --- Q8: latency companion — adjudicates the Q7 reading ------------- + // Q7 showed counter-age regret is flat, against prediction. Two + // readings: (1) bounded-window regret SATURATES and hides slow + // detection, or (2) the monolith genuinely reacts fine. Decisive + // test: measure mean time-to-first-fire after the step directly. If + // latency GROWS with counter age while regret stayed flat → reading + // (1), the regret metric is blind to slow detection (a real metric + // defect). If latency is also flat → reading (2). Non-reactors are + // counted at the full 60-min window (no survivor drop). + println!("\n## Q8 — Reaction latency vs counter age (SettledStep −50%, mean min to first fire)\n"); + println!("Adjudicates Q7. Non-reacting trials counted at 60min (the window cap, not dropped)."); + println!("Latency growing with age + flat regret (Q7) ⇒ regret metric is saturation-blind.\n"); + println!("| algo | SPM | settle=5m | settle=30m | settle=60m | settle=120m |"); + println!("| --- | --- | --- | --- | --- | --- |"); + for algo in &algos { + for &spm in &[6.0f32, 12.0, 30.0] { + print!("| {} | {} |", short(&algo.name), spm as u32); + for &settle in &settles { + let scen = Scenario::SettledStep { + settle_minutes: settle, + delta_pct: -50, + }; + let seed = + base_seed.wrapping_add(hash_label(&algo.name, spm, settle as i64 + 21000)); + let ts = run_cell(algo, &scen, spm, trials, seed); + let event_at = settle * 60; + let window_cap = 60 * 60u64; + let mut sum_lat = 0.0f64; + for t in &ts { + let first = t + .ticks + .iter() + .find(|tk| tk.fired && tk.t_secs > event_at) + .map(|tk| (tk.t_secs - event_at) as f64) + .unwrap_or(window_cap as f64); + sum_lat += first; + } + print!(" {:.1} |", sum_lat / ts.len() as f64 / 60.0); + } + println!(); + } + } + + // --- Q9: the REAL counter-age cross-check (§9.2 reconciliation) ----- + // Re-reading 70fcb260: the age-BLINDNESS it reports is for + // ClassicComposed (3–30%, "functionally blind at high SPM") and + // Parametric (<1%), NOT for VardiffState/the monolith (which it lists + // as 100% age-independent). Q7/Q8 tested the monolith → no + // contradiction, just the wrong algorithm. Q9 tests the algorithms + // the commit actually flagged, using its methodology: + // detection RATE = P[fire within 60min] (not mean latency), and + // actual counter age at step (time since last fire) — the variable + // the blindness depends on. If detection collapses at high SPM AND + // the −10% mature detection is near-zero, 70fcb260 reproduces and + // regret should track it; if not, THAT is the contradiction. + println!("\n## Q9 — Counter-age detection rate for the algorithms 70fcb260 flagged\n"); + println!("det = P[fire within 60min of step]; age = actual counter age at step (min);"); + println!("reg = integrated post-step regret. settle=60min, −10% drop (the commit's headline).\n"); + println!("| algo | SPM | det% | actual_age(min) | regret |"); + println!("| --- | --- | --- | --- | --- |"); + let blind_algos = vec![ + AlgorithmSpec::classic_composed(), + AlgorithmSpec::parametric(), + AlgorithmSpec::classic_vardiff_state(), + ]; + for algo in &blind_algos { + for &spm in &[6.0f32, 12.0, 30.0] { + let scen = Scenario::SettledStep { + settle_minutes: 60, + delta_pct: -10, + }; + let seed = base_seed.wrapping_add(hash_label(&algo.name, spm, 25000)); + let ts = run_cell(algo, &scen, spm, trials, seed); + let (_, sched) = scen.build(spm); + let event_at = 60 * 60u64; + let window_end = event_at + 60 * 60; + let mut detected = 0u32; + let mut sum_age = 0.0f64; + for t in &ts { + if t.ticks.iter().any(|tk| tk.fired && tk.t_secs > event_at && tk.t_secs <= window_end) { + detected += 1; + } + // Actual counter age: time since last fire at/before step. + let last_fire = t + .ticks + .iter() + .filter(|tk| tk.fired && tk.t_secs <= event_at) + .map(|tk| tk.t_secs) + .max() + .unwrap_or(0); + sum_age += (event_at - last_fire) as f64; + } + let det = 100.0 * detected as f64 / ts.len() as f64; + let age = sum_age / ts.len() as f64 / 60.0; + let reg = mean_quad(&ts, &sched, event_at, u64::MAX).regret() * 60.0; + println!( + "| {} | {} | {:.0}% | {:.1} | {:.3} |", + short(&algo.name), + spm as u32, + det, + age, + reg + ); + } + } + + // --- §10: three metric philosophies, same data, different rankings --- + // Build one workload profile per algorithm over a realistic mix, then + // score it three ways to show how the loss-shape choice changes WHO + // WINS. The mix deliberately includes the −10% aged-counter cell (the + // slow-degradation case e² is blind to) so the rankings actually + // diverge. Aggregates: Rq=mean e² regret, Rl=mean |e| regret, + // Det=mean −10% mature detection rate, Eff=mean fire effort. + // (display label, spec) — explicit labels avoid the truncation + // collision between the monolith and ClassicComposed. + let panel: Vec<(&str, AlgorithmSpec)> = vec![ + ("monolith(prod)", AlgorithmSpec::classic_vardiff_state()), + ("balanced", AlgorithmSpec::balanced()), + ("react_priority", AlgorithmSpec::react_priority()), + ("ClassicComposed", AlgorithmSpec::classic_composed()), + ("Parametric", AlgorithmSpec::parametric()), + ]; + let panel_spms: [f32; 4] = [6.0, 12.0, 20.0, 30.0]; + println!("\n## §10 — Same data, three metric philosophies (do rankings diverge?)\n"); + println!("Workload mix per algo over SPM {{6,12,20,30}}: Stable, ±50% & ±10% steps,"); + println!("and the settle60/−10% aged-counter cell (cold-start excluded). Rq=mean e², Rl=mean|e|, "); + println!("Det=−10% mature detection rate, Eff=fire effort. Lower R/Eff better, higher Det better.\n"); + println!("| algo | Rq (e²) | Rl (|e|) | Det% | Eff |"); + println!("| --- | --- | --- | --- | --- |"); + struct Row { + name: String, + rq: f64, + rl: f64, + det: f64, + eff: f64, + } + let mut rows: Vec = Vec::new(); + for (label, algo) in &panel { + let mut agg = Quad::default(); + let mut n = 0u32; + let mut det_sum = 0.0f64; + let mut det_n = 0u32; + for &spm in &panel_spms { + // steady + transient scenarios (cold-start excluded: it is a + // one-time event that dominates Rq and washes out the + // detection differences these philosophies are meant to expose) + let mut scens = vec![Scenario::Stable]; + for &d in &[-50i32, -10, 10, 50] { + scens.push(Scenario::Step { delta_pct: d }); + } + for (si, scen) in scens.iter().enumerate() { + let seed = base_seed.wrapping_add(hash_label(&algo.name, spm, si as i64 + 30000)); + let ts = run_cell(algo, scen, spm, trials, seed); + let (_, sched) = scen.build(spm); + let t_lo = if matches!(scen, Scenario::Step { .. }) { + STEP_EVENT_AT_SECS + } else { + 0 + }; + agg.add(&mean_quad(&ts, &sched, t_lo, u64::MAX)); + n += 1; + } + // aged-counter −10% detection (the e²-blind case) + let scen = Scenario::SettledStep { + settle_minutes: 60, + delta_pct: -10, + }; + let seed = base_seed.wrapping_add(hash_label(&algo.name, spm, 31000)); + let ts = run_cell(algo, &scen, spm, trials, seed); + let event_at = 60 * 60u64; + let window_end = event_at + 60 * 60; + let detected = ts + .iter() + .filter(|t| { + t.ticks + .iter() + .any(|tk| tk.fired && tk.t_secs > event_at && tk.t_secs <= window_end) + }) + .count(); + det_sum += detected as f64 / ts.len() as f64; + det_n += 1; + } + let q = agg.scale(1.0 / n as f64); + rows.push(Row { + name: label.to_string(), + rq: q.regret(), + rl: q.lin(), + det: 100.0 * det_sum / det_n as f64, + eff: q.effort(), + }); + } + for r in &rows { + println!( + "| {} | {:.4} | {:.4} | {:.0}% | {:.4} |", + r.name, r.rq, r.rl, r.det, r.eff + ); + } + // Show the three rankings explicitly. + let rank = |key: &dyn Fn(&Row) -> f64, asc: bool| -> String { + let mut idx: Vec = (0..rows.len()).collect(); + idx.sort_by(|&a, &b| { + let (ka, kb) = (key(&rows[a]), key(&rows[b])); + if asc { + ka.partial_cmp(&kb).unwrap() + } else { + kb.partial_cmp(&ka).unwrap() + } + }); + idx.iter() + .map(|&i| rows[i].name.clone()) + .collect::>() + .join(" > ") + }; + println!("\n**Ranking by philosophy** (best → worst):\n"); + println!("- *Quadratic regret only* (Rq, asc): {}", rank(&|r| r.rq, true)); + println!("- *Linear regret only* (Rl, asc): {}", rank(&|r| r.rl, true)); + println!( + "- *Detection-first* (Det desc, ties by Rq): {}", + rank(&|r| r.det, false) + ); + println!( + "- *Composite* (Rq + 0.5·Eff − 0.01·Det, asc): {}", + rank(&|r| r.rq + 0.5 * r.eff - 0.01 * r.det / 100.0, true) + ); + + println!("\n(interpretation in docs/THEORY.md §5 & §8; this binary is the validation pass.)"); +} + +/// Time-averaged post-step mean-e² (the transient regret) for one +/// (algo, δ, SPM) cell. Shared by Q4 and Q5. +fn step_regret(algo: &AlgorithmSpec, delta_pct: i32, spm: f32, trials: usize, base_seed: u64) -> f64 { + let scen = Scenario::Step { delta_pct }; + let seed = base_seed.wrapping_add(hash_label(&algo.name, spm, delta_pct as i64 + 9000)); + let ts = run_cell(algo, &scen, spm, trials, seed); + let (_, sched) = scen.build(spm); + mean_quad(&ts, &sched, STEP_EVENT_AT_SECS, u64::MAX).regret() +} + +/// Compact display name: first letters of the three slash-separated +/// parts, else the whole thing truncated. +fn short(name: &str) -> String { + if name.len() <= 22 { + return name.to_string(); + } + name.chars().take(22).collect() +} + +/// Deterministic per-(algo,spm,bucket) seed offset so different cells +/// don't share trial seeds (avoids accidental correlation) while +/// staying fully reproducible. +fn hash_label(name: &str, spm: f32, bucket: i64) -> u64 { + let mut h = 1469598103934665603u64; // FNV-1a offset + for b in name.bytes() { + h ^= b as u64; + h = h.wrapping_mul(1099511628211); + } + h ^= (spm as u64).wrapping_mul(2654435761); + h ^= bucket as u64; + h +} diff --git a/sv2/channels-sv2/sim/src/bin/regret-radar.rs b/sv2/channels-sv2/sim/src/bin/regret-radar.rs new file mode 100644 index 0000000000..c8ba3202f9 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/regret-radar.rs @@ -0,0 +1,489 @@ +//! Principled regret/effort radar — the §10 replacement for the +//! six-axis `EqualWeightFitness` radar. +//! +//! Five axes, each a genuinely independent operational cost (not a +//! correlated projection), each higher-is-better, **normalized against +//! the ClassicComposed reference** (ClassicComposed lands at the 0.5 +//! mid-ring; outward = beats it, inward = worse). ClassicComposed is +//! the introspectable three-stage decomposition that is fire-for-fire +//! equivalent to the production monolith, so it is the same behavioral +//! baseline while also exposing per-tick state. No arbitrary `/0.30`-style +//! ceilings, and — unlike hull-normalization — stable run-to-run and +//! meaningful for a single algorithm without needing a strawman in the +//! candidate set: +//! +//! - tracking : −regret_lin (linear log-error ⟨|e|⟩; §10 chose +//! LINEAR so small persistent drops stay visible) +//! - gentleness : −effort (Σ(Δln D)² over fires) +//! - detection : P[fire within 60min | aged-counter −10% drop] +//! (the SEPARATE axis §9.4 proved is not derivable +//! from e(t)) +//! - over-safety: −regret_over (over-difficulty time; death-spiral side) +//! - tighten-care: −effort_up (costly tightening fires specifically) +//! +//! Raw costs are averaged across SPM and the relevant scenario classes, +//! then each axis is mapped cost→score by `1 − raw/max_raw` so the +//! worst candidate sits near 0 and the best near 1 on that axis. +//! +//! Usage: `cargo run --release --bin regret-radar` +//! Env: VARDIFF_RR_TRIALS (default 1000), VARDIFF_RR_OUT (svg path). + +use std::env; +use std::f64::consts::PI; +use std::fs; +use std::sync::Arc; + +use channels_sv2::vardiff::composed::{ + AcceleratingPartialRetarget, AdaptivePoissonCusum, AsymmetricCusumBoundary, Composed, + EwmaEstimator, PoissonCI, +}; +use channels_sv2::vardiff::MockClock; +use vardiff_sim::baseline::{ + Cell, Scenario, DEFAULT_BASELINE_SEED, DEFAULT_TRIAL_COUNT, MIN_SETTLED_WINDOW_SECS, + QUIET_WINDOW_SECS, REACT_WINDOW_SECS, SETTLE_BUFFER_SECS, STEP_EVENT_AT_SECS, +}; +use vardiff_sim::grid::{AlgorithmSpec, VardiffBox}; +use vardiff_sim::trial::{run_trial_observed, Trial}; +use vardiff_sim::{ + convergence_time_distribution, jitter_distribution, reaction_time_distribution, + settled_accuracy_distribution, LogErrorRegret, Metric, +}; + +const AXES: &[&str] = &[ + "Tracking", + "Gentleness", + "Detection", + "Over-diff safety", + "Tighten care", +]; + +/// Axis labels for the familiar-metrics radar (raw measurements, all +/// lower-is-better, mapped to a log-ratio score vs the reference so +/// "outward = better, mid-ring = ties classic" holds — see `log_score` +/// in main for why this panel uses a log scale rather than the left +/// panel's ref/(ref+val)). +// Order groups the two SPEED axes (Convergence, Reaction) adjacent and +// the two STABILITY axes (Settled accuracy, Jitter) adjacent, so each +// related pair forms a contiguous edge of the polygon. +const FAM_AXES: &[&str] = &[ + "Convergence", + "Reaction (−50%)", + "Settled accuracy", + "Jitter", +]; + +const COLORS: &[&str] = &["#e41a1c", "#377eb8", "#4daf4a", "#984ea3", "#ff7f00"]; + +/// Raw per-algorithm costs before hull-normalization. +struct RawCost { + name: String, + regret_lin: f64, + effort: f64, + detection: f64, // already a benefit in [0,1]; higher = better + regret_over: f64, + effort_up: f64, +} + +/// Familiar, human-anchored measurements plotted as a second panel so +/// the abstract regret/effort axes can be cross-read against quantities +/// people already have intuition for. Raw units (not normalized): +struct Familiar { + name: String, + convergence_min: f64, // cold-start p50 time to converge (minutes) + settled_accuracy: f64, // stable p50 |H_est/H_true − 1| (fraction) + reaction_min: f64, // −50% step p50 reaction time (minutes) + jitter_per_min: f64, // stable post-convergence fires/min +} + +fn run_cell(algo: &AlgorithmSpec, scen: &Scenario, spm: f32, trials: usize, seed: u64) -> Vec { + let (config, schedule) = scen.build(spm); + let mut out = Vec::with_capacity(trials); + for i in 0..trials { + let clock = Arc::new(MockClock::new(0)); + let v = (algo.factory)(clock.clone()); + out.push(run_trial_observed(v, clock, config.clone(), &schedule, seed.wrapping_add(i as u64))); + } + out +} + +/// The interim AsymCusum champion (pre-SignPersist) — kept as a plotted +/// comparison so the radar shows what the sign-persistence discount bought +/// over the AsymCusum-only config. `Ewma150 / AsymCusum-s0.2-t6 / +/// Accel-0.2-0.8-0.05`. +fn champion_asymcusum() -> AlgorithmSpec { + let name = vardiff_sim::naming::triple_name( + &EwmaEstimator::new(150), + &AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(0.2, 0.05, 6.0), + 5, + ), + &AcceleratingPartialRetarget::new(0.2, 0.8, 0.05), + ); + AlgorithmSpec::new(name, |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(150), + AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(0.2, 0.05, 6.0), + 5, + ), + AcceleratingPartialRetarget::new(0.2, 0.8, 0.05), + 1.0, + clock, + ))) + }) +} + +fn main() -> std::io::Result<()> { + let trials: usize = env::var("VARDIFF_RR_TRIALS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(DEFAULT_TRIAL_COUNT); + let out_path = env::var("VARDIFF_RR_OUT").unwrap_or_else(|_| "regret_radar.svg".to_string()); + + // raws[0] MUST be the reference algorithm: every cost axis is + // normalized against it (it lands at the 0.5 mid-ring). We anchor on + // ClassicComposed — the introspectable three-stage build that is + // fire-for-fire equivalent to the production monolith, so it is the + // same behavioral baseline we want to beat. With reference-relative + // scoring no strawman is needed for spread — contenders are read + // directly as "beats / loses to classic" per axis. (To audit a + // known-bad algorithm, append parametric() here; it'll plot near + // center.) + let algos = vec![ + ("classic_composed", AlgorithmSpec::classic_composed()), + ("balanced", AlgorithmSpec::balanced()), + ("react_priority", AlgorithmSpec::react_priority()), + ("champion (SignPersist)", AlgorithmSpec::champion()), + ("interim (AsymCusum)", champion_asymcusum()), + ]; + let spms: [f32; 4] = [6.0, 12.0, 20.0, 30.0]; + let metric = LogErrorRegret; + + eprintln!("regret-radar: {} algos × {} SPM, {} trials/cell", algos.len(), spms.len(), trials); + + let mut raws: Vec = Vec::new(); + let mut fams: Vec = Vec::new(); + for (label, algo) in &algos { + // Average regret/effort over a transient+steady mix (cold-start + // excluded — one-time, dominates and washes out differences). + let mut regret_lin = 0.0; + let mut regret_over = 0.0; + let mut effort = 0.0; + let mut effort_up = 0.0; + let mut n = 0.0; + for &spm in &spms { + let mut scens = vec![Scenario::Stable]; + for &d in &[-50i32, -10, 10, 50] { + scens.push(Scenario::Step { delta_pct: d }); + } + for (si, scen) in scens.iter().enumerate() { + let seed = DEFAULT_BASELINE_SEED.wrapping_add((si as u64) << 12).wrapping_add(spm as u64); + let ts = run_cell(algo, scen, spm, trials, seed); + let cell = Cell { shares_per_minute: spm, scenario: scen.clone() }; + let mv = metric.compute(&ts, &cell); + regret_lin += mv.get("regret_lin").unwrap_or(0.0); + regret_over += mv.get("regret_over").unwrap_or(0.0); + effort += mv.get("effort").unwrap_or(0.0); + effort_up += mv.get("effort_up").unwrap_or(0.0); + n += 1.0; + } + } + // Detection: aged-counter −10% drop, P[fire within 60min], avg over SPM. + let mut det = 0.0; + let mut dn = 0.0; + for &spm in &spms { + let scen = Scenario::SettledStep { settle_minutes: 60, delta_pct: -10 }; + let seed = DEFAULT_BASELINE_SEED.wrapping_add(0xD17).wrapping_add(spm as u64); + let ts = run_cell(algo, &scen, spm, trials, seed); + let event_at = 60 * 60u64; + let window_end = event_at + 60 * 60; + let hit = ts.iter().filter(|t| { + t.ticks.iter().any(|tk| tk.fired && tk.t_secs > event_at && tk.t_secs <= window_end) + }).count(); + det += hit as f64 / ts.len() as f64; + dn += 1.0; + } + raws.push(RawCost { + name: label.to_string(), + regret_lin: regret_lin / n, + effort: effort / n, + detection: det / dn, + regret_over: regret_over / n, + effort_up: effort_up / n, + }); + + // Familiar metrics (raw units), each from its canonical scenario, + // averaged over SPM. These mirror the existing baseline tables so + // the regret radar can be cross-read against intuitive numbers. + let (mut conv, mut acc, mut react, mut jit, mut fc) = (0.0, 0.0, 0.0, 0.0, 0.0); + for &spm in &spms { + // cold-start convergence p50 (seconds → minutes) + let cs = run_cell(algo, &Scenario::ColdStart, spm, trials, + DEFAULT_BASELINE_SEED.wrapping_add(0xC04).wrapping_add(spm as u64)); + let (_, cdist) = convergence_time_distribution(&cs, QUIET_WINDOW_SECS); + conv += cdist.p50().unwrap_or(0.0) / 60.0; + // stable: settled accuracy p50 + jitter mean/min + let st = run_cell(algo, &Scenario::Stable, spm, trials, + DEFAULT_BASELINE_SEED.wrapping_add(0x57A).wrapping_add(spm as u64)); + acc += settled_accuracy_distribution(&st).p50().unwrap_or(0.0); + jit += jitter_distribution(&st, QUIET_WINDOW_SECS, SETTLE_BUFFER_SECS, MIN_SETTLED_WINDOW_SECS) + .mean().unwrap_or(0.0); + // −50% step reaction p50 (seconds → minutes) + let rs = run_cell(algo, &Scenario::Step { delta_pct: -50 }, spm, trials, + DEFAULT_BASELINE_SEED.wrapping_add(0x4EA).wrapping_add(spm as u64)); + let (_, rdist) = reaction_time_distribution(&rs, STEP_EVENT_AT_SECS, REACT_WINDOW_SECS); + react += rdist.p50().unwrap_or(0.0) / 60.0; + fc += 1.0; + } + fams.push(Familiar { + name: label.to_string(), + convergence_min: conv / fc, + settled_accuracy: acc / fc, + reaction_min: react / fc, + jitter_per_min: jit / fc, + }); + } + + // Normalize against the CLASSICCOMPOSED REFERENCE (raws[0]), not the + // candidate-set hull. Rationale: hull-normalization makes the chart + // relative to whoever you happened to include (unstable run to run; + // needs a strawman to show spread). ClassicComposed is a stable, + // principled, non-arbitrary reference — the production-equivalent + // algorithm we want to beat. For a cost axis, score = ref/(ref+cost): + // the reference lands at exactly 0.5 (mid-ring), beating it pushes + // outward (→1), losing pulls inward (→0), always bounded in (0,1). + // Detection is an absolute probability — plot it RAW (normalizing a + // probability by the set max would falsely promote the best to 1.0). + let reference = &raws[0]; + let cost_score = |reff: f64, cost: f64| reff / (reff + cost).max(1e-12); + + let profiles: Vec<(String, [f64; 5])> = raws + .iter() + .map(|r| { + ( + r.name.clone(), + [ + cost_score(reference.regret_lin, r.regret_lin), + cost_score(reference.effort, r.effort), + r.detection, // raw probability in [0,1] + cost_score(reference.regret_over, r.regret_over), + cost_score(reference.effort_up, r.effort_up), + ], + ) + }) + .collect(); + + // Markdown table (raw + normalized) to stdout. + println!("\n## Regret/effort radar — raw costs (lower better, except Detection)\n"); + println!("| algo | regret_lin | effort | detection | regret_over | effort_up |"); + println!("| --- | --- | --- | --- | --- | --- |"); + for r in &raws { + println!( + "| {} | {:.4} | {:.4} | {:.0}% | {:.4} | {:.4} |", + r.name, r.regret_lin, r.effort, r.detection * 100.0, r.regret_over, r.effort_up + ); + } + println!("\n## Axes vs ClassicComposed reference (0.5=ties classic, >0.5 beats it; Detection raw)\n"); + print!("| algo |"); + for a in AXES { + print!(" {} |", a); + } + println!(); + print!("| --- |"); + for _ in AXES { + print!(" --- |"); + } + println!(); + for (name, ax) in &profiles { + print!("| {} |", name); + for v in ax { + print!(" {:.2} |", v); + } + println!(); + } + + // Familiar-metrics table (raw units) — the intuition anchor. + println!("\n## Familiar metrics (raw units, for cross-reference)\n"); + println!("| algo | convergence p50 | reaction p50 (−50%) | settled acc p50 | jitter (fires/min) |"); + println!("| --- | --- | --- | --- | --- |"); + for f in &fams { + println!( + "| {} | {:.1} min | {:.1} min | {:.1}% | {:.3} |", + f.name, + f.convergence_min, + f.reaction_min, + f.settled_accuracy * 100.0, + f.jitter_per_min + ); + } + + // Familiar metrics → radar profiles, normalized vs the reference + // (raws[0]/fams[0] = ClassicComposed). These keep "0.5 = ties classic, + // outward = better", but use a PER-AXIS LOG-RATIO score: + // score = 0.5 + k_axis · log2(ref/val), clamped to [0,1]. + // + // Rationale — on these raw axes ClassicComposed is a degenerate outlier + // in its own favor (it barely fires, so jitter ≈ 0.018 and settled + // accuracy ≈ 1%, ~7× better than any contender; meanwhile it is ~2× + // SLOWER on convergence/reaction). The left panel's ref/(ref+val) would + // crush every contender into a tiny band on the stability axes — + // truthful but useless for reading contender-vs-contender separation — + // and a single global log `k` can't serve axes whose spreads range from + // ~1.3× (speed) to ~8× (accuracy): pick k for accuracy and the speed + // axes flatten; pick k for speed and accuracy clips. + // + // So each axis gets its OWN `k_axis`, set from the data: the largest + // |log2(ref/val)| on that axis maps to `EDGE` from the mid-ring. Every + // axis then uses its full dynamic range (max separation, no clipping), + // and ClassicComposed still sits at exactly 0.5 everywhere (ref/ref=1). + // This panel is the "raw intuition" cross-reference, so a per-axis scale + // is appropriate; the left panel remains the single-scale quantitative + // one. + let fref = &fams[0]; + const EDGE: f64 = 0.46; // most-extreme algo lands near rim/center, unclipped + // axis i → extractor on a `Familiar` + let axis_val: [fn(&Familiar) -> f64; 4] = [ + |f| f.convergence_min, + |f| f.reaction_min, + |f| f.settled_accuracy, + |f| f.jitter_per_min, + ]; + let axis_ref = [ + fref.convergence_min, + fref.reaction_min, + fref.settled_accuracy, + fref.jitter_per_min, + ]; + // Per-axis k from the max |log2(ref/val)| across all algos. + let mut k_axis = [0.0f64; 4]; + for a in 0..4 { + let max_dev = fams + .iter() + .map(|f| { + let (r, v) = (axis_ref[a], axis_val[a](f)); + if r > 0.0 && v > 0.0 { + (r / v).log2().abs() + } else { + 0.0 + } + }) + .fold(0.0f64, f64::max); + k_axis[a] = if max_dev > 1e-9 { EDGE / max_dev } else { 0.0 }; + } + let fam_profiles: Vec<(String, [f64; 4])> = fams + .iter() + .map(|f| { + let mut ax = [0.5f64; 4]; + for a in 0..4 { + let (r, v) = (axis_ref[a], axis_val[a](f)); + if r > 0.0 && v > 0.0 { + ax[a] = (0.5 + k_axis[a] * (r / v).log2()).clamp(0.0, 1.0); + } + } + (f.name.clone(), ax) + }) + .collect(); + + let svg = render(&profiles, &fam_profiles); + fs::write(&out_path, svg)?; + eprintln!("\nWrote {}", out_path); + Ok(()) +} + +fn render(profiles: &[(String, [f64; 5])], fam_profiles: &[(String, [f64; 4])]) -> String { + let width = 1240; + let height = 720 + 22 * profiles.len(); + let mut s = String::new(); + s.push_str(&format!( + r##" + +Regret/effort (derived) +Familiar metrics (raw) +Both: mid-ring = ties ClassicComposed, outward = better. Axes ↑ = better. (Left: ref/(ref+cost); Right: per-axis log-ratio.) +"## + )); + + // Left radar: the derived regret/effort axes. + let left: Vec<(&str, &[f64])> = profiles.iter().map(|(n, a)| (n.as_str(), &a[..])).collect(); + draw_radar(&mut s, 320.0, 360.0, 215.0, AXES, &left); + // Right radar: the familiar measurements, same normalization. + let right: Vec<(&str, &[f64])> = + fam_profiles.iter().map(|(n, a)| (n.as_str(), &a[..])).collect(); + draw_radar(&mut s, 910.0, 360.0, 215.0, FAM_AXES, &right); + + // Shared legend across the bottom. + let ly0 = 660.0; + for (idx, (name, _)) in profiles.iter().enumerate() { + let color = COLORS[idx % COLORS.len()]; + let y = ly0 + idx as f64 * 22.0; + s.push_str(&format!( + r##" +{} +"##, + y - 11.0, y, name + )); + } + s.push_str("\n"); + s +} + +/// Draws one radar centered at `(cx, cy)`: 5 rings (the 3rd bold = the +/// ClassicComposed reference), one labeled axis per entry in +/// `axes`, and one polygon per `(name, values)` profile in `COLORS` +/// order. Values are expected in [0,1] (mid-ring = 0.5 = ties classic). +fn draw_radar(s: &mut String, cx: f64, cy: f64, radius: f64, axes: &[&str], profiles: &[(&str, &[f64])]) { + let n = axes.len(); + let angle = |i: usize| -PI / 2.0 + 2.0 * PI * i as f64 / n as f64; + // rings + for ring in 1..=5 { + let r = radius * ring as f64 / 5.0; + let mut pts = String::new(); + for i in 0..n { + let a = angle(i); + pts.push_str(&format!("{:.1},{:.1} ", cx + r * a.cos(), cy + r * a.sin())); + } + let (stroke, op, w) = if ring == 3 { + ("#333", "0.55", "1.5") + } else { + ("#666", "0.15", "0.5") + }; + s.push_str(&format!( + r##" +"##, + pts.trim() + )); + } + // axes + labels + for (i, axis) in axes.iter().enumerate() { + let a = angle(i); + let (xe, ye) = (cx + radius * a.cos(), cy + radius * a.sin()); + s.push_str(&format!( + r##" +"## + )); + let (lx, ly) = (cx + (radius + 22.0) * a.cos(), cy + (radius + 22.0) * a.sin()); + let anchor = if a.cos().abs() < 0.1 { "middle" } else if a.cos() > 0.0 { "start" } else { "end" }; + s.push_str(&format!( + r##"{} ↑ +"##, + ly + 4.0, axis + )); + } + // polygons + for (idx, (_name, ax)) in profiles.iter().enumerate() { + let color = COLORS[idx % COLORS.len()]; + let mut pts = String::new(); + for (i, &val) in ax.iter().enumerate() { + let a = angle(i); + let r = radius * val.clamp(0.0, 1.0); + pts.push_str(&format!("{:.1},{:.1} ", cx + r * a.cos(), cy + r * a.sin())); + } + s.push_str(&format!( + r##" +"##, + pts.trim() + )); + } +} diff --git a/sv2/channels-sv2/sim/src/bin/sweep-accelerating.rs b/sv2/channels-sv2/sim/src/bin/sweep-accelerating.rs new file mode 100644 index 0000000000..cddd46975b --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/sweep-accelerating.rs @@ -0,0 +1,201 @@ +//! Parameter sweep for AcceleratingPartialRetarget. +//! +//! Sweeps (acceleration, eta_max) over the standard scenario grid to find +//! the optimal tradeoff between convergence speed and jitter/stability. +//! +//! ## Usage +//! +//! ```text +//! cargo run --release --bin sweep-accelerating +//! ``` + +use std::env; + +use vardiff_sim::{baseline::Scenario, grid::AlgorithmSpec, grid::Grid}; + +fn main() { + let trial_count: usize = env::var("VARDIFF_SWEEP_TRIALS") + .ok() + .and_then(|v| v.parse().ok()) + .unwrap_or(500); + + let base_seed: u64 = 0xDEAD_BEEF_CAFE_F00D; + + let accelerations: &[f32] = &[0.05, 0.1, 0.15, 0.2]; + let eta_maxes: &[f32] = &[0.4, 0.5, 0.6, 0.8]; + + let mut algorithms = vec![ + AlgorithmSpec::ewma_asymmetric_cusum(120, 1.5, 0.05, 3.0, 0.2), + ]; + + for &acc in accelerations { + for &eta_max in eta_maxes { + algorithms.push(AlgorithmSpec::ada_cusum_accelerating( + 120, 1.5, 0.05, 3.0, 0.2, eta_max, acc, + )); + } + } + + let mut scenarios = vec![Scenario::ColdStart, Scenario::Stable]; + for &delta in &[-50, -25, -10, -5, 5, 10, 25, 50] { + scenarios.push(Scenario::Step { delta_pct: delta }); + } + + let grid = Grid { + algorithms, + share_rates: vec![6.0, 10.0, 12.0, 20.0, 30.0], + scenarios, + trial_count, + base_seed, + }; + + eprintln!( + "Sweeping {} algorithms × {} SPM × {} scenarios × {} trials", + grid.algorithms.len(), + grid.share_rates.len(), + grid.scenarios.len(), + grid.trial_count, + ); + + let results = grid.run_paired(); + + // Print header + println!("# AcceleratingPartialRetarget Parameter Sweep\n"); + println!("Base: EwmaEstimator(120s) + AsymmetricCusumBoundary(s=1.5, floor=0.05, tighten=3.0)"); + println!("Sweep: eta_base=0.2, acceleration ∈ {{0.05, 0.1, 0.15, 0.2}}, eta_max ∈ {{0.4, 0.5, 0.6, 0.8}}"); + println!("Trials: {}\n", trial_count); + + // Aggregate metrics across share rates for each algorithm + println!("## Summary (averaged across SPM=6,10,12,20,30)\n"); + println!("| Algorithm | Stable Jitter | Step±50 React | Step±50 Conv | Step±10 React | Step±10 Conv | Step±5 React | ColdStart Conv |"); + println!("|-----------|---------------|---------------|--------------|---------------|--------------|--------------|----------------|"); + + let mut algo_names: Vec<&String> = results.keys().collect(); + algo_names.sort(); + + for algo_name in &algo_names { + let cells = &results[*algo_name]; + + let mut stable_jitter = Vec::new(); + let mut step50_react = Vec::new(); + let mut step50_conv = Vec::new(); + let mut step10_react = Vec::new(); + let mut step10_conv = Vec::new(); + let mut step5_react = Vec::new(); + let mut cold_conv = Vec::new(); + + for cell in cells { + match &cell.scenario { + Scenario::Stable => { + if let Some(v) = cell.get("jitter_mean_per_min") { + stable_jitter.push(v); + } + } + Scenario::Step { delta_pct: 50 } | Scenario::Step { delta_pct: -50 } => { + if let Some(v) = cell.get("reaction_rate") { + step50_react.push(v); + } + step50_conv.push(cell.get("convergence_rate").unwrap_or(0.0)); + } + Scenario::Step { delta_pct: 10 } | Scenario::Step { delta_pct: -10 } => { + if let Some(v) = cell.get("reaction_rate") { + step10_react.push(v); + } + step10_conv.push(cell.get("convergence_rate").unwrap_or(0.0)); + } + Scenario::Step { delta_pct: 5 } | Scenario::Step { delta_pct: -5 } => { + if let Some(v) = cell.get("reaction_rate") { + step5_react.push(v); + } + } + Scenario::ColdStart => { + cold_conv.push(cell.get("convergence_rate").unwrap_or(0.0)); + } + _ => {} + } + } + + let mean = |v: &[f64]| -> f64 { + if v.is_empty() { f64::NAN } else { v.iter().sum::() / v.len() as f64 } + }; + + println!( + "| {} | {:.4} | {:.3} | {:.3} | {:.3} | {:.3} | {:.3} | {:.3} |", + algo_name, + mean(&stable_jitter), + mean(&step50_react), + mean(&step50_conv), + mean(&step10_react), + mean(&step10_conv), + mean(&step5_react), + mean(&cold_conv), + ); + } + + // Detailed per-SPM table for the step±50 convergence (the key metric) + println!("\n## Step ±50% Convergence Rate by SPM\n"); + println!("| Algorithm | SPM=6 | SPM=10 | SPM=12 | SPM=20 | SPM=30 |"); + println!("|-----------|-------|--------|--------|--------|--------|"); + + for algo_name in &algo_names { + let cells = &results[*algo_name]; + let mut by_spm: Vec = Vec::new(); + + for &spm in &[6.0f32, 10.0, 12.0, 20.0, 30.0] { + let conv_values: Vec = cells + .iter() + .filter(|c| { + (c.shares_per_minute - spm).abs() < 0.1 + && matches!( + c.scenario, + Scenario::Step { delta_pct: 50 } | Scenario::Step { delta_pct: -50 } + ) + }) + .map(|c| c.get("convergence_rate").unwrap_or(0.0)) + .collect(); + let avg = if conv_values.is_empty() { + f64::NAN + } else { + conv_values.iter().sum::() / conv_values.len() as f64 + }; + by_spm.push(avg); + } + + println!( + "| {} | {:.3} | {:.3} | {:.3} | {:.3} | {:.3} |", + algo_name, by_spm[0], by_spm[1], by_spm[2], by_spm[3], by_spm[4], + ); + } + + // Jitter detail + println!("\n## Stable-Load Jitter by SPM (fires/min)\n"); + println!("| Algorithm | SPM=6 | SPM=10 | SPM=12 | SPM=20 | SPM=30 |"); + println!("|-----------|-------|--------|--------|--------|--------|"); + + for algo_name in &algo_names { + let cells = &results[*algo_name]; + let mut by_spm: Vec = Vec::new(); + + for &spm in &[6.0f32, 10.0, 12.0, 20.0, 30.0] { + let jitter: Vec = cells + .iter() + .filter(|c| { + (c.shares_per_minute - spm).abs() < 0.1 + && matches!(c.scenario, Scenario::Stable) + }) + .filter_map(|c| c.get("jitter_mean_per_min")) + .collect(); + let avg = if jitter.is_empty() { + f64::NAN + } else { + jitter.iter().sum::() / jitter.len() as f64 + }; + by_spm.push(avg); + } + + println!( + "| {} | {:.4} | {:.4} | {:.4} | {:.4} | {:.4} |", + algo_name, by_spm[0], by_spm[1], by_spm[2], by_spm[3], by_spm[4], + ); + } +} diff --git a/sv2/channels-sv2/sim/src/bin/sweep-adaptive.rs b/sv2/channels-sv2/sim/src/bin/sweep-adaptive.rs new file mode 100644 index 0000000000..852300cc3f --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/sweep-adaptive.rs @@ -0,0 +1,308 @@ +//! Parameter sweep for the AdaptivePoissonCusum boundary composition. +//! +//! Sweeps: CUSUM sensitivity × tighten_multiplier × spm_threshold +//! with fixed EwmaEstimator(120s) + AcceleratingPartialRetarget(0.2, 0.6, 0.2). + +use std::collections::HashMap; +use std::env; +use std::fs; +use std::path::PathBuf; +use std::time::Instant; + +use vardiff_sim::baseline::{CellResult, Scenario, DEFAULT_BASELINE_SEED}; +use vardiff_sim::grid::{AlgorithmSpec, Grid, VardiffBox}; +use vardiff_sim::metrics; +use vardiff_sim::metrics::DerivedMetric; + +use channels_sv2::vardiff::composed::{ + AcceleratingPartialRetarget, AdaptivePoissonCusum, AsymmetricCusumBoundary, Composed, + EwmaEstimator, PoissonCI, +}; + +fn main() -> std::io::Result<()> { + let trial_count: usize = env::var("VARDIFF_SWEEP_TRIALS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(500); + let base_seed: u64 = env::var("VARDIFF_SWEEP_SEED") + .ok() + .and_then(|s| { + s.strip_prefix("0x") + .and_then(|h| u64::from_str_radix(h, 16).ok()) + .or_else(|| s.parse().ok()) + }) + .unwrap_or(DEFAULT_BASELINE_SEED); + let out_dir = env::var("VARDIFF_SWEEP_OUT_DIR") + .map(PathBuf::from) + .unwrap_or_else(|_| PathBuf::from(".")); + + let sensitivities = vec![1.0, 1.5, 2.0, 2.5]; + let tighten_mults = vec![1.5, 2.0, 3.0, 4.0]; + let transitions = vec![10u32, 20, 30, 50]; + let eta_base = 0.2f32; + let eta_max = 0.6f32; + let acceleration = 0.2f32; + + let mut algorithms: Vec = Vec::new(); + + // Reference algorithms + algorithms.push(AlgorithmSpec::full_remedy()); + algorithms.push(AlgorithmSpec::classic_vardiff_state()); + + // Sweep: sensitivity × tighten × transition + for &sens in &sensitivities { + for &tighten in &tighten_mults { + for &trans in &transitions { + let name = format!( + "Adp-s{}-t{}-tr{}", + (sens * 10.0) as u32, + (tighten * 10.0) as u32, + trans + ); + algorithms.push(AlgorithmSpec::new(name, move |clock| { + let boundary = AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(sens, 0.05, tighten), + trans, + ); + let inner = Composed::new( + EwmaEstimator::new(120), + boundary, + AcceleratingPartialRetarget::new(eta_base, eta_max, acceleration), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + })); + } + } + } + + let mut scenarios = vec![Scenario::ColdStart, Scenario::Stable]; + for &d in &[-50i32, -25, -10, 10, 25, 50] { + scenarios.push(Scenario::Step { delta_pct: d }); + } + for &d in &[-50i32, -25, 25, 50] { + scenarios.push(Scenario::SettledStep { + settle_minutes: 60, + delta_pct: d, + }); + } + + let grid = Grid { + algorithms, + share_rates: vec![4.0, 6.0, 8.0, 10.0, 12.0, 15.0, 20.0, 30.0], + scenarios, + trial_count, + base_seed, + }; + + eprintln!( + "Adaptive boundary sweep: {} algorithms × {} cells × {} trials = {} total", + grid.algorithms.len(), + grid.share_rates.len() * grid.scenarios.len(), + trial_count, + grid.total_runs() * trial_count, + ); + + let started = Instant::now(); + let results = grid.run_paired(); + let elapsed = started.elapsed(); + eprintln!("Sweep complete in {:.1}s", elapsed.as_secs_f64()); + + fs::create_dir_all(&out_dir)?; + + // Compute comprehensive fitness via the derived metric system + let derived_registry = metrics::derived_registry(); + let comp_fitness = derived_registry + .iter() + .find(|d| d.id() == "comprehensive_fitness") + .expect("ComprehensiveFitness not in registry"); + + // For each algorithm, compute comprehensive fitness per SPM + let mut algo_fitness: Vec<(String, Vec<(u32, f64)>)> = Vec::new(); + for (name, cells) in &results { + let computed = comp_fitness.compute(cells); + let mut per_spm: Vec<(u32, f64)> = Vec::new(); + for (spm, mv) in &computed { + if let Some(v) = mv.get("comprehensive_fitness") { + per_spm.push((*spm as u32, v)); + } + } + per_spm.sort_by_key(|(spm, _)| *spm); + algo_fitness.push((name.clone(), per_spm)); + } + + // Sort by mean comprehensive fitness + algo_fitness.sort_by(|a, b| { + let avg_a: f64 = if a.1.is_empty() { + 0.0 + } else { + a.1.iter().map(|(_, v)| v).sum::() / a.1.len() as f64 + }; + let avg_b: f64 = if b.1.is_empty() { + 0.0 + } else { + b.1.iter().map(|(_, v)| v).sum::() / b.1.len() as f64 + }; + avg_b.partial_cmp(&avg_a).unwrap() + }); + + // Also compute operational fitness + let op_fitness = derived_registry + .iter() + .find(|d| d.id() == "operational_fitness") + .expect("OperationalFitness not in registry"); + + // Build report + let share_rates: Vec = vec![4, 6, 8, 10, 12, 15, 20, 30]; + let mut report = String::new(); + report.push_str(&format!( + "# Adaptive Boundary Parameter Sweep\n\n\ + {} trials/cell, {} algorithms, base_seed = {:#x}, completed in {:.1}s\n\n\ + Boundary: AdaptivePoissonCusum (PoissonCI below transition, CUSUM above)\n\ + Update: AcceleratingPartialRetarget(eta={}, max={}, acc={})\n\ + Estimator: EwmaEstimator(120s)\n\n", + trial_count, + grid.algorithms.len(), + base_seed, + elapsed.as_secs_f64(), + eta_base, + eta_max, + acceleration, + )); + + // Top 20 table + report.push_str("## Top 20 by mean comprehensive fitness\n\n"); + report.push_str("| Rank | Algorithm | Mean |"); + for spm in &share_rates { + report.push_str(&format!(" {} |", spm)); + } + report.push_str("\n| --- | --- | --- |"); + for _ in &share_rates { + report.push_str(" --- |"); + } + report.push('\n'); + + for (i, (name, per_spm)) in algo_fitness.iter().take(20).enumerate() { + let avg: f64 = if per_spm.is_empty() { + 0.0 + } else { + per_spm.iter().map(|(_, v)| v).sum::() / per_spm.len() as f64 + }; + report.push_str(&format!("| {} | {} | {:.4} |", i + 1, name, avg)); + for &target_spm in &share_rates { + match per_spm.iter().find(|(s, _)| *s == target_spm) { + Some((_, v)) => report.push_str(&format!(" {:.3} |", v)), + None => report.push_str(" — |"), + } + } + report.push('\n'); + } + + // Per-cell metrics for top 5: reaction rate, accuracy, overshoot, jitter + let metric_keys = vec![ + ("reaction_rate", "Reaction rate (cold-start -50%)"), + ("settled_accuracy_p50", "Settled accuracy p50 (stable)"), + ("jitter_mean_per_min", "Jitter mean (stable)"), + ]; + + let top5_names: Vec<&str> = algo_fitness + .iter() + .take(5) + .map(|(n, _)| n.as_str()) + .collect(); + let ref_names = vec!["FullRemedy", "VardiffState"]; + + for (key, label) in &metric_keys { + report.push_str(&format!("\n## {} (top 5 + references)\n\n", label)); + report.push_str("| Algorithm |"); + for spm in &share_rates { + report.push_str(&format!(" {} |", spm)); + } + report.push_str("\n| --- |"); + for _ in &share_rates { + report.push_str(" --- |"); + } + report.push('\n'); + + let all_names: Vec<&str> = top5_names + .iter() + .copied() + .chain(ref_names.iter().copied()) + .collect(); + + for name in &all_names { + if let Some(cells) = results.get(*name) { + report.push_str(&format!("| {} |", name)); + for &target_spm in &share_rates { + // Find cell matching this SPM + the right scenario + let scenario_filter = if key.contains("settled") || key.contains("jitter") { + "Stable" + } else { + "Step-50" + }; + let val: Option = cells + .iter() + .filter(|c| c.shares_per_minute as u32 == target_spm) + .filter(|c| { + let sk = c.scenario_key(); + if scenario_filter == "Stable" { + sk == "stable" + } else { + sk.contains("-50") + } + }) + .filter_map(|c| c.get(key)) + .next(); + match val { + Some(v) => report.push_str(&format!(" {:.3} |", v)), + None => report.push_str(" — |"), + } + } + report.push('\n'); + } + } + } + + // Overshoot from cold-start scenario + report.push_str("\n## Ramp overshoot p99 (cold-start) (top 5 + references)\n\n"); + report.push_str("| Algorithm |"); + for spm in &share_rates { + report.push_str(&format!(" {} |", spm)); + } + report.push_str("\n| --- |"); + for _ in &share_rates { + report.push_str(" --- |"); + } + report.push('\n'); + let all_names: Vec<&str> = top5_names + .iter() + .copied() + .chain(ref_names.iter().copied()) + .collect(); + for name in &all_names { + if let Some(cells) = results.get(*name) { + report.push_str(&format!("| {} |", name)); + for &target_spm in &share_rates { + let val: Option = cells + .iter() + .filter(|c| c.shares_per_minute as u32 == target_spm) + .filter(|c| c.scenario_key() == "cold_start") + .filter_map(|c| c.get("ramp_overshoot_p99")) + .next(); + match val { + Some(v) => report.push_str(&format!(" {:.1}% |", v * 100.0)), + None => report.push_str(" — |"), + } + } + report.push('\n'); + } + } + + let out_path = out_dir.join("adaptive_sweep.md"); + fs::write(&out_path, &report)?; + eprintln!("Wrote {}", out_path.display()); + + Ok(()) +} diff --git a/sv2/channels-sv2/sim/src/bin/sweep-asymmetric-poisson.rs b/sv2/channels-sv2/sim/src/bin/sweep-asymmetric-poisson.rs new file mode 100644 index 0000000000..ef817988e6 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/sweep-asymmetric-poisson.rs @@ -0,0 +1,246 @@ +//! Parameter sweep for AsymmetricPoissonCI. +//! +//! Sweeps: tighten_multiplier for the PoissonCI boundary at low SPM. +//! Tests whether asymmetric cost awareness improves behavior at SPM 4-10 +//! where PoissonCI is the active boundary. + +use std::env; +use std::fs; +use std::path::PathBuf; +use std::time::Instant; + +use vardiff_sim::baseline::{Scenario, DEFAULT_BASELINE_SEED}; +use vardiff_sim::grid::{AlgorithmSpec, Grid, VardiffBox}; +use vardiff_sim::metrics; + +use channels_sv2::vardiff::composed::{ + AcceleratingPartialRetarget, AsymmetricCusumBoundary, AsymmetricPoissonCI, Boundary, Composed, + EstimatorSnapshot, EwmaEstimator, PoissonCI, +}; + +/// Adaptive boundary using AsymmetricPoissonCI at low SPM, AsymmetricCUSUM at high SPM. +#[derive(Debug, Clone)] +struct AdaptiveAsymPoissonCusum { + poisson: AsymmetricPoissonCI, + cusum: AsymmetricCusumBoundary, + spm_threshold: u32, +} + +impl Boundary for AdaptiveAsymPoissonCusum { + fn threshold(&self, dt_secs: u64, shares_per_minute: f32, snap: &EstimatorSnapshot) -> f64 { + if (shares_per_minute as u32) < self.spm_threshold { + self.poisson.threshold(dt_secs, shares_per_minute, snap) + } else { + self.cusum.threshold(dt_secs, shares_per_minute, snap) + } + } + + fn code(&self) -> String { + format!( + "AdaptAsymPC-spm{}[{}|{}]", + self.spm_threshold, + self.poisson.code(), + self.cusum.code() + ) + } +} + +fn main() -> std::io::Result<()> { + let trial_count: usize = env::var("VARDIFF_SWEEP_TRIALS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(1000); + let base_seed: u64 = env::var("VARDIFF_SWEEP_SEED") + .ok() + .and_then(|s| { + s.strip_prefix("0x") + .and_then(|h| u64::from_str_radix(h, 16).ok()) + .or_else(|| s.parse().ok()) + }) + .unwrap_or(DEFAULT_BASELINE_SEED); + let out_dir = env::var("VARDIFF_SWEEP_OUT_DIR") + .map(PathBuf::from) + .unwrap_or_else(|_| PathBuf::from(".")); + + let tighten_multipliers = vec![1.0, 1.25, 1.5, 2.0, 2.5, 3.0]; + let eta_base = 0.2f32; + let eta_max = 0.4f32; + let acceleration = 0.2f32; + let spm_threshold = 10u32; + + let mut algorithms: Vec = Vec::new(); + + // Reference: current production (symmetric PoissonCI at low SPM) + algorithms.push(AlgorithmSpec::adaptive_boundary(spm_threshold)); + algorithms.push(AlgorithmSpec::full_remedy()); + + // Sweep: AsymmetricPoissonCI with varying tighten multipliers + for &tighten in &tighten_multipliers { + let name = format!("AsymPoisson-t{}", (tighten * 100.0) as u32); + algorithms.push(AlgorithmSpec::new(name, move |clock| { + let boundary = AdaptiveAsymPoissonCusum { + poisson: AsymmetricPoissonCI::new(2.576, 0.05, tighten), + cusum: AsymmetricCusumBoundary::new(1.5, 0.05, 3.0), + spm_threshold, + }; + let inner = Composed::new( + EwmaEstimator::new(120), + boundary, + AcceleratingPartialRetarget::new(eta_base, eta_max, acceleration), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + })); + } + + // Focus on low SPM where PoissonCI is active + let share_rates = vec![4.0, 6.0, 8.0, 10.0, 12.0, 15.0, 20.0, 30.0]; + + let mut scenarios = vec![Scenario::ColdStart, Scenario::Stable]; + for &d in &[-50i32, -25, -10, -5, 5, 10, 25, 50] { + scenarios.push(Scenario::Step { delta_pct: d }); + } + for &d in &[-50i32, -25, 25, 50] { + scenarios.push(Scenario::SettledStep { + settle_minutes: 60, + delta_pct: d, + }); + } + + let grid = Grid { + algorithms, + share_rates, + scenarios, + trial_count, + base_seed, + }; + + eprintln!( + "AsymmetricPoissonCI sweep: {} algorithms × {} cells × {} trials = {} total", + grid.algorithms.len(), + grid.share_rates.len() * grid.scenarios.len(), + trial_count, + grid.total_runs() * trial_count, + ); + + let started = Instant::now(); + let results = grid.run_paired(); + let elapsed = started.elapsed(); + eprintln!("Sweep complete in {:.1}s", elapsed.as_secs_f64()); + + fs::create_dir_all(&out_dir)?; + + // Compute fitness metrics + let derived_registry = metrics::derived_registry(); + let comp_fitness = derived_registry + .iter() + .find(|d| d.id() == "comprehensive_fitness") + .expect("ComprehensiveFitness not in registry"); + let op_fitness = derived_registry + .iter() + .find(|d| d.id() == "operational_fitness") + .expect("OperationalFitness not in registry"); + + // For each algorithm, compute fitness per SPM + let mut algo_fitness: Vec<(String, Vec<(u32, f64)>, Vec<(u32, f64)>)> = Vec::new(); + for (name, cells) in &results { + let comp = comp_fitness.compute(cells); + let ops = op_fitness.compute(cells); + let mut per_spm_comp: Vec<(u32, f64)> = Vec::new(); + let mut per_spm_ops: Vec<(u32, f64)> = Vec::new(); + for (spm, mv) in &comp { + if let Some(v) = mv.get("score") { + per_spm_comp.push((*spm as u32, v)); + } + } + for (spm, mv) in &ops { + if let Some(v) = mv.get("score") { + per_spm_ops.push((*spm as u32, v)); + } + } + per_spm_comp.sort_by_key(|(spm, _)| *spm); + per_spm_ops.sort_by_key(|(spm, _)| *spm); + algo_fitness.push((name.clone(), per_spm_comp, per_spm_ops)); + } + + // Sort by mean comprehensive fitness + algo_fitness.sort_by(|a, b| { + let avg_a: f64 = if a.1.is_empty() { + 0.0 + } else { + a.1.iter().map(|(_, v)| v).sum::() / a.1.len() as f64 + }; + let avg_b: f64 = if b.1.is_empty() { + 0.0 + } else { + b.1.iter().map(|(_, v)| v).sum::() / b.1.len() as f64 + }; + avg_b.partial_cmp(&avg_a).unwrap() + }); + + // Print report + let share_rates_u32: Vec = vec![4, 6, 8, 10, 12, 15, 20, 30]; + let mut report = String::new(); + report.push_str("# AsymmetricPoissonCI Sweep Results\n\n"); + report.push_str("## Comprehensive Fitness\n\n"); + report.push_str("| Algorithm | Avg |"); + for spm in &share_rates_u32 { + report.push_str(&format!(" {} |", spm)); + } + report.push_str("\n| --- | --- |"); + for _ in &share_rates_u32 { + report.push_str(" --- |"); + } + report.push('\n'); + + for (name, per_spm_comp, _) in &algo_fitness { + let avg: f64 = if per_spm_comp.is_empty() { + 0.0 + } else { + per_spm_comp.iter().map(|(_, v)| v).sum::() / per_spm_comp.len() as f64 + }; + report.push_str(&format!("| {} | {:.3} |", name, avg)); + for &target_spm in &share_rates_u32 { + match per_spm_comp.iter().find(|(s, _)| *s == target_spm) { + Some((_, v)) => report.push_str(&format!(" {:.3} |", v)), + None => report.push_str(" - |"), + } + } + report.push('\n'); + } + + report.push_str("\n## Operational Fitness\n\n"); + report.push_str("| Algorithm | Avg |"); + for spm in &share_rates_u32 { + report.push_str(&format!(" {} |", spm)); + } + report.push_str("\n| --- | --- |"); + for _ in &share_rates_u32 { + report.push_str(" --- |"); + } + report.push('\n'); + + for (name, _, per_spm_ops) in &algo_fitness { + let avg: f64 = if per_spm_ops.is_empty() { + 0.0 + } else { + per_spm_ops.iter().map(|(_, v)| v).sum::() / per_spm_ops.len() as f64 + }; + report.push_str(&format!("| {} | {:.3} |", name, avg)); + for &target_spm in &share_rates_u32 { + match per_spm_ops.iter().find(|(s, _)| *s == target_spm) { + Some((_, v)) => report.push_str(&format!(" {:.3} |", v)), + None => report.push_str(" - |"), + } + } + report.push('\n'); + } + + let out_path = out_dir.join("asymmetric_poisson_sweep.md"); + fs::write(&out_path, &report)?; + eprintln!("Report written to {}", out_path.display()); + print!("{}", report); + + Ok(()) +} diff --git a/sv2/channels-sv2/sim/src/bin/sweep-balanced.rs b/sv2/channels-sv2/sim/src/bin/sweep-balanced.rs new file mode 100644 index 0000000000..2beffbc0d0 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/sweep-balanced.rs @@ -0,0 +1,266 @@ +//! Maximin-scored parameter sweep targeting a *balanced* vardiff algorithm. +//! +//! The radar analysis showed every shipped algorithm has at least one weak +//! axis (≤0.45), with react−10% and convergence the universal graveyards. +//! This sweep searches the maximin leader family — EwmaEstimator + +//! AdaptivePoissonCusum + AcceleratingPartialRetarget — for a triple whose +//! WORST equal-weight axis is as high as possible (maximin), i.e. no big gap. +//! +//! Axes (all higher = better), from `EqualWeightFitness`: +//! react_10, react_50, jitter, step_safety, convergence, overshoot +//! +//! Score per algorithm = min over the 6 axes (averaged across share rates). +//! Output is ranked by that maximin score; ties broken by mean. +//! +//! ## Usage +//! ```text +//! cargo run --release --bin sweep-balanced +//! VARDIFF_SWEEP_TRIALS=300 cargo run --release --bin sweep-balanced +//! ``` +//! Env: VARDIFF_SWEEP_TRIALS (default 300), VARDIFF_SWEEP_SEED, +//! VARDIFF_SWEEP_OUT_DIR (default "."), writes `balanced_sweep.md`. + +use std::env; +use std::fs; +use std::path::PathBuf; +use std::time::Instant; + +use vardiff_sim::baseline::{Scenario, DEFAULT_BASELINE_SEED}; +use vardiff_sim::grid::{AlgorithmSpec, Grid, VardiffBox}; +use vardiff_sim::metrics::{DerivedMetric, EqualWeightFitness}; + +use channels_sv2::vardiff::composed::{ + AcceleratingPartialRetarget, AdaptivePoissonCusum, AsymmetricCusumBoundary, Composed, + EwmaEstimator, PoissonCI, +}; + +/// The six equal-weight axes in plot order, with display labels. +const AXES: &[(&str, &str)] = &[ + ("reaction_10", "react-10%"), + ("reaction_50", "react-50%"), + ("jitter", "jitter"), + ("step_safety", "step-safe"), + ("convergence", "conv"), + ("overshoot", "overshoot"), +]; + +/// A scored algorithm: name, the 6 per-axis means, maximin, and mean. +struct Profile { + name: String, + axes: [f64; 6], + maximin: f64, + mean: f64, +} + +fn main() -> std::io::Result<()> { + let trial_count: usize = env::var("VARDIFF_SWEEP_TRIALS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(300); + let base_seed: u64 = env::var("VARDIFF_SWEEP_SEED") + .ok() + .and_then(|s| { + s.strip_prefix("0x") + .and_then(|h| u64::from_str_radix(h, 16).ok()) + .or_else(|| s.parse().ok()) + }) + .unwrap_or(DEFAULT_BASELINE_SEED); + let out_dir = env::var("VARDIFF_SWEEP_OUT_DIR") + .map(PathBuf::from) + .unwrap_or_else(|_| PathBuf::from(".")); + + // Search space, centered on the maximin leader family. Lower τ and lower + // CUSUM sensitivity push react−10% / convergence up; tighten and η_max + // trade against jitter / overshoot. + let taus = [60u64, 75, 90, 105, 120]; + let sensitivities = [1.0f64, 1.5, 2.0]; + let tightens = [2.0f64, 3.0]; + let transitions = [8u32, 10, 12]; + let eta_bases = [0.2f32, 0.3]; + let eta_maxes = [0.4f32, 0.6]; + let acceleration = 0.2f32; + + let mut algorithms: Vec = Vec::new(); + + // Reference points so the sweep table is anchored against known algos. + algorithms.push(AlgorithmSpec::full_remedy()); + algorithms.push(AlgorithmSpec::classic_vardiff_state()); + algorithms.push(AlgorithmSpec::adaptive_boundary(10)); + + for &tau in &taus { + for &sens in &sensitivities { + for &tighten in &tightens { + for &trans in &transitions { + for &eb in &eta_bases { + for &em in &eta_maxes { + if em < eb { + continue; // η_max below η_base is degenerate + } + // Derive the name from the parts so it can't drift. + let name = vardiff_sim::naming::triple_name( + &EwmaEstimator::new(tau), + &AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(sens, 0.05, tighten), + trans, + ), + &AcceleratingPartialRetarget::new(eb, em, acceleration), + ); + algorithms.push(AlgorithmSpec::new(name, move |clock| { + let boundary = AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(sens, 0.05, tighten), + trans, + ); + let inner = Composed::new( + EwmaEstimator::new(tau), + boundary, + AcceleratingPartialRetarget::new(eb, em, acceleration), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + })); + } + } + } + } + } + } + + // Scenarios required by EqualWeightFitness: ColdStart (convergence, + // overshoot), Stable (jitter, step magnitude), Step −10% and −50%. + let scenarios = vec![ + Scenario::ColdStart, + Scenario::Stable, + Scenario::Step { delta_pct: -10 }, + Scenario::Step { delta_pct: -50 }, + ]; + + let grid = Grid { + algorithms, + share_rates: vec![4.0, 6.0, 8.0, 10.0, 12.0, 15.0, 20.0, 30.0], + scenarios, + trial_count, + base_seed, + }; + + eprintln!( + "Sweeping {} algorithms × {} cells × {} trials = {} total trials", + grid.algorithms.len(), + grid.share_rates.len() * grid.scenarios.len(), + trial_count, + grid.total_runs() * trial_count, + ); + let started = Instant::now(); + let results = grid.run(); + eprintln!("Sweep complete in {:.1}s", started.elapsed().as_secs_f64()); + + // Score every algorithm: average each axis across share rates, then take + // the min (maximin) and mean. + let metric = EqualWeightFitness; + let mut profiles: Vec = Vec::new(); + for (name, cells) in &results { + let computed = metric.compute(cells); + let mut sums = [0.0f64; 6]; + let mut count = 0u32; + for (_spm, mv) in &computed { + for (i, (key, _)) in AXES.iter().enumerate() { + sums[i] += mv.get(key).unwrap_or(0.0); + } + count += 1; + } + if count == 0 { + continue; + } + let axes: [f64; 6] = std::array::from_fn(|i| sums[i] / count as f64); + let maximin = axes.iter().cloned().fold(f64::INFINITY, f64::min); + let mean = axes.iter().sum::() / 6.0; + profiles.push(Profile { + name: name.clone(), + axes, + maximin, + mean, + }); + } + + // Rank by maximin desc, then mean desc. + profiles.sort_by(|a, b| { + b.maximin + .partial_cmp(&a.maximin) + .unwrap() + .then(b.mean.partial_cmp(&a.mean).unwrap()) + }); + + // Best-in-class hull and per-axis leaders. + let hull: [f64; 6] = std::array::from_fn(|i| { + profiles.iter().map(|p| p.axes[i]).fold(0.0_f64, f64::max) + }); + + let mut md = String::new(); + md.push_str("# Balanced (maximin) vardiff sweep\n\n"); + md.push_str(&format!( + "{} configs, {} trials/cell, seed `{:#x}`. Ranked by **min axis** \ + (maximin) — highest worst-axis first. All axes higher = better.\n\n", + profiles.len(), + trial_count, + base_seed, + )); + md.push_str("| # | Algorithm | react-10% | react-50% | jitter | step-safe | conv | overshoot | **min** | mean |\n"); + md.push_str("| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n"); + for (rank, p) in profiles.iter().enumerate().take(30) { + // Mark the worst axis with underscores so the gap is findable. + let worst_i = p + .axes + .iter() + .enumerate() + .min_by(|a, b| a.1.partial_cmp(b.1).unwrap()) + .map(|(i, _)| i) + .unwrap(); + let cell = |i: usize| { + if i == worst_i { + format!("_{:.3}_", p.axes[i]) + } else { + format!("{:.3}", p.axes[i]) + } + }; + md.push_str(&format!( + "| {} | {} | {} | {} | {} | {} | {} | {} | **{:.3}** | {:.3} |\n", + rank + 1, + p.name, + cell(0), + cell(1), + cell(2), + cell(3), + cell(4), + cell(5), + p.maximin, + p.mean, + )); + } + md.push_str(&format!( + "| | **best-in-class** | {:.3} | {:.3} | {:.3} | {:.3} | {:.3} | {:.3} | | |\n", + hull[0], hull[1], hull[2], hull[3], hull[4], hull[5], + )); + + let path = out_dir.join("balanced_sweep.md"); + fs::create_dir_all(&out_dir)?; + fs::write(&path, &md)?; + + // Echo the top 10 to stderr for immediate inspection. + eprintln!("\nTop 10 by maximin:\n"); + eprintln!("| rank | min | mean | algorithm |"); + eprintln!("| --- | --- | --- | --- |"); + for (rank, p) in profiles.iter().enumerate().take(10) { + eprintln!( + "| {} | {:.3} | {:.3} | {} |", + rank + 1, + p.maximin, + p.mean, + p.name + ); + } + eprintln!("\nBest-in-class hull: {:?}", hull.map(|v| (v * 1000.0).round() / 1000.0)); + eprintln!("\nWrote {}", path.display()); + Ok(()) +} diff --git a/sv2/channels-sv2/sim/src/bin/sweep-bayesian-ci.rs b/sv2/channels-sv2/sim/src/bin/sweep-bayesian-ci.rs new file mode 100644 index 0000000000..520ba8e2cd --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/sweep-bayesian-ci.rs @@ -0,0 +1,319 @@ +//! Bayesian + CredibleIntervalBoundary sweep. Explores the parameter +//! space of the uncertainty-aware composition to find configurations +//! that match or beat FullRemedy. +//! +//! ## Usage +//! +//! ```text +//! cargo run --release --bin sweep-bayesian-ci +//! ``` +//! +//! ## Strategy +//! +//! Sweeps (discount, prior_shares, ci_z, eta) with FullRemedy as reference. +//! The CI boundary adapts to the estimator's reported uncertainty, so the +//! key parameters are: +//! - discount: controls how fast the posterior adapts (lower = faster) +//! - prior_shares: controls post-fire confidence (lower = more uncertain after fire) +//! - ci_z: how many σ required to fire (lower = more sensitive) +//! - eta: PartialRetarget damping + +use std::collections::HashMap; +use std::env; +use std::fs; +use std::path::PathBuf; +use std::time::Instant; + +use vardiff_sim::baseline::{CellResult, Scenario, DEFAULT_BASELINE_SEED, DEFAULT_TRIAL_COUNT}; +use vardiff_sim::grid::{AlgorithmSpec, Grid}; +use vardiff_sim::metrics::{DecouplingScore, DerivedMetric}; + +fn main() -> std::io::Result<()> { + let trial_count = env_or("VARDIFF_BCI_TRIALS", DEFAULT_TRIAL_COUNT); + let base_seed = env_or_seed("VARDIFF_BCI_SEED", DEFAULT_BASELINE_SEED); + let out_dir = env::var("VARDIFF_BCI_OUT_DIR") + .map(PathBuf::from) + .unwrap_or_else(|_| PathBuf::from(".")); + + let mut scenarios = vec![Scenario::ColdStart, Scenario::Stable]; + for &d in &[-50i32, -25, -10, -5, 5, 10, 25, 50] { + scenarios.push(Scenario::Step { delta_pct: d }); + } + let share_rates = vec![6.0, 8.0, 10.0, 12.0, 15.0, 20.0, 25.0, 30.0]; + + // Sweep: (discount, ci_z, eta) with fixed prior=4.0 + let discounts = vec![0.70, 0.85, 0.90, 0.95]; + let ci_zs = vec![1.5, 1.96, 2.5, 3.0]; + let etas: Vec = vec![0.2, 0.3, 0.5]; + let prior = 4.0; + + let mut algorithms: Vec = Vec::new(); + for &d in &discounts { + for &z in &ci_zs { + for &eta in &etas { + algorithms.push(AlgorithmSpec::bayesian_ci(d, prior, z, eta)); + } + } + } + algorithms.push(AlgorithmSpec::full_remedy()); + + let grid = Grid { + algorithms, + share_rates: share_rates.clone(), + scenarios, + trial_count, + base_seed, + }; + + eprintln!( + "BayesianCI sweep: {} configs + FullRemedy, {} cells × {} trials = {} total", + discounts.len() * ci_zs.len() * etas.len(), + grid.share_rates.len() * grid.scenarios.len(), + trial_count, + grid.total_runs() * trial_count, + ); + + let started = Instant::now(); + let results = grid.run_paired(); + eprintln!( + "Sweep complete in {:.2}s\n", + started.elapsed().as_secs_f64() + ); + + fs::create_dir_all(&out_dir)?; + let out_path = out_dir.join("bayesian_ci_sweep.md"); + + let report = build_report( + &discounts, + &ci_zs, + &etas, + prior, + &share_rates, + &results, + trial_count, + base_seed, + ); + fs::write(&out_path, &report)?; + eprintln!("Wrote {}", out_path.display()); + + Ok(()) +} + +fn build_report( + discounts: &[f64], + ci_zs: &[f64], + etas: &[f32], + prior: f64, + share_rates: &[f32], + results: &HashMap>, + trial_count: usize, + base_seed: u64, +) -> String { + let mut out = String::new(); + out.push_str(&format!( + "# BayesianCI sweep ({} trials/cell, base_seed = {:#x})\n\n", + trial_count, base_seed + )); + out.push_str(&format!( + "Bayesian estimator + CredibleIntervalBoundary. Fixed prior={}.\n\n", + prior + )); + + // Find top configurations by decoupling score at SPM=6 (hardest case) + let mut scored: Vec<(String, f64)> = Vec::new(); + for (name, cells) in results.iter() { + if name == "FullRemedy" { + continue; + } + let ds = DecouplingScore.compute(cells); + if let Some((_, mv)) = ds.iter().find(|(s, _)| *s == 6.0) { + if let Some(score) = mv.get("score") { + scored.push((name.clone(), score)); + } + } + } + scored.sort_by(|a, b| b.1.partial_cmp(&a.1).unwrap_or(std::cmp::Ordering::Equal)); + + out.push_str("## Top 10 configurations by decoupling score at SPM=6\n\n"); + out.push_str("| Rank | Algorithm | SPM=6 | SPM=12 | SPM=30 | SPM=60 | SPM=120 |\n"); + out.push_str("| --- | --- | --- | --- | --- | --- | --- |\n"); + + let top_n = scored.iter().take(10).collect::>(); + for (rank, (name, _)) in top_n.iter().enumerate() { + out.push_str(&format!("| {} | {} |", rank + 1, name)); + for &spm in share_rates { + let s = get_decoupling(results, name, spm); + out.push_str(&match s { + Some(v) => format!(" {:.3} |", v), + None => " — |".to_string(), + }); + } + out.push('\n'); + } + // Add FullRemedy reference row + out.push_str("| ref | **FullRemedy** |"); + for &spm in share_rates { + let s = get_decoupling(results, "FullRemedy", spm); + out.push_str(&match s { + Some(v) => format!(" **{:.3}** |", v), + None => " — |".to_string(), + }); + } + out.push_str("\n\n"); + + // Detailed metrics for top 5 + out.push_str("## Detailed metrics for top 5\n\n"); + for (rank, (name, _)) in top_n.iter().take(5).enumerate() { + out.push_str(&format!("### #{} — `{}`\n\n", rank + 1, name)); + + out.push_str("| SPM | Decoupling | Reaction -50% | Jitter | Convergence | Overshoot p99 | Settled p50 |\n"); + out.push_str("| --- | --- | --- | --- | --- | --- | --- |\n"); + for &spm in share_rates { + let dc = get_decoupling(results, name, spm); + let rr = get_metric( + results, + name, + spm, + "step_minus_50_at_15min", + "reaction_rate", + ); + let jt = get_metric(results, name, spm, "stable_1ph", "jitter_mean_per_min"); + let cv = get_metric( + results, + name, + spm, + "cold_start_10gh_to_1ph", + "convergence_rate", + ); + let ov = get_metric( + results, + name, + spm, + "cold_start_10gh_to_1ph", + "ramp_target_overshoot_p99", + ); + let sa = get_metric(results, name, spm, "stable_1ph", "settled_accuracy_p50"); + out.push_str(&format!( + "| {} | {} | {} | {} | {} | {} | {} |\n", + spm as u32, + fmt_opt3(dc), + fmt_opt3(rr), + fmt_opt3(jt), + fmt_pct(cv), + fmt_pct(ov), + fmt_pct(sa), + )); + } + out.push('\n'); + } + + // FullRemedy reference + out.push_str("### Reference — `FullRemedy`\n\n"); + out.push_str("| SPM | Decoupling | Reaction -50% | Jitter | Convergence | Overshoot p99 | Settled p50 |\n"); + out.push_str("| --- | --- | --- | --- | --- | --- | --- |\n"); + for &spm in share_rates { + let dc = get_decoupling(results, "FullRemedy", spm); + let rr = get_metric( + results, + "FullRemedy", + spm, + "step_minus_50_at_15min", + "reaction_rate", + ); + let jt = get_metric( + results, + "FullRemedy", + spm, + "stable_1ph", + "jitter_mean_per_min", + ); + let cv = get_metric( + results, + "FullRemedy", + spm, + "cold_start_10gh_to_1ph", + "convergence_rate", + ); + let ov = get_metric( + results, + "FullRemedy", + spm, + "cold_start_10gh_to_1ph", + "ramp_target_overshoot_p99", + ); + let sa = get_metric( + results, + "FullRemedy", + spm, + "stable_1ph", + "settled_accuracy_p50", + ); + out.push_str(&format!( + "| {} | {} | {} | {} | {} | {} | {} |\n", + spm as u32, + fmt_opt3(dc), + fmt_opt3(rr), + fmt_opt3(jt), + fmt_pct(cv), + fmt_pct(ov), + fmt_pct(sa), + )); + } + out.push('\n'); + + out +} + +fn get_decoupling(results: &HashMap>, name: &str, spm: f32) -> Option { + let cells = results.get(name)?; + let scored = DecouplingScore.compute(cells); + scored + .iter() + .find(|(s, _)| *s == spm) + .and_then(|(_, mv)| mv.get("score")) +} + +fn get_metric( + results: &HashMap>, + name: &str, + spm: f32, + scenario: &str, + key: &str, +) -> Option { + results + .get(name)? + .iter() + .find(|c| c.shares_per_minute == spm && c.scenario_key() == scenario) + .and_then(|c| c.get(key)) +} + +fn fmt_opt3(v: Option) -> String { + match v { + Some(x) => format!("{:.3}", x), + None => "—".to_string(), + } +} + +fn fmt_pct(v: Option) -> String { + match v { + Some(x) => format!("{:.1}%", x * 100.0), + None => "—".to_string(), + } +} + +fn env_or(var: &str, default: T) -> T { + env::var(var) + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(default) +} + +fn env_or_seed(var: &str, default: u64) -> u64 { + if let Ok(s) = env::var(var) { + if let Some(hex) = s.strip_prefix("0x").or_else(|| s.strip_prefix("0X")) { + return u64::from_str_radix(hex, 16).unwrap_or(default); + } + return s.parse().unwrap_or(default); + } + default +} diff --git a/sv2/channels-sv2/sim/src/bin/sweep-bayesian.rs b/sv2/channels-sv2/sim/src/bin/sweep-bayesian.rs new file mode 100644 index 0000000000..6d61beb23f --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/sweep-bayesian.rs @@ -0,0 +1,576 @@ +//! Bayesian Gamma-Poisson discount-factor sweep. Explores the +//! (discount, prior_shares, eta, z) parameter space to find the +//! Pareto-optimal composition for the Bayesian estimator. +//! +//! ## Usage +//! +//! ```text +//! cargo run --release --bin sweep-bayesian +//! ``` +//! +//! Output: `bayesian_sweep.md` in the current directory. +//! +//! ## Environment +//! +//! - `VARDIFF_BAYES_TRIALS` — trials per cell (default 1000). +//! - `VARDIFF_BAYES_SEED` — base seed (default `0xDEAD_BEEF_CAFE_F00D`). +//! - `VARDIFF_BAYES_OUT_DIR` — output directory (default `.`). +//! +//! ## Strategy +//! +//! The sweep explores three dimensions sequentially: +//! +//! 1. **Discount factor** (with fixed eta=0.2, z=2.576, prior=4.0): +//! Tests the fundamental memory/responsiveness trade-off. +//! +//! 2. **Prior strength** (with best discount from step 1): +//! Tests initial uncertainty sensitivity. +//! +//! 3. **Joint (discount, eta)** at fixed z=2.576: +//! Tests whether Bayesian smoothness allows more aggressive updates. +//! +//! The output includes FullRemedy as a reference column for direct +//! comparison. + +use std::collections::HashMap; +use std::env; +use std::fs; +use std::path::PathBuf; +use std::time::Instant; + +use vardiff_sim::baseline::{CellResult, Scenario, DEFAULT_BASELINE_SEED, DEFAULT_TRIAL_COUNT}; +use vardiff_sim::grid::{AlgorithmSpec, Grid}; +use vardiff_sim::metrics::{DecouplingScore, DerivedMetric}; + +fn main() -> std::io::Result<()> { + let trial_count = env_or("VARDIFF_BAYES_TRIALS", DEFAULT_TRIAL_COUNT); + let base_seed = env_or_seed("VARDIFF_BAYES_SEED", DEFAULT_BASELINE_SEED); + let out_dir = env::var("VARDIFF_BAYES_OUT_DIR") + .map(PathBuf::from) + .unwrap_or_else(|_| PathBuf::from(".")); + + let mut scenarios = vec![Scenario::ColdStart, Scenario::Stable]; + for &d in &[-50i32, -25, -10, -5, 5, 10, 25, 50] { + scenarios.push(Scenario::Step { delta_pct: d }); + } + let share_rates = vec![6.0, 8.0, 10.0, 12.0, 15.0, 20.0, 25.0, 30.0]; + + // ==================================================================== + // Phase 1: Discount factor sweep (fixed eta=0.2, z=2.576, prior=0.5) + // Using very low prior so the model adapts fast after reset. + // ==================================================================== + let discounts = vec![0.50, 0.70, 0.85, 0.90, 0.95, 0.99]; + let fixed_prior = 0.5; + let fixed_eta = 0.2f32; + let fixed_z = 2.576; + + let mut algorithms: Vec = discounts + .iter() + .map(|&d| AlgorithmSpec::bayesian(d, fixed_prior, fixed_eta, fixed_z)) + .collect(); + // Add FullRemedy as reference + algorithms.push(AlgorithmSpec::full_remedy()); + + let grid = Grid { + algorithms, + share_rates: share_rates.clone(), + scenarios: scenarios.clone(), + trial_count, + base_seed, + }; + + eprintln!( + "Phase 1: Discount sweep ({} configs + FullRemedy) × {} cells × {} trials", + discounts.len(), + grid.share_rates.len() * grid.scenarios.len(), + trial_count, + ); + + let started = Instant::now(); + let results_phase1 = grid.run_paired(); + eprintln!( + "Phase 1 complete in {:.2}s\n", + started.elapsed().as_secs_f64() + ); + + // ==================================================================== + // Phase 2: Prior strength sweep (with discount=0.85 from phase 1) + // ==================================================================== + let priors = vec![0.1, 0.5, 1.0, 2.0, 4.0]; + let best_discount = 0.85; + + let mut algorithms: Vec = priors + .iter() + .map(|&p| AlgorithmSpec::bayesian(best_discount, p, fixed_eta, fixed_z)) + .collect(); + algorithms.push(AlgorithmSpec::full_remedy()); + + let grid = Grid { + algorithms, + share_rates: share_rates.clone(), + scenarios: scenarios.clone(), + trial_count, + base_seed, + }; + + eprintln!( + "Phase 2: Prior sweep ({} configs + FullRemedy) × {} cells × {} trials", + priors.len(), + grid.share_rates.len() * grid.scenarios.len(), + trial_count, + ); + + let started = Instant::now(); + let results_phase2 = grid.run_paired(); + eprintln!( + "Phase 2 complete in {:.2}s\n", + started.elapsed().as_secs_f64() + ); + + // ==================================================================== + // Phase 3: Joint (discount, eta) sweep + // ==================================================================== + let etas: Vec = vec![0.2, 0.3, 0.5, 0.7, 1.0]; + let discounts_joint = vec![0.50, 0.70, 0.85]; + + let mut algorithms: Vec = Vec::new(); + for &d in &discounts_joint { + for &eta in &etas { + algorithms.push(AlgorithmSpec::bayesian(d, fixed_prior, eta, fixed_z)); + } + } + algorithms.push(AlgorithmSpec::full_remedy()); + + let grid = Grid { + algorithms, + share_rates: share_rates.clone(), + scenarios: scenarios.clone(), + trial_count, + base_seed, + }; + + eprintln!( + "Phase 3: Joint (discount, eta) sweep ({} configs + FullRemedy) × {} cells × {} trials", + discounts_joint.len() * etas.len(), + grid.share_rates.len() * grid.scenarios.len(), + trial_count, + ); + + let started = Instant::now(); + let results_phase3 = grid.run_paired(); + eprintln!( + "Phase 3 complete in {:.2}s\n", + started.elapsed().as_secs_f64() + ); + + // ==================================================================== + // Build report + // ==================================================================== + fs::create_dir_all(&out_dir)?; + let out_path = out_dir.join("bayesian_sweep.md"); + + let report = build_report( + &discounts, + &priors, + &discounts_joint, + &etas, + &share_rates, + &results_phase1, + &results_phase2, + &results_phase3, + trial_count, + base_seed, + ); + fs::write(&out_path, &report)?; + eprintln!("Wrote {}", out_path.display()); + + Ok(()) +} + +fn build_report( + discounts: &[f64], + priors: &[f64], + discounts_joint: &[f64], + etas: &[f32], + share_rates: &[f32], + results_phase1: &HashMap>, + results_phase2: &HashMap>, + results_phase3: &HashMap>, + trial_count: usize, + base_seed: u64, +) -> String { + let mut out = String::new(); + out.push_str(&format!( + "# Bayesian Gamma-Poisson sweep ({} trials/cell, base_seed = {:#x})\n\n", + trial_count, base_seed + )); + out.push_str( + "Explores the Bayesian estimator's parameter space. The Bayesian model \ + maintains a Gamma posterior over the hashrate ratio, updated with \ + exponential discounting each tick. Lower discount = faster adaptation \ + but more noise.\n\n", + ); + + // ---- Phase 1: Discount sweep ---- + out.push_str("## Phase 1: Discount factor sweep\n\n"); + out.push_str( + "Fixed: prior_shares=0.5, eta=0.2, z=2.576. FullRemedy (EWMA τ=120s) for reference.\n\n", + ); + + // Decoupling score + out.push_str("### Decoupling score (higher = better)\n\n"); + emit_header_with_ref(&mut out, discounts, "d"); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &d in discounts { + let name = bayes_name(d, 0.5, 0.2, 2.576); + let score = get_decoupling(results_phase1, &name, spm); + out.push_str(&fmt_opt(score)); + } + let fr_score = get_decoupling(results_phase1, "FullRemedy", spm); + out.push_str(&fmt_opt(fr_score)); + out.push('\n'); + } + out.push('\n'); + + // Reaction rate -50% + out.push_str("### Reaction rate at −50% step (higher = better)\n\n"); + emit_header_with_ref(&mut out, discounts, "d"); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &d in discounts { + let name = bayes_name(d, 0.5, 0.2, 2.576); + let v = get_metric( + results_phase1, + &name, + spm, + "step_minus_50_at_15min", + "reaction_rate", + ); + out.push_str(&fmt_opt(v)); + } + let v = get_metric( + results_phase1, + "FullRemedy", + spm, + "step_minus_50_at_15min", + "reaction_rate", + ); + out.push_str(&fmt_opt(v)); + out.push('\n'); + } + out.push('\n'); + + // Jitter + out.push_str("### Stable-load jitter mean (lower = better)\n\n"); + emit_header_with_ref(&mut out, discounts, "d"); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &d in discounts { + let name = bayes_name(d, 0.5, 0.2, 2.576); + let v = get_metric( + results_phase1, + &name, + spm, + "stable_1ph", + "jitter_mean_per_min", + ); + out.push_str(&fmt_opt(v)); + } + let v = get_metric( + results_phase1, + "FullRemedy", + spm, + "stable_1ph", + "jitter_mean_per_min", + ); + out.push_str(&fmt_opt(v)); + out.push('\n'); + } + out.push('\n'); + + // Settled accuracy + out.push_str("### Settled accuracy p50 (lower = better)\n\n"); + emit_header_with_ref(&mut out, discounts, "d"); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &d in discounts { + let name = bayes_name(d, 0.5, 0.2, 2.576); + let v = get_metric( + results_phase1, + &name, + spm, + "stable_1ph", + "settled_accuracy_p50", + ); + out.push_str(&fmt_opt_pct(v)); + } + let v = get_metric( + results_phase1, + "FullRemedy", + spm, + "stable_1ph", + "settled_accuracy_p50", + ); + out.push_str(&fmt_opt_pct(v)); + out.push('\n'); + } + out.push('\n'); + + // Cold-start convergence + out.push_str("### Cold-start convergence rate (higher = better)\n\n"); + emit_header_with_ref(&mut out, discounts, "d"); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &d in discounts { + let name = bayes_name(d, 0.5, 0.2, 2.576); + let v = get_metric( + results_phase1, + &name, + spm, + "cold_start_10gh_to_1ph", + "convergence_rate", + ); + out.push_str(&fmt_opt_pct(v)); + } + let v = get_metric( + results_phase1, + "FullRemedy", + spm, + "cold_start_10gh_to_1ph", + "convergence_rate", + ); + out.push_str(&fmt_opt_pct(v)); + out.push('\n'); + } + out.push('\n'); + + // Ramp overshoot p99 + out.push_str("### Ramp target overshoot p99 — cold start (lower = better)\n\n"); + emit_header_with_ref(&mut out, discounts, "d"); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &d in discounts { + let name = bayes_name(d, 0.5, 0.2, 2.576); + let v = get_metric( + results_phase1, + &name, + spm, + "cold_start_10gh_to_1ph", + "ramp_target_overshoot_p99", + ); + out.push_str(&fmt_opt_pct(v)); + } + let v = get_metric( + results_phase1, + "FullRemedy", + spm, + "cold_start_10gh_to_1ph", + "ramp_target_overshoot_p99", + ); + out.push_str(&fmt_opt_pct(v)); + out.push('\n'); + } + out.push('\n'); + + // ---- Phase 2: Prior sweep ---- + out.push_str("## Phase 2: Prior strength sweep (discount=0.95)\n\n"); + out.push_str("Fixed: discount=0.85, eta=0.2, z=2.576.\n\n"); + + out.push_str("### Decoupling score\n\n"); + emit_header_priors(&mut out, priors); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &p in priors { + let name = bayes_name(0.95, p, 0.2, 2.576); + let score = get_decoupling(results_phase2, &name, spm); + out.push_str(&fmt_opt(score)); + } + let fr_score = get_decoupling(results_phase2, "FullRemedy", spm); + out.push_str(&fmt_opt(fr_score)); + out.push('\n'); + } + out.push('\n'); + + out.push_str("### Reaction rate at −50% step\n\n"); + emit_header_priors(&mut out, priors); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &p in priors { + let name = bayes_name(0.95, p, 0.2, 2.576); + let v = get_metric( + results_phase2, + &name, + spm, + "step_minus_50_at_15min", + "reaction_rate", + ); + out.push_str(&fmt_opt(v)); + } + let v = get_metric( + results_phase2, + "FullRemedy", + spm, + "step_minus_50_at_15min", + "reaction_rate", + ); + out.push_str(&fmt_opt(v)); + out.push('\n'); + } + out.push('\n'); + + // ---- Phase 3: Joint (discount, eta) ---- + out.push_str("## Phase 3: Joint (discount × eta) sweep\n\n"); + out.push_str("Fixed: prior=0.5, z=2.576. Each cell is decoupling score.\n\n"); + + for &d in discounts_joint { + out.push_str(&format!("### discount = {:.2}\n\n", d)); + out.push_str("| SPM |"); + for &eta in etas { + out.push_str(&format!(" η={:.1} |", eta)); + } + out.push_str(" FullRemedy |\n| ---"); + for _ in etas { + out.push_str(" | ---"); + } + out.push_str(" | --- |\n"); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &eta in etas { + let name = bayes_name(d, 0.5, eta, 2.576); + let score = get_decoupling(results_phase3, &name, spm); + out.push_str(&fmt_opt(score)); + } + let fr_score = get_decoupling(results_phase3, "FullRemedy", spm); + out.push_str(&fmt_opt(fr_score)); + out.push('\n'); + } + out.push('\n'); + + // Reaction rate for this discount + out.push_str(&format!("#### Reaction rate at −50% (d={:.2})\n\n", d)); + out.push_str("| SPM |"); + for &eta in etas { + out.push_str(&format!(" η={:.1} |", eta)); + } + out.push_str(" FullRemedy |\n| ---"); + for _ in etas { + out.push_str(" | ---"); + } + out.push_str(" | --- |\n"); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &eta in etas { + let name = bayes_name(d, 0.5, eta, 2.576); + let v = get_metric( + results_phase3, + &name, + spm, + "step_minus_50_at_15min", + "reaction_rate", + ); + out.push_str(&fmt_opt(v)); + } + let v = get_metric( + results_phase3, + "FullRemedy", + spm, + "step_minus_50_at_15min", + "reaction_rate", + ); + out.push_str(&fmt_opt(v)); + out.push('\n'); + } + out.push('\n'); + } + + out +} + +fn bayes_name(discount: f64, prior: f64, eta: f32, z: f64) -> String { + format!( + "Bayesian-d{}-p{}-eta{}-z{}", + (discount * 1000.0).round() as u32, + (prior * 10.0).round() as u32, + (eta * 100.0).round() as u32, + (z * 1000.0).round() as u32, + ) +} + +fn get_decoupling(results: &HashMap>, name: &str, spm: f32) -> Option { + let cells = results.get(name)?; + let scored = DecouplingScore.compute(cells); + scored + .iter() + .find(|(s, _)| *s == spm) + .and_then(|(_, mv)| mv.get("score")) +} + +fn get_metric( + results: &HashMap>, + name: &str, + spm: f32, + scenario_key: &str, + metric_key: &str, +) -> Option { + results + .get(name)? + .iter() + .find(|c| c.shares_per_minute == spm && c.scenario_key() == scenario_key) + .and_then(|c| c.get(metric_key)) +} + +fn fmt_opt(v: Option) -> String { + match v { + Some(x) => format!(" {:.3} |", x), + None => " — |".to_string(), + } +} + +fn fmt_opt_pct(v: Option) -> String { + match v { + Some(x) => format!(" {:.1}% |", x * 100.0), + None => " — |".to_string(), + } +} + +fn emit_header_with_ref(out: &mut String, discounts: &[f64], prefix: &str) { + out.push_str("| SPM |"); + for &d in discounts { + out.push_str(&format!(" {}={:.2} |", prefix, d)); + } + out.push_str(" FullRemedy |\n| ---"); + for _ in discounts { + out.push_str(" | ---"); + } + out.push_str(" | --- |\n"); +} + +fn emit_header_priors(out: &mut String, priors: &[f64]) { + out.push_str("| SPM |"); + for &p in priors { + out.push_str(&format!(" p={:.0} |", p)); + } + out.push_str(" FullRemedy |\n| ---"); + for _ in priors { + out.push_str(" | ---"); + } + out.push_str(" | --- |\n"); +} + +fn env_or(var: &str, default: T) -> T { + env::var(var) + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(default) +} + +fn env_or_seed(var: &str, default: u64) -> u64 { + if let Ok(s) = env::var(var) { + if let Some(hex) = s.strip_prefix("0x").or_else(|| s.strip_prefix("0X")) { + return u64::from_str_radix(hex, 16).unwrap_or(default); + } + return s.parse().unwrap_or(default); + } + default +} diff --git a/sv2/channels-sv2/sim/src/bin/sweep-estimators.rs b/sv2/channels-sv2/sim/src/bin/sweep-estimators.rs new file mode 100644 index 0000000000..053d96086b --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/sweep-estimators.rs @@ -0,0 +1,303 @@ +//! Maximin-scored sweep over ESTIMATOR FAMILIES to attack the react−10% wall. +//! +//! The balanced sweep (sweep-balanced) topped out at maximin ≈ 0.55 with +//! react−10% as the binding axis, using EWMA estimators. react−10% is hard +//! because detecting a small mean shift against Poisson noise needs either +//! more data (slower) or a looser boundary (more jitter). Uncertainty-aware +//! estimators (Kalman, Bayesian) may break that tradeoff: they can react +//! fast when confident and hold steady when not. +//! +//! This sweep pairs Kalman(q) and Bayesian(discount, prior) estimators with +//! the boundary/update that won the EWMA sweep (AdaptPC-spm8 with a sensitive +//! CUSUM + Accel update), and scores by maximin over the 6 equal-weight axes. +//! +//! ## Usage +//! ```text +//! cargo run --release --bin sweep-estimators +//! VARDIFF_SWEEP_TRIALS=300 cargo run --release --bin sweep-estimators +//! ``` +//! Writes `estimator_sweep.md`. + +use std::env; +use std::fs; +use std::path::PathBuf; +use std::time::Instant; + +use vardiff_sim::baseline::{Scenario, DEFAULT_BASELINE_SEED}; +use vardiff_sim::grid::{AlgorithmSpec, Grid, VardiffBox}; +use vardiff_sim::metrics::{DerivedMetric, EqualWeightFitness}; + +use channels_sv2::vardiff::composed::{ + AcceleratingPartialRetarget, AdaptivePoissonCusum, AsymmetricCusumBoundary, BayesianEstimator, + Composed, EwmaEstimator, KalmanEstimator, PoissonCI, +}; + +const AXES: &[(&str, &str)] = &[ + ("reaction_10", "react-10%"), + ("reaction_50", "react-50%"), + ("jitter", "jitter"), + ("step_safety", "step-safe"), + ("convergence", "conv"), + ("overshoot", "overshoot"), +]; + +struct Profile { + name: String, + axes: [f64; 6], + maximin: f64, + mean: f64, +} + +fn main() -> std::io::Result<()> { + let trial_count: usize = env::var("VARDIFF_SWEEP_TRIALS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(300); + let base_seed: u64 = env::var("VARDIFF_SWEEP_SEED") + .ok() + .and_then(|s| { + s.strip_prefix("0x") + .and_then(|h| u64::from_str_radix(h, 16).ok()) + .or_else(|| s.parse().ok()) + }) + .unwrap_or(DEFAULT_BASELINE_SEED); + let out_dir = env::var("VARDIFF_SWEEP_OUT_DIR") + .map(PathBuf::from) + .unwrap_or_else(|_| PathBuf::from(".")); + + // Winning boundary/update family from sweep-balanced: AdaptPC-spm8 with a + // sensitive CUSUM (s1, t3) and Accel(0.3, 0.6, 0.2). We vary the ESTIMATOR + // while holding these, plus a couple of boundary sensitivities since the + // estimator's noise profile may shift the optimal sensitivity. + let spm_threshold = 8u32; + let sensitivities = [1.0f64, 1.5]; + let tighten = 3.0f64; + let eta = (0.3f32, 0.6f32, 0.2f32); + + // Kalman process-noise q: 0.0002 (≈τ300s, smooth) → 0.01 (fast). + let kalman_qs = [0.0005f64, 0.001, 0.002, 0.005, 0.01]; + // Bayesian discount (forgetting) × prior strength. + let bayes_discounts = [0.90f64, 0.95, 0.98]; + let bayes_priors = [2.0f64, 5.0]; + + let mut algorithms: Vec = Vec::new(); + + // References: production + the EWMA balanced winner. + algorithms.push(AlgorithmSpec::classic_vardiff_state()); + algorithms.push(AlgorithmSpec::full_remedy()); + { + // The sweep-balanced winner, rebuilt here for head-to-head. + let name = vardiff_sim::naming::triple_name( + &EwmaEstimator::new(90), + &AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(1.0, 0.05, 3.0), + 8, + ), + &AcceleratingPartialRetarget::new(0.3, 0.6, 0.2), + ); + algorithms.push(AlgorithmSpec::new(name, move |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(90), + AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(1.0, 0.05, 3.0), + 8, + ), + AcceleratingPartialRetarget::new(0.3, 0.6, 0.2), + 1.0, + clock, + ))) + })); + } + + // Kalman family. + for &q in &kalman_qs { + for &sens in &sensitivities { + let name = vardiff_sim::naming::triple_name( + &KalmanEstimator::new(q), + &AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(sens, 0.05, tighten), + spm_threshold, + ), + &AcceleratingPartialRetarget::new(eta.0, eta.1, eta.2), + ); + algorithms.push(AlgorithmSpec::new(name, move |clock| { + VardiffBox(Box::new(Composed::new( + KalmanEstimator::new(q), + AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(sens, 0.05, tighten), + spm_threshold, + ), + AcceleratingPartialRetarget::new(eta.0, eta.1, eta.2), + 1.0, + clock, + ))) + })); + } + } + + // Bayesian family. + for &disc in &bayes_discounts { + for &prior in &bayes_priors { + for &sens in &sensitivities { + let name = vardiff_sim::naming::triple_name( + &BayesianEstimator::new(disc, prior), + &AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(sens, 0.05, tighten), + spm_threshold, + ), + &AcceleratingPartialRetarget::new(eta.0, eta.1, eta.2), + ); + algorithms.push(AlgorithmSpec::new(name, move |clock| { + VardiffBox(Box::new(Composed::new( + BayesianEstimator::new(disc, prior), + AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(sens, 0.05, tighten), + spm_threshold, + ), + AcceleratingPartialRetarget::new(eta.0, eta.1, eta.2), + 1.0, + clock, + ))) + })); + } + } + } + + let scenarios = vec![ + Scenario::ColdStart, + Scenario::Stable, + Scenario::Step { delta_pct: -10 }, + Scenario::Step { delta_pct: -50 }, + ]; + + let grid = Grid { + algorithms, + share_rates: vec![4.0, 6.0, 8.0, 10.0, 12.0, 15.0, 20.0, 30.0], + scenarios, + trial_count, + base_seed, + }; + + eprintln!( + "Sweeping {} algorithms × {} cells × {} trials", + grid.algorithms.len(), + grid.share_rates.len() * grid.scenarios.len(), + trial_count, + ); + let started = Instant::now(); + let results = grid.run(); + eprintln!("Sweep complete in {:.1}s", started.elapsed().as_secs_f64()); + + let metric = EqualWeightFitness; + let mut profiles: Vec = Vec::new(); + for (name, cells) in &results { + let computed = metric.compute(cells); + let mut sums = [0.0f64; 6]; + let mut count = 0u32; + for (_spm, mv) in &computed { + for (i, (key, _)) in AXES.iter().enumerate() { + sums[i] += mv.get(key).unwrap_or(0.0); + } + count += 1; + } + if count == 0 { + continue; + } + let axes: [f64; 6] = std::array::from_fn(|i| sums[i] / count as f64); + let maximin = axes.iter().cloned().fold(f64::INFINITY, f64::min); + let mean = axes.iter().sum::() / 6.0; + profiles.push(Profile { + name: name.clone(), + axes, + maximin, + mean, + }); + } + + profiles.sort_by(|a, b| { + b.maximin + .partial_cmp(&a.maximin) + .unwrap() + .then(b.mean.partial_cmp(&a.mean).unwrap()) + }); + + let hull: [f64; 6] = std::array::from_fn(|i| { + profiles.iter().map(|p| p.axes[i]).fold(0.0_f64, f64::max) + }); + + let mut md = String::new(); + md.push_str("# Estimator-family (maximin) sweep\n\n"); + md.push_str(&format!( + "{} configs, {} trials/cell, seed `{:#x}`. Kalman & Bayesian \ + estimators vs the EWMA balanced winner. Ranked by **min axis** \ + (maximin). All axes higher = better.\n\n", + profiles.len(), + trial_count, + base_seed, + )); + md.push_str("| # | Algorithm | react-10% | react-50% | jitter | step-safe | conv | overshoot | **min** | mean |\n"); + md.push_str("| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n"); + for (rank, p) in profiles.iter().enumerate() { + let worst_i = p + .axes + .iter() + .enumerate() + .min_by(|a, b| a.1.partial_cmp(b.1).unwrap()) + .map(|(i, _)| i) + .unwrap(); + let cell = |i: usize| { + if i == worst_i { + format!("_{:.3}_", p.axes[i]) + } else { + format!("{:.3}", p.axes[i]) + } + }; + md.push_str(&format!( + "| {} | {} | {} | {} | {} | {} | {} | {} | **{:.3}** | {:.3} |\n", + rank + 1, + p.name, + cell(0), + cell(1), + cell(2), + cell(3), + cell(4), + cell(5), + p.maximin, + p.mean, + )); + } + md.push_str(&format!( + "| | **best-in-class** | {:.3} | {:.3} | {:.3} | {:.3} | {:.3} | {:.3} | | |\n", + hull[0], hull[1], hull[2], hull[3], hull[4], hull[5], + )); + + let path = out_dir.join("estimator_sweep.md"); + fs::create_dir_all(&out_dir)?; + fs::write(&path, &md)?; + + eprintln!("\nTop 10 by maximin:\n"); + eprintln!("| rank | min | mean | react-10% | algorithm |"); + eprintln!("| --- | --- | --- | --- | --- |"); + for (rank, p) in profiles.iter().enumerate().take(10) { + eprintln!( + "| {} | {:.3} | {:.3} | {:.3} | {} |", + rank + 1, + p.maximin, + p.mean, + p.axes[0], + p.name + ); + } + eprintln!( + "\nreact-10% best-in-class: {:.3} (EWMA sweep wall was 0.674)", + hull[0] + ); + eprintln!("Wrote {}", path.display()); + Ok(()) +} diff --git a/sv2/channels-sv2/sim/src/bin/sweep-eta-z.rs b/sv2/channels-sv2/sim/src/bin/sweep-eta-z.rs new file mode 100644 index 0000000000..fb340f1f7a --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/sweep-eta-z.rs @@ -0,0 +1,434 @@ +//! Joint (η, z) sweep for the FullRemedy family. The independent +//! single-axis sweeps (`sweep-eta` and `sweep-z`) suggest that smaller +//! η and slightly higher z each Pareto-improve different metrics; this +//! binary characterizes their joint behavior to surface any cross-axis +//! coupling that the marginal sweeps would miss. +//! +//! Holds `EwmaEstimator(τ = 120s)` fixed (its sweep characterization +//! lives in `sweep-ewma-tau`) and varies η × z over a 3 × 3 grid: +//! +//! - η ∈ {0.1, 0.2, 0.3} +//! - z ∈ {2.576, 3.000, 3.500} +//! +//! ## Usage +//! +//! ```text +//! cargo run --release --bin sweep-eta-z +//! ``` +//! +//! Output: `eta_z_joint_sweep.md` in the current directory +//! (configurable via `VARDIFF_EZ_OUT_DIR`). Default sweep is 9 × 50 +//! cells × 1000 trials = 450,000 trials, ~3 minutes in release mode. +//! Reduce via `VARDIFF_EZ_TRIALS=100` for fast iteration. +//! +//! ## Environment +//! +//! - `VARDIFF_EZ_TRIALS` — trials per cell (default 1000). +//! - `VARDIFF_EZ_SEED` — base seed (default `0xDEAD_BEEF_CAFE_F00D`). +//! - `VARDIFF_EZ_OUT_DIR` — output directory (default `.`). +//! - `VARDIFF_EZ_ETAS` — comma-separated η values +//! (default `0.1,0.2,0.3`). +//! - `VARDIFF_EZ_Z_VALUES` — comma-separated z values +//! (default `2.576,3.0,3.5`). +//! +//! ## Paired vs un-paired +//! +//! Uses `Grid::run_paired` so cross-(η, z) metric differences are +//! attributable to the parameter change alone, not to seed disparity. + +use std::env; +use std::fs; +use std::path::PathBuf; +use std::time::Instant; + +use vardiff_sim::baseline::{Scenario, DEFAULT_BASELINE_SEED, DEFAULT_TRIAL_COUNT}; +use vardiff_sim::grid::{AlgorithmSpec, Grid}; +use vardiff_sim::metrics::{DecouplingScore, DerivedMetric}; + +const SWEEP_TAU_SECS: u64 = 120; + +fn main() -> std::io::Result<()> { + let trial_count = env_or("VARDIFF_EZ_TRIALS", DEFAULT_TRIAL_COUNT); + let base_seed = env_or_seed("VARDIFF_EZ_SEED", DEFAULT_BASELINE_SEED); + let out_dir = env::var("VARDIFF_EZ_OUT_DIR") + .map(PathBuf::from) + .unwrap_or_else(|_| PathBuf::from(".")); + let etas: Vec = env::var("VARDIFF_EZ_ETAS") + .ok() + .and_then(|s| { + let v: Vec = s.split(',').filter_map(|t| t.trim().parse().ok()).collect(); + if v.is_empty() { + None + } else { + Some(v) + } + }) + .unwrap_or_else(|| vec![0.1, 0.2, 0.3]); + let zs: Vec = env::var("VARDIFF_EZ_Z_VALUES") + .ok() + .and_then(|s| { + let v: Vec = s.split(',').filter_map(|t| t.trim().parse().ok()).collect(); + if v.is_empty() { + None + } else { + Some(v) + } + }) + .unwrap_or_else(|| vec![2.576, 3.0, 3.5]); + + let mut scenarios = vec![Scenario::ColdStart, Scenario::Stable]; + for &d in &[-50i32, -25, -10, -5, 5, 10, 25, 50] { + scenarios.push(Scenario::Step { delta_pct: d }); + } + + // Build the algorithm list as the Cartesian product (η × z). + let mut algorithms = Vec::new(); + for &eta in &etas { + for &z in &zs { + algorithms.push(AlgorithmSpec::full_remedy_with(SWEEP_TAU_SECS, eta, z)); + } + } + + let grid = Grid { + algorithms, + share_rates: vec![6.0, 8.0, 10.0, 12.0, 15.0, 20.0, 25.0, 30.0], + scenarios, + trial_count, + base_seed, + }; + + eprintln!( + "FullRemedy joint (η, z) sweep: η ∈ {{{}}} × z ∈ {{{}}} = {} algorithms × {} cells × {} trials = {} total trials, \ + τ={}s, base_seed = {:#x}", + etas.iter().map(|e| format!("{:.2}", e)).collect::>().join(", "), + zs.iter().map(|z| format!("{:.3}", z)).collect::>().join(", "), + etas.len() * zs.len(), + grid.share_rates.len() * grid.scenarios.len(), + trial_count, + grid.total_runs() * trial_count, + SWEEP_TAU_SECS, + base_seed, + ); + + let started = Instant::now(); + let results = grid.run_paired(); + eprintln!( + "Sweep complete in {:.2}s\n", + started.elapsed().as_secs_f64() + ); + + fs::create_dir_all(&out_dir)?; + let out_path = out_dir.join("eta_z_joint_sweep.md"); + + let report = build_report( + &etas, + &zs, + &grid.share_rates, + &results, + trial_count, + base_seed, + ); + fs::write(&out_path, &report)?; + eprintln!("Wrote {}", out_path.display()); + + Ok(()) +} + +fn algorithm_name(eta: f32, z: f64) -> String { + format!( + "FullRemedy-tau{}-eta{}-z{}", + SWEEP_TAU_SECS, + (eta * 100.0).round() as u32, + (z * 1000.0).round() as u32, + ) +} + +#[derive(Clone, Copy)] +enum Direction { + Higher, + Lower, +} + +#[derive(Clone, Copy)] +struct MetricSpec { + title: &'static str, + scenario_key: &'static str, + metric_key: &'static str, + direction: Direction, + format: ValueFormat, + description: &'static str, +} + +#[derive(Clone, Copy)] +enum ValueFormat { + Decimal3, + Percent1, + PerMin3, + Reaction2, +} + +impl ValueFormat { + fn fmt(&self, v: f64) -> String { + match self { + Self::Decimal3 => format!("{:.3}", v), + Self::Percent1 => format!("{:.1}%", v * 100.0), + Self::PerMin3 => format!("{:.3}", v), + Self::Reaction2 => format!("{:.2}", v), + } + } +} + +fn build_report( + etas: &[f32], + zs: &[f64], + share_rates: &[f32], + results: &std::collections::HashMap>, + trial_count: usize, + base_seed: u64, +) -> String { + let mut out = String::new(); + out.push_str(&format!( + "# FullRemedy joint (η, z) sweep ({} trials/cell, base_seed = {:#x})\n\n", + trial_count, base_seed + )); + out.push_str(&format!( + "Joint Pareto exploration of the PartialRetarget η and \ + PoissonCI z axes on the FullRemedy family. Holds \ + `EwmaEstimator(τ = {}s)` fixed and varies (η, z) over a {} × {} \ + grid. Each row in the per-metric tables is a share rate; each \ + column is one (η, z) point. The single-axis sweeps \ + (`eta_sweep.md`, `z_sweep.md`) characterize the marginal \ + effects; this report surfaces any cross-axis coupling — \ + specifically, whether the joint optimum differs from the \ + per-axis marginal optima.\n\n", + SWEEP_TAU_SECS, + etas.len(), + zs.len(), + )); + + // ---- Cross-axis metric tables ---- + let metrics = [ + MetricSpec { + title: "Decoupling score", + scenario_key: "", // computed via DecouplingScore::compute + metric_key: "score", + direction: Direction::Higher, + format: ValueFormat::Decimal3, + description: "`reaction_rate(Step−50) × clamp(1 − jitter_p50 / J_max, 0, 1)`, \ + J_max = 0.50 fires/min.", + }, + MetricSpec { + title: "Jitter mean (stable load)", + scenario_key: "stable_1ph", + metric_key: "jitter_mean_per_min", + direction: Direction::Lower, + format: ValueFormat::PerMin3, + description: "Fires per minute, post-convergence.", + }, + MetricSpec { + title: "Reaction rate at −50% step", + scenario_key: "step_minus_50_at_15min", + metric_key: "reaction_rate", + direction: Direction::Higher, + format: ValueFormat::Reaction2, + description: + "Fraction of trials that fire within 5 min of a 50% drop in true hashrate.", + }, + MetricSpec { + title: "Reaction rate at −10% step", + scenario_key: "step_minus_10_at_15min", + metric_key: "reaction_rate", + direction: Direction::Higher, + format: ValueFormat::Reaction2, + description: "Small-step sensitivity: a 10% drop is closer to Poisson noise.", + }, + MetricSpec { + title: "Settled accuracy p50 (stable)", + scenario_key: "stable_1ph", + metric_key: "settled_accuracy_p50", + direction: Direction::Lower, + format: ValueFormat::Percent1, + description: "`|final_hashrate / true_hashrate − 1|` at trial end.", + }, + MetricSpec { + title: "Ramp target overshoot p90 (cold start)", + scenario_key: "cold_start_10gh_to_1ph", + metric_key: "ramp_target_overshoot_p90", + direction: Direction::Lower, + format: ValueFormat::Percent1, + description: "`max(new_hashrate over fires) / H_true − 1` — tail of the distribution.", + }, + MetricSpec { + title: "Ramp target overshoot p99 (cold start)", + scenario_key: "cold_start_10gh_to_1ph", + metric_key: "ramp_target_overshoot_p99", + direction: Direction::Lower, + format: ValueFormat::Percent1, + description: "Worst-trial tail of the ramp overshoot distribution.", + }, + ]; + + for metric in &metrics { + out.push_str(&format!("## {}\n\n", metric.title)); + out.push_str(metric.description); + out.push('\n'); + out.push('\n'); + emit_joint_table(&mut out, metric, etas, zs, share_rates, results); + out.push('\n'); + } + + // ---- Pareto summary at SPM=6 ---- + out.push_str("## Pareto summary at SPM=6\n\n"); + out.push_str( + "Concentrates the trade-off picture at the cell where the \ + FullRemedy parameters have the largest cross-axis coupling \ + (SPM=6 is the hardest cell — sparsest Poisson signal, longest \ + ramp, widest threshold band). For each metric, the table lists \ + the (η, z) point that wins. Reading down: if one (η, z) point \ + wins multiple rows, it is a strong candidate for the new \ + default.\n\n", + ); + out.push_str("| Metric | Best (η, z) at SPM=6 | Value |\n"); + out.push_str("| --- | --- | --- |\n"); + for metric in &metrics { + if let Some((eta, z, value)) = best_at_spm(metric, etas, zs, 6.0, results) { + out.push_str(&format!( + "| {} | η={:.2}, z={:.3} | {} |\n", + metric.title, + eta, + z, + metric.format.fmt(value), + )); + } + } + out.push('\n'); + + // ---- Pareto summary at SPM=120 (small-step sensitivity floor) ---- + out.push_str("## Pareto summary at SPM=120\n\n"); + out.push_str( + "The high-SPM cell. Small-step sensitivity matters most here \ + (the reaction-rate tables in this section drive the operational \ + small-step floor). A new default must not regress \ + meaningfully on the SPM=120 metrics — particularly `reaction \ + rate at −10% step`, which `sweep-z` showed is the canary for \ + excessive z.\n\n", + ); + out.push_str("| Metric | Best (η, z) at SPM=120 | Value |\n"); + out.push_str("| --- | --- | --- |\n"); + for metric in &metrics { + if let Some((eta, z, value)) = best_at_spm(metric, etas, zs, 120.0, results) { + out.push_str(&format!( + "| {} | η={:.2}, z={:.3} | {} |\n", + metric.title, + eta, + z, + metric.format.fmt(value), + )); + } + } + out.push('\n'); + + out +} + +fn emit_joint_table( + out: &mut String, + metric: &MetricSpec, + etas: &[f32], + zs: &[f64], + share_rates: &[f32], + results: &std::collections::HashMap>, +) { + // Header. + out.push_str("| SPM |"); + for &eta in etas { + for &z in zs { + out.push_str(&format!(" η{:.2}/z{:.3} |", eta, z)); + } + } + out.push('\n'); + out.push_str("| ---"); + for _ in 0..(etas.len() * zs.len()) { + out.push_str(" | ---"); + } + out.push_str(" |\n"); + + // Rows. + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &eta in etas { + for &z in zs { + let v = lookup_metric_value(metric, eta, z, spm, results); + out.push_str(&match v { + Some(x) => format!(" {} |", metric.format.fmt(x)), + None => " — |".to_string(), + }); + } + } + out.push('\n'); + } +} + +fn lookup_metric_value( + metric: &MetricSpec, + eta: f32, + z: f64, + spm: f32, + results: &std::collections::HashMap>, +) -> Option { + let name = algorithm_name(eta, z); + let cells = results.get(&name)?; + if metric.title == "Decoupling score" { + // DecouplingScore is a DerivedMetric, computed across cells. + let scored = DecouplingScore.compute(cells); + return scored + .iter() + .find(|(s, _)| *s == spm) + .and_then(|(_, mv)| mv.get(metric.metric_key)); + } + cells + .iter() + .find(|c| c.shares_per_minute == spm && c.scenario_key() == metric.scenario_key) + .and_then(|c| c.get(metric.metric_key)) +} + +fn best_at_spm( + metric: &MetricSpec, + etas: &[f32], + zs: &[f64], + spm: f32, + results: &std::collections::HashMap>, +) -> Option<(f32, f64, f64)> { + let mut best: Option<(f32, f64, f64)> = None; + for &eta in etas { + for &z in zs { + if let Some(v) = lookup_metric_value(metric, eta, z, spm, results) { + let is_better = match metric.direction { + Direction::Higher => best.map(|(_, _, b)| v > b).unwrap_or(true), + Direction::Lower => best.map(|(_, _, b)| v < b).unwrap_or(true), + }; + if is_better { + best = Some((eta, z, v)); + } + } + } + } + best +} + +fn env_or(var: &str, default: T) -> T { + env::var(var) + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(default) +} + +fn env_or_seed(var: &str, default: u64) -> u64 { + if let Ok(s) = env::var(var) { + if let Some(hex) = s.strip_prefix("0x").or_else(|| s.strip_prefix("0X")) { + return u64::from_str_radix(hex, 16).unwrap_or(default); + } + return s.parse().unwrap_or(default); + } + default +} diff --git a/sv2/channels-sv2/sim/src/bin/sweep-eta.rs b/sv2/channels-sv2/sim/src/bin/sweep-eta.rs new file mode 100644 index 0000000000..c660a97c15 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/sweep-eta.rs @@ -0,0 +1,392 @@ +//! PartialRetarget η-parameter sweep for the FullRemedy family. Holds +//! `EwmaEstimator(τ = 120s)` and `PoissonCI(z = 2.576, margin = 0.05)` +//! fixed and varies η ∈ {0.1, 0.2, 0.3, 0.5, 0.7, 1.0}, characterizing +//! the responsiveness/damping Pareto frontier with the same metric +//! suite as `sweep-ewma-tau`. +//! +//! η = 1.0 is the "no damping" boundary — full retarget on every fire. +//! η = 0.2 is the FullRemedy default, chosen via this sweep plus the +//! joint (η, z) sweep (`sweep-eta-z`). Smaller η than 0.2 (e.g. 0.1) +//! tightens overshoot further but catastrophically breaks cold-start +//! convergence at higher SPM — each fire moves too small a fraction of +//! the gap for the algorithm to traverse the cold-start ramp before +//! the rate-aware PoissonCI threshold suppresses firing. η = 0.2 is +//! the smallest value that preserves cold-start convergence rate at +//! ≥99% across every SPM. +//! +//! ## Usage +//! +//! ```text +//! cargo run --release --bin sweep-eta +//! ``` +//! +//! Output: `eta_sweep.md` in the current directory (configurable via +//! `VARDIFF_ETA_OUT_DIR`). Default sweep is 6 × 50 cells × 1000 trials +//! = 300,000 trials, ~2 minutes in release mode. Reduce via +//! `VARDIFF_ETA_TRIALS=100` for fast iteration. +//! +//! ## Environment +//! +//! - `VARDIFF_ETA_TRIALS` — trials per cell (default 1000). +//! - `VARDIFF_ETA_SEED` — base seed (default `0xDEAD_BEEF_CAFE_F00D`). +//! - `VARDIFF_ETA_OUT_DIR` — output directory (default `.`). +//! - `VARDIFF_ETAS` — comma-separated η values (default +//! `0.1,0.2,0.3,0.5,0.7,1.0`). +//! +//! ## Output format +//! +//! One table per headline metric, η as columns and SPM as rows. The +//! Pareto-optimal η is generally the smallest η whose ramp-overshoot +//! tail and reaction rate are both acceptable — smaller η means tighter +//! overshoot bounds at the cost of slower reaction. +//! +//! ## Paired vs un-paired +//! +//! Uses `Grid::run_paired` so cross-η metric differences are +//! attributable to the η change alone, not to seed disparity. + +use std::env; +use std::fs; +use std::path::PathBuf; +use std::time::Instant; + +use vardiff_sim::baseline::{Scenario, DEFAULT_BASELINE_SEED, DEFAULT_TRIAL_COUNT}; +use vardiff_sim::grid::{AlgorithmSpec, Grid}; +use vardiff_sim::metrics::{DecouplingScore, DerivedMetric}; + +/// Fixed axes for the η sweep — varied independently from η so the +/// reader can attribute any frontier movement to η alone. +const SWEEP_TAU_SECS: u64 = 120; +const SWEEP_Z: f64 = 2.576; + +fn main() -> std::io::Result<()> { + let trial_count = env_or("VARDIFF_ETA_TRIALS", DEFAULT_TRIAL_COUNT); + let base_seed = env_or_seed("VARDIFF_ETA_SEED", DEFAULT_BASELINE_SEED); + let out_dir = env::var("VARDIFF_ETA_OUT_DIR") + .map(PathBuf::from) + .unwrap_or_else(|_| PathBuf::from(".")); + let etas: Vec = env::var("VARDIFF_ETAS") + .ok() + .and_then(|s| { + let v: Vec = s.split(',').filter_map(|t| t.trim().parse().ok()).collect(); + if v.is_empty() { + None + } else { + Some(v) + } + }) + .unwrap_or_else(|| vec![0.1, 0.2, 0.3, 0.5, 0.7, 1.0]); + + let mut scenarios = vec![Scenario::ColdStart, Scenario::Stable]; + for &d in &[-50i32, -25, -10, -5, 5, 10, 25, 50] { + scenarios.push(Scenario::Step { delta_pct: d }); + } + + let grid = Grid { + algorithms: etas + .iter() + .map(|&eta| AlgorithmSpec::full_remedy_with(SWEEP_TAU_SECS, eta, SWEEP_Z)) + .collect(), + share_rates: vec![6.0, 8.0, 10.0, 12.0, 15.0, 20.0, 25.0, 30.0], + scenarios, + trial_count, + base_seed, + }; + + eprintln!( + "FullRemedy η sweep: η ∈ {{{}}} × {} cells × {} trials = {} total trials, \ + τ={}s, z={}, base_seed = {:#x}", + etas.iter() + .map(|e| format!("{:.2}", e)) + .collect::>() + .join(", "), + grid.share_rates.len() * grid.scenarios.len(), + trial_count, + grid.total_runs() * trial_count, + SWEEP_TAU_SECS, + SWEEP_Z, + base_seed, + ); + + let started = Instant::now(); + let results = grid.run_paired(); + eprintln!( + "Sweep complete in {:.2}s\n", + started.elapsed().as_secs_f64() + ); + + fs::create_dir_all(&out_dir)?; + let out_path = out_dir.join("eta_sweep.md"); + + let report = build_report(&etas, &grid.share_rates, &results, trial_count, base_seed); + fs::write(&out_path, &report)?; + eprintln!("Wrote {}", out_path.display()); + + Ok(()) +} + +fn algorithm_name(eta: f32) -> String { + format!( + "FullRemedy-tau{}-eta{}-z{}", + SWEEP_TAU_SECS, + (eta * 100.0).round() as u32, + (SWEEP_Z * 1000.0).round() as u32, + ) +} + +fn build_report( + etas: &[f32], + share_rates: &[f32], + results: &std::collections::HashMap>, + trial_count: usize, + base_seed: u64, +) -> String { + let mut out = String::new(); + out.push_str(&format!( + "# FullRemedy η sweep ({} trials/cell, base_seed = {:#x})\n\n", + trial_count, base_seed + )); + out.push_str(&format!( + "Pareto-explore the PartialRetarget η parameter on the \ + FullRemedy family. Holds the other two FullRemedy axes fixed \ + (`EwmaEstimator(τ = {}s)`, `PoissonCI(z = {}, margin = 0.05)`) \ + and varies only η. Smaller η means each fire moves a smaller \ + fraction of the gap from `current_h` to the estimator's \ + belief — tighter overshoot bounds at the cost of slower \ + reaction to large step changes.\n\n", + SWEEP_TAU_SECS, SWEEP_Z, + )); + + let lookup = |eta: f32, spm: f32, scenario_key: &str, key: &str| -> Option { + let name = algorithm_name(eta); + results + .get(&name)? + .iter() + .find(|c| c.shares_per_minute == spm && c.scenario_key() == scenario_key) + .and_then(|c| c.get(key)) + }; + + // ---- Decoupling score ---- + out.push_str("## Decoupling score (higher = better)\n\n"); + out.push_str( + "`reaction_rate(Step−50) × clamp(1 − jitter_p50 / J_max, 0, 1)`, \ + J_max = 0.50 fires/min. 1.0 = perfect; > 0.8 = strong; < 0.3 \ + = poor.\n\n", + ); + emit_grid_header(&mut out, etas); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &eta in etas { + let name = algorithm_name(eta); + let cells = match results.get(&name) { + Some(c) => c.clone(), + None => continue, + }; + let scored = DecouplingScore.compute(&cells); + let s = scored + .iter() + .find(|(s, _)| *s == spm) + .and_then(|(_, mv)| mv.get("score")); + out.push_str(&match s { + Some(v) => format!(" {:.3} |", v), + None => " — |".to_string(), + }); + } + out.push('\n'); + } + out.push('\n'); + + // ---- Jitter mean ---- + out.push_str("## Jitter mean under stable load (lower = better)\n\n"); + out.push_str( + "Fires per minute, post-convergence. Smaller = less active \ + stable-load tracking. FullRemedy by design fires under stable \ + load (the cost of active tracking) so absolute jitter scales \ + with η as well as with the boundary.\n\n", + ); + emit_grid_header(&mut out, etas); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &eta in etas { + let v = lookup(eta, spm, "stable_1ph", "jitter_mean_per_min"); + out.push_str(&match v { + Some(x) => format!(" {:.3} |", x), + None => " — |".to_string(), + }); + } + out.push('\n'); + } + out.push('\n'); + + // ---- Reaction rate at −50% step ---- + out.push_str("## Reaction rate at −50% step (higher = better)\n\n"); + out.push_str( + "Fraction of trials that fire within 5 min of a 50% drop in \ + true hashrate. Smaller η damps the per-fire move so multiple \ + fires may be needed to traverse the post-step gap — this \ + table captures whether smaller η costs reactive sensitivity.\n\n", + ); + emit_grid_header(&mut out, etas); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &eta in etas { + let v = lookup(eta, spm, "step_minus_50_at_15min", "reaction_rate"); + out.push_str(&match v { + Some(x) => format!(" {:.2} |", x), + None => " — |".to_string(), + }); + } + out.push('\n'); + } + out.push('\n'); + + // ---- Reaction rate at −10% step ---- + out.push_str("## Reaction rate at −10% step (higher = better)\n\n"); + out.push_str( + "Small-step sensitivity: a 10% drop is closer to Poisson noise \ + and harder to distinguish from chance. Smaller η means each \ + fire moves less, requiring more fires to traverse the gap — \ + which costs sensitivity on shallow steps.\n\n", + ); + emit_grid_header(&mut out, etas); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &eta in etas { + let v = lookup(eta, spm, "step_minus_10_at_15min", "reaction_rate"); + out.push_str(&match v { + Some(x) => format!(" {:.2} |", x), + None => " — |".to_string(), + }); + } + out.push('\n'); + } + out.push('\n'); + + // ---- Settled accuracy p50 ---- + out.push_str("## Settled accuracy p50 under stable load (lower = better)\n\n"); + out.push_str( + "`|final_hashrate / true_hashrate − 1|` at trial end. Smaller \ + = closer to truth.\n\n", + ); + emit_grid_header(&mut out, etas); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &eta in etas { + let v = lookup(eta, spm, "stable_1ph", "settled_accuracy_p50"); + out.push_str(&match v { + Some(x) => format!(" {:.1}% |", x * 100.0), + None => " — |".to_string(), + }); + } + out.push('\n'); + } + out.push('\n'); + + // ---- Ramp target overshoot p50 (cold start) ---- + out.push_str("## Ramp target overshoot p50 — cold start (lower = better)\n\n"); + out.push_str( + "`max(new_hashrate over fires) / H_true − 1`. Smaller η directly \ + caps the per-fire jump; this is the metric η was introduced \ + to bound.\n\n", + ); + emit_grid_header(&mut out, etas); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &eta in etas { + let v = lookup( + eta, + spm, + "cold_start_10gh_to_1ph", + "ramp_target_overshoot_p50", + ); + out.push_str(&match v { + Some(x) => format!(" {:.1}% |", x * 100.0), + None => " — |".to_string(), + }); + } + out.push('\n'); + } + out.push('\n'); + + // ---- Ramp target overshoot p90 (cold start) ---- + out.push_str("## Ramp target overshoot p90 — cold start (lower = better)\n\n"); + out.push_str( + "Tail of the same distribution. Captures unlucky-Poisson ramp \ + trajectories. The η-sensitivity headline metric.\n\n", + ); + emit_grid_header(&mut out, etas); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &eta in etas { + let v = lookup( + eta, + spm, + "cold_start_10gh_to_1ph", + "ramp_target_overshoot_p90", + ); + out.push_str(&match v { + Some(x) => format!(" {:.1}% |", x * 100.0), + None => " — |".to_string(), + }); + } + out.push('\n'); + } + out.push('\n'); + + // ---- Ramp target overshoot p99 (cold start) ---- + out.push_str("## Ramp target overshoot p99 — cold start (lower = better)\n\n"); + out.push_str( + "Worst-trial tail. This is the metric that the original axis \ + analysis identified PartialRetarget as the closure for.\n\n", + ); + emit_grid_header(&mut out, etas); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &eta in etas { + let v = lookup( + eta, + spm, + "cold_start_10gh_to_1ph", + "ramp_target_overshoot_p99", + ); + out.push_str(&match v { + Some(x) => format!(" {:.1}% |", x * 100.0), + None => " — |".to_string(), + }); + } + out.push('\n'); + } + out.push('\n'); + + out +} + +fn emit_grid_header(out: &mut String, etas: &[f32]) { + out.push_str("| SPM |"); + for &e in etas { + out.push_str(&format!(" η={:.2} |", e)); + } + out.push('\n'); + out.push_str("| ---"); + for _ in etas { + out.push_str(" | ---"); + } + out.push_str(" |\n"); +} + +fn env_or(var: &str, default: T) -> T { + env::var(var) + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(default) +} + +fn env_or_seed(var: &str, default: u64) -> u64 { + if let Ok(s) = env::var(var) { + if let Some(hex) = s.strip_prefix("0x").or_else(|| s.strip_prefix("0X")) { + return u64::from_str_radix(hex, 16).unwrap_or(default); + } + return s.parse().unwrap_or(default); + } + default +} diff --git a/sv2/channels-sv2/sim/src/bin/sweep-ewma-tau.rs b/sv2/channels-sv2/sim/src/bin/sweep-ewma-tau.rs new file mode 100644 index 0000000000..23e2307106 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/sweep-ewma-tau.rs @@ -0,0 +1,336 @@ +//! EWMA τ-parameter sweep. Runs EWMA across five time constants +//! (30 / 60 / 120 / 300 / 600 seconds), each against the canonical +//! 5 × 10 cell grid, then emits a single Markdown comparison table +//! letting you pick the variance/responsiveness Pareto-optimal τ for +//! your operational regime. +//! +//! ## Usage +//! +//! ```text +//! cargo run --release --bin sweep-ewma-tau +//! ``` +//! +//! Output: `ewma_tau_sweep.md` in the current directory (configurable +//! via `VARDIFF_EWMA_OUT_DIR`). The sweep takes 5 × 50 × 1000 = 250,000 +//! trials, ~90 seconds in release mode. Reduce via +//! `VARDIFF_EWMA_TRIALS=100` for fast iteration. +//! +//! ## Environment +//! +//! - `VARDIFF_EWMA_TRIALS` — trials per cell (default 1000). +//! - `VARDIFF_EWMA_SEED` — base seed (default `0xDEAD_BEEF_CAFE_F00D`). +//! - `VARDIFF_EWMA_OUT_DIR` — output directory (default `.`). +//! - `VARDIFF_EWMA_TAUS` — comma-separated τ values in seconds +//! (default `30,60,120,300,600`). +//! +//! ## Output format +//! +//! The Markdown report has one table per key metric: +//! +//! - **Decoupling score** by τ × SPM (higher = better trade-off) +//! - **Jitter p50** by τ × SPM (lower = better) +//! - **Reaction rate at −50% step** by τ × SPM (higher = better) +//! - **Settled accuracy p50** by τ × SPM (lower = better) +//! +//! Reading column-wise gives you "how does τ affect this metric at +//! one SPM?". The Pareto-optimal τ is generally the one that +//! maximizes decoupling without inflating settled accuracy too much. +//! +//! ## Paired vs un-paired +//! +//! Uses `Grid::run_paired` so cross-τ metric differences are +//! attributable to the τ change alone, not to seed disparity. + +use std::env; +use std::fs; +use std::path::PathBuf; +use std::time::Instant; + +use vardiff_sim::baseline::{Scenario, DEFAULT_BASELINE_SEED, DEFAULT_TRIAL_COUNT}; +use vardiff_sim::grid::{AlgorithmSpec, Grid}; +use vardiff_sim::metrics::{DecouplingScore, DerivedMetric}; + +fn main() -> std::io::Result<()> { + let trial_count = env_or("VARDIFF_EWMA_TRIALS", DEFAULT_TRIAL_COUNT); + let base_seed = env_or_seed("VARDIFF_EWMA_SEED", DEFAULT_BASELINE_SEED); + let out_dir = env::var("VARDIFF_EWMA_OUT_DIR") + .map(PathBuf::from) + .unwrap_or_else(|_| PathBuf::from(".")); + let taus: Vec = env::var("VARDIFF_EWMA_TAUS") + .ok() + .and_then(|s| { + let v: Vec = s.split(',').filter_map(|t| t.trim().parse().ok()).collect(); + if v.is_empty() { + None + } else { + Some(v) + } + }) + .unwrap_or_else(|| vec![30, 60, 120, 300, 600]); + + let mut scenarios = vec![Scenario::ColdStart, Scenario::Stable]; + for &d in &[-50i32, -25, -10, -5, 5, 10, 25, 50] { + scenarios.push(Scenario::Step { delta_pct: d }); + } + + let grid = Grid { + algorithms: taus.iter().map(|&t| AlgorithmSpec::ewma(t)).collect(), + share_rates: vec![6.0, 8.0, 10.0, 12.0, 15.0, 20.0, 25.0, 30.0], + scenarios, + trial_count, + base_seed, + }; + + eprintln!( + "EWMA τ sweep: τ ∈ {{{}}} × {} cells × {} trials = {} total trials, base_seed = {:#x}", + taus.iter() + .map(|t| t.to_string()) + .collect::>() + .join(", "), + grid.share_rates.len() * grid.scenarios.len(), + trial_count, + grid.total_runs() * trial_count, + base_seed, + ); + + let started = Instant::now(); + let results = grid.run_paired(); + eprintln!( + "Sweep complete in {:.2}s\n", + started.elapsed().as_secs_f64() + ); + + fs::create_dir_all(&out_dir)?; + let out_path = out_dir.join("ewma_tau_sweep.md"); + + let report = build_report(&taus, &grid.share_rates, &results, trial_count, base_seed); + fs::write(&out_path, &report)?; + eprintln!("Wrote {}", out_path.display()); + + Ok(()) +} + +fn build_report( + taus: &[u64], + share_rates: &[f32], + results: &std::collections::HashMap>, + trial_count: usize, + base_seed: u64, +) -> String { + let mut out = String::new(); + out.push_str(&format!( + "# EWMA τ sweep ({} trials/cell, base_seed = {:#x})\n\n", + trial_count, base_seed + )); + out.push_str( + "Pareto-explore the EWMA time constant τ. Lower τ → more \ + responsive but more jittery; higher τ → smoother but slower \ + to react. The right τ is the one that maximizes decoupling \ + score without inflating settled accuracy beyond your \ + tolerance.\n\n", + ); + + // Helper: lookup a metric value at (τ, spm, scenario_key). + let lookup = |tau: u64, spm: f32, scenario_key: &str, key: &str| -> Option { + let name = format!("EWMA-{tau}s"); + results + .get(&name)? + .iter() + .find(|c| c.shares_per_minute == spm && c.scenario_key() == scenario_key) + .and_then(|c| c.get(key)) + }; + + // ---- Decoupling score per τ ---- + out.push_str("## Decoupling score (higher = better)\n\n"); + out.push_str( + "`reaction_rate(Step−50) × clamp(1 − jitter_p50 / J_max, 0, 1)`, \ + J_max = 0.50 fires/min. 1.0 = perfect; > 0.8 = strong; < 0.3 \ + = poor.\n\n", + ); + emit_grid_header(&mut out, taus); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &tau in taus { + let name = format!("EWMA-{tau}s"); + let cells = match results.get(&name) { + Some(c) => c.clone(), + None => continue, + }; + // Per-algorithm decoupling at this spm. + let scored = DecouplingScore.compute(&cells); + let s = scored + .iter() + .find(|(s, _)| *s == spm) + .and_then(|(_, mv)| mv.get("score")); + out.push_str(&match s { + Some(v) => format!(" {:.3} |", v), + None => " — |".to_string(), + }); + } + out.push('\n'); + } + out.push('\n'); + + // ---- Jitter p50 under stable load ---- + out.push_str("## Jitter p50 under stable load (lower = better)\n\n"); + out.push_str( + "Fires per minute, post-convergence. Smaller is better; 0 = \ + no fires under stable load.\n\n", + ); + emit_grid_header(&mut out, taus); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &tau in taus { + let v = lookup(tau, spm, "stable_1ph", "jitter_p50_per_min"); + out.push_str(&match v { + Some(x) => format!(" {:.3} |", x), + None => " — |".to_string(), + }); + } + out.push('\n'); + } + out.push('\n'); + + // ---- Reaction rate at −50% step ---- + out.push_str("## Reaction rate at −50% step (higher = better)\n\n"); + out.push_str( + "Fraction of trials that fire within 5 min of a 50% drop in \ + true hashrate.\n\n", + ); + emit_grid_header(&mut out, taus); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &tau in taus { + let v = lookup(tau, spm, "step_minus_50_at_15min", "reaction_rate"); + out.push_str(&match v { + Some(x) => format!(" {:.2} |", x), + None => " — |".to_string(), + }); + } + out.push('\n'); + } + out.push('\n'); + + // ---- Settled accuracy p50 ---- + out.push_str("## Settled accuracy p50 (lower = better)\n\n"); + out.push_str( + "`|final_hashrate / true_hashrate − 1|` at trial end. Smaller \ + = closer to truth.\n\n", + ); + emit_grid_header(&mut out, taus); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &tau in taus { + let v = lookup(tau, spm, "stable_1ph", "settled_accuracy_p50"); + out.push_str(&match v { + Some(x) => format!(" {:.1}% |", x * 100.0), + None => " — |".to_string(), + }); + } + out.push('\n'); + } + out.push('\n'); + + // ---- Estimator variance under stable load ---- + out.push_str("## Estimator variance p50 under stable load (lower = better)\n\n"); + out.push_str( + "Population variance of `H̃ / H_true` over post-settle ticks. \ + Indicates how noisy the estimator's belief is.\n\n", + ); + emit_grid_header(&mut out, taus); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &tau in taus { + let v = lookup(tau, spm, "stable_1ph", "variance_p50"); + out.push_str(&match v { + Some(x) => format!(" {:.4} |", x), + None => " — |".to_string(), + }); + } + out.push('\n'); + } + out.push('\n'); + + // ---- Ramp target overshoot p50 (cold start) ---- + out.push_str("## Ramp target overshoot p50 — cold start (lower = better)\n\n"); + out.push_str( + "`max(new_hashrate over fires) / H_true − 1`. Larger τ → more \ + smoothing → larger overshoot when the EWMA finally catches \ + up; this table quantifies that trade-off.\n\n", + ); + emit_grid_header(&mut out, taus); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &tau in taus { + let v = lookup( + tau, + spm, + "cold_start_10gh_to_1ph", + "ramp_target_overshoot_p50", + ); + out.push_str(&match v { + Some(x) => format!(" {:.1}% |", x * 100.0), + None => " — |".to_string(), + }); + } + out.push('\n'); + } + out.push('\n'); + + // ---- Ramp target overshoot p90 (cold start) ---- + out.push_str("## Ramp target overshoot p90 — cold start (lower = better)\n\n"); + out.push_str( + "Tail of the same distribution. Captures unlucky-Poisson ramp \ + trajectories.\n\n", + ); + emit_grid_header(&mut out, taus); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &tau in taus { + let v = lookup( + tau, + spm, + "cold_start_10gh_to_1ph", + "ramp_target_overshoot_p90", + ); + out.push_str(&match v { + Some(x) => format!(" {:.1}% |", x * 100.0), + None => " — |".to_string(), + }); + } + out.push('\n'); + } + out.push('\n'); + + out +} + +fn emit_grid_header(out: &mut String, taus: &[u64]) { + out.push_str("| SPM |"); + for &t in taus { + out.push_str(&format!(" τ={}s |", t)); + } + out.push('\n'); + out.push_str("| ---"); + for _ in taus { + out.push_str(" | ---"); + } + out.push_str(" |\n"); +} + +fn env_or(var: &str, default: T) -> T { + env::var(var) + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(default) +} + +fn env_or_seed(var: &str, default: u64) -> u64 { + if let Ok(s) = env::var(var) { + if let Some(hex) = s.strip_prefix("0x").or_else(|| s.strip_prefix("0X")) { + return u64::from_str_radix(hex, 16).unwrap_or(default); + } + return s.parse().unwrap_or(default); + } + default +} diff --git a/sv2/channels-sv2/sim/src/bin/sweep-regret-big.rs b/sv2/channels-sv2/sim/src/bin/sweep-regret-big.rs new file mode 100644 index 0000000000..6fab6f25f7 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/sweep-regret-big.rs @@ -0,0 +1,468 @@ +//! Big regret/effort-scored parameter scan — the multi-hour, multi-core +//! successor to `sweep-regret`, built to hunt the new Pareto champions +//! after the §10 metric overhaul. +//! +//! ## Why this exists +//! +//! The first `sweep-regret` (363 algos) returned a winner that pegged the +//! search-box edge on FIVE of six axes: +//! `Ewma120s / Adapt-spm8[AsymCusum-s1-f0.05-t3] / Accel-0.2-0.6-0.2` +//! - tau = 120 (box MAX) +//! - sens = 1.0 (box MIN) +//! - tighten = 3.0 (box MAX) +//! - spm = 8 (box MIN) +//! - eta_max = 0.6 (box MAX) +//! That is the textbook signature of an optimum lying OUTSIDE the box. So +//! this scan (a) pushes every pegged frontier outward, and (b) unfreezes +//! the two params the first sweep held constant — the CUSUM drift fraction +//! (`floor`, was 0.05) and the retarget `acceleration` (was 0.2). +//! +//! Cost is IDENTICAL to `sweep-regret` so the two tables are directly +//! comparable: +//! ```text +//! cost = w_over·regret_over + w_under·regret_under +//! + rho·(rho_up·effort_up + rho_down·effort_down) +//! + w_det·(1 − detection) +//! ``` +//! Defaults: w_over:w_under = 3:1, rho_up:rho_down = 3:1, rho = 0.5, +//! w_det = 0.5 (the §10 values; all env-overridable). +//! +//! ## Parallelism +//! +//! `grid.run()` is serial; this bin instead fans the algorithm list across +//! a `std::thread::scope` worker pool (no new deps — `baseline.rs` flagged +//! rayon as merely a future optimization). Each worker pulls the next +//! algorithm index from a shared atomic and runs all of its cells via the +//! same `run_cell_with_algorithm` the serial grid uses, with the SAME +//! `cell_index` seed derivation — so a parallel run is bit-identical to the +//! serial grid it replaces, only faster. +//! +//! ## Usage +//! ```text +//! cargo run --release --bin sweep-regret-big +//! VARDIFF_BIG_TRIALS=1000 cargo run --release --bin sweep-regret-big +//! VARDIFF_BIG_THREADS=12 VARDIFF_BIG_TRIALS=500 cargo run --release --bin sweep-regret-big +//! ``` +//! Env: VARDIFF_BIG_TRIALS (default 500), VARDIFF_BIG_THREADS (default = +//! available_parallelism), VARDIFF_SWEEP_SEED, the VARDIFF_W_*/RHO_* +//! weight overrides, VARDIFF_BIG_OUT_DIR (default "."), writes +//! `regret_sweep_big.md`. + +use std::env; +use std::fs; +use std::path::PathBuf; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::Mutex; +use std::time::Instant; + +use channels_sv2::vardiff::composed::{ + AcceleratingPartialRetarget, AdaptivePoissonCusum, AsymmetricCusumBoundary, Composed, + EwmaEstimator, PoissonCI, +}; +use vardiff_sim::baseline::{Cell, Scenario, DEFAULT_BASELINE_SEED}; +use vardiff_sim::grid::{run_cell_with_algorithm, AlgorithmSpec, VardiffBox}; + +/// Cost weights (all relative to the "cheap" sides = 1.0). Mirrors +/// `sweep-regret::Weights` so the two scans score identically. +struct Weights { + w_over: f64, + w_under: f64, + rho_up: f64, + rho_down: f64, + rho: f64, + w_det: f64, +} + +impl Weights { + fn from_env() -> Self { + let g = |k: &str, d: f64| env::var(k).ok().and_then(|s| s.parse().ok()).unwrap_or(d); + Weights { + w_over: g("VARDIFF_W_OVER", 3.0), + w_under: g("VARDIFF_W_UNDER", 1.0), + rho_up: g("VARDIFF_RHO_UP", 3.0), + rho_down: g("VARDIFF_RHO_DOWN", 1.0), + rho: g("VARDIFF_RHO", 0.5), + w_det: g("VARDIFF_W_DET", 0.5), + } + } +} + +/// Aggregated cost components for one algorithm (means over the mix). +struct Profile { + name: String, + regret_over: f64, + regret_under: f64, + effort_up: f64, + effort_down: f64, + detection: f64, + cost: f64, + is_anchor: bool, +} + +/// One point in the search space. Stored so we can name + build lazily +/// inside each worker (the factory closure captures these by value). +#[derive(Clone, Copy)] +struct Params { + tau: u64, + sens: f64, + floor: f64, + tighten: f64, + spm: u32, + eta_base: f32, + eta_max: f32, + accel: f32, +} + +fn spec_for(p: Params) -> AlgorithmSpec { + let name = vardiff_sim::naming::triple_name( + &EwmaEstimator::new(p.tau), + &AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(p.sens, p.floor, p.tighten), + p.spm, + ), + &AcceleratingPartialRetarget::new(p.eta_base, p.eta_max, p.accel), + ); + AlgorithmSpec::new(name, move |clock| { + let boundary = AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(p.sens, p.floor, p.tighten), + p.spm, + ); + let inner = Composed::new( + EwmaEstimator::new(p.tau), + boundary, + AcceleratingPartialRetarget::new(p.eta_base, p.eta_max, p.accel), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) +} + +/// Run all cells for one algorithm and reduce to a `Profile`. Replicates +/// `sweep-regret`'s aggregation exactly: regret/effort averaged over the +/// Stable + ±10/±50 mix, detection from the SettledStep{60,−10} cell. +#[allow(clippy::too_many_arguments)] +fn profile_for( + algo: &AlgorithmSpec, + algo_idx: usize, + share_rates: &[f32], + scenarios: &[Scenario], + trial_count: usize, + base_seed: u64, + w: &Weights, + is_anchor: bool, +) -> Option { + let n_spm = share_rates.len(); + let n_scen = scenarios.len(); + + let (mut ro, mut ru, mut eu, mut ed) = (0.0, 0.0, 0.0, 0.0); + let mut n = 0u32; + let mut det_sum = 0.0; + let mut det_n = 0u32; + + for (spm_idx, &spm) in share_rates.iter().enumerate() { + for (scen_idx, scen) in scenarios.iter().enumerate() { + let cell = Cell { + shares_per_minute: spm, + scenario: scen.clone(), + }; + // SAME seed derivation as Grid::run, so this is bit-identical + // to a serial grid placing this algo at `algo_idx`. + let cell_index = (algo_idx * n_spm * n_scen + spm_idx * n_scen + scen_idx) as u64; + let result = run_cell_with_algorithm(algo, &cell, trial_count, base_seed, cell_index); + + let is_mix = matches!( + scen, + Scenario::Stable + | Scenario::Step { + delta_pct: -50 | -10 | 10 | 50 + } + ); + if is_mix { + ro += result.get("regret_over").unwrap_or(0.0); + ru += result.get("regret_under").unwrap_or(0.0); + eu += result.get("effort_up").unwrap_or(0.0); + ed += result.get("effort_down").unwrap_or(0.0); + n += 1; + } + if matches!( + scen, + Scenario::SettledStep { + settle_minutes: 60, + delta_pct: -10 + } + ) { + if let Some(rate) = result.get("settled_reaction_rate") { + det_sum += rate; + det_n += 1; + } + } + } + } + if n == 0 { + return None; + } + let (regret_over, regret_under, effort_up, effort_down) = + (ro / n as f64, ru / n as f64, eu / n as f64, ed / n as f64); + let detection = if det_n > 0 { det_sum / det_n as f64 } else { 0.0 }; + let cost = w.w_over * regret_over + + w.w_under * regret_under + + w.rho * (w.rho_up * effort_up + w.rho_down * effort_down) + + w.w_det * (1.0 - detection); + Some(Profile { + name: algo.name.clone(), + regret_over, + regret_under, + effort_up, + effort_down, + detection, + cost, + is_anchor, + }) +} + +fn main() -> std::io::Result<()> { + let trial_count: usize = env::var("VARDIFF_BIG_TRIALS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(500); + let base_seed: u64 = env::var("VARDIFF_SWEEP_SEED") + .ok() + .and_then(|s| { + s.strip_prefix("0x") + .and_then(|h| u64::from_str_radix(h, 16).ok()) + .or_else(|| s.parse().ok()) + }) + .unwrap_or(DEFAULT_BASELINE_SEED); + let n_threads: usize = env::var("VARDIFF_BIG_THREADS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or_else(|| { + std::thread::available_parallelism() + .map(|n| n.get()) + .unwrap_or(4) + }) + .max(1); + let out_dir = env::var("VARDIFF_BIG_OUT_DIR") + .map(PathBuf::from) + .unwrap_or_else(|_| PathBuf::from(".")); + let w = Weights::from_env(); + + // ---- Expanded search space (see module docs for the box-edge rationale). + // Pegged axes pushed outward; the two previously-frozen axes unfrozen. + // Ranges re-centered after an 8-trial recon pass on a wider box: the + // recon winners still pegged sens/spm/tighten/accel at their edges, so + // those four are widened to BRACKET the optimum; axes whose extremes + // never placed (tau=90, tighten=3, eta_max=0.4, high spm/sens) are + // trimmed to keep the grid focused. + let taus = [120u64, 150, 180, 210]; // recon winners clustered 120–150 + let sensitivities = [0.3f64, 0.5, 0.75, 1.0]; // recon pegged 0.5 min → add 0.3 below + let floors = [0.025f64, 0.05, 0.1]; // all three placed in recon — keep + let tightens = [4.0f64, 5.0, 6.0, 7.0]; // recon pegged 5 max → add 6,7; drop 3 + let transitions = [3u32, 4, 5, 6]; // recon pegged 5 min → add 3,4; drop 8,10 + let eta_bases = [0.2f32, 0.3]; + let eta_maxes = [0.6f32, 0.8]; // recon never chose 0.4 — drop it + let accels = [0.05f32, 0.1, 0.2]; // recon pegged 0.1 min → add 0.05; drop 0.4 + + // Reference anchors: production-classic (now == ClassicComposed) and the + // two current Pareto champions. Placed first so seed offsets are stable. + let mut params: Vec<(Params, bool)> = Vec::new(); + let mut specs: Vec = vec![ + AlgorithmSpec::classic_vardiff_state(), + AlgorithmSpec::balanced(), + AlgorithmSpec::react_priority(), + ]; + let n_anchors = specs.len(); + + for &tau in &taus { + for &sens in &sensitivities { + for &floor in &floors { + for &tighten in &tightens { + for &spm in &transitions { + for &eta_base in &eta_bases { + for &eta_max in &eta_maxes { + if eta_max < eta_base { + continue; + } + for &accel in &accels { + params.push(( + Params { + tau, + sens, + floor, + tighten, + spm, + eta_base, + eta_max, + accel, + }, + false, + )); + } + } + } + } + } + } + } + } + for (p, _) in ¶ms { + specs.push(spec_for(*p)); + } + + let scenarios = vec![ + Scenario::Stable, + Scenario::Step { delta_pct: -50 }, + Scenario::Step { delta_pct: -10 }, + Scenario::Step { delta_pct: 10 }, + Scenario::Step { delta_pct: 50 }, + Scenario::SettledStep { + settle_minutes: 60, + delta_pct: -10, + }, + ]; + let share_rates = vec![6.0f32, 8.0, 12.0, 20.0, 30.0]; + + let n_algos = specs.len(); + let n_cells = share_rates.len() * scenarios.len(); + let total_runs = n_algos * n_cells * trial_count; + eprintln!( + "Big sweep: {} algos ({} grid + {} anchors) × {} cells × {} trials = {} runs, {} threads", + n_algos, + n_algos - n_anchors, + n_anchors, + n_cells, + trial_count, + total_runs, + n_threads, + ); + + let started = Instant::now(); + let next = AtomicUsize::new(0); + let done = AtomicUsize::new(0); + let out: Mutex> = Mutex::new(Vec::with_capacity(n_algos)); + + std::thread::scope(|scope| { + for _ in 0..n_threads { + scope.spawn(|| loop { + let i = next.fetch_add(1, Ordering::Relaxed); + if i >= n_algos { + break; + } + let is_anchor = i < n_anchors; + if let Some(p) = profile_for( + &specs[i], + i, + &share_rates, + &scenarios, + trial_count, + base_seed, + &w, + is_anchor, + ) { + out.lock().unwrap().push(p); + } + let d = done.fetch_add(1, Ordering::Relaxed) + 1; + if d % 256 == 0 || d == n_algos { + let el = started.elapsed().as_secs_f64(); + let rate = d as f64 / el; + let eta = (n_algos - d) as f64 / rate.max(1e-9); + eprintln!( + " {}/{} algos ({:.0}%) | {:.0}s elapsed | ~{:.0}s remaining", + d, + n_algos, + 100.0 * d as f64 / n_algos as f64, + el, + eta, + ); + } + }); + } + }); + + let mut profiles = out.into_inner().unwrap(); + eprintln!( + "Big sweep complete: {} profiles in {:.1}s", + profiles.len(), + started.elapsed().as_secs_f64() + ); + + // Rank by cost ascending (lower = better). + profiles.sort_by(|a, b| a.cost.partial_cmp(&b.cost).unwrap()); + let anchor_rank: Vec<(usize, &Profile)> = profiles + .iter() + .enumerate() + .filter(|(_, p)| p.is_anchor) + .collect(); + + let row = |i: usize, p: &Profile| { + format!( + "| {} | {}{} | **{:.4}** | {:.4} | {:.4} | {:.4} | {:.4} | {:.0}% |\n", + i + 1, + p.name, + if p.is_anchor { " ⟵anchor" } else { "" }, + p.cost, + p.regret_over, + p.regret_under, + p.effort_up, + p.effort_down, + p.detection * 100.0, + ) + }; + + let mut md = String::new(); + md.push_str("# Big regret/effort sweep\n\n"); + md.push_str(&format!( + "Cost = {:.1}·regret_over + {:.1}·regret_under + {:.2}·({:.1}·effort_up + {:.1}·effort_down) + {:.2}·(1−detection). Lower is better.\n\n", + w.w_over, w.w_under, w.rho, w.rho_up, w.rho_down, w.w_det + )); + md.push_str(&format!( + "{} algos, {} trials/cell, base_seed {:#x}. regret = linear ⟨|e|⟩; detection = P[fire≤60min | aged −10%].\n\n", + n_algos, trial_count, base_seed + )); + + md.push_str("## Anchor placement\n\n"); + md.push_str("Where the reference algorithms (production-classic + the two current champions) land in the full ranking.\n\n"); + md.push_str("| overall rank | algorithm | cost | det% |\n| --- | --- | --- | --- |\n"); + for (i, p) in &anchor_rank { + md.push_str(&format!( + "| {} / {} | {} | {:.4} | {:.0}% |\n", + i + 1, + n_algos, + p.name, + p.cost, + p.detection * 100.0 + )); + } + md.push('\n'); + + md.push_str("## Full ranking\n\n"); + md.push_str("| rank | algorithm | **cost** | reg_over | reg_under | eff_up | eff_down | det% |\n"); + md.push_str("| --- | --- | --- | --- | --- | --- | --- | --- |\n"); + for (i, p) in profiles.iter().enumerate() { + md.push_str(&row(i, p)); + } + md.push('\n'); + + let out_path = out_dir.join("regret_sweep_big.md"); + fs::write(&out_path, &md)?; + eprintln!("Wrote {}", out_path.display()); + + // Echo the top 25 + anchors to stdout for a quick glance. + println!("\n## Big sweep — top 25 (lower cost = better)\n"); + println!("| rank | algorithm | cost | reg_over | reg_under | eff_up | eff_down | det% |"); + println!("| --- | --- | --- | --- | --- | --- | --- | --- |"); + for (i, p) in profiles.iter().take(25).enumerate() { + print!("{}", row(i, p)); + } + println!("\nAnchors landed at ranks: {}", + anchor_rank + .iter() + .map(|(i, p)| format!("{} (#{}/{})", p.name, i + 1, n_algos)) + .collect::>() + .join(", ") + ); + Ok(()) +} diff --git a/sv2/channels-sv2/sim/src/bin/sweep-regret.rs b/sv2/channels-sv2/sim/src/bin/sweep-regret.rs new file mode 100644 index 0000000000..2fc4b870d7 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/sweep-regret.rs @@ -0,0 +1,319 @@ +//! Regret/effort-scored parameter sweep — the §10 replacement for the +//! maximin-over-`EqualWeightFitness` sweeps (`sweep-balanced` et al.). +//! +//! Scores each candidate by a single **cost to minimize** built from the +//! `LogErrorRegret` decomposition plus an explicit slow-degradation +//! detection term (§9.4 — detection is NOT recoverable from regret): +//! +//! ```text +//! cost = w_over·regret_over + w_under·regret_under (tracking) +//! + rho·( rho_up·effort_up + rho_down·effort_down ) (control effort) +//! + w_det·( 1 − detection ) (missed slow drop) +//! ``` +//! +//! - regret_* are LINEAR ⟨|e|⟩ (the chosen loss shape: keeps small +//! persistent drops visible), `e = ln(H_est/H_true)`, averaged over a +//! transient+steady scenario mix (cold-start excluded — one-time, +//! dominates, washes out differences). +//! - effort_* = Σ(Δln D)² over fires, split by direction. +//! - detection = P[fire within 60min | aged-counter −10% drop], the +//! operationally critical failing-ASIC case. +//! +//! ## Weights (the values call — see docs/THEORY.md §10) +//! +//! Directional asymmetries are well-grounded (commit `a1d3fa7b` +//! tighten_multiplier=3.0; the §5.1/§9.2 death-spiral physics): +//! w_over:w_under = 3:1, rho_up:rho_down = 3:1. +//! The cross-block weights are judgment: rho (effort vs regret) = 0.5, +//! w_det (miss penalty) = 0.5. All are env-overridable so the ranking's +//! sensitivity to them can be checked. +//! +//! ## Usage +//! ```text +//! cargo run --release --bin sweep-regret +//! VARDIFF_SWEEP_TRIALS=300 cargo run --release --bin sweep-regret +//! VARDIFF_W_OVER=3 VARDIFF_RHO=0.5 VARDIFF_W_DET=0.5 cargo run --release --bin sweep-regret +//! ``` +//! Env: VARDIFF_SWEEP_TRIALS (default 300), VARDIFF_SWEEP_SEED, +//! VARDIFF_W_OVER/W_UNDER/RHO_UP/RHO_DOWN/RHO/W_DET (weight overrides), +//! VARDIFF_SWEEP_OUT_DIR (default "."), writes `regret_sweep.md`. + +use std::env; +use std::fs; +use std::path::PathBuf; +use std::time::Instant; + +use channels_sv2::vardiff::composed::{ + AcceleratingPartialRetarget, AdaptivePoissonCusum, AsymmetricCusumBoundary, Composed, + EwmaEstimator, PoissonCI, +}; +use vardiff_sim::baseline::{Scenario, DEFAULT_BASELINE_SEED}; +use vardiff_sim::grid::{AlgorithmSpec, Grid, VardiffBox}; + +/// Weights (all relative to the "cheap" sides = 1.0). See module docs. +struct Weights { + w_over: f64, + w_under: f64, + rho_up: f64, + rho_down: f64, + rho: f64, + w_det: f64, +} + +impl Weights { + fn from_env() -> Self { + let g = |k: &str, d: f64| { + env::var(k).ok().and_then(|s| s.parse().ok()).unwrap_or(d) + }; + Weights { + w_over: g("VARDIFF_W_OVER", 3.0), + w_under: g("VARDIFF_W_UNDER", 1.0), + rho_up: g("VARDIFF_RHO_UP", 3.0), + rho_down: g("VARDIFF_RHO_DOWN", 1.0), + rho: g("VARDIFF_RHO", 0.5), + w_det: g("VARDIFF_W_DET", 0.5), + } + } +} + +/// Aggregated cost components for one algorithm (means over the mix). +struct Profile { + name: String, + regret_over: f64, + regret_under: f64, + effort_up: f64, + effort_down: f64, + detection: f64, + cost: f64, +} + +fn main() -> std::io::Result<()> { + let trial_count: usize = env::var("VARDIFF_SWEEP_TRIALS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(300); + let base_seed: u64 = env::var("VARDIFF_SWEEP_SEED") + .ok() + .and_then(|s| { + s.strip_prefix("0x") + .and_then(|h| u64::from_str_radix(h, 16).ok()) + .or_else(|| s.parse().ok()) + }) + .unwrap_or(DEFAULT_BASELINE_SEED); + let out_dir = env::var("VARDIFF_SWEEP_OUT_DIR") + .map(PathBuf::from) + .unwrap_or_else(|_| PathBuf::from(".")); + let w = Weights::from_env(); + + // Search space, centered on the maximin-leader family (same family the + // old sweep-balanced explored, so results are comparable). + let taus = [60u64, 75, 90, 105, 120]; + let sensitivities = [1.0f64, 1.5, 2.0]; + let tightens = [2.0f64, 3.0]; + let transitions = [8u32, 10, 12]; + let eta_bases = [0.2f32, 0.3]; + let eta_maxes = [0.4f32, 0.6]; + let acceleration = 0.2f32; + + let mut algorithms: Vec = Vec::new(); + // Reference anchors. + algorithms.push(AlgorithmSpec::classic_vardiff_state()); + algorithms.push(AlgorithmSpec::balanced()); + algorithms.push(AlgorithmSpec::react_priority()); + + for &tau in &taus { + for &sens in &sensitivities { + for &tighten in &tightens { + for &trans in &transitions { + for &eb in &eta_bases { + for &em in &eta_maxes { + if em < eb { + continue; + } + let name = vardiff_sim::naming::triple_name( + &EwmaEstimator::new(tau), + &AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(sens, 0.05, tighten), + trans, + ), + &AcceleratingPartialRetarget::new(eb, em, acceleration), + ); + algorithms.push(AlgorithmSpec::new(name, move |clock| { + let boundary = AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(sens, 0.05, tighten), + trans, + ); + let inner = Composed::new( + EwmaEstimator::new(tau), + boundary, + AcceleratingPartialRetarget::new(eb, em, acceleration), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + })); + } + } + } + } + } + } + + // Scenarios: Stable + ±10/±50 steps feed regret/effort; the + // SettledStep{60,−10} cell feeds detection (settled_reaction_rate). + let scenarios = vec![ + Scenario::Stable, + Scenario::Step { delta_pct: -50 }, + Scenario::Step { delta_pct: -10 }, + Scenario::Step { delta_pct: 10 }, + Scenario::Step { delta_pct: 50 }, + Scenario::SettledStep { + settle_minutes: 60, + delta_pct: -10, + }, + ]; + let share_rates = vec![6.0f32, 8.0, 12.0, 20.0, 30.0]; + + let grid = Grid { + algorithms, + share_rates: share_rates.clone(), + scenarios: scenarios.clone(), + trial_count, + base_seed, + }; + + eprintln!( + "Sweeping {} algorithms × {} cells × {} trials = {} total", + grid.algorithms.len(), + share_rates.len() * scenarios.len(), + trial_count, + grid.total_runs() * trial_count, + ); + let started = Instant::now(); + let results = grid.run(); + eprintln!("Sweep complete in {:.1}s", started.elapsed().as_secs_f64()); + + // Aggregate the per-cell LogErrorRegret values (already computed by the + // registry during the grid run) over the regret/effort scenario mix, + // and pull detection from the SettledStep cell. + let mut profiles: Vec = Vec::new(); + for (name, cells) in &results { + let mut ro = 0.0; + let mut ru = 0.0; + let mut eu = 0.0; + let mut ed = 0.0; + let mut n = 0u32; + let mut det_sum = 0.0; + let mut det_n = 0u32; + for cell in cells { + let is_mix = matches!( + cell.scenario, + Scenario::Stable + | Scenario::Step { + delta_pct: -50 | -10 | 10 | 50 + } + ); + if is_mix { + ro += cell.get("regret_over").unwrap_or(0.0); + ru += cell.get("regret_under").unwrap_or(0.0); + eu += cell.get("effort_up").unwrap_or(0.0); + ed += cell.get("effort_down").unwrap_or(0.0); + n += 1; + } + if matches!( + cell.scenario, + Scenario::SettledStep { + settle_minutes: 60, + delta_pct: -10 + } + ) { + if let Some(rate) = cell.get("settled_reaction_rate") { + det_sum += rate; + det_n += 1; + } + } + } + if n == 0 { + continue; + } + let (regret_over, regret_under, effort_up, effort_down) = ( + ro / n as f64, + ru / n as f64, + eu / n as f64, + ed / n as f64, + ); + let detection = if det_n > 0 { + det_sum / det_n as f64 + } else { + 0.0 + }; + let cost = w.w_over * regret_over + + w.w_under * regret_under + + w.rho * (w.rho_up * effort_up + w.rho_down * effort_down) + + w.w_det * (1.0 - detection); + profiles.push(Profile { + name: name.clone(), + regret_over, + regret_under, + effort_up, + effort_down, + detection, + cost, + }); + } + + // Rank by cost ascending (lower = better). + profiles.sort_by(|a, b| a.cost.partial_cmp(&b.cost).unwrap()); + + let mut md = String::new(); + md.push_str("# Regret/effort sweep\n\n"); + md.push_str(&format!( + "Cost = {:.1}·regret_over + {:.1}·regret_under + {:.2}·({:.1}·effort_up + {:.1}·effort_down) + {:.2}·(1−detection). Lower is better.\n\n", + w.w_over, w.w_under, w.rho, w.rho_up, w.rho_down, w.w_det + )); + md.push_str(&format!( + "{} trials/cell, base_seed {:#x}. regret = linear ⟨|e|⟩; detection = P[fire≤60min | aged −10%].\n\n", + trial_count, base_seed + )); + md.push_str("| rank | algorithm | **cost** | reg_over | reg_under | eff_up | eff_down | det% |\n"); + md.push_str("| --- | --- | --- | --- | --- | --- | --- | --- |\n"); + for (i, p) in profiles.iter().enumerate() { + md.push_str(&format!( + "| {} | {} | **{:.4}** | {:.4} | {:.4} | {:.4} | {:.4} | {:.0}% |\n", + i + 1, + p.name, + p.cost, + p.regret_over, + p.regret_under, + p.effort_up, + p.effort_down, + p.detection * 100.0, + )); + } + md.push('\n'); + + let out_path = out_dir.join("regret_sweep.md"); + fs::write(&out_path, &md)?; + eprintln!("Wrote {}", out_path.display()); + + // Also echo the top 15 to stdout for quick inspection. + println!("\n## Regret/effort sweep — top 15 (lower cost = better)\n"); + println!("| rank | algorithm | cost | reg_over | reg_under | eff_up | eff_down | det% |"); + println!("| --- | --- | --- | --- | --- | --- | --- | --- |"); + for (i, p) in profiles.iter().take(15).enumerate() { + println!( + "| {} | {} | {:.4} | {:.4} | {:.4} | {:.4} | {:.4} | {:.0}% |", + i + 1, + p.name, + p.cost, + p.regret_over, + p.regret_under, + p.effort_up, + p.effort_down, + p.detection * 100.0, + ); + } + Ok(()) +} diff --git a/sv2/channels-sv2/sim/src/bin/sweep-signpersist-cotuned.rs b/sv2/channels-sv2/sim/src/bin/sweep-signpersist-cotuned.rs new file mode 100644 index 0000000000..a8a6414660 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/sweep-signpersist-cotuned.rs @@ -0,0 +1,275 @@ +//! Co-tuned maximin sweep around the SignPersistenceCusumBoundary. +//! +//! The first SignPersist sweep broke the react−10% wall (0.54 → 0.67+) but +//! borrowed the estimator/update settings that were tuned for the DIFFERENT +//! AdaptPC boundary, and convergence emerged as the new weak axis (~0.42). +//! +//! Hypothesis for the convergence sag: cold-start is a *tightening* scenario +//! (miner faster than the too-low initial target → would_tighten), so the +//! inherited tighten_multiplier=3 makes the ramp 3× harder to fire, and the +//! sign discount (cap 0.4–0.8) can't fully offset it. So tighten_multiplier, +//! the update aggressiveness (eta_max/accel), and τ are the untested levers. +//! +//! This sweep co-tunes all three axes around SignPersist to find the Pareto +//! best — does fixing convergence cost the react−10% gain, or is there a +//! setting that holds both? Scored by maximin; full per-axis table emitted. +//! +//! ## Usage +//! ```text +//! VARDIFF_SWEEP_TRIALS=300 cargo run --release --bin sweep-signpersist-cotuned +//! ``` +//! Writes `signpersist_cotuned_sweep.md`. + +use std::env; +use std::fs; +use std::path::PathBuf; +use std::time::Instant; + +use vardiff_sim::baseline::{Scenario, DEFAULT_BASELINE_SEED}; +use vardiff_sim::grid::{AlgorithmSpec, Grid, VardiffBox}; +use vardiff_sim::metrics::{DerivedMetric, EqualWeightFitness}; + +use channels_sv2::vardiff::composed::{ + AcceleratingPartialRetarget, AdaptivePoissonCusum, AsymmetricCusumBoundary, Composed, + EwmaEstimator, PoissonCI, SignPersistenceCusumBoundary, +}; + +const AXES: &[(&str, &str)] = &[ + ("reaction_10", "react-10%"), + ("reaction_50", "react-50%"), + ("jitter", "jitter"), + ("step_safety", "step-safe"), + ("convergence", "conv"), + ("overshoot", "overshoot"), +]; + +struct Profile { + name: String, + axes: [f64; 6], + maximin: f64, + mean: f64, +} + +fn main() -> std::io::Result<()> { + let trial_count: usize = env::var("VARDIFF_SWEEP_TRIALS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(300); + let base_seed: u64 = env::var("VARDIFF_SWEEP_SEED") + .ok() + .and_then(|s| { + s.strip_prefix("0x") + .and_then(|h| u64::from_str_radix(h, 16).ok()) + .or_else(|| s.parse().ok()) + }) + .unwrap_or(DEFAULT_BASELINE_SEED); + let out_dir = env::var("VARDIFF_SWEEP_OUT_DIR") + .map(PathBuf::from) + .unwrap_or_else(|_| PathBuf::from(".")); + + // Estimator axis: τ trades reaction/convergence speed vs jitter. + let taus = [75u64, 90]; + // Boundary axis: sign-persistence with the convergence-critical lever. + let sensitivities = [1.0f64, 1.5]; + // tighten_multiplier: THE convergence lever. 1.0 = symmetric (best ramp), + // up to 3.0 = original (best jitter/safety). Sweep the whole range. + let tightens = [1.0f64, 1.5, 2.0, 3.0]; + let discounts = [0.10f64, 0.15]; // the react-winning settings + let max_disc = 0.4f64; // higher caps gave no react benefit last time + // Update axis: aggressiveness drives convergence and overshoot. + // (eta_base, eta_max, acceleration) + let updates = [ + (0.3f32, 0.6f32, 0.2f32), + (0.3f32, 0.8f32, 0.2f32), + (0.3f32, 0.8f32, 0.3f32), + ]; + + let mut algorithms: Vec = Vec::new(); + + // References: production + the balanced champion + the prior SignPersist + // react leader (so the Pareto movement is anchored). + algorithms.push(AlgorithmSpec::classic_vardiff_state()); + { + let name = vardiff_sim::naming::triple_name( + &EwmaEstimator::new(90), + &AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(1.0, 0.05, 3.0), + 8, + ), + &AcceleratingPartialRetarget::new(0.3, 0.6, 0.2), + ); + algorithms.push(AlgorithmSpec::new(name, move |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(90), + AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(1.0, 0.05, 3.0), + 8, + ), + AcceleratingPartialRetarget::new(0.3, 0.6, 0.2), + 1.0, + clock, + ))) + })); + } + + for &tau in &taus { + for &sens in &sensitivities { + for &tighten in &tightens { + for &disc in &discounts { + for &(eb, em, acc) in &updates { + let name = vardiff_sim::naming::triple_name( + &EwmaEstimator::new(tau), + &SignPersistenceCusumBoundary::new(sens, 0.05, tighten, disc, max_disc), + &AcceleratingPartialRetarget::new(eb, em, acc), + ); + algorithms.push(AlgorithmSpec::new(name, move |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(tau), + SignPersistenceCusumBoundary::new(sens, 0.05, tighten, disc, max_disc), + AcceleratingPartialRetarget::new(eb, em, acc), + 1.0, + clock, + ))) + })); + } + } + } + } + } + + let scenarios = vec![ + Scenario::ColdStart, + Scenario::Stable, + Scenario::Step { delta_pct: -10 }, + Scenario::Step { delta_pct: -50 }, + ]; + + let grid = Grid { + algorithms, + share_rates: vec![4.0, 6.0, 8.0, 10.0, 12.0, 15.0, 20.0, 30.0], + scenarios, + trial_count, + base_seed, + }; + + eprintln!( + "Sweeping {} algorithms × {} cells × {} trials", + grid.algorithms.len(), + grid.share_rates.len() * grid.scenarios.len(), + trial_count, + ); + let started = Instant::now(); + let results = grid.run(); + eprintln!("Sweep complete in {:.1}s", started.elapsed().as_secs_f64()); + + let metric = EqualWeightFitness; + let mut profiles: Vec = Vec::new(); + for (name, cells) in &results { + let computed = metric.compute(cells); + let mut sums = [0.0f64; 6]; + let mut count = 0u32; + for (_spm, mv) in &computed { + for (i, (key, _)) in AXES.iter().enumerate() { + sums[i] += mv.get(key).unwrap_or(0.0); + } + count += 1; + } + if count == 0 { + continue; + } + let axes: [f64; 6] = std::array::from_fn(|i| sums[i] / count as f64); + let maximin = axes.iter().cloned().fold(f64::INFINITY, f64::min); + let mean = axes.iter().sum::() / 6.0; + profiles.push(Profile { + name: name.clone(), + axes, + maximin, + mean, + }); + } + + profiles.sort_by(|a, b| { + b.maximin + .partial_cmp(&a.maximin) + .unwrap() + .then(b.mean.partial_cmp(&a.mean).unwrap()) + }); + + let hull: [f64; 6] = std::array::from_fn(|i| { + profiles.iter().map(|p| p.axes[i]).fold(0.0_f64, f64::max) + }); + + let mut md = String::new(); + md.push_str("# SignPersist co-tuned (maximin) sweep\n\n"); + md.push_str(&format!( + "{} configs, {} trials/cell, seed `{:#x}`. Estimator τ × boundary \ + (sensitivity, tighten, discount) × update co-tuned around \ + SignPersist. Ranked by **min axis** (maximin). All axes higher = \ + better.\n\n", + profiles.len(), + trial_count, + base_seed, + )); + md.push_str("| # | Algorithm | react-10% | react-50% | jitter | step-safe | conv | overshoot | **min** | mean |\n"); + md.push_str("| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n"); + for (rank, p) in profiles.iter().enumerate().take(40) { + let worst_i = p + .axes + .iter() + .enumerate() + .min_by(|a, b| a.1.partial_cmp(b.1).unwrap()) + .map(|(i, _)| i) + .unwrap(); + let cell = |i: usize| { + if i == worst_i { + format!("_{:.3}_", p.axes[i]) + } else { + format!("{:.3}", p.axes[i]) + } + }; + md.push_str(&format!( + "| {} | {} | {} | {} | {} | {} | {} | {} | **{:.3}** | {:.3} |\n", + rank + 1, + p.name, + cell(0), + cell(1), + cell(2), + cell(3), + cell(4), + cell(5), + p.maximin, + p.mean, + )); + } + md.push_str(&format!( + "| | **best-in-class** | {:.3} | {:.3} | {:.3} | {:.3} | {:.3} | {:.3} | | |\n", + hull[0], hull[1], hull[2], hull[3], hull[4], hull[5], + )); + + let path = out_dir.join("signpersist_cotuned_sweep.md"); + fs::create_dir_all(&out_dir)?; + fs::write(&path, &md)?; + + eprintln!("\nTop 12 by maximin:\n"); + eprintln!("| rank | min | mean | react10 | conv | algorithm |"); + eprintln!("| --- | --- | --- | --- | --- | --- |"); + for (rank, p) in profiles.iter().enumerate().take(12) { + eprintln!( + "| {} | {:.3} | {:.3} | {:.3} | {:.3} | {} |", + rank + 1, + p.maximin, + p.mean, + p.axes[0], + p.axes[4], + p.name + ); + } + eprintln!( + "\nhull: react10={:.3} conv={:.3} (prior maximin ceiling 0.551)", + hull[0], hull[4] + ); + eprintln!("Wrote {}", path.display()); + Ok(()) +} diff --git a/sv2/channels-sv2/sim/src/bin/sweep-signpersist-regret.rs b/sv2/channels-sv2/sim/src/bin/sweep-signpersist-regret.rs new file mode 100644 index 0000000000..427a0198c1 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/sweep-signpersist-regret.rs @@ -0,0 +1,321 @@ +//! Regret/effort sweep over the SignPersistence boundary family — the +//! follow-up to the trajectory spike where `c+signpersist` beat the +//! champion on ramp-up (33->11 min), settle gap (-9.8%->-5.8%), AND +//! detection (11->7 min), all from one mechanism. (The §10 regret/effort +//! successor to the older maximin `sweep-signpersist` bin.) +//! +//! Sign-persistence discounts the fire threshold on consecutive same-sign +//! residuals (applied AFTER the tighten multiplier), so a PERSISTENT +//! under-difficulty (cold start, settle bias) progressively relaxes the +//! tighten brake and fires frequent small corrections, while a one-off +//! spike keeps full death-spiral reluctance. This sweep asks: tuned +//! properly, how much of the remaining settle gap (-5.8% vs the -0.7% +//! oracle floor) can it close WITHOUT losing detection or gentleness? +//! +//! Cost is IDENTICAL to sweep-regret-big so rankings compare directly; the +//! current champion (AsymCusum boundary) is the anchor. +//! +//! Usage: `cargo run --release --bin sweep-signpersist-regret` +//! Env: VARDIFF_SP_TRIALS (default 300), VARDIFF_SP_THREADS, +//! VARDIFF_SWEEP_SEED, VARDIFF_W_*/RHO_* weights, +//! VARDIFF_SP_OUT_DIR (default "."), writes `signpersist_regret_sweep.md`. + +use std::env; +use std::fs; +use std::path::PathBuf; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::Mutex; +use std::time::Instant; + +use channels_sv2::vardiff::composed::{ + AcceleratingPartialRetarget, AdaptivePoissonCusum, AdaptiveSignPersist, AsymmetricCusumBoundary, + Composed, EwmaEstimator, PoissonCI, SignPersistenceCusumBoundary, +}; +use vardiff_sim::baseline::{Cell, Scenario, DEFAULT_BASELINE_SEED}; +use vardiff_sim::grid::{run_cell_with_algorithm, AlgorithmSpec, VardiffBox}; + +struct Weights { + w_over: f64, + w_under: f64, + rho_up: f64, + rho_down: f64, + rho: f64, + w_det: f64, +} +impl Weights { + fn from_env() -> Self { + let g = |k: &str, d: f64| env::var(k).ok().and_then(|s| s.parse().ok()).unwrap_or(d); + Weights { + w_over: g("VARDIFF_W_OVER", 3.0), + w_under: g("VARDIFF_W_UNDER", 1.0), + rho_up: g("VARDIFF_RHO_UP", 3.0), + rho_down: g("VARDIFF_RHO_DOWN", 1.0), + rho: g("VARDIFF_RHO", 0.5), + w_det: g("VARDIFF_W_DET", 0.5), + } + } +} + +struct Profile { + name: String, + regret_over: f64, + regret_under: f64, + effort_up: f64, + effort_down: f64, + detection: f64, + cost: f64, + is_anchor: bool, +} + +#[derive(Clone, Copy)] +struct Params { + tau: u64, + sens: f64, + tighten: f64, + discount: f64, + max_discount: f64, + spm: u32, +} + +const FLOOR: f64 = 0.05; +const ETA_BASE: f32 = 0.2; +const ETA_MAX: f32 = 0.8; +const ACCEL: f32 = 0.05; + +fn signpersist_spec(p: Params) -> AlgorithmSpec { + let name = vardiff_sim::naming::triple_name( + &EwmaEstimator::new(p.tau), + &AdaptiveSignPersist::sign_persist( + SignPersistenceCusumBoundary::new(p.sens, FLOOR, p.tighten, p.discount, p.max_discount), + p.spm, + ), + &AcceleratingPartialRetarget::new(ETA_BASE, ETA_MAX, ACCEL), + ); + AlgorithmSpec::new(name, move |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(p.tau), + AdaptiveSignPersist::sign_persist( + SignPersistenceCusumBoundary::new(p.sens, FLOOR, p.tighten, p.discount, p.max_discount), + p.spm, + ), + AcceleratingPartialRetarget::new(ETA_BASE, ETA_MAX, ACCEL), + 1.0, + clock, + ))) + }) +} + +fn champion_spec() -> AlgorithmSpec { + let name = vardiff_sim::naming::triple_name( + &EwmaEstimator::new(150), + &AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(0.2, FLOOR, 6.0), + 5, + ), + &AcceleratingPartialRetarget::new(ETA_BASE, ETA_MAX, ACCEL), + ); + AlgorithmSpec::new(name, |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(150), + AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(0.2, FLOOR, 6.0), + 5, + ), + AcceleratingPartialRetarget::new(ETA_BASE, ETA_MAX, ACCEL), + 1.0, + clock, + ))) + }) +} + +#[allow(clippy::too_many_arguments)] +fn profile_for( + algo: &AlgorithmSpec, + algo_idx: usize, + share_rates: &[f32], + scenarios: &[Scenario], + trial_count: usize, + base_seed: u64, + w: &Weights, + is_anchor: bool, +) -> Option { + let (n_spm, n_scen) = (share_rates.len(), scenarios.len()); + let (mut ro, mut ru, mut eu, mut ed) = (0.0, 0.0, 0.0, 0.0); + let mut n = 0u32; + let (mut ds, mut dn) = (0.0, 0u32); + for (spm_idx, &spm) in share_rates.iter().enumerate() { + for (scen_idx, scen) in scenarios.iter().enumerate() { + let cell = Cell { shares_per_minute: spm, scenario: scen.clone() }; + let cell_index = (algo_idx * n_spm * n_scen + spm_idx * n_scen + scen_idx) as u64; + let r = run_cell_with_algorithm(algo, &cell, trial_count, base_seed, cell_index); + if matches!(scen, Scenario::Stable | Scenario::Step { delta_pct: -50 | -10 | 10 | 50 }) { + ro += r.get("regret_over").unwrap_or(0.0); + ru += r.get("regret_under").unwrap_or(0.0); + eu += r.get("effort_up").unwrap_or(0.0); + ed += r.get("effort_down").unwrap_or(0.0); + n += 1; + } + if matches!(scen, Scenario::SettledStep { settle_minutes: 60, delta_pct: -10 }) { + if let Some(rate) = r.get("settled_reaction_rate") { + ds += rate; + dn += 1; + } + } + } + } + if n == 0 { + return None; + } + let (regret_over, regret_under, effort_up, effort_down) = + (ro / n as f64, ru / n as f64, eu / n as f64, ed / n as f64); + let detection = if dn > 0 { ds / dn as f64 } else { 0.0 }; + let cost = w.w_over * regret_over + + w.w_under * regret_under + + w.rho * (w.rho_up * effort_up + w.rho_down * effort_down) + + w.w_det * (1.0 - detection); + Some(Profile { + name: algo.name.clone(), + regret_over, + regret_under, + effort_up, + effort_down, + detection, + cost, + is_anchor, + }) +} + +fn main() -> std::io::Result<()> { + let trial_count: usize = env::var("VARDIFF_SP_TRIALS").ok().and_then(|s| s.parse().ok()).unwrap_or(300); + let base_seed: u64 = env::var("VARDIFF_SWEEP_SEED") + .ok() + .and_then(|s| s.strip_prefix("0x").and_then(|h| u64::from_str_radix(h, 16).ok()).or_else(|| s.parse().ok())) + .unwrap_or(DEFAULT_BASELINE_SEED); + let n_threads: usize = env::var("VARDIFF_SP_THREADS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or_else(|| std::thread::available_parallelism().map(|n| n.get()).unwrap_or(4)) + .max(1); + let out_dir = env::var("VARDIFF_SP_OUT_DIR").map(PathBuf::from).unwrap_or_else(|_| PathBuf::from(".")); + let w = Weights::from_env(); + + // Centered on the spike config (s0.2,t6,d0.12,dm0.6,spm5,tau150); + // widened on the discount axes (the new levers). + let taus = [120u64, 150, 180]; + let sensitivities = [0.15f64, 0.2, 0.3]; + let tightens = [5.0f64, 6.0, 7.0]; + let discounts = [0.06f64, 0.12, 0.2, 0.3]; + let max_discounts = [0.4f64, 0.6, 0.8]; + let spms = [4u32, 5, 6]; + + let mut params: Vec = Vec::new(); + for &tau in &taus { + for &sens in &sensitivities { + for &tighten in &tightens { + for &discount in &discounts { + for &max_discount in &max_discounts { + for &spm in &spms { + params.push(Params { tau, sens, tighten, discount, max_discount, spm }); + } + } + } + } + } + } + + let mut specs: Vec = vec![champion_spec()]; + let n_anchors = specs.len(); + for p in ¶ms { + specs.push(signpersist_spec(*p)); + } + + let scenarios = vec![ + Scenario::Stable, + Scenario::Step { delta_pct: -50 }, + Scenario::Step { delta_pct: -10 }, + Scenario::Step { delta_pct: 10 }, + Scenario::Step { delta_pct: 50 }, + Scenario::SettledStep { settle_minutes: 60, delta_pct: -10 }, + ]; + let share_rates = vec![6.0f32, 8.0, 12.0, 20.0, 30.0]; + + let n_algos = specs.len(); + let n_cells = share_rates.len() * scenarios.len(); + eprintln!( + "SignPersist sweep: {} algos ({} grid + {} anchor) x {} cells x {} trials = {} runs, {} threads", + n_algos, n_algos - n_anchors, n_anchors, n_cells, trial_count, n_algos * n_cells * trial_count, n_threads + ); + + let started = Instant::now(); + let next = AtomicUsize::new(0); + let done = AtomicUsize::new(0); + let out: Mutex> = Mutex::new(Vec::with_capacity(n_algos)); + std::thread::scope(|scope| { + for _ in 0..n_threads { + scope.spawn(|| loop { + let i = next.fetch_add(1, Ordering::Relaxed); + if i >= n_algos { + break; + } + let is_anchor = i < n_anchors; + if let Some(p) = profile_for(&specs[i], i, &share_rates, &scenarios, trial_count, base_seed, &w, is_anchor) { + out.lock().unwrap().push(p); + } + let d = done.fetch_add(1, Ordering::Relaxed) + 1; + if d % 128 == 0 || d == n_algos { + let el = started.elapsed().as_secs_f64(); + let eta = (n_algos - d) as f64 / (d as f64 / el).max(1e-9); + eprintln!(" {}/{} ({:.0}%) | {:.0}s elapsed | ~{:.0}s left", d, n_algos, 100.0 * d as f64 / n_algos as f64, el, eta); + } + }); + } + }); + + let mut profiles = out.into_inner().unwrap(); + eprintln!("Done: {} profiles in {:.1}s", profiles.len(), started.elapsed().as_secs_f64()); + profiles.sort_by(|a, b| a.cost.partial_cmp(&b.cost).unwrap()); + let champ_rank = profiles.iter().position(|p| p.is_anchor); + + let row = |i: usize, p: &Profile| { + format!( + "| {} | {}{} | **{:.4}** | {:.4} | {:.4} | {:.4} | {:.4} | {:.0}% |\n", + i + 1, p.name, if p.is_anchor { " <-champion" } else { "" }, + p.cost, p.regret_over, p.regret_under, p.effort_up, p.effort_down, p.detection * 100.0, + ) + }; + + let mut md = String::new(); + md.push_str("# SignPersistence boundary sweep (regret/effort)\n\n"); + md.push_str(&format!( + "Cost = {:.1}.regret_over + {:.1}.regret_under + {:.2}.({:.1}.effort_up + {:.1}.effort_down) + {:.2}.(1-detection). Lower is better.\n\n", + w.w_over, w.w_under, w.rho, w.rho_up, w.rho_down, w.w_det + )); + md.push_str(&format!( + "{} algos, {} trials/cell, base_seed {:#x}. Champion (AsymCusum) anchor at rank {}/{}.\n\n", + n_algos, trial_count, base_seed, champ_rank.map(|r| r + 1).unwrap_or(0), n_algos + )); + md.push_str("| rank | algorithm | **cost** | reg_over | reg_under | eff_up | eff_down | det% |\n"); + md.push_str("| --- | --- | --- | --- | --- | --- | --- | --- |\n"); + for (i, p) in profiles.iter().enumerate() { + md.push_str(&row(i, p)); + } + let out_path = out_dir.join("signpersist_regret_sweep.md"); + fs::write(&out_path, &md)?; + eprintln!("Wrote {}", out_path.display()); + + println!("\n## SignPersist sweep - top 20 + champion anchor\n"); + println!("| rank | algorithm | cost | reg_over | reg_under | eff_up | eff_down | det% |"); + println!("| --- | --- | --- | --- | --- | --- | --- | --- |"); + for (i, p) in profiles.iter().take(20).enumerate() { + print!("{}", row(i, p)); + } + if let Some(r) = champ_rank { + if r >= 20 { + print!("{}", row(r, &profiles[r])); + } + println!("\nChampion (AsymCusum) anchor at rank {}/{}, cost {:.4}.", r + 1, n_algos, profiles[r].cost); + } + Ok(()) +} diff --git a/sv2/channels-sv2/sim/src/bin/sweep-signpersist.rs b/sv2/channels-sv2/sim/src/bin/sweep-signpersist.rs new file mode 100644 index 0000000000..a4346ad2fa --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/sweep-signpersist.rs @@ -0,0 +1,259 @@ +//! Maximin sweep for SignPersistenceCusumBoundary — the residual-SIGN +//! persistence attack on the react−10% wall. +//! +//! Prior sweeps confirmed react−10% caps maximin at ≈0.55: magnitude-based +//! boundaries can't distinguish a real 10% drop from Poisson noise without +//! paying in jitter (VolatilityAdaptiveBoundary even loosened during the +//! drop). Sign persistence uses a different signal: a SUSTAINED drop produces +//! many consecutive same-direction residuals, whereas symmetric noise flips +//! sign. The boundary ratchets its threshold DOWN as one direction persists, +//! so a genuine drop is detected faster while noise keeps resetting. +//! +//! Sweeps base_sensitivity × tighten × discount-per-tick × max-discount × τ, +//! Accel update fixed at the balanced-winner setting. Scored by maximin. +//! +//! ## Usage +//! ```text +//! VARDIFF_SWEEP_TRIALS=300 cargo run --release --bin sweep-signpersist +//! ``` +//! Writes `signpersist_sweep.md`. + +use std::env; +use std::fs; +use std::path::PathBuf; +use std::time::Instant; + +use vardiff_sim::baseline::{Scenario, DEFAULT_BASELINE_SEED}; +use vardiff_sim::grid::{AlgorithmSpec, Grid, VardiffBox}; +use vardiff_sim::metrics::{DerivedMetric, EqualWeightFitness}; + +use channels_sv2::vardiff::composed::{ + AcceleratingPartialRetarget, AdaptivePoissonCusum, AsymmetricCusumBoundary, Composed, + EwmaEstimator, PoissonCI, SignPersistenceCusumBoundary, +}; + +const AXES: &[(&str, &str)] = &[ + ("reaction_10", "react-10%"), + ("reaction_50", "react-50%"), + ("jitter", "jitter"), + ("step_safety", "step-safe"), + ("convergence", "conv"), + ("overshoot", "overshoot"), +]; + +struct Profile { + name: String, + axes: [f64; 6], + maximin: f64, + mean: f64, +} + +fn main() -> std::io::Result<()> { + let trial_count: usize = env::var("VARDIFF_SWEEP_TRIALS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(300); + let base_seed: u64 = env::var("VARDIFF_SWEEP_SEED") + .ok() + .and_then(|s| { + s.strip_prefix("0x") + .and_then(|h| u64::from_str_radix(h, 16).ok()) + .or_else(|| s.parse().ok()) + }) + .unwrap_or(DEFAULT_BASELINE_SEED); + let out_dir = env::var("VARDIFF_SWEEP_OUT_DIR") + .map(PathBuf::from) + .unwrap_or_else(|_| PathBuf::from(".")); + + let taus = [60u64, 90]; + let sensitivities = [1.0f64, 1.5]; + let tightens = [2.0f64, 3.0]; + let discounts = [0.05f64, 0.10, 0.15]; // per-tick threshold reduction + let max_discounts = [0.4f64, 0.6, 0.8]; // cap on total reduction + let eta = (0.3f32, 0.6f32, 0.2f32); + + let mut algorithms: Vec = Vec::new(); + + // References. + algorithms.push(AlgorithmSpec::classic_vardiff_state()); + { + let name = vardiff_sim::naming::triple_name( + &EwmaEstimator::new(90), + &AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(1.0, 0.05, 3.0), + 8, + ), + &AcceleratingPartialRetarget::new(0.3, 0.6, 0.2), + ); + algorithms.push(AlgorithmSpec::new(name, move |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(90), + AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(1.0, 0.05, 3.0), + 8, + ), + AcceleratingPartialRetarget::new(0.3, 0.6, 0.2), + 1.0, + clock, + ))) + })); + } + + for &tau in &taus { + for &sens in &sensitivities { + for &tighten in &tightens { + for &disc in &discounts { + for &maxd in &max_discounts { + let name = vardiff_sim::naming::triple_name( + &EwmaEstimator::new(tau), + &SignPersistenceCusumBoundary::new(sens, 0.05, tighten, disc, maxd), + &AcceleratingPartialRetarget::new(eta.0, eta.1, eta.2), + ); + algorithms.push(AlgorithmSpec::new(name, move |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(tau), + SignPersistenceCusumBoundary::new(sens, 0.05, tighten, disc, maxd), + AcceleratingPartialRetarget::new(eta.0, eta.1, eta.2), + 1.0, + clock, + ))) + })); + } + } + } + } + } + + let scenarios = vec![ + Scenario::ColdStart, + Scenario::Stable, + Scenario::Step { delta_pct: -10 }, + Scenario::Step { delta_pct: -50 }, + ]; + + let grid = Grid { + algorithms, + share_rates: vec![4.0, 6.0, 8.0, 10.0, 12.0, 15.0, 20.0, 30.0], + scenarios, + trial_count, + base_seed, + }; + + eprintln!( + "Sweeping {} algorithms × {} cells × {} trials", + grid.algorithms.len(), + grid.share_rates.len() * grid.scenarios.len(), + trial_count, + ); + let started = Instant::now(); + let results = grid.run(); + eprintln!("Sweep complete in {:.1}s", started.elapsed().as_secs_f64()); + + let metric = EqualWeightFitness; + let mut profiles: Vec = Vec::new(); + for (name, cells) in &results { + let computed = metric.compute(cells); + let mut sums = [0.0f64; 6]; + let mut count = 0u32; + for (_spm, mv) in &computed { + for (i, (key, _)) in AXES.iter().enumerate() { + sums[i] += mv.get(key).unwrap_or(0.0); + } + count += 1; + } + if count == 0 { + continue; + } + let axes: [f64; 6] = std::array::from_fn(|i| sums[i] / count as f64); + let maximin = axes.iter().cloned().fold(f64::INFINITY, f64::min); + let mean = axes.iter().sum::() / 6.0; + profiles.push(Profile { + name: name.clone(), + axes, + maximin, + mean, + }); + } + + profiles.sort_by(|a, b| { + b.maximin + .partial_cmp(&a.maximin) + .unwrap() + .then(b.mean.partial_cmp(&a.mean).unwrap()) + }); + + let hull: [f64; 6] = std::array::from_fn(|i| { + profiles.iter().map(|p| p.axes[i]).fold(0.0_f64, f64::max) + }); + + let mut md = String::new(); + md.push_str("# SignPersistenceCusumBoundary (maximin) sweep\n\n"); + md.push_str(&format!( + "{} configs, {} trials/cell, seed `{:#x}`. Ranked by **min axis** \ + (maximin). All axes higher = better.\n\n", + profiles.len(), + trial_count, + base_seed, + )); + md.push_str("| # | Algorithm | react-10% | react-50% | jitter | step-safe | conv | overshoot | **min** | mean |\n"); + md.push_str("| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n"); + for (rank, p) in profiles.iter().enumerate().take(40) { + let worst_i = p + .axes + .iter() + .enumerate() + .min_by(|a, b| a.1.partial_cmp(b.1).unwrap()) + .map(|(i, _)| i) + .unwrap(); + let cell = |i: usize| { + if i == worst_i { + format!("_{:.3}_", p.axes[i]) + } else { + format!("{:.3}", p.axes[i]) + } + }; + md.push_str(&format!( + "| {} | {} | {} | {} | {} | {} | {} | {} | **{:.3}** | {:.3} |\n", + rank + 1, + p.name, + cell(0), + cell(1), + cell(2), + cell(3), + cell(4), + cell(5), + p.maximin, + p.mean, + )); + } + md.push_str(&format!( + "| | **best-in-class** | {:.3} | {:.3} | {:.3} | {:.3} | {:.3} | {:.3} | | |\n", + hull[0], hull[1], hull[2], hull[3], hull[4], hull[5], + )); + + let path = out_dir.join("signpersist_sweep.md"); + fs::create_dir_all(&out_dir)?; + fs::write(&path, &md)?; + + eprintln!("\nTop 10 by maximin:\n"); + eprintln!("| rank | min | mean | react-10% | algorithm |"); + eprintln!("| --- | --- | --- | --- | --- |"); + for (rank, p) in profiles.iter().enumerate().take(10) { + eprintln!( + "| {} | {:.3} | {:.3} | {:.3} | {} |", + rank + 1, + p.maximin, + p.mean, + p.axes[0], + p.name + ); + } + eprintln!( + "\nreact-10% best-in-class: {:.3} (prior wall ≈ 0.55 maximin / 0.54 react-10%)", + hull[0] + ); + eprintln!("Wrote {}", path.display()); + Ok(()) +} diff --git a/sv2/channels-sv2/sim/src/bin/sweep-voladapt.rs b/sv2/channels-sv2/sim/src/bin/sweep-voladapt.rs new file mode 100644 index 0000000000..7c170100b2 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/sweep-voladapt.rs @@ -0,0 +1,262 @@ +//! Maximin sweep for the VolatilityAdaptiveBoundary prototype. +//! +//! Hypothesis: a boundary that tightens when the share stream is calm and +//! loosens when it's genuinely volatile can beat the fixed-boundary react−10% +//! ↔ jitter tradeoff that capped the EWMA sweep at maximin ≈ 0.55. +//! +//! Sweeps alpha (EWMA memory of the volatility tracker) × vf_max (max +//! loosening) × z (PoissonCI floor) × EWMA τ, with the Accel update fixed at +//! the balanced-winner setting. Scored by maximin over the 6 equal-weight +//! axes; the EWMA balanced winner and production are included as references. +//! +//! ## Usage +//! ```text +//! VARDIFF_SWEEP_TRIALS=300 cargo run --release --bin sweep-voladapt +//! ``` +//! Writes `voladapt_sweep.md`. + +use std::env; +use std::fs; +use std::path::PathBuf; +use std::time::Instant; + +use vardiff_sim::baseline::{Scenario, DEFAULT_BASELINE_SEED}; +use vardiff_sim::grid::{AlgorithmSpec, Grid, VardiffBox}; +use vardiff_sim::metrics::{DerivedMetric, EqualWeightFitness}; + +use channels_sv2::vardiff::composed::{ + AcceleratingPartialRetarget, AdaptivePoissonCusum, AsymmetricCusumBoundary, Composed, + EwmaEstimator, PoissonCI, VolatilityAdaptiveBoundary, +}; + +const AXES: &[(&str, &str)] = &[ + ("reaction_10", "react-10%"), + ("reaction_50", "react-50%"), + ("jitter", "jitter"), + ("step_safety", "step-safe"), + ("convergence", "conv"), + ("overshoot", "overshoot"), +]; + +struct Profile { + name: String, + axes: [f64; 6], + maximin: f64, + mean: f64, +} + +fn main() -> std::io::Result<()> { + let trial_count: usize = env::var("VARDIFF_SWEEP_TRIALS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(300); + let base_seed: u64 = env::var("VARDIFF_SWEEP_SEED") + .ok() + .and_then(|s| { + s.strip_prefix("0x") + .and_then(|h| u64::from_str_radix(h, 16).ok()) + .or_else(|| s.parse().ok()) + }) + .unwrap_or(DEFAULT_BASELINE_SEED); + let out_dir = env::var("VARDIFF_SWEEP_OUT_DIR") + .map(PathBuf::from) + .unwrap_or_else(|_| PathBuf::from(".")); + + let taus = [60u64, 90, 120]; + let alphas = [0.1f64, 0.2, 0.4]; + let vf_maxes = [2.0f64, 4.0, 8.0]; + let zs = [2.0f64, 2.576]; + let eta = (0.3f32, 0.6f32, 0.2f32); + + let mut algorithms: Vec = Vec::new(); + + // References. + algorithms.push(AlgorithmSpec::classic_vardiff_state()); + { + // EWMA balanced winner (maximin 0.551) for head-to-head. + let name = vardiff_sim::naming::triple_name( + &EwmaEstimator::new(90), + &AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(1.0, 0.05, 3.0), + 8, + ), + &AcceleratingPartialRetarget::new(0.3, 0.6, 0.2), + ); + algorithms.push(AlgorithmSpec::new(name, move |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(90), + AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(1.0, 0.05, 3.0), + 8, + ), + AcceleratingPartialRetarget::new(0.3, 0.6, 0.2), + 1.0, + clock, + ))) + })); + } + + for &tau in &taus { + for &alpha in &alphas { + for &vf_max in &vf_maxes { + for &z in &zs { + let name = vardiff_sim::naming::triple_name( + &EwmaEstimator::new(tau), + &VolatilityAdaptiveBoundary::with_poisson( + PoissonCI::with_z(z, 0.05), + alpha, + vf_max, + ), + &AcceleratingPartialRetarget::new(eta.0, eta.1, eta.2), + ); + algorithms.push(AlgorithmSpec::new(name, move |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(tau), + VolatilityAdaptiveBoundary::with_poisson( + PoissonCI::with_z(z, 0.05), + alpha, + vf_max, + ), + AcceleratingPartialRetarget::new(eta.0, eta.1, eta.2), + 1.0, + clock, + ))) + })); + } + } + } + } + + let scenarios = vec![ + Scenario::ColdStart, + Scenario::Stable, + Scenario::Step { delta_pct: -10 }, + Scenario::Step { delta_pct: -50 }, + ]; + + let grid = Grid { + algorithms, + share_rates: vec![4.0, 6.0, 8.0, 10.0, 12.0, 15.0, 20.0, 30.0], + scenarios, + trial_count, + base_seed, + }; + + eprintln!( + "Sweeping {} algorithms × {} cells × {} trials", + grid.algorithms.len(), + grid.share_rates.len() * grid.scenarios.len(), + trial_count, + ); + let started = Instant::now(); + let results = grid.run(); + eprintln!("Sweep complete in {:.1}s", started.elapsed().as_secs_f64()); + + let metric = EqualWeightFitness; + let mut profiles: Vec = Vec::new(); + for (name, cells) in &results { + let computed = metric.compute(cells); + let mut sums = [0.0f64; 6]; + let mut count = 0u32; + for (_spm, mv) in &computed { + for (i, (key, _)) in AXES.iter().enumerate() { + sums[i] += mv.get(key).unwrap_or(0.0); + } + count += 1; + } + if count == 0 { + continue; + } + let axes: [f64; 6] = std::array::from_fn(|i| sums[i] / count as f64); + let maximin = axes.iter().cloned().fold(f64::INFINITY, f64::min); + let mean = axes.iter().sum::() / 6.0; + profiles.push(Profile { + name: name.clone(), + axes, + maximin, + mean, + }); + } + + profiles.sort_by(|a, b| { + b.maximin + .partial_cmp(&a.maximin) + .unwrap() + .then(b.mean.partial_cmp(&a.mean).unwrap()) + }); + + let hull: [f64; 6] = std::array::from_fn(|i| { + profiles.iter().map(|p| p.axes[i]).fold(0.0_f64, f64::max) + }); + + let mut md = String::new(); + md.push_str("# VolatilityAdaptiveBoundary (maximin) sweep\n\n"); + md.push_str(&format!( + "{} configs, {} trials/cell, seed `{:#x}`. Ranked by **min axis** \ + (maximin). All axes higher = better.\n\n", + profiles.len(), + trial_count, + base_seed, + )); + md.push_str("| # | Algorithm | react-10% | react-50% | jitter | step-safe | conv | overshoot | **min** | mean |\n"); + md.push_str("| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n"); + for (rank, p) in profiles.iter().enumerate() { + let worst_i = p + .axes + .iter() + .enumerate() + .min_by(|a, b| a.1.partial_cmp(b.1).unwrap()) + .map(|(i, _)| i) + .unwrap(); + let cell = |i: usize| { + if i == worst_i { + format!("_{:.3}_", p.axes[i]) + } else { + format!("{:.3}", p.axes[i]) + } + }; + md.push_str(&format!( + "| {} | {} | {} | {} | {} | {} | {} | {} | **{:.3}** | {:.3} |\n", + rank + 1, + p.name, + cell(0), + cell(1), + cell(2), + cell(3), + cell(4), + cell(5), + p.maximin, + p.mean, + )); + } + md.push_str(&format!( + "| | **best-in-class** | {:.3} | {:.3} | {:.3} | {:.3} | {:.3} | {:.3} | | |\n", + hull[0], hull[1], hull[2], hull[3], hull[4], hull[5], + )); + + let path = out_dir.join("voladapt_sweep.md"); + fs::create_dir_all(&out_dir)?; + fs::write(&path, &md)?; + + eprintln!("\nTop 10 by maximin:\n"); + eprintln!("| rank | min | mean | react-10% | algorithm |"); + eprintln!("| --- | --- | --- | --- | --- |"); + for (rank, p) in profiles.iter().enumerate().take(10) { + eprintln!( + "| {} | {:.3} | {:.3} | {:.3} | {} |", + rank + 1, + p.maximin, + p.mean, + p.axes[0], + p.name + ); + } + eprintln!( + "\nreact-10% best-in-class: {:.3} (EWMA/Kalman wall was 0.54)", + hull[0] + ); + eprintln!("Wrote {}", path.display()); + Ok(()) +} diff --git a/sv2/channels-sv2/sim/src/bin/sweep-z.rs b/sv2/channels-sv2/sim/src/bin/sweep-z.rs new file mode 100644 index 0000000000..47fb405414 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/sweep-z.rs @@ -0,0 +1,339 @@ +//! PoissonCI z-parameter sweep for the FullRemedy family. Holds +//! `EwmaEstimator(τ = 120s)` and `PartialRetarget(η = 0.2)` fixed and +//! varies z ∈ {1.96, 2.326, 2.576, 3.0, 3.5}, characterizing the +//! false-fire vs. reaction-sensitivity Pareto frontier under PoissonCI. +//! η is held at the FullRemedy default; the joint `sweep-eta-z` +//! confirmed (η, z) are nearly separable so the z marginal is stable +//! across η. +//! +//! The z values correspond to common confidence levels under the +//! normal approximation: +//! +//! - z = 1.96 — 95% two-sided CI +//! - z = 2.326 — 98% two-sided CI +//! - z = 2.576 — 99% two-sided CI (FullRemedy default) +//! - z = 3.0 — ~99.7% (3-sigma) +//! - z = 3.5 — ~99.95% +//! +//! Higher z widens the threshold, suppressing false fires under stable +//! load at the cost of slower reaction on small steps. This sweep +//! characterizes whether z = 2.576 is Pareto-optimal under the current +//! metric definitions. +//! +//! ## Usage +//! +//! ```text +//! cargo run --release --bin sweep-z +//! ``` +//! +//! Output: `z_sweep.md` in the current directory (configurable via +//! `VARDIFF_Z_OUT_DIR`). Default sweep is 5 × 50 cells × 1000 trials +//! = 250,000 trials, ~90 seconds in release mode. Reduce via +//! `VARDIFF_Z_TRIALS=100` for fast iteration. +//! +//! ## Environment +//! +//! - `VARDIFF_Z_TRIALS` — trials per cell (default 1000). +//! - `VARDIFF_Z_SEED` — base seed (default `0xDEAD_BEEF_CAFE_F00D`). +//! - `VARDIFF_Z_OUT_DIR` — output directory (default `.`). +//! - `VARDIFF_Z_VALUES` — comma-separated z values (default +//! `1.96,2.326,2.576,3.0,3.5`). +//! +//! ## Paired vs un-paired +//! +//! Uses `Grid::run_paired` so cross-z metric differences are +//! attributable to the z change alone, not to seed disparity. + +use std::env; +use std::fs; +use std::path::PathBuf; +use std::time::Instant; + +use vardiff_sim::baseline::{Scenario, DEFAULT_BASELINE_SEED, DEFAULT_TRIAL_COUNT}; +use vardiff_sim::grid::{AlgorithmSpec, Grid}; +use vardiff_sim::metrics::{DecouplingScore, DerivedMetric}; + +/// Fixed axes for the z sweep — varied independently from z so the +/// reader can attribute any frontier movement to z alone. +const SWEEP_TAU_SECS: u64 = 120; +const SWEEP_ETA: f32 = 0.2; + +fn main() -> std::io::Result<()> { + let trial_count = env_or("VARDIFF_Z_TRIALS", DEFAULT_TRIAL_COUNT); + let base_seed = env_or_seed("VARDIFF_Z_SEED", DEFAULT_BASELINE_SEED); + let out_dir = env::var("VARDIFF_Z_OUT_DIR") + .map(PathBuf::from) + .unwrap_or_else(|_| PathBuf::from(".")); + let zs: Vec = env::var("VARDIFF_Z_VALUES") + .ok() + .and_then(|s| { + let v: Vec = s.split(',').filter_map(|t| t.trim().parse().ok()).collect(); + if v.is_empty() { + None + } else { + Some(v) + } + }) + .unwrap_or_else(|| vec![1.96, 2.326, 2.576, 3.0, 3.5]); + + let mut scenarios = vec![Scenario::ColdStart, Scenario::Stable]; + for &d in &[-50i32, -25, -10, -5, 5, 10, 25, 50] { + scenarios.push(Scenario::Step { delta_pct: d }); + } + + let grid = Grid { + algorithms: zs + .iter() + .map(|&z| AlgorithmSpec::full_remedy_with(SWEEP_TAU_SECS, SWEEP_ETA, z)) + .collect(), + share_rates: vec![6.0, 8.0, 10.0, 12.0, 15.0, 20.0, 25.0, 30.0], + scenarios, + trial_count, + base_seed, + }; + + eprintln!( + "FullRemedy z sweep: z ∈ {{{}}} × {} cells × {} trials = {} total trials, \ + τ={}s, η={}, base_seed = {:#x}", + zs.iter() + .map(|z| format!("{:.3}", z)) + .collect::>() + .join(", "), + grid.share_rates.len() * grid.scenarios.len(), + trial_count, + grid.total_runs() * trial_count, + SWEEP_TAU_SECS, + SWEEP_ETA, + base_seed, + ); + + let started = Instant::now(); + let results = grid.run_paired(); + eprintln!( + "Sweep complete in {:.2}s\n", + started.elapsed().as_secs_f64() + ); + + fs::create_dir_all(&out_dir)?; + let out_path = out_dir.join("z_sweep.md"); + + let report = build_report(&zs, &grid.share_rates, &results, trial_count, base_seed); + fs::write(&out_path, &report)?; + eprintln!("Wrote {}", out_path.display()); + + Ok(()) +} + +fn algorithm_name(z: f64) -> String { + format!( + "FullRemedy-tau{}-eta{}-z{}", + SWEEP_TAU_SECS, + (SWEEP_ETA * 100.0).round() as u32, + (z * 1000.0).round() as u32, + ) +} + +fn build_report( + zs: &[f64], + share_rates: &[f32], + results: &std::collections::HashMap>, + trial_count: usize, + base_seed: u64, +) -> String { + let mut out = String::new(); + out.push_str(&format!( + "# FullRemedy z sweep ({} trials/cell, base_seed = {:#x})\n\n", + trial_count, base_seed + )); + out.push_str(&format!( + "Pareto-explore the PoissonCI z parameter on the FullRemedy \ + family. Holds the other two FullRemedy axes fixed \ + (`EwmaEstimator(τ = {}s)`, `PartialRetarget(η = {})`) and \ + varies only z. Higher z widens the threshold, suppressing \ + false fires under stable load at the cost of slower reaction \ + on small steps.\n\n", + SWEEP_TAU_SECS, SWEEP_ETA, + )); + + let lookup = |z: f64, spm: f32, scenario_key: &str, key: &str| -> Option { + let name = algorithm_name(z); + results + .get(&name)? + .iter() + .find(|c| c.shares_per_minute == spm && c.scenario_key() == scenario_key) + .and_then(|c| c.get(key)) + }; + + // ---- Decoupling score ---- + out.push_str("## Decoupling score (higher = better)\n\n"); + out.push_str( + "`reaction_rate(Step−50) × clamp(1 − jitter_p50 / J_max, 0, 1)`, \ + J_max = 0.50 fires/min. 1.0 = perfect; > 0.8 = strong; < 0.3 \ + = poor.\n\n", + ); + emit_grid_header(&mut out, zs); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &z in zs { + let name = algorithm_name(z); + let cells = match results.get(&name) { + Some(c) => c.clone(), + None => continue, + }; + let scored = DecouplingScore.compute(&cells); + let s = scored + .iter() + .find(|(s, _)| *s == spm) + .and_then(|(_, mv)| mv.get("score")); + out.push_str(&match s { + Some(v) => format!(" {:.3} |", v), + None => " — |".to_string(), + }); + } + out.push('\n'); + } + out.push('\n'); + + // ---- Jitter mean ---- + out.push_str("## Jitter mean under stable load (lower = better)\n\n"); + out.push_str( + "Fires per minute, post-convergence. Higher z directly raises \ + the threshold floor, suppressing stable-load fires — this \ + is the metric z was introduced to bound.\n\n", + ); + emit_grid_header(&mut out, zs); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &z in zs { + let v = lookup(z, spm, "stable_1ph", "jitter_mean_per_min"); + out.push_str(&match v { + Some(x) => format!(" {:.3} |", x), + None => " — |".to_string(), + }); + } + out.push('\n'); + } + out.push('\n'); + + // ---- Reaction rate at −50% step ---- + out.push_str("## Reaction rate at −50% step (higher = better)\n\n"); + out.push_str( + "Fraction of trials that fire within 5 min of a 50% drop in \ + true hashrate. Higher z lifts the threshold; if it lifts past \ + the post-step δ at low SPM, reaction rate collapses.\n\n", + ); + emit_grid_header(&mut out, zs); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &z in zs { + let v = lookup(z, spm, "step_minus_50_at_15min", "reaction_rate"); + out.push_str(&match v { + Some(x) => format!(" {:.2} |", x), + None => " — |".to_string(), + }); + } + out.push('\n'); + } + out.push('\n'); + + // ---- Reaction rate at −10% step ---- + out.push_str("## Reaction rate at −10% step (higher = better)\n\n"); + out.push_str( + "Small-step sensitivity. A 10% drop is the hardest signal to \ + distinguish from Poisson noise; z controls how readily the \ + algorithm fires on it.\n\n", + ); + emit_grid_header(&mut out, zs); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &z in zs { + let v = lookup(z, spm, "step_minus_10_at_15min", "reaction_rate"); + out.push_str(&match v { + Some(x) => format!(" {:.2} |", x), + None => " — |".to_string(), + }); + } + out.push('\n'); + } + out.push('\n'); + + // ---- Ramp target overshoot p90 (cold start) ---- + out.push_str("## Ramp target overshoot p90 — cold start (lower = better)\n\n"); + out.push_str( + "Higher z means the algorithm fires less readily on the \ + Phase-1-end Poisson spike; this trades against responsiveness \ + on slow ramps.\n\n", + ); + emit_grid_header(&mut out, zs); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &z in zs { + let v = lookup( + z, + spm, + "cold_start_10gh_to_1ph", + "ramp_target_overshoot_p90", + ); + out.push_str(&match v { + Some(x) => format!(" {:.1}% |", x * 100.0), + None => " — |".to_string(), + }); + } + out.push('\n'); + } + out.push('\n'); + + // ---- Ramp target overshoot p99 (cold start) ---- + out.push_str("## Ramp target overshoot p99 — cold start (lower = better)\n\n"); + out.push_str("Worst-trial tail of the ramp overshoot distribution.\n\n"); + emit_grid_header(&mut out, zs); + for &spm in share_rates { + out.push_str(&format!("| {} |", spm as u32)); + for &z in zs { + let v = lookup( + z, + spm, + "cold_start_10gh_to_1ph", + "ramp_target_overshoot_p99", + ); + out.push_str(&match v { + Some(x) => format!(" {:.1}% |", x * 100.0), + None => " — |".to_string(), + }); + } + out.push('\n'); + } + out.push('\n'); + + out +} + +fn emit_grid_header(out: &mut String, zs: &[f64]) { + out.push_str("| SPM |"); + for &z in zs { + out.push_str(&format!(" z={:.3} |", z)); + } + out.push('\n'); + out.push_str("| ---"); + for _ in zs { + out.push_str(" | ---"); + } + out.push_str(" |\n"); +} + +fn env_or(var: &str, default: T) -> T { + env::var(var) + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(default) +} + +fn env_or_seed(var: &str, default: u64) -> u64 { + if let Ok(s) = env::var(var) { + if let Some(hex) = s.strip_prefix("0x").or_else(|| s.strip_prefix("0X")) { + return u64::from_str_radix(hex, 16).unwrap_or(default); + } + return s.parse().unwrap_or(default); + } + default +} diff --git a/sv2/channels-sv2/sim/src/bin/trace-trial.rs b/sv2/channels-sv2/sim/src/bin/trace-trial.rs new file mode 100644 index 0000000000..b0807375a2 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/trace-trial.rs @@ -0,0 +1,357 @@ +//! Single-trial tracer. Runs ONE trial with a chosen algorithm, +//! scenario, and seed, then dumps the per-tick state (timestamp, +//! shares, current hashrate, δ, θ, H̃, fired, new hashrate) as a +//! CSV-ish table to stdout. The output is small enough that you can +//! inspect it directly in a terminal or paste it into a spreadsheet +//! for plotting. +//! +//! Designed for investigating one-off anomalies surfaced by the +//! comparison sweep — e.g., "why does Parametric have 45.8% +//! overshoot at SPM=30 cold start in all 1000 trials?". +//! +//! ## Usage +//! +//! ```text +//! cargo run --release --bin trace-trial -- \ +//! --algorithm parametric \ +//! --scenario cold_start \ +//! --spm 30 \ +//! --seed 0xCAFE +//! ``` +//! +//! ## Algorithms +//! +//! - `vardiff_state` — the production algorithm (not observable; δ/θ/H̃ +//! columns will show `—`). +//! - `classic_composed` — four-axis-decomposed Classic. Observable. +//! - `parametric` — Classic with PoissonCI boundary. +//! - `ewma_60s` — EwmaEstimator(60s) + PoissonCI + PartialRetarget. +//! +//! ## Scenarios +//! +//! - `cold_start` — initial 1e10, true 1e15, schedule stable. +//! - `stable` — initial 1e15, true 1e15. +//! - `step_minus_50` — true 1e15 → 5e14 at 15min. +//! - `step_plus_50` — true 1e15 → 1.5e15 at 15min. +//! - `step:` — generic step at 15min with the given Δ% (e.g., +//! `step:-25` for −25%). +//! +//! ## Investigations enabled +//! +//! - **SPM=30 cold-start overshoot** (`--algorithm parametric +//! --scenario cold_start --spm 30`): look at H̃ column. Does the peak +//! come from Phase 1 ramp or post-settle Poisson noise? +//! - **VardiffState convergence failure at SPM=6** (`--algorithm +//! vardiff_state --scenario cold_start --spm 6`): trace 30 trials +//! with different seeds; identify which scenarios fail to converge. +//! - **Asymmetric step response** (`--algorithm vardiff_state +//! --scenario step:+50 --spm 120`): see whether the algorithm fires +//! at all post-step. + +use std::env; +use std::sync::Arc; + +use channels_sv2::vardiff::MockClock; +use vardiff_sim::baseline::Scenario; +use vardiff_sim::grid::AlgorithmSpec; +use vardiff_sim::trial::run_trial_observed; + +struct Args { + algorithm: String, + scenario: String, + spm: f32, + seed: u64, + /// If Some(N), scan N seeds starting from `seed`, find the one + /// with the largest target overshoot, then trace it. + scan_overshoot: Option, +} + +fn parse_args() -> Args { + let mut algorithm = String::from("parametric"); + let mut scenario = String::from("cold_start"); + let mut spm: f32 = 30.0; + let mut seed: u64 = 0xCAFE; + let mut scan_overshoot: Option = None; + + let argv: Vec = env::args().collect(); + let mut i = 1; + while i < argv.len() { + let key = &argv[i]; + let val = argv.get(i + 1).cloned().unwrap_or_default(); + match key.as_str() { + "--algorithm" | "-a" => algorithm = val, + "--scenario" | "-s" => scenario = val, + "--spm" => spm = val.parse().unwrap_or(spm), + "--seed" => { + seed = if let Some(hex) = val.strip_prefix("0x").or_else(|| val.strip_prefix("0X")) + { + u64::from_str_radix(hex, 16).unwrap_or(seed) + } else { + val.parse().unwrap_or(seed) + }; + } + "--scan-overshoot" => { + scan_overshoot = val.parse::().ok(); + } + "--help" | "-h" => { + print_help(); + std::process::exit(0); + } + _ => {} + } + i += 2; + } + + Args { + algorithm, + scenario, + spm, + seed, + scan_overshoot, + } +} + +fn print_help() { + eprintln!( + "Usage: trace-trial [options] +Options: + --algorithm, -a one of: vardiff_state, classic_composed, parametric, + parametric_strict, classic_partial_retarget, ewma_60s, + sliding_window, full_remedy (default: parametric) + --scenario, -s one of: cold_start, stable, step_minus_50, step_plus_50, step: + (default: cold_start) + --spm shares per minute (default: 30) + --seed trial seed; hex (0x...) or decimal (default: 0xCAFE). + When --scan-overshoot is set, this is the base seed + from which N consecutive seeds are scanned. + --scan-overshoot N scan N seeds, find the one with the largest ramp + target overshoot, then trace it. Useful for hunting + worst-case ramp behavior (e.g., VardiffState SPM=6 + p99=145% from FINDINGS.md §3.4). + --help, -h print this help + +Algorithm shorthand: + parametric_strict Parametric with z=3.0 (99.7% CI) — stricter boundary. + classic_partial_retarget Classic boundary + PartialRetarget(η=0.3) — isolates + the UpdateRule axis: bounds per-fire magnitude. + full_remedy EwmaEstimator(120s) + PoissonCI + PartialRetarget(0.3) — + the composed three-axis remedy predicted to close + the SPM=6 Phase-1 cascade. +" + ); +} + +fn algorithm_factory(name: &str) -> Result { + Ok(match name { + "vardiff_state" | "vardiff" => AlgorithmSpec::classic_vardiff_state(), + "classic_composed" | "classic" => AlgorithmSpec::classic_composed(), + "parametric" => AlgorithmSpec::parametric(), + "parametric_strict" | "strict" => AlgorithmSpec::parametric_strict(), + "classic_partial_retarget" | "classic_pr" | "cpr" => { + AlgorithmSpec::classic_partial_retarget(0.3) + } + "ewma_60s" | "ewma" => AlgorithmSpec::ewma_60s(), + "sliding_window" | "sliding" => AlgorithmSpec::sliding_window(10), + "full_remedy" | "remedy" => AlgorithmSpec::full_remedy(), + "bayesian" | "bayes" => AlgorithmSpec::bayesian(0.95, 4.0, 0.2, 2.576), + "bayesian_ci" | "bayes_ci" => AlgorithmSpec::bayesian_ci(0.85, 4.0, 1.96, 0.3), + other => return Err(format!("unknown algorithm: {other}")), + }) +} + +fn scenario_from_str(s: &str) -> Result { + Ok(match s { + "cold_start" | "cold" => Scenario::ColdStart, + "stable" => Scenario::Stable, + "step_minus_50" => Scenario::Step { delta_pct: -50 }, + "step_plus_50" => Scenario::Step { delta_pct: 50 }, + other => { + if let Some(num) = other.strip_prefix("step:") { + let d: i32 = num.parse().map_err(|_| format!("bad step delta: {num}"))?; + Scenario::Step { delta_pct: d } + } else { + return Err(format!("unknown scenario: {other}")); + } + } + }) +} + +/// Returns the peak ramp target overshoot (max new_hashrate / true_h +/// − 1, clamped at 0) for one trial. Used by --scan-overshoot to +/// identify the worst-case trial across many seeds. +fn target_overshoot(trial: &vardiff_sim::Trial) -> f64 { + let true_h = trial.true_hashrate_at_end as f64; + if true_h <= 0.0 { + return 0.0; + } + let peak = trial + .ticks + .iter() + .filter_map(|t| t.new_hashrate.map(|h| h as f64)) + .fold(f64::NEG_INFINITY, f64::max); + if peak.is_finite() && peak > 0.0 { + ((peak / true_h) - 1.0).max(0.0) + } else { + 0.0 + } +} + +fn main() -> Result<(), String> { + let args = parse_args(); + + let algorithm = algorithm_factory(&args.algorithm)?; + let scenario = scenario_from_str(&args.scenario)?; + let (config, schedule) = scenario.build(args.spm); + + let chosen_seed = if let Some(n) = args.scan_overshoot { + eprintln!( + "scanning {} seeds for max ramp target overshoot: algorithm={}, scenario={}, spm={}, base_seed={:#x}", + n, algorithm.name, scenario.key(), args.spm, args.seed, + ); + + let mut scored: Vec<(f64, u64)> = Vec::with_capacity(n); + for i in 0..n { + let seed = args.seed.wrapping_add(i as u64); + let clock = Arc::new(MockClock::new(0)); + let vardiff = (algorithm.factory)(clock.clone()); + let trial = run_trial_observed(vardiff, clock, config.clone(), &schedule, seed); + scored.push((target_overshoot(&trial), seed)); + } + scored.sort_by(|a, b| b.0.partial_cmp(&a.0).unwrap_or(std::cmp::Ordering::Equal)); + + eprintln!("\nTop 10 trials by target overshoot:"); + for (overshoot, seed) in scored.iter().take(10) { + eprintln!(" {:>7.2}% overshoot @ seed {:#x}", overshoot * 100.0, seed); + } + + let best_seed = scored[0].1; + let best_overshoot = scored[0].0; + eprintln!( + "\nTracing seed {:#x} (max overshoot {:.2}%):\n", + best_seed, + best_overshoot * 100.0, + ); + best_seed + } else { + eprintln!( + "tracing: algorithm={}, scenario={}, spm={}, seed={:#x}", + algorithm.name, + scenario.key(), + args.spm, + args.seed, + ); + args.seed + }; + + eprintln!( + " duration={}s, initial_hashrate={:.3e}, true_hashrate_at_end={:.3e}", + config.duration_secs, + config.initial_hashrate, + schedule.at(config.duration_secs), + ); + + let clock = Arc::new(MockClock::new(0)); + let vardiff = (algorithm.factory)(clock.clone()); + let trial = run_trial_observed(vardiff, clock, config.clone(), &schedule, chosen_seed); + + // Header. + println!( + "{:>5} {:>4} {:>6} {:>12} {:>10} {:>10} {:>12} {:>6} {:>12} {:>11}", + "tick", + "t", + "shares", + "current_h", + "delta", + "thresh", + "h_estimate", + "fired", + "new_h", + "true_h_now" + ); + println!("{}", "-".repeat(106)); + + let true_h_end = trial.true_hashrate_at_end as f64; + let mut peak_h_estimate: f64 = f64::NEG_INFINITY; + let mut peak_h_estimate_tick = 0usize; + let mut peak_new_hashrate: f64 = f64::NEG_INFINITY; + let mut peak_new_hashrate_tick = 0usize; + for (i, t) in trial.ticks.iter().enumerate() { + let true_h_now = schedule.at(t.t_secs); + if let Some(h) = t.h_estimate.map(|h| h as f64) { + if h > peak_h_estimate { + peak_h_estimate = h; + peak_h_estimate_tick = i + 1; + } + } + if let Some(h) = t.new_hashrate.map(|h| h as f64) { + if h > peak_new_hashrate { + peak_new_hashrate = h; + peak_new_hashrate_tick = i + 1; + } + } + println!( + "{:>5} {:>4} {:>6} {:>12.3e} {:>10} {:>10} {:>12} {:>6} {:>12} {:>11.3e}", + i + 1, + t.t_secs, + t.n_shares, + t.current_hashrate_before, + fmt_pct_opt(t.delta), + fmt_pct_opt(t.threshold), + fmt_hashrate_opt(t.h_estimate), + if t.fired { "YES" } else { "" }, + fmt_hashrate_opt(t.new_hashrate), + true_h_now, + ); + } + + println!(); + println!("Summary:"); + println!(" total fires: {}", trial.fire_count()); + println!( + " final hashrate: {:.3e}", + trial.final_hashrate + ); + println!( + " true_hashrate_at_end: {:.3e}", + trial.true_hashrate_at_end + ); + if peak_h_estimate.is_finite() { + let ratio = peak_h_estimate / true_h_end; + println!( + " peak h_estimate: {:.3e} at tick {} ({:.1}% overshoot)", + peak_h_estimate, + peak_h_estimate_tick, + (ratio - 1.0) * 100.0, + ); + } + if peak_new_hashrate.is_finite() { + let ratio = peak_new_hashrate / true_h_end; + println!( + " peak new_hashrate (target): {:.3e} at tick {} ({:.1}% overshoot)", + peak_new_hashrate, + peak_new_hashrate_tick, + (ratio - 1.0).max(0.0) * 100.0, + ); + } + println!( + " settled accuracy: {:.4} ({:.2}%)", + (trial.final_hashrate as f64 / true_h_end - 1.0).abs(), + (trial.final_hashrate as f64 / true_h_end - 1.0).abs() * 100.0, + ); + + Ok(()) +} + +fn fmt_pct_opt(v: Option) -> String { + match v { + None => "—".to_string(), + Some(f) => format!("{:.2}%", f), + } +} + +fn fmt_hashrate_opt(v: Option) -> String { + match v { + None => "—".to_string(), + Some(h) => format!("{:.3e}", h), + } +} diff --git a/sv2/channels-sv2/sim/src/bin/trajectory-plot.rs b/sv2/channels-sv2/sim/src/bin/trajectory-plot.rs new file mode 100644 index 0000000000..c6847dbf99 --- /dev/null +++ b/sv2/channels-sv2/sim/src/bin/trajectory-plot.rs @@ -0,0 +1,544 @@ +//! Composite trajectory plot — the plain-language algorithm comparison. +//! +//! The regret/effort radar answers "which algorithm wins the §10 cost", +//! but it abstracts away TIME, and ramp-up speed + detection latency ARE +//! time. This bin draws the one picture a non-expert reads instantly: +//! the algorithm's difficulty-implied hashrate estimate chasing the true +//! miner hashrate over a single continuous timeline. "The line should +//! follow the dashed target; sooner and tighter is better." +//! +//! ## The composite scenario (one timeline, three phases) +//! +//! Phase 1 COLD START (0 → SETTLE_AT): estimate starts 10^5× low, +//! must ramp up to truth — shows RAMP-UP TIME. +//! Phase 2 SETTLE (SETTLE_AT → DROP_AT): hold at truth so the +//! share counter ages ~60 min, the operationally common state. +//! Phase 3 AGED DROP (DROP_AT → end): true hashrate sags −10% on the +//! aged counter — the failing-ASIC case. Shows DETECTION: how +//! long (if ever) until the algorithm notices and follows down. +//! +//! Each algorithm's line is the PER-TICK MEDIAN across N trials (robust to +//! the Poisson share noise); truth is the dashed reference. The classic +//! line famously ramps slowly AND never catches the aged −10% drop within +//! the window — the two failures the new metric was built to expose, both +//! visible in one frame. +//! +//! Usage: `cargo run --release --bin trajectory-plot` +//! Env: VARDIFF_TRAJ_TRIALS (default 400), VARDIFF_TRAJ_SPM (default 12), +//! VARDIFF_TRAJ_OUT (svg path, default trajectory_plot.svg). + +use std::env; +use std::fs; +use std::sync::Arc; + +use channels_sv2::vardiff::composed::{ + AcceleratingPartialRetarget, AdaptivePoissonCusum, AsymmetricCusumBoundary, Composed, + EwmaEstimator, FullRetargetNoClamp, PoissonCI, StepFunction, +}; +use channels_sv2::vardiff::MockClock; +use vardiff_sim::baseline::{COLD_START_INITIAL_HASHRATE, TRUE_HASHRATE}; +use vardiff_sim::grid::{AlgorithmSpec, VardiffBox}; +use vardiff_sim::schedule::HashrateSchedule; +use vardiff_sim::trial::{run_trial_observed, Trial, TrialConfig}; + +// ---- Timeline geometry (simulated seconds) ------------------------------- +const SETTLE_AT: u64 = 25 * 60; // end of cold-start ramp window +const DROP_AT: u64 = 85 * 60; // counter has aged ~60 min by here +const END: u64 = 145 * 60; // 60 min to observe (or miss) the drop +const TICK: u64 = 60; +const DROP_FRAC: f32 = 0.90; // −10% sag + +const COLORS: &[&str] = &["#777777", "#377eb8", "#4daf4a", "#e41a1c", "#ff7f00", "#984ea3"]; + +/// The interim AsymCusum champion (pre-SignPersist) — kept as a plotted +/// comparison so the trajectory shows what the sign-persistence discount +/// bought over the AsymCusum-only config (faster ramp, tighter settle). +fn champion_asymcusum() -> AlgorithmSpec { + AlgorithmSpec::new("interim (AsymCusum)", |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(150), + AdaptivePoissonCusum::with_params( + PoissonCI::default_parametric(), + AsymmetricCusumBoundary::new(0.2, 0.05, 6.0), + 5, + ), + AcceleratingPartialRetarget::new(0.2, 0.8, 0.05), + 1.0, + clock, + ))) + }) +} + +/// The "oracle" reference: the SAME estimator belief as the champion +/// (EWMA τ=150), but with the control policy stripped away — it fires on +/// any deviation (threshold 0) and retargets straight to its estimate +/// (no partial retarget, no clamp, no tighten asymmetry). It therefore +/// tracks the best a τ=150 estimator can, limited only by irreducible +/// Poisson measurement noise. Plotting it decomposes the champion's +/// settle-phase offset into two parts: +/// gap(oracle → truth) = irreducible noise — nobody can do better +/// gap(champion → oracle) = the cost of the asymmetric control policy +/// i.e. how much of the offset is physics vs. a deliberate choice. +fn oracle() -> AlgorithmSpec { + AlgorithmSpec::new("oracle (Ewma150 MLE, no policy)", |clock| { + VardiffBox(Box::new(Composed::new( + EwmaEstimator::new(150), + // Threshold 0 for all dt ⇒ fires on any nonzero deviation. + StepFunction { + table: vec![(u64::MAX, 0.0)], + }, + FullRetargetNoClamp, + 1.0, + clock, + ))) + }) +} + +/// Per-fire retarget magnitude for one trial: `(t_secs, |Δln D|)` where +/// Δln D = ln(new_hashrate / current_hashrate_before). This is the +/// "violence" of each fire — a full classic retarget is a big |Δln D|, a +/// gentle partial nudge is small. Used to size the fire-raster marks. +fn fire_magnitudes(t: &Trial) -> Vec<(u64, f64)> { + t.ticks + .iter() + .filter(|tk| tk.fired) + .filter_map(|tk| { + let old = tk.current_hashrate_before as f64; + tk.new_hashrate.map(|nh| nh as f64).and_then(|nh| { + if old > 0.0 && nh > 0.0 { + Some((tk.t_secs, (nh / old).ln().abs())) + } else { + None + } + }) + }) + .collect() +} + +/// Median of a slice (returns lower-mid for even n). Mutates via sort of a +/// scratch copy. +fn median(xs: &[f64]) -> f64 { + if xs.is_empty() { + return f64::NAN; + } + let mut v: Vec = xs.to_vec(); + v.sort_by(|a, b| a.partial_cmp(b).unwrap()); + v[v.len() / 2] +} + +fn main() -> std::io::Result<()> { + let trials: usize = env::var("VARDIFF_TRAJ_TRIALS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(400); + let spm: f32 = env::var("VARDIFF_TRAJ_SPM") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(12.0); + let out_path = env::var("VARDIFF_TRAJ_OUT").unwrap_or_else(|_| "trajectory_plot.svg".to_string()); + + // Composite schedule: truth = TRUE_HASHRATE through the cold-start and + // settle phases, then −10% at DROP_AT. (Cold start is about the + // ESTIMATE being low, not truth — truth is flat here; the estimate + // starts low via TrialConfig::initial_hashrate.) + let schedule = HashrateSchedule::new(vec![ + (0, TRUE_HASHRATE), + (DROP_AT, TRUE_HASHRATE * DROP_FRAC), + ]); + let config = TrialConfig { + duration_secs: END, + initial_hashrate: COLD_START_INITIAL_HASHRATE, + shares_per_minute: spm, + tick_interval_secs: TICK, + }; + + // classic (real vardiff) as the baseline, the interim AsymCusum + // champion, and the final SignPersist champion — so the plot shows the + // ramp/settle/detection gains at each step. Each gets a median line AND + // a fire-raster lane. + let algos = vec![ + ("classic (real vardiff)", AlgorithmSpec::classic_composed()), + ("interim (AsymCusum)", champion_asymcusum()), + ("champion (SignPersist)", AlgorithmSpec::champion()), + ]; + + let n_ticks = (END / TICK) as usize; + // Representative single trial (for the fire raster — medians smear fires + // out, so the raster reads ONE concrete run). Same seed for every algo + // so they see the identical share stream. + const REP_SEED: u64 = 0x7A1; + eprintln!( + "trajectory-plot: {} algos (+oracle) × {} trials, spm {}, {} ticks over {} min", + algos.len(), + trials, + spm, + n_ticks, + END / 60 + ); + + // Per algo: per-tick median of current_hashrate_before across trials, + // plus the fires (t_secs, |Δln D|) from the representative trial. + let mut series: Vec<(String, Vec)> = Vec::new(); + let mut rasters: Vec<(String, Vec<(u64, f64)>)> = Vec::new(); + for (label, algo) in &algos { + let mut per_tick: Vec> = vec![Vec::with_capacity(trials); n_ticks]; + for i in 0..trials { + let clock = Arc::new(MockClock::new(0)); + let v = (algo.factory)(clock.clone()); + let t = run_trial_observed(v, clock, config.clone(), &schedule, REP_SEED.wrapping_add(i as u64)); + for (ti, tick) in t.ticks.iter().enumerate() { + if ti < n_ticks { + per_tick[ti].push(tick.current_hashrate_before as f64); + } + } + if i == 0 { + rasters.push((label.to_string(), fire_magnitudes(&t))); + } + } + let med: Vec = per_tick.iter().map(|c| median(c)).collect(); + series.push((label.to_string(), med)); + } + + // Oracle reference line: same EWMA(150) belief, no control policy — + // the best a τ=150 estimator can track. Median across trials, like the + // contenders. Kept SEPARATE so it renders as a faint reference (not a + // contender) and gets no fire lane (it fires every tick by design). + let oracle_spec = oracle(); + let mut oracle_pt: Vec> = vec![Vec::with_capacity(trials); n_ticks]; + for i in 0..trials { + let clock = Arc::new(MockClock::new(0)); + let v = (oracle_spec.factory)(clock.clone()); + let t = run_trial_observed(v, clock, config.clone(), &schedule, REP_SEED.wrapping_add(i as u64)); + for (ti, tick) in t.ticks.iter().enumerate() { + if ti < n_ticks { + oracle_pt[ti].push(tick.current_hashrate_before as f64); + } + } + } + let oracle_line: Vec = oracle_pt.iter().map(|c| median(c)).collect(); + + // Truth line, per tick (at tick end time). + let truth: Vec = (0..n_ticks) + .map(|ti| schedule.at((ti as u64 + 1) * TICK) as f64) + .collect(); + + let svg = render(&series, &rasters, &oracle_line, &truth, n_ticks, spm); + fs::write(&out_path, &svg)?; + eprintln!("Wrote {}", out_path); + + // Console: key readouts — ramp-up time to ±10% of truth, and detection + // latency after the drop (first tick whose median crosses below the + // halfway point between old and new truth). + println!("\n## Trajectory readouts (median across {} trials, spm {})\n", trials, spm); + println!("| algo | ramp-up to ±10% | follows −10% drop? | detect latency | settle gap vs truth |"); + println!("| --- | --- | --- | --- | --- |"); + let drop_tick = (DROP_AT / TICK) as usize; + let drop_abs = TRUE_HASHRATE as f64 * (1.0 - DROP_FRAC as f64); // the −10% in absolute H/s + // Settle-phase window: the 10 ticks just before the drop. Used to + // quantify the steady-state offset, with the oracle as the floor. + let settle = |line: &[f64]| { + let w = &line[drop_tick.saturating_sub(10)..drop_tick]; + (median(w) / TRUE_HASHRATE as f64 - 1.0) * 100.0 // signed % vs truth + }; + let oracle_gap = settle(&oracle_line); + for (label, med) in &series { + // ramp-up: first tick within ±10% of TRUE_HASHRATE. + let ramp = med + .iter() + .position(|&h| (h - TRUE_HASHRATE as f64).abs() <= 0.10 * TRUE_HASHRATE as f64) + .map(|ti| format!("{} min", (ti as u64 + 1) * TICK / 60)) + .unwrap_or_else(|| "never".into()); + // Detection measured against the algorithm's OWN pre-drop baseline + // (the median over the 10 ticks just before the drop), NOT an + // absolute line — an algorithm that already sits under truth must + // not be credited with "instant" detection. "Followed" = the + // estimate moves DOWN by at least half the drop magnitude relative + // to its own baseline, within the 60-min window. + let pre = median(&med[drop_tick.saturating_sub(10)..drop_tick]); + let threshold = pre - 0.5 * drop_abs; + let det = med + .iter() + .enumerate() + .skip(drop_tick) + .find(|(_, &h)| h <= threshold) + .map(|(ti, _)| ((ti - drop_tick) as u64 * TICK / 60)) + .map(|d| ("yes".to_string(), format!("{} min", d))) + .unwrap_or_else(|| ("NO".into(), "—".into())); + println!( + "| {} | {} | {} | {} | {:+.1}% |", + label, ramp, det.0, det.1, settle(med) + ); + } + // Oracle ramp-up: the estimator's OWN cold-start floor (no policy). If + // a contender's ramp ≈ this, the remaining slowness is the τ=150 + // estimator, not the control policy — so a policy-only fix (warm-up + // mode) can't help; you'd have to shorten τ during cold start. + let oracle_ramp = oracle_line + .iter() + .position(|&h| (h - TRUE_HASHRATE as f64).abs() <= 0.10 * TRUE_HASHRATE as f64) + .map(|ti| format!("{} min", (ti as u64 + 1) * TICK / 60)) + .unwrap_or_else(|| "never".into()); + println!( + "\nAccuracy ceiling (cost-blind, fires every tick) settle gap at τ=150: {:+.1}%. \ + NOT a target — confirm-debias proved closing a contender's gap to this raises §10 cost monotonically.", + oracle_gap + ); + println!( + "Accuracy-ceiling ramp-up to ±10% (estimator-only floor at τ=150): {}. \ + A contender's ramp near this is estimator-limited, not policy-limited.", + oracle_ramp + ); + Ok(()) +} + +fn render( + series: &[(String, Vec)], + rasters: &[(String, Vec<(u64, f64)>)], + oracle_line: &[f64], + truth: &[f64], + n_ticks: usize, + spm: f32, +) -> String { + let ml = 70.0; + let mr = 230.0; // wide right for legend + let mt = 70.0; + let w = 1100i64; + let pw = w as f64 - ml - mr; + let ph = 360.0; // plot region height (fixed; raster strip sits below) + + // Raster strip geometry: one lane per contender, below the x-axis. + let lane_h = 22.0; + let raster_top = mt + ph + 64.0; // leave room for x-axis ticks + label + let raster_h = lane_h * series.len() as f64; + let h = (raster_top + raster_h + 36.0) as i64; + + // Y axis: hashrate in units of 1e15 (= TRUE_HASHRATE), range 0..1.25. + let y_max = 1.25f64; + let unit = TRUE_HASHRATE as f64; + let xt = |ti: usize| ml + pw * ti as f64 / (n_ticks - 1).max(1) as f64; + let xs = |t_secs: u64| ml + pw * (t_secs as f64 / END as f64).clamp(0.0, 1.0); + let yv = |h_units: f64| mt + ph * (1.0 - (h_units / y_max).clamp(0.0, 1.0)); + + let mut s = String::new(); + s.push_str(&format!( + r##" + +Estimate chasing truth — ramp-up, settle, and an aged −10% drop +Difficulty-implied hashrate (median of trials). Dashed = truth; dotted = accuracy ceiling (cost-blind); green band = cost-optimal settle level. spm={spm}. +"##, + cx = w / 2, + )); + + // Phase bands + labels. + let x_settle = xt((SETTLE_AT / TICK) as usize - 1); + let x_drop = xt((DROP_AT / TICK) as usize - 1); + s.push_str(&format!( + r##" + +① cold-start ramp +② settle (counter ages ~60min) +③ aged −10% drop +"##, + ml, mt, x_settle - ml, ph, // cold band + x_drop, mt, ml + pw - x_drop, ph, // drop band + (ml + x_settle) / 2.0, mt - 8.0, + (x_settle + x_drop) / 2.0, mt - 8.0, + (x_drop + ml + pw) / 2.0, mt - 8.0, + )); + + // Y gridlines + labels (0, 0.25, .., 1.25 ×1e15). + let mut yg = 0.0; + while yg <= y_max + 1e-9 { + let y = yv(yg); + s.push_str(&format!( + r##" +{:.2} +"##, + ml + pw, ml - 8.0, y + 4.0, yg + )); + yg += 0.25; + } + s.push_str(&format!( + r##"hashrate (×10¹⁵ H/s) +"##, + ml - 44.0, mt + ph / 2.0, ml - 44.0, mt + ph / 2.0 + )); + + // X axis ticks every 20 min. + let mut xm = 0u64; + while xm * 60 <= END { + let ti = ((xm * 60) / TICK) as usize; + let x = xt(ti.min(n_ticks - 1)); + s.push_str(&format!( + r##" +{} +"##, + mt, mt + ph, mt + ph + 18.0, xm + )); + xm += 20; + } + s.push_str(&format!( + r##"minutes +"##, + ml + pw / 2.0, mt + ph + 42.0 + )); + + // Cost-optimal corridor: the champion's own settle level. We proved + // (confirm-debias) that under the §10 objective the cost minimum sits + // at the champion's bias=1.0 — i.e. THIS level, not the accuracy + // ceiling, is optimal. Shade a thin band at the champion's back-half + // settle median across the settle phase so the champion line visibly + // sits IN the optimal corridor rather than "failing" the dotted ceiling. + let drop_tick = (DROP_AT / TICK) as usize; + if let Some((_, champ)) = series.last() { + let w0 = drop_tick.saturating_sub(10); + if drop_tick <= champ.len() && w0 < drop_tick { + let lvl = median(&champ[w0..drop_tick]) / unit; // in 1e15 units + let half = 0.01; // ±1% visual thickness + let (x0, x1) = (xt((SETTLE_AT / TICK) as usize - 1), xt(drop_tick - 1)); + s.push_str(&format!( + r##" +cost-optimal +"##, + x0, + yv(lvl + half), + (x1 - x0).max(0.0), + (yv(lvl - half) - yv(lvl + half)).max(0.0), + x1 - 4.0, + yv(lvl + half) - 3.0, + )); + } + } + + // Truth (dashed). + let mut tp = String::new(); + for (ti, &hu) in truth.iter().enumerate() { + tp.push_str(&format!("{}{:.1},{:.1}", if ti == 0 { "M" } else { "L" }, xt(ti), yv(hu / unit))); + tp.push(' '); + } + s.push_str(&format!( + r##" +"##, + tp.trim() + )); + + // Accuracy-ceiling line (faint, before the contenders so they draw on + // top): the best a τ=150 estimator can track, but COST-BLIND — it + // reaches this only by firing every tick. confirm-debias proved the + // gap from a contender to here is NOT recoverable daylight: closing it + // raises §10 cost monotonically. So this is an accuracy bound, not a + // target; the cost-optimal level is the green corridor above. + let mut op = String::new(); + for (ti, &hu) in oracle_line.iter().enumerate() { + op.push_str(&format!("{}{:.1},{:.1}", if ti == 0 { "M" } else { "L" }, xt(ti), yv(hu / unit))); + op.push(' '); + } + s.push_str(&format!( + r##" +"##, + op.trim() + )); + + // Algorithm lines. + for (idx, (_label, med)) in series.iter().enumerate() { + let color = COLORS[idx % COLORS.len()]; + let mut p = String::new(); + for (ti, &hu) in med.iter().enumerate() { + p.push_str(&format!("{}{:.1},{:.1}", if ti == 0 { "M" } else { "L" }, xt(ti), yv(hu / unit))); + p.push(' '); + } + s.push_str(&format!( + r##" +"##, + p.trim() + )); + } + + // ---- Fire-raster strip: one lane per contender. Each fire is a mark at + // its time; mark HEIGHT ∝ |Δln D| (retarget violence). Spacing shows + // "slowly", size shows "violently", marks just after ③ show reactivity + // to the small drop (classic's lane stays empty there = the blind spot). + let max_mag = rasters + .iter() + .flat_map(|(_, fs)| fs.iter().map(|&(_, m)| m)) + .fold(0.0f64, f64::max) + .max(1e-9); + s.push_str(&format!( + r##"Fires (mark height ∝ retarget size |Δln D|): few+tall = slow & violent, many+short = quick & gentle +"##, + ml, raster_top - 12.0 + )); + // Phase dividers across the raster (settle + drop boundaries). + for &bx in &[xt((SETTLE_AT / TICK) as usize - 1), xt((DROP_AT / TICK) as usize - 1)] { + s.push_str(&format!( + r##" +"##, + raster_top, raster_top + raster_h + )); + } + for (idx, (label, fires)) in rasters.iter().enumerate() { + let color = COLORS[idx % COLORS.len()]; + let lane_y = raster_top + lane_h * idx as f64; + let baseline = lane_y + lane_h - 4.0; + // lane baseline + label + s.push_str(&format!( + r##" +{} +"##, + ml + pw, ml - 6.0, baseline, short_label(label) + )); + for &(t_secs, mag) in fires { + let x = xs(t_secs); + let bar_h = 3.0 + (lane_h - 7.0) * (mag / max_mag); + s.push_str(&format!( + r##" +"##, + x - 1.3, baseline - bar_h, bar_h + )); + } + } + + // Legend (right margin). + let lx = ml + pw + 22.0; + let mut ly = mt + 6.0; + s.push_str(&format!( + r##" +true hashrate +"##, + ly, lx + 26.0, ly, lx + 32.0, ly + 4.0 + )); + ly += 24.0; + for (idx, (label, _)) in series.iter().enumerate() { + let color = COLORS[idx % COLORS.len()]; + s.push_str(&format!( + r##" +{} +"##, + ly, lx + 26.0, ly, lx + 32.0, ly + 4.0, label + )); + ly += 24.0; + } + // Accuracy-ceiling entry (faint dotted) — relabeled from "oracle". + s.push_str(&format!( + r##" +accuracy ceiling (cost-blind) +"##, + ly, lx + 26.0, ly, lx + 32.0, ly + 4.0 + )); + ly += 24.0; + // Cost-optimal corridor swatch. + s.push_str(&format!( + r##" +cost-optimal settle (§10) +"##, + ly - 9.0, lx + 32.0, ly + 1.0 + )); + + s.push_str("\n"); + s +} + +/// First word of an algo label, for the cramped raster lane labels. +fn short_label(label: &str) -> &str { + label.split_whitespace().next().unwrap_or(label) +} diff --git a/sv2/channels-sv2/sim/src/composed.rs b/sv2/channels-sv2/sim/src/composed.rs new file mode 100644 index 0000000000..16ec079169 --- /dev/null +++ b/sv2/channels-sv2/sim/src/composed.rs @@ -0,0 +1,58 @@ +//! Sim-side facade over [`channels_sv2::vardiff::composed`]. +//! +//! Re-exports the production pipeline types and adds the sim-only +//! [`crate::trial::Observable`] extension trait to `Composed`. + +pub use channels_sv2::vardiff::composed::*; + +use crate::trial::Observable; + +impl Observable for Composed +where + E: Estimator, + B: Boundary, + U: UpdateRule, +{ + fn last_decision(&self) -> Option { + self.last_decision + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::schedule::HashrateSchedule; + use crate::trial::{run_trial, TrialConfig}; + use channels_sv2::vardiff::MockClock; + use channels_sv2::VardiffState; + use std::sync::Arc; + + #[test] + fn vardiff_state_delegates_to_composed_and_produces_fires() { + // VardiffState now wraps AdaCUSUM internally. Verify it + // actually fires during a cold-start scenario (basic smoke test). + let clock = Arc::new(MockClock::new(0)); + let state = VardiffState::new_with_clock(1.0, clock.clone()).unwrap(); + let config = TrialConfig { + duration_secs: 30 * 60, + initial_hashrate: 1.0e10, + shares_per_minute: 12.0, + tick_interval_secs: 60, + }; + let schedule = HashrateSchedule::stable(1.0e15); + let trial = run_trial(state, clock, config, &schedule, 0xCAFE); + let fires = trial.fires(); + assert!( + fires.len() >= 3, + "VardiffState (AdaCUSUM) should fire multiple times during cold start, got {}", + fires.len() + ); + // Final hashrate should be in the right ballpark (within 2x of truth) + let ratio = trial.final_hashrate as f64 / 1.0e15; + assert!( + ratio > 0.5 && ratio < 2.0, + "Final hashrate should be near truth, got ratio {}", + ratio + ); + } +} diff --git a/sv2/channels-sv2/sim/src/grid.rs b/sv2/channels-sv2/sim/src/grid.rs new file mode 100644 index 0000000000..831ae6b0bc --- /dev/null +++ b/sv2/channels-sv2/sim/src/grid.rs @@ -0,0 +1,2337 @@ +//! The declarative grid layer — Cartesian product over (algorithm, +//! share rate, scenario). +//! +//! ## What a [`Grid`] is +//! +//! A `Grid` declares three axes — `algorithms`, `share_rates`, +//! `scenarios` — plus a trial count and base seed. Calling `Grid::run` +//! produces every cell in the Cartesian product, drives `trial_count` +//! trials at each, and returns `HashMap>`. Algorithm is a first-class dimension; one binary +//! produces every algorithm's characterization in one sweep. +//! +//! ## Observable dispatch +//! +//! The grid always drives trials through [`run_trial_observed`], which +//! populates the optional `delta`, `threshold`, and `h_estimate` +//! fields on each [`TickRecord`] for algorithms that implement +//! [`Observable`]. The bias / variance / overshoot metrics consume +//! those fields. +//! +//! For algorithms that don't naturally implement `Observable` (the +//! production [`VardiffState`]), the [`AsObservable`] wrapper provides +//! a null impl that always returns `None`. The dispatch path stays +//! uniform — every algorithm in the grid is `Vardiff + Observable` — +//! and introspection-only metrics gracefully degrade to `None` values +//! that the TOML serializer simply omits. +//! +//! ## Type erasure +//! +//! Different concrete algorithm types (`VardiffState`, +//! `ClassicComposed`, `Composed`) must coexist in +//! the same `algorithms` vector. Rust generics can't express that +//! directly, so the grid stores [`AlgorithmSpec`] values whose +//! `factory` closure produces a [`VardiffBox`] — a sim-side newtype +//! wrapping `Box` (the compound trait of +//! [`Vardiff`] + [`Observable`]). +//! +//! ## Seeding +//! +//! Per-trial seeds are derived as +//! `base_seed + (cell_index << 20) + trial_index` with +//! `cell_index = algo_idx × N_spm × N_scen + spm_idx × N_scen + +//! scen_idx`. The `<< 20` shift gives each cell a 1,048,576-entry +//! seed range; collision-free as long as `trial_count ≤ 2^20`. For a +//! single-algorithm grid (`algo_idx = 0`) `cell_index` collapses to +//! `spm_idx × N_scen + scen_idx`, the same ordering used by +//! [`crate::baseline::default_cells`]. +//! +//! For paired A/B comparisons where metric differences must be +//! attributable to algorithm behavior rather than seed disparity, use +//! [`Grid::run_paired`] — it strips `algo_idx` from the cell index so +//! all algorithms see the same trial inputs at each cell. + +use std::collections::HashMap; +use std::sync::Arc; + +use bitcoin::Target; +use channels_sv2::vardiff::pow2_pid::Pow2PidVardiff; +use channels_sv2::vardiff::pid_tuned::{PidConfig, PidTunedVardiff}; +use channels_sv2::vardiff::{error::VardiffError, Clock, MockClock, Vardiff}; +use channels_sv2::VardiffState; + +use crate::baseline::{Cell, CellResult, Scenario, DEFAULT_BASELINE_SEED, DEFAULT_TRIAL_COUNT}; +use crate::composed; +use crate::metrics; +use crate::trial::{run_trial_observed, DecisionRecord, Observable, Trial}; + +// ============================================================================ +// ObservableVardiff compound trait + AsObservable wrapper +// ============================================================================ + +/// Compound trait combining `Vardiff` and `Observable`. The grid's +/// type-erased path stores algorithms as `Box` +/// so the trial driver can call both vardiff methods (try_vardiff, +/// add_shares, …) and the introspection accessor (`last_decision`) +/// through the same trait object. +/// +/// Blanket-implemented for any type that satisfies both — including +/// concrete algorithms like [`composed::Composed`] (which has an +/// explicit `Observable` impl) and the [`AsObservable`] wrapper used +/// for non-observable algorithms. +pub trait ObservableVardiff: Vardiff + Observable {} +impl ObservableVardiff for T {} + +/// Wraps a `V: Vardiff` to also implement `Observable` by returning +/// `None` for `last_decision`. Used for algorithms (notably +/// `VardiffState`) that don't expose internal decision state — so they +/// can flow through the grid's `Vardiff + Observable` dispatch path +/// with the introspection fields gracefully empty. +/// +/// `Vardiff` methods delegate directly to the inner value; the algorithm +/// behaves identically to the unwrapped version. Only `last_decision` +/// is synthetic. +#[derive(Debug)] +pub struct AsObservable(pub V); + +impl Vardiff for AsObservable { + fn last_update_timestamp(&self) -> u64 { + self.0.last_update_timestamp() + } + fn shares_since_last_update(&self) -> u32 { + self.0.shares_since_last_update() + } + fn min_allowed_hashrate(&self) -> f32 { + self.0.min_allowed_hashrate() + } + fn set_timestamp_of_last_update(&mut self, ts: u64) { + self.0.set_timestamp_of_last_update(ts); + } + fn increment_shares_since_last_update(&mut self) { + self.0.increment_shares_since_last_update(); + } + fn add_shares(&mut self, n: u32) { + self.0.add_shares(n); + } + fn reset_counter(&mut self) -> Result<(), VardiffError> { + self.0.reset_counter() + } + fn try_vardiff( + &mut self, + hashrate: f32, + target: &Target, + shares_per_minute: f32, + ) -> Result, VardiffError> { + self.0.try_vardiff(hashrate, target, shares_per_minute) + } +} + +impl Observable for AsObservable { + fn last_decision(&self) -> Option { + None + } +} + +// ============================================================================ +// VardiffBox — type-erased Vardiff + Observable wrapper +// ============================================================================ + +/// A `Box` wrapper that implements `Vardiff` +/// and `Observable` itself, so it flows through the generic +/// `run_trial_observed` driver without +/// modification. The orphan rule prevents direct +/// `impl Vardiff for Box<...>` (both `Vardiff` and `Box` are foreign +/// to the sim crate); this newtype is the standard workaround. +/// +/// All methods delegate to the inner box — performance is a single +/// virtual call per method, identical to direct `&mut dyn` dispatch. +pub struct VardiffBox(pub Box); + +impl std::fmt::Debug for VardiffBox { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_tuple("VardiffBox").field(&self.0).finish() + } +} + +impl Vardiff for VardiffBox { + fn last_update_timestamp(&self) -> u64 { + self.0.last_update_timestamp() + } + fn shares_since_last_update(&self) -> u32 { + self.0.shares_since_last_update() + } + fn min_allowed_hashrate(&self) -> f32 { + self.0.min_allowed_hashrate() + } + fn set_timestamp_of_last_update(&mut self, timestamp: u64) { + self.0.set_timestamp_of_last_update(timestamp); + } + fn increment_shares_since_last_update(&mut self) { + self.0.increment_shares_since_last_update(); + } + fn add_shares(&mut self, n: u32) { + self.0.add_shares(n); + } + fn reset_counter(&mut self) -> Result<(), VardiffError> { + self.0.reset_counter() + } + fn try_vardiff( + &mut self, + hashrate: f32, + target: &Target, + shares_per_minute: f32, + ) -> Result, VardiffError> { + self.0.try_vardiff(hashrate, target, shares_per_minute) + } +} + +impl Observable for VardiffBox { + fn last_decision(&self) -> Option { + self.0.last_decision() + } +} + +// ============================================================================ +// AlgorithmSpec — name + factory closure +// ============================================================================ + +/// Algorithm factory type. Takes a clock and produces a fresh +/// [`VardiffBox`] each call. `Send + Sync + 'static` because the spec +/// is shared across the grid and (eventually) across worker threads +/// when the grid is parallelized. +pub type VardiffFactory = Arc) -> VardiffBox + Send + Sync>; + +/// One entry in the grid's algorithm axis. Carries the algorithm's +/// name (used as the key in the per-algorithm result map and in the +/// baseline file name) plus the factory closure that constructs a +/// fresh instance per trial. +#[derive(Clone)] +pub struct AlgorithmSpec { + pub name: String, + pub factory: VardiffFactory, +} + +impl std::fmt::Debug for AlgorithmSpec { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("AlgorithmSpec") + .field("name", &self.name) + .finish_non_exhaustive() + } +} + +impl AlgorithmSpec { + /// General constructor. Use the convenience constructors + /// (`classic_vardiff_state`, `classic_composed`, …) for the + /// algorithms shipped with the framework. + pub fn new(name: impl Into, factory: F) -> Self + where + F: Fn(Arc) -> VardiffBox + Send + Sync + 'static, + { + Self { + name: name.into(), + factory: Arc::new(factory), + } + } + + /// The production `VardiffState`. Wrapped in [`AsObservable`] so + /// it satisfies the grid's `Vardiff + Observable` requirement; + /// `last_decision` always returns `None`, so introspection-only + /// metrics (bias, variance, overshoot) gracefully report `None` + /// for this algorithm. + pub fn classic_vardiff_state() -> Self { + // The monolith is fire-equivalent to Cumul / Step / FullClamp. Derive + // the name from those three components and append the `*` monolith + // marker so it is distinguishable from ClassicComposed (which the + // sanitize_filename fn keeps collision-free on disk). + let name = format!( + "{}*", + crate::naming::triple_name( + &composed::CumulativeCounter::new(), + &composed::StepFunction::classic_table(), + &composed::FullRetargetWithClamp::classic(), + ) + ); + Self::new(name, |clock| { + let inner = VardiffState::new_with_clock(1.0, clock) + .expect("VardiffState construction should never fail"); + VardiffBox(Box::new(AsObservable(inner))) + }) + } + + /// The three-stage-decomposed Classic algorithm. Asserted + /// fire-for-fire equivalent to `VardiffState`; additionally + /// exposes the per-tick decision state, so bias / variance / + /// overshoot metrics work. + pub fn classic_composed() -> Self { + let name = crate::naming::triple_name( + &composed::CumulativeCounter::new(), + &composed::StepFunction::classic_table(), + &composed::FullRetargetWithClamp::classic(), + ); + Self::new(name, |clock| { + VardiffBox(Box::new(composed::classic_composed(1.0, clock))) + }) + } + + /// The Parametric algorithm: same as Classic except the Boundary + /// axis swaps from the share-rate-blind step ladder to a + /// `PoissonCI(z = 2.576, margin = 0.05)` rate-aware threshold. + /// + /// This is the canonical one-axis-swap from Classic: same + /// Estimator, same Update — only the threshold + /// form differs. Holding three axes constant and varying the + /// fourth is exactly what the three-stage pipeline supports. + pub fn parametric() -> Self { + let name = crate::naming::triple_name( + &composed::CumulativeCounter::new(), + &composed::PoissonCI::default_parametric(), + &composed::FullRetargetWithClamp::classic(), + ); + Self::new(name, |clock| { + let inner = composed::Composed::new( + composed::CumulativeCounter::new(), + composed::PoissonCI::default_parametric(), + composed::FullRetargetWithClamp::classic(), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// EWMA-60s: an exponentially-weighted estimator with τ = 60s, + /// combined with the rate-aware Parametric boundary and a damped + /// partial-retarget update (η = 0.5). Three axes differ from + /// Classic — Estimator and Update — leaving Boundary + /// shared. Demonstrates the framework's combinatorial reuse: + /// `EwmaEstimator` + `PoissonCI` + `PartialRetarget` are each + /// individually swappable, and EWMA is one specific composition + /// of them. + pub fn ewma_60s() -> Self { + Self::ewma(60) + } + + /// Generic EWMA factory parameterized by τ (time constant in + /// seconds). Use this to sweep τ along the variance/responsiveness + /// Pareto frontier: + /// + /// ```text + /// for &tau in &[30, 60, 120, 300, 600] { + /// grid.algorithms.push(AlgorithmSpec::ewma(tau)); + /// } + /// ``` + /// + /// Algorithm name is `"EWMA-{tau}s"`. Other axes match + /// [`ewma_60s`](Self::ewma_60s): `AbsoluteRatio` statistic, + /// `PoissonCI(2.576, 0.05)` boundary, `PartialRetarget(0.5)` update. + pub fn ewma(tau_secs: u64) -> Self { + let name = crate::naming::triple_name( + &composed::EwmaEstimator::new(tau_secs), + &composed::PoissonCI::default_parametric(), + &composed::PartialRetarget::default_ewma(), + ); + Self::new(name, move |clock| { + let inner = composed::Composed::new( + composed::EwmaEstimator::new(tau_secs), + composed::PoissonCI::default_parametric(), + composed::PartialRetarget::default_ewma(), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// Sliding-Window algorithm: `SlidingWindowEstimator(n_ticks)` + + /// `PoissonCI(2.576, 0.05)` + + /// `FullRetargetNoClamp`. + /// + /// Algorithm name is `"SlidingWindow-{n_ticks}t"`. The + /// `n_ticks` × `tick_secs (=60)` product is the effective window + /// in seconds; e.g. `n_ticks = 10` → 10-minute sliding window. + pub fn sliding_window(n_ticks: usize) -> Self { + let name = crate::naming::triple_name( + &composed::SlidingWindowEstimator::new(n_ticks), + &composed::PoissonCI::default_parametric(), + &composed::FullRetargetNoClamp, + ); + Self::new(name, move |clock| { + let inner = composed::Composed::new( + composed::SlidingWindowEstimator::new(n_ticks), + composed::PoissonCI::default_parametric(), + composed::FullRetargetNoClamp, + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// Strict-CI Parametric: same as [`parametric`](Self::parametric) + /// but uses `PoissonCI::strict_3sigma()` (z = 3.0, ~99.7% CI) for + /// the boundary. The motivation is the FINDINGS.md § "Parametric + /// SPM=6 cascade" failure mode — under the default z = 2.576 the + /// SPM=6 trace at seed `0xcb3b` fires on a Poisson(5.2)→15 + /// outlier at tick 11 (deviation ≈ 188%, threshold ≈ 128%). + /// Bumping z to 3.0 lifts the threshold to ≈ 142% — still + /// permeable to the 188% outlier, so this variant is expected to + /// only marginally improve the worst-case at SPM=6 but should + /// trim the median. + pub fn parametric_strict() -> Self { + let name = crate::naming::triple_name( + &composed::CumulativeCounter::new(), + &composed::PoissonCI::strict_3sigma(), + &composed::FullRetargetWithClamp::classic(), + ); + Self::new(name, |clock| { + let inner = composed::Composed::new( + composed::CumulativeCounter::new(), + composed::PoissonCI::strict_3sigma(), + composed::FullRetargetWithClamp::classic(), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// Classic estimator + classic boundary + classic statistic, but + /// the UpdateRule axis swaps `FullRetargetWithClamp` for + /// `PartialRetarget(eta)`. Isolates "just damp the magnitude of + /// each fire" from the orthogonal axis changes. The η parameter + /// chooses how aggressively to damp: η = 1.0 reproduces + /// full-retarget-without-clamps, η = 0.3 moves only 30% toward + /// the estimator's belief on each fire. + /// + /// **Why study this in isolation?** The three-stage hypothesis is + /// that each axis closes a distinct failure mode. The + /// 0xcb3b/SPM=6 cascade survives a boundary tightening because + /// the *update magnitude* (full retarget to a noisy single-window + /// h_estimate) is the unbounded step. A pure PartialRetarget + /// swap should bound the per-fire jump regardless of estimator + /// noise — predicting the worst-case overshoot drops to + /// approximately `η × (peak − truth)`. + /// + /// Algorithm name is `"ClassicPartialRetarget-{eta×100 as u32}"`, + /// e.g. `classic_partial_retarget(0.3)` → `"ClassicPartialRetarget-30"`. + pub fn classic_partial_retarget(eta: f32) -> Self { + let name = crate::naming::triple_name( + &composed::CumulativeCounter::new(), + &composed::StepFunction::classic_table(), + &composed::PartialRetarget::new(eta), + ); + Self::new(name, move |clock| { + let inner = composed::Composed::new( + composed::CumulativeCounter::new(), + composed::StepFunction::classic_table(), + composed::PartialRetarget::new(eta), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// The "full remedy" algorithm: composes the three axis fixes + /// suggested by the FINDINGS.md § "Axis closure picture" analysis. + /// + /// - Estimator: `EwmaEstimator(120s)` — temporal smoothing closes + /// the single-window Poisson spike that drives Phase-1-end + /// cascades. + /// - Boundary: `PoissonCI` (default 99% CI, z = 2.576) — rate-aware + /// threshold floor, prevents false-fires on stable load. + /// - Update: `PartialRetarget(0.2)` — bounds the magnitude of any + /// single fire, defense-in-depth against estimator-noise tails. + /// + /// Each parameter is substantiated by its own Pareto sweep: + /// `sweep-ewma-tau` characterizes τ, `sweep-eta` characterizes η, + /// `sweep-z` characterizes z, and `sweep-eta-z` confirms the + /// (η, z) axes are nearly separable (no exotic joint optimum). + /// + /// η = 0.2 is the convergence-vs-overshoot balance point. Smaller + /// η (e.g. 0.1) tightens the ramp-overshoot tail further but + /// catastrophically breaks cold-start convergence at high SPM + /// (48% convergence at SPM=120 vs 99.6% at η=0.2 — the rate-aware + /// PoissonCI threshold suppresses firing before truth is reached + /// when per-fire moves are too small). Larger η (e.g. 0.3) preserves + /// cold-start convergence but widens the ramp-overshoot tail + /// (p99 = 31% at SPM=6 vs 12% at η=0.2) and worsens decoupling + /// (0.79 vs 0.87 at SPM=6). η = 0.2 is the sweet spot. + /// + /// z = 2.576 preserves the −10% step sensitivity floor at high SPM + /// (raising z to 3.0 drops it from 0.57 to 0.48). + /// + /// Worst-case behavior: `--scan-overshoot 100 --spm 6` against + /// VardiffState peaks at 187% above truth; FullRemedy on the same + /// scan collapses the worst-case to a low double-digit excursion. + pub fn full_remedy() -> Self { + let name = crate::naming::triple_name( + &composed::EwmaEstimator::new(120), + &composed::PoissonCI::default_parametric(), + &composed::PartialRetarget::new(0.2), + ); + Self::new(name, |clock| { + let inner = composed::Composed::new( + composed::EwmaEstimator::new(120), + composed::PoissonCI::default_parametric(), + composed::PartialRetarget::new(0.2), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// PoissonCI boundary + AcceleratingPartialRetarget update. + /// + /// Hypothesis: PoissonCI gates fires with statistical rigor (prevents + /// overshoot at low SPM where data is sparse), while + /// AcceleratingPartialRetarget gives fast convergence at high SPM + /// (where PoissonCI fires often and the accelerating η can safely + /// ramp). Combines FullRemedy's low-SPM discipline with + /// VardiffState's high-SPM speed. + pub fn poisson_accel() -> Self { + let name = crate::naming::triple_name( + &composed::EwmaEstimator::new(120), + &composed::PoissonCI::default_parametric(), + &composed::AcceleratingPartialRetarget::new(0.2, 0.6, 0.2), + ); + Self::new(name, |clock| { + let inner = composed::Composed::new( + composed::EwmaEstimator::new(120), + composed::PoissonCI::default_parametric(), + composed::AcceleratingPartialRetarget::new(0.2, 0.6, 0.2), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// PoissonCI + GuardedAccelRetarget: only accelerates η after the + /// first direction reversal. During cold-start (all fires upward), + /// η stays at 0.2 — preventing overshoot. After the first reversal + /// proves we've crossed the target, acceleration kicks in for + /// subsequent step-changes. + pub fn poisson_guarded_accel() -> Self { + let name = crate::naming::triple_name( + &composed::EwmaEstimator::new(120), + &composed::PoissonCI::default_parametric(), + &composed::GuardedAccelRetarget::new(0.2, 0.6, 0.2), + ); + Self::new(name, |clock| { + let inner = composed::Composed::new( + composed::EwmaEstimator::new(120), + composed::PoissonCI::default_parametric(), + composed::GuardedAccelRetarget::new(0.2, 0.6, 0.2), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// Adaptive boundary: PoissonCI at low SPM, CUSUM at high SPM. + /// The `spm_threshold` determines the crossover point. Below it, + /// PoissonCI's conservatism prevents overshoot on sparse data. + /// At or above it, CUSUM's aggression leverages abundant data. + /// Paired with AcceleratingPartialRetarget for fast convergence. + pub fn adaptive_boundary(spm_threshold: u32) -> Self { + let name = crate::naming::triple_name( + &composed::EwmaEstimator::new(120), + &composed::AdaptivePoissonCusum::new(spm_threshold), + &composed::AcceleratingPartialRetarget::new(0.2, 0.6, 0.2), + ); + Self::new(name, move |clock| { + let inner = composed::Composed::new( + composed::EwmaEstimator::new(120), + composed::AdaptivePoissonCusum::new(spm_threshold), + composed::AcceleratingPartialRetarget::new(0.2, 0.6, 0.2), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// **Balanced Pareto optimum** (maximin 0.551, the best worst-axis of any + /// algorithm characterized). `EwmaEstimator(90s)` + + /// `AdaptivePoissonCusum(spm=8)` with a sensitive CUSUM (sensitivity=1.0, + /// tighten=3.0) + `AcceleratingPartialRetarget(0.3, 0.6, 0.2)`. + /// + /// Found by the maximin parameter sweep (`sweep-balanced`): no single + /// equal-weight axis falls below 0.55, trading a little jitter/overshoot + /// safety for materially stronger small-drop reaction and convergence + /// than the production `VardiffState`. This is the recommended default + /// when balanced behavior across all scenarios is wanted. + pub fn balanced() -> Self { + let make_boundary = || { + composed::AdaptivePoissonCusum::with_params( + composed::PoissonCI::default_parametric(), + composed::AsymmetricCusumBoundary::new(1.0, 0.05, 3.0), + 8, + ) + }; + let name = crate::naming::triple_name( + &composed::EwmaEstimator::new(90), + &make_boundary(), + &composed::AcceleratingPartialRetarget::new(0.3, 0.6, 0.2), + ); + Self::new(name, move |clock| { + let inner = composed::Composed::new( + composed::EwmaEstimator::new(90), + make_boundary(), + composed::AcceleratingPartialRetarget::new(0.3, 0.6, 0.2), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// **React-priority Pareto optimum** (best small-drop reaction of any + /// balanced-ish algorithm). `EwmaEstimator(90s)` + + /// `AdaptiveSignPersist(spm=8)` — PoissonCI below 8 SPM, and + /// `SignPersistenceCusumBoundary(sensitivity=1.5, floor=0.05, tighten=3.0, + /// discount=0.15, max_discount=0.4)` at/above — + + /// `AcceleratingPartialRetarget(0.3, 0.6, 0.2)`. + /// + /// The sign-persistence boundary ratchets its threshold down as a + /// deviation persists in one direction, so a sustained 10% hashrate drop + /// (failing/throttling ASIC) is detected far faster than any fixed + /// boundary — at the cost of slower cold-start convergence (the two draw + /// on the same "agility budget"). Per-SPM analysis showed the bare + /// SignPersist boundary collapses at low SPM (jitter/step/convergence all + /// near zero at 4 SPM) because sparse-data Poisson noise spuriously trips + /// the same-sign discount; wrapping it in the PoissonCI low-SPM guard + /// (`AdaptiveSignPersist`) fixes that. Use when fast detection of gradual + /// hashrate loss is the operational priority. + pub fn react_priority() -> Self { + let make_boundary = || { + composed::AdaptiveSignPersist::sign_persist( + composed::SignPersistenceCusumBoundary::new(1.5, 0.05, 3.0, 0.15, 0.4), + 8, + ) + }; + let name = crate::naming::triple_name( + &composed::EwmaEstimator::new(90), + &make_boundary(), + &composed::AcceleratingPartialRetarget::new(0.3, 0.6, 0.2), + ); + Self::new(name, move |clock| { + let inner = composed::Composed::new( + composed::EwmaEstimator::new(90), + make_boundary(), + composed::AcceleratingPartialRetarget::new(0.3, 0.6, 0.2), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// **The regret/effort champion** (June 2026). `EwmaEstimator(150s)` + + /// `AdaptiveSignPersist(spm=6)` — PoissonCI below 6 SPM, and + /// `SignPersistenceCusumBoundary(sensitivity=0.3, floor=0.05, + /// tighten=6.0, discount=0.06, max_discount=0.6)` at/above — + + /// `AcceleratingPartialRetarget(0.2, 0.8, 0.05)`. + /// + /// Found by the §10 regret/effort process (`bin/sweep-regret-big` → + /// `sweep-signpersist-regret` → `confirm-signpersist`): it beats the + /// prior `balanced`/`react_priority` Pareto champions by trading a low + /// over-difficulty cost (`regret_over` ~0.029, near the field minimum) + /// for a tolerated, cheap under-difficulty bias. Relative to the + /// AsymCusum-only interim champion it adds the sign-persistence + /// discount, which corrects most of that under-difficulty bias (faster + /// cold-start ramp, tighter steady state) WITHOUT giving back + /// death-spiral safety: the discount applies after the tighten + /// multiplier, so a one-off spike keeps full tighten-reluctance while a + /// *persistent* under-difficulty progressively relaxes it. Validated as + /// a weight-robust interior optimum at the §10 3:1 over:under weight; + /// 100% detection on the aged-counter −10% drop. + pub fn champion() -> Self { + let make_boundary = || { + composed::AdaptiveSignPersist::sign_persist( + composed::SignPersistenceCusumBoundary::new(0.3, 0.05, 6.0, 0.06, 0.6), + 6, + ) + }; + let name = crate::naming::triple_name( + &composed::EwmaEstimator::new(150), + &make_boundary(), + &composed::AcceleratingPartialRetarget::new(0.2, 0.8, 0.05), + ); + Self::new(name, move |clock| { + let inner = composed::Composed::new( + composed::EwmaEstimator::new(150), + make_boundary(), + composed::AcceleratingPartialRetarget::new(0.2, 0.8, 0.05), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// Parameterized FullRemedy: same three-axis composition as + /// [`full_remedy`](Self::full_remedy) but with the EWMA time + /// constant, PartialRetarget η, and PoissonCI z-score exposed as + /// arguments. Use this to Pareto-explore the + /// (responsiveness, damping, false-fire rate) frontier: + /// + /// ```text + /// for &eta in &[0.1, 0.2, 0.3, 0.5, 0.7, 1.0] { + /// grid.algorithms.push(AlgorithmSpec::full_remedy_with(120, eta, 2.576)); + /// } + /// ``` + /// + /// `full_remedy_with(120, 0.3, 2.576)` is behaviorally identical + /// to `full_remedy()` but carries a different display name + /// (`FullRemedy-tau120-eta30-z2576`) to keep parametric-sweep + /// result tables collision-free. + /// + /// The PoissonCI margin is held at `0.05` (the default-parametric + /// value); a four-parameter version is not currently exposed + /// because the sweep evidence so far suggests `margin` is a less + /// impactful axis than the other three. + pub fn full_remedy_with(tau_secs: u64, eta: f32, z: f64) -> Self { + let name = crate::naming::triple_name( + &composed::EwmaEstimator::new(tau_secs), + &composed::PoissonCI::with_z(z, 0.05), + &composed::PartialRetarget::new(eta), + ); + Self::new(name, move |clock| { + let inner = composed::Composed::new( + composed::EwmaEstimator::new(tau_secs), + composed::PoissonCI::with_z(z, 0.05), + composed::PartialRetarget::new(eta), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// Bayesian Gamma-Poisson estimator composed with PoissonCI boundary + /// and PartialRetarget update rule. Uses the same boundary and update + /// rule as FullRemedy but replaces the EWMA estimator with a + /// principled Bayesian posterior over the hashrate ratio. + /// + /// `discount`: exponential forgetting per tick (0.90–0.99). + /// `prior_shares`: initial pseudo-count strength (2.0–10.0). + /// `eta`: PartialRetarget damping factor. + /// `z`: PoissonCI z-score threshold. + pub fn bayesian(discount: f64, prior_shares: f64, eta: f32, z: f64) -> Self { + let name = crate::naming::triple_name( + &composed::BayesianEstimator::new(discount, prior_shares), + &composed::PoissonCI::with_z(z, 0.05), + &composed::PartialRetarget::new(eta), + ); + Self::new(name, move |clock| { + let inner = composed::Composed::new( + composed::BayesianEstimator::new(discount, prior_shares), + composed::PoissonCI::with_z(z, 0.05), + composed::PartialRetarget::new(eta), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// Bayesian estimator with FullRetarget (no damping) — for testing + /// the estimator's noise characteristics in isolation. If the Bayesian + /// estimator is smooth enough, it can tolerate aggressive updates. + pub fn bayesian_full_retarget(discount: f64, prior_shares: f64, z: f64) -> Self { + let name = crate::naming::triple_name( + &composed::BayesianEstimator::new(discount, prior_shares), + &composed::PoissonCI::with_z(z, 0.05), + &composed::FullRetargetNoClamp, + ); + Self::new(name, move |clock| { + let inner = composed::Composed::new( + composed::BayesianEstimator::new(discount, prior_shares), + composed::PoissonCI::with_z(z, 0.05), + composed::FullRetargetNoClamp, + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// Bayesian estimator with CredibleIntervalBoundary — the composition + /// that leverages uncertainty-aware decision making. The boundary fires + /// when the Gamma posterior's credible interval excludes ratio=1.0. + /// + /// `discount`: exponential forgetting per tick. + /// `prior_shares`: initial pseudo-count strength. + /// `ci_z`: credible interval z-score (1.96=95%, 2.576=99%). + /// `eta`: PartialRetarget damping. + pub fn bayesian_ci(discount: f64, prior_shares: f64, ci_z: f64, eta: f32) -> Self { + let name = crate::naming::triple_name( + &composed::BayesianEstimator::new(discount, prior_shares), + &composed::CredibleIntervalBoundary::with_z(ci_z), + &composed::PartialRetarget::new(eta), + ); + Self::new(name, move |clock| { + let inner = composed::Composed::new( + composed::BayesianEstimator::new(discount, prior_shares), + composed::CredibleIntervalBoundary::with_z(ci_z), + composed::PartialRetarget::new(eta), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// EWMA + AsymmetricCusumBoundary: requires more evidence to tighten + /// (costly: rejects in-flight shares) than to ease (free). + pub fn ewma_asymmetric_cusum( + tau_secs: u64, + base_sensitivity: f64, + floor: f64, + tighten_multiplier: f64, + eta: f32, + ) -> Self { + let name = crate::naming::triple_name( + &composed::EwmaEstimator::new(tau_secs), + &composed::AsymmetricCusumBoundary::new(base_sensitivity, floor, tighten_multiplier), + &composed::PartialRetarget::new(eta), + ); + Self::new(name, move |clock| { + let inner = composed::Composed::new( + composed::EwmaEstimator::new(tau_secs), + composed::AsymmetricCusumBoundary::new(base_sensitivity, floor, tighten_multiplier), + composed::PartialRetarget::new(eta), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// Kalman estimator + PoissonCI boundary + PartialRetarget. + /// The Kalman provides adaptive smoothing + native uncertainty. + pub fn kalman_poisson(q: f64, eta: f32) -> Self { + let name = crate::naming::triple_name( + &composed::KalmanEstimator::new(q), + &composed::PoissonCI::default_parametric(), + &composed::PartialRetarget::new(eta), + ); + Self::new(name, move |clock| { + let inner = composed::Composed::new( + composed::KalmanEstimator::new(q), + composed::PoissonCI::default_parametric(), + composed::PartialRetarget::new(eta), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// Kalman estimator + CredibleIntervalBoundary + PartialRetarget. + /// Full uncertainty-aware pipeline: Kalman reports confidence, + /// CI boundary adapts threshold to confidence. + pub fn kalman_ci(q: f64, ci_z: f64, eta: f32) -> Self { + let name = crate::naming::triple_name( + &composed::KalmanEstimator::new(q), + &composed::CredibleIntervalBoundary::with_z(ci_z), + &composed::PartialRetarget::new(eta), + ); + Self::new(name, move |clock| { + let inner = composed::Composed::new( + composed::KalmanEstimator::new(q), + composed::CredibleIntervalBoundary::with_z(ci_z), + composed::PartialRetarget::new(eta), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// EWMA estimator + CUSUM boundary + PartialRetarget. + /// Sequential-testing boundary that detects sustained changes faster. + pub fn ewma_cusum(tau_secs: u64, sensitivity: f64, floor: f64, eta: f32) -> Self { + let name = format!( + "EWMA-CUSUM-tau{}-s{}-f{}-eta{}", + tau_secs, + (sensitivity * 10.0).round() as u32, + (floor * 100.0).round() as u32, + (eta * 100.0).round() as u32, + ); + Self::new(name, move |clock| { + let inner = composed::Composed::new( + composed::EwmaEstimator::new(tau_secs), + composed::CusumBoundary::new(sensitivity, floor), + composed::PartialRetarget::new(eta), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// Kalman estimator + CUSUM boundary + PartialRetarget. + /// Both new components: adaptive estimator + sequential boundary. + pub fn kalman_cusum(q: f64, sensitivity: f64, floor: f64, eta: f32) -> Self { + let name = format!( + "Kalman-CUSUM-q{}-s{}-f{}-eta{}", + (q * 10000.0).round() as u32, + (sensitivity * 10.0).round() as u32, + (floor * 100.0).round() as u32, + (eta * 100.0).round() as u32, + ); + Self::new(name, move |clock| { + let inner = composed::Composed::new( + composed::KalmanEstimator::new(q), + composed::CusumBoundary::new(sensitivity, floor), + composed::PartialRetarget::new(eta), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// EWMA + AdaptiveCusumBoundary: rate-adaptive sequential testing. + /// Sensitivity scales with √(SPM/reference) so it's conservative at + /// low SPM (less jitter) and aggressive at high SPM (faster detection). + pub fn ewma_adaptive_cusum(tau_secs: u64, base_sensitivity: f64, floor: f64, eta: f32) -> Self { + let name = format!( + "EWMA-AdaCUSUM-tau{}-s{}-f{}-eta{}", + tau_secs, + (base_sensitivity * 10.0).round() as u32, + (floor * 100.0).round() as u32, + (eta * 100.0).round() as u32, + ); + Self::new(name, move |clock| { + let inner = composed::Composed::new( + composed::EwmaEstimator::new(tau_secs), + composed::AdaptiveCusumBoundary::new(base_sensitivity, floor), + composed::PartialRetarget::new(eta), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// Power-of-2 quantized PID vardiff algorithm. + /// + /// P-only controller (Kp = -diff × 0.01, Ki=Kd=0) with power-of-2 + /// quantization. The quantization creates a ~41% dead zone that + /// makes the algorithm nearly inert for normal variance (±50%). + /// + /// Included as a reference implementation for comparing against + /// PID-based approaches found in the wild. + pub fn pow2_pid(spm_target: f32, initial_hashrate: f32) -> Self { + let name = format!("Pow2-PID-spm{}", spm_target.round() as u32); + Self::new(name, move |clock| { + let inner = Pow2PidVardiff::new(spm_target, 0.01, initial_hashrate, 1.0, clock); + VardiffBox(Box::new(AsObservable(inner))) + }) + } + + /// Pow2 PID with default parameters (SPM=10, 1 PH/s initial). + pub fn pow2_pid_default() -> Self { + Self::pow2_pid(10.0, 1.0e15) + } + + /// Tuned PID controller with balanced gains. + /// + /// Operates in difficulty-space with SPM error as the process variable. + /// All three PID terms active, anti-windup on integral, dead zone for noise. + pub fn pid_balanced(spm_target: f32) -> Self { + let name = format!("PID-Balanced-spm{}", spm_target.round() as u32); + Self::new(name, move |clock| { + let inner = PidTunedVardiff::new( + PidConfig::balanced(spm_target), + 1.0e15, + clock, + ); + VardiffBox(Box::new(AsObservable(inner))) + }) + } + + /// Tuned PID controller with aggressive gains (faster response, more jitter). + pub fn pid_aggressive(spm_target: f32) -> Self { + let name = format!("PID-Aggressive-spm{}", spm_target.round() as u32); + Self::new(name, move |clock| { + let inner = PidTunedVardiff::new( + PidConfig::aggressive(spm_target), + 1.0e15, + clock, + ); + VardiffBox(Box::new(AsObservable(inner))) + }) + } + + /// Tuned PID controller with conservative gains (minimal jitter, slower response). + pub fn pid_conservative(spm_target: f32) -> Self { + let name = format!("PID-Conservative-spm{}", spm_target.round() as u32); + Self::new(name, move |clock| { + let inner = PidTunedVardiff::new( + PidConfig::conservative(spm_target), + 1.0e15, + clock, + ); + VardiffBox(Box::new(AsObservable(inner))) + }) + } + + /// Tuned PID with custom config. + pub fn pid_custom(name: impl Into, config: PidConfig) -> Self { + let name = name.into(); + Self::new(name, move |clock| { + let inner = PidTunedVardiff::new(config, 1.0e15, clock); + VardiffBox(Box::new(AsObservable(inner))) + }) + } + + /// AdaCUSUM with AcceleratingPartialRetarget: η ramps up on + /// consecutive same-direction fires. Addresses the gap where + /// persistent small drift takes many fires at fixed η=0.2. + pub fn ada_cusum_accelerating( + tau_secs: u64, + base_sensitivity: f64, + floor: f64, + tighten_multiplier: f64, + eta_base: f32, + eta_max: f32, + acceleration: f32, + ) -> Self { + let name = format!( + "AdaCUSUM-Accel-eta{}-{}-acc{}", + (eta_base * 100.0).round() as u32, + (eta_max * 100.0).round() as u32, + (acceleration * 100.0).round() as u32, + ); + Self::new(name, move |clock| { + let inner = composed::Composed::new( + composed::EwmaEstimator::new(tau_secs), + composed::AsymmetricCusumBoundary::new(base_sensitivity, floor, tighten_multiplier), + composed::AcceleratingPartialRetarget::new(eta_base, eta_max, acceleration), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// SpmRatio estimator + AsymmetricCUSUM + PartialRetarget: bypasses + /// U256 arithmetic entirely by computing h_estimate via direct + /// SPM-ratio scaling. + pub fn spm_ratio_cusum( + tau_secs: u64, + base_sensitivity: f64, + floor: f64, + tighten_multiplier: f64, + eta: f32, + ) -> Self { + let name = format!( + "SpmRatio-CUSUM-tau{}-eta{}", + tau_secs, + (eta * 100.0).round() as u32, + ); + Self::new(name, move |clock| { + let inner = composed::Composed::new( + composed::SpmRatioEstimator::new(tau_secs), + composed::AsymmetricCusumBoundary::new(base_sensitivity, floor, tighten_multiplier), + composed::PartialRetarget::new(eta), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// SignPersistenceCusumBoundary + EWMA + PartialRetarget: lowers + /// threshold when deviation sign persists across ticks (PID integral + /// concept adapted to the three-stage framework). + pub fn ewma_sign_persistence( + tau_secs: u64, + base_sensitivity: f64, + floor: f64, + tighten_multiplier: f64, + sign_discount: f64, + max_discount: f64, + eta: f32, + ) -> Self { + let name = format!( + "EWMA-SignPersist-sd{}-md{}-eta{}", + (sign_discount * 100.0).round() as u32, + (max_discount * 100.0).round() as u32, + (eta * 100.0).round() as u32, + ); + Self::new(name, move |clock| { + let inner = composed::Composed::new( + composed::EwmaEstimator::new(tau_secs), + composed::SignPersistenceCusumBoundary::new( + base_sensitivity, + floor, + tighten_multiplier, + sign_discount, + max_discount, + ), + composed::PartialRetarget::new(eta), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// The "best-of-best" composition combining the three PID-investigation + /// improvements: + /// + /// - **Estimator**: `SpmRatioEstimator(120s)` — EWMA smoothing with + /// direct SPM-ratio scaling (no U256 arithmetic, simpler code path). + /// - **Boundary**: `AsymmetricCusumBoundary(s=1.5, floor=0.05, tighten=3.0)` + /// — proven sequential-evidence boundary with asymmetric tighten cost. + /// - **UpdateRule**: `AcceleratingPartialRetarget(base=0.2, max=0.6, acc=0.2)` + /// — η ramps on consecutive same-direction fires for 22% faster convergence + /// with zero jitter cost. + /// + /// The parameter sweep confirmed: + /// - acc=0.2, cap=0.6 is optimal (captures 99.7% of the benefit) + /// - Jitter is identical to baseline (acceleration only activates post-fire) + /// - Convergence improves 9-40% across SPM=6-30 + pub fn best_of_best() -> Self { + let name = crate::naming::triple_name( + &composed::SpmRatioEstimator::new(120), + &composed::AsymmetricCusumBoundary::new(1.5, 0.05, 3.0), + &composed::AcceleratingPartialRetarget::new(0.2, 0.6, 0.2), + ); + Self::new(name, |clock| { + let inner = composed::Composed::new( + composed::SpmRatioEstimator::new(120), + composed::AsymmetricCusumBoundary::new(1.5, 0.05, 3.0), + composed::AcceleratingPartialRetarget::new(0.2, 0.6, 0.2), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// ckpool-inspired algorithm: dual-window EWMA estimator with adaptive + /// window switching, hysteresis-gate boundary, and full retarget with + /// oscillation guard. + /// + /// Reproduces the core logic of ckpool's `add_submit()` vardiff path + /// (stratifier.c) within the three-stage pipeline: + /// + /// - **Estimator**: `CkpoolEstimator(60, 300)` — dual EWMA (1min short, + /// 5min long) with automatic switch to the short window when shares + /// flood in above the "fast" threshold (72 shares ≈ 240s / 3.33s). + /// Includes time-bias correction (`1 - e^(-t/τ)`) for warmup. + /// + /// - **Boundary**: `HysteresisGate(72, 240, 0.5, 1.33)` — binary + /// fire/no-fire with a data gate (72 shares OR 240s) and an asymmetric + /// dead band [0.5×, 1.33×] around target rate ratio. + /// + /// - **UpdateRule**: `CkpoolRetarget(1)` — full retarget to the + /// estimator's belief with oscillation guard (suppress decrease when + /// ≤1 share's worth of data since last fire). + /// + /// Reference: (src/stratifier.c) + /// and + pub fn ckpool() -> Self { + let name = crate::naming::triple_name( + &composed::CkpoolEstimator::new(60, 300), + &composed::HysteresisGate::ckpool_defaults(), + &composed::CkpoolRetarget::ckpool_defaults(), + ); + Self::new(name, |clock| { + let inner = composed::Composed::new( + composed::CkpoolEstimator::new(60, 300), + composed::HysteresisGate::ckpool_defaults(), + composed::CkpoolRetarget::ckpool_defaults(), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// Hybrid: ckpool's dual-window adaptive estimator paired with + /// FullRemedy's proven boundary (PoissonCI) and update (PartialRetarget). + /// + /// Tests whether ckpool's adaptive window switching and time-bias + /// correction improve counter-age sensitivity and post-fire accuracy + /// without the overshoot/accuracy problems caused by ckpool's native + /// hysteresis gate and full retarget. + pub fn ckpool_remedy() -> Self { + let name = crate::naming::triple_name( + &composed::CkpoolEstimator::new(60, 300), + &composed::PoissonCI::default_parametric(), + &composed::PartialRetarget::new(0.2), + ); + Self::new(name, |clock| { + let inner = composed::Composed::new( + composed::CkpoolEstimator::new(60, 300), + composed::PoissonCI::default_parametric(), + composed::PartialRetarget::new(0.2), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// CkpoolRemedy with a lower fast-threshold for the short-window switch. + /// + /// The default threshold (72 shares) means the short window never + /// activates at low SPMs (4-6) within a typical 5-minute reaction + /// window. Lowering to `ft` shares enables the responsive short EMA + /// to kick in sooner, potentially improving reaction rate at low SPMs. + pub fn ckpool_remedy_ft(ft: u32) -> Self { + let name = crate::naming::triple_name( + &composed::CkpoolEstimator::with_fast_threshold(60, 300, ft), + &composed::PoissonCI::default_parametric(), + &composed::PartialRetarget::new(0.2), + ); + Self::new(name, move |clock| { + let inner = composed::Composed::new( + composed::CkpoolEstimator::with_fast_threshold(60, 300, ft), + composed::PoissonCI::default_parametric(), + composed::PartialRetarget::new(0.2), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// Hybrid: ckpool estimator + narrowed hysteresis gate + damped update. + /// + /// The original ckpool hysteresis [0.5, 1.33] is too wide for 60s + /// ticks — the rate ratio wanders far from 1.0 while staying "inside" + /// the band. This variant tightens to [0.8, 1.2] (fire when >20% + /// off target) with a lower data gate (6 shares OR 60s) that matches + /// the tick-based evaluation cadence. Paired with PartialRetarget(0.3) + /// to limit overshoot. + pub fn ckpool_narrow_hyst() -> Self { + let name = crate::naming::triple_name( + &composed::CkpoolEstimator::new(60, 300), + &composed::HysteresisGate::new(6, 60, 0.8, 1.2), + &composed::PartialRetarget::new(0.3), + ); + Self::new(name, |clock| { + let inner = composed::Composed::new( + composed::CkpoolEstimator::new(60, 300), + composed::HysteresisGate::new(6, 60, 0.8, 1.2), + composed::PartialRetarget::new(0.3), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// Hybrid: standard EWMA estimator with ckpool's time-bias warmup + /// correction, paired with FullRemedy's boundary and update. + /// + /// Isolates the single idea of time-bias correction: does dividing + /// the EMA by `1 - e^(-dt/tau)` improve counter-age sensitivity and + /// post-fire accuracy? If this beats FullRemedy on counter-age metrics + /// without sacrificing anything else, the correction deserves + /// integration into the main EwmaEstimator. + pub fn time_bias_remedy() -> Self { + let name = crate::naming::triple_name( + &composed::TimeBiasEwmaEstimator::new(120), + &composed::PoissonCI::default_parametric(), + &composed::PartialRetarget::new(0.2), + ); + Self::new(name, |clock| { + let inner = composed::Composed::new( + composed::TimeBiasEwmaEstimator::new(120), + composed::PoissonCI::default_parametric(), + composed::PartialRetarget::new(0.2), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// Parameterized ckpool variant for exploring the parameter space. + /// + /// - `tau_short`: short-window EMA time constant (ckpool: 60s) + /// - `tau_long`: long-window EMA time constant (ckpool: 300s) + /// - `hysteresis_low`: lower dead-band multiplier (ckpool: 0.5) + /// - `hysteresis_high`: upper dead-band multiplier (ckpool: 1.33) + pub fn ckpool_with( + tau_short: u64, + tau_long: u64, + hysteresis_low: f64, + hysteresis_high: f64, + ) -> Self { + let min_shares = + ((tau_long as f64 * 0.8) / 3.33).round() as u32; + let min_time = (tau_long as f64 * 0.8).round() as u64; + let name = crate::naming::triple_name( + &composed::CkpoolEstimator::new(tau_short, tau_long), + &composed::HysteresisGate::new(min_shares, min_time, hysteresis_low, hysteresis_high), + &composed::CkpoolRetarget::ckpool_defaults(), + ); + Self::new(name, move |clock| { + let inner = composed::Composed::new( + composed::CkpoolEstimator::new(tau_short, tau_long), + composed::HysteresisGate::new(min_shares, min_time, hysteresis_low, hysteresis_high), + composed::CkpoolRetarget::ckpool_defaults(), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } + + /// FullRemedy with AdaptivePartialRetarget: scales η by fire margin. + /// `eta_base` is the damping at reference_margin; `reference_margin` + /// is the "normal" margin in percentage points. + pub fn full_remedy_adaptive(eta_base: f32, reference_margin: f64) -> Self { + let name = crate::naming::triple_name( + &composed::EwmaEstimator::new(120), + &composed::PoissonCI::default_parametric(), + &composed::AdaptivePartialRetarget::new(eta_base, reference_margin), + ); + Self::new(name, move |clock| { + let inner = composed::Composed::new( + composed::EwmaEstimator::new(120), + composed::PoissonCI::default_parametric(), + composed::AdaptivePartialRetarget::new(eta_base, reference_margin), + 1.0, + clock, + ); + VardiffBox(Box::new(inner)) + }) + } +} + +// ============================================================================ +// Grid +// ============================================================================ + +/// A declarative parameter sweep. The three axes (algorithm, +/// share-rate, scenario) form a Cartesian product; running the grid +/// drives `trial_count` trials at each (algorithm × cell) intersection +/// and returns the per-algorithm metric results. +#[derive(Clone, Debug)] +pub struct Grid { + pub algorithms: Vec, + pub share_rates: Vec, + pub scenarios: Vec, + pub trial_count: usize, + pub base_seed: u64, +} + +impl Grid { + /// The canonical default grid: one algorithm (classic + /// `VardiffState`), 8 share rates (SPM=6-30), 10 scenarios + /// (cold start + stable + 8 step deltas). 80 cells total. + /// Matches the cell ordering used by [`crate::baseline::default_cells`]. + pub fn default_classic() -> Self { + let mut scenarios = vec![Scenario::ColdStart, Scenario::Stable]; + for &delta in &[-50, -25, -10, -5, 5, 10, 25, 50] { + scenarios.push(Scenario::Step { delta_pct: delta }); + } + Self { + algorithms: vec![AlgorithmSpec::classic_vardiff_state()], + share_rates: vec![6.0, 8.0, 10.0, 12.0, 15.0, 20.0, 25.0, 30.0], + scenarios, + trial_count: DEFAULT_TRIAL_COUNT, + base_seed: DEFAULT_BASELINE_SEED, + } + } + + /// Counter-age characterization grid: tests reaction time as a + /// function of how long the algorithm has been settled (counter + /// age) before a step change. Produces the 2D table + /// (share_rate × counter_age) that maps directly to shape-proxy + /// calibration results. + /// + /// Uses `ClassicComposed` (the threshold-ladder algorithm) since + /// counter age is the defining variable for the classic algo's + /// `StepFunction` boundary. Also includes `VardiffState` (now + /// AdaCUSUM) for comparison. + pub fn settled_step() -> Self { + let settle_values: Vec = vec![5, 15, 30, 60, 120]; + let deltas: Vec = vec![-50, 50]; + let mut scenarios = Vec::new(); + for &settle in &settle_values { + for &delta in &deltas { + scenarios.push(Scenario::SettledStep { + settle_minutes: settle, + delta_pct: delta, + }); + } + } + Self { + algorithms: vec![ + AlgorithmSpec::classic_composed(), + AlgorithmSpec::classic_vardiff_state(), + ], + share_rates: vec![6.0, 8.0, 10.0, 12.0, 15.0, 20.0, 25.0, 30.0], + scenarios, + trial_count: DEFAULT_TRIAL_COUNT, + base_seed: DEFAULT_BASELINE_SEED, + } + } + + /// All cells in the grid (the (share_rate, scenario) tuples). + /// Independent of the algorithm axis. + pub fn cells(&self) -> Vec { + let mut out = Vec::with_capacity(self.share_rates.len() * self.scenarios.len()); + for &spm in &self.share_rates { + for scen in &self.scenarios { + out.push(Cell { + shares_per_minute: spm, + scenario: scen.clone(), + }); + } + } + out + } + + /// Total cell count = algorithms × share_rates × scenarios. + pub fn total_runs(&self) -> usize { + self.algorithms.len() * self.share_rates.len() * self.scenarios.len() + } + + /// Runs the entire grid. Returns a map keyed by algorithm name to + /// the per-cell results for that algorithm. Drives every trial + /// through [`run_trial_observed`] so introspection-emitting + /// algorithms have their `delta` / `threshold` / `h_estimate` + /// captured per tick. + /// + /// ## Seed derivation and the 2^20 cap + /// + /// Per-trial seeds are derived as + /// + /// ```text + /// seed = base_seed + /// + (cell_index << 20) + /// + trial_index + /// ``` + /// + /// where `cell_index = (algo_idx * N_spm * N_scen) + (spm_idx * + /// N_scen) + scen_idx`. The `<< 20` shift gives each cell a + /// 2^20-wide (1,048,576-entry) seed range, so seeds remain + /// collision-free as long as `trial_count <= 2^20`. The default + /// 1,000-trial baseline and even a 50,000-trial stress-baseline + /// are well within range; trial counts above 1 million should + /// either replace this with a 64-bit splitmix derivation or + /// accept the (small) risk of seed reuse across adjacent cells. + pub fn run(&self) -> HashMap> { + let n_spm = self.share_rates.len(); + let n_scen = self.scenarios.len(); + + let mut by_algorithm: HashMap> = + HashMap::with_capacity(self.algorithms.len()); + + for (algo_idx, algo) in self.algorithms.iter().enumerate() { + let mut cells_for_algo: Vec = Vec::with_capacity(n_spm * n_scen); + for (spm_idx, &spm) in self.share_rates.iter().enumerate() { + for (scen_idx, scen) in self.scenarios.iter().enumerate() { + let cell = Cell { + shares_per_minute: spm, + scenario: scen.clone(), + }; + let cell_index = algo_idx * n_spm * n_scen + spm_idx * n_scen + scen_idx; + let result = run_cell_with_algorithm( + algo, + &cell, + self.trial_count, + self.base_seed, + cell_index as u64, + ); + cells_for_algo.push(result); + } + } + by_algorithm.insert(algo.name.clone(), cells_for_algo); + } + + by_algorithm + } + + /// Like [`Grid::run`] but uses **algorithm-agnostic seeds**: all + /// algorithms in the grid see the same trial inputs at each cell. + /// Use this for paired A/B comparisons where metric differences + /// must be attributable to algorithm behavior alone — same Poisson + /// share stream, same hashrate schedule, same `try_vardiff` call + /// sequence — not to disparate seeds across algorithms. + /// + /// ## When to use which + /// + /// - [`Grid::run`] (algo-indexed seeds, `base + (algo_idx × + /// N_spm × N_scen + spm_idx × N_scen + scen_idx) << 20 + + /// trial_index`): each algorithm gets its own seed space. Safer + /// for regression baselines (no chance of seed reuse colliding + /// with an unrelated algorithm's checked-in baseline). + /// - [`Grid::run_paired`] (algo-stripped seeds, `base + (spm_idx + /// × N_scen + scen_idx) << 20 + trial_index`): paired + /// comparison. Metric deltas are smaller because the + /// per-algorithm samples come from the same underlying random + /// variate, so cross-algorithm variance shrinks. + /// + /// Don't mix the two — a baseline emitted by `run_paired` is not + /// directly comparable to one from `run` (the underlying trial + /// inputs differ). + pub fn run_paired(&self) -> HashMap> { + let n_scen = self.scenarios.len(); + + let mut by_algorithm: HashMap> = + HashMap::with_capacity(self.algorithms.len()); + + for algo in &self.algorithms { + let mut cells_for_algo: Vec = + Vec::with_capacity(self.share_rates.len() * n_scen); + for (spm_idx, &spm) in self.share_rates.iter().enumerate() { + for (scen_idx, scen) in self.scenarios.iter().enumerate() { + let cell = Cell { + shares_per_minute: spm, + scenario: scen.clone(), + }; + // Algorithm-stripped cell_index: the same (spm, + // scen) gets the same trial seeds regardless of + // which algorithm consumes them. + let cell_index = spm_idx * n_scen + scen_idx; + let result = run_cell_with_algorithm( + algo, + &cell, + self.trial_count, + self.base_seed, + cell_index as u64, + ); + cells_for_algo.push(result); + } + } + by_algorithm.insert(algo.name.clone(), cells_for_algo); + } + + by_algorithm + } +} + +/// Runs `trial_count` trials of one (algorithm, cell) intersection +/// and computes every applicable registered metric on the resulting +/// trial set. Uses [`run_trial_observed`] so observable algorithms +/// populate the per-tick introspection fields that bias / variance / +/// overshoot metrics consume. +pub fn run_cell_with_algorithm( + algorithm: &AlgorithmSpec, + cell: &Cell, + trial_count: usize, + base_seed: u64, + cell_index: u64, +) -> CellResult { + let (config, schedule) = cell.scenario.build(cell.shares_per_minute); + + let mut trials: Vec = Vec::with_capacity(trial_count); + for trial_index in 0..trial_count { + let seed = base_seed + .wrapping_add(cell_index.wrapping_shl(20)) + .wrapping_add(trial_index as u64); + let clock = Arc::new(MockClock::new(0)); + let vardiff = (algorithm.factory)(clock.clone()); + let trial = run_trial_observed(vardiff, clock, config.clone(), &schedule, seed); + trials.push(trial); + } + + let mut result = CellResult::new(cell.shares_per_minute, cell.scenario.clone()); + for metric in metrics::registry() { + if metric.applies_to(cell) { + let values = metric.compute(&trials, cell); + result.metrics.insert(metric.id(), values); + } + } + result +} + +// ============================================================================ +// Tests +// ============================================================================ + +#[cfg(test)] +mod tests { + use super::*; + use crate::baseline::{default_cells, run_baseline}; + + #[test] + fn default_classic_has_one_algorithm_eight_rates_ten_scenarios() { + let g = Grid::default_classic(); + assert_eq!(g.algorithms.len(), 1); + assert_eq!(g.algorithms[0].name, "Cumul / Step / FullClamp*"); + assert_eq!(g.share_rates.len(), 8); + assert_eq!(g.scenarios.len(), 10); + assert_eq!(g.total_runs(), 80); + } + + #[test] + fn default_classic_cells_match_default_cells() { + let grid_cells = Grid::default_classic().cells(); + let legacy_cells = default_cells(); + assert_eq!(grid_cells.len(), legacy_cells.len()); + for (g, l) in grid_cells.iter().zip(legacy_cells.iter()) { + assert_eq!(g.shares_per_minute, l.shares_per_minute); + assert_eq!(g.scenario, l.scenario); + } + } + + #[test] + fn vardiff_box_delegates_to_inner_via_as_observable() { + // VardiffState doesn't impl Observable; wrap in AsObservable to + // get a Vardiff + Observable that VardiffBox can hold. + let clock = Arc::new(MockClock::new(100)); + let inner = AsObservable(VardiffState::new_with_clock(1.0, clock.clone()).unwrap()); + let mut boxed = VardiffBox(Box::new(inner)); + assert_eq!(boxed.last_update_timestamp(), 100); + assert_eq!(boxed.min_allowed_hashrate(), 1.0); + assert_eq!(boxed.shares_since_last_update(), 0); + boxed.add_shares(42); + assert_eq!(boxed.shares_since_last_update(), 42); + boxed.reset_counter().unwrap(); + assert_eq!(boxed.shares_since_last_update(), 0); + // AsObservable returns None for last_decision. + assert!(boxed.last_decision().is_none()); + } + + #[test] + fn vardiff_box_with_composed_exposes_last_decision() { + // ClassicComposed natively implements Observable. When wrapped + // in VardiffBox the last_decision should propagate. + let clock = Arc::new(MockClock::new(0)); + let inner = composed::classic_composed(1.0, clock.clone()); + let mut boxed = VardiffBox(Box::new(inner)); + // Before any try_vardiff call, last_decision is None. + assert!(boxed.last_decision().is_none()); + // Drive one tick past the dt > 15 guard to force a decision. + boxed.add_shares(12); + clock.set(60); + let target = bitcoin::Target::MAX; + let _ = boxed.try_vardiff(1.0e15, &target, 12.0); + // Composed records the decision; VardiffBox surfaces it. + assert!(boxed.last_decision().is_some()); + } + + #[test] + fn algorithm_spec_factory_produces_fresh_instances() { + let algo = AlgorithmSpec::classic_vardiff_state(); + let clock_a = Arc::new(MockClock::new(0)); + let mut a = (algo.factory)(clock_a.clone()); + let clock_b = Arc::new(MockClock::new(0)); + let mut b = (algo.factory)(clock_b.clone()); + a.add_shares(5); + b.add_shares(10); + assert_eq!(a.shares_since_last_update(), 5); + assert_eq!(b.shares_since_last_update(), 10); + } + + #[test] + fn grid_run_with_three_trials_matches_run_baseline_seedwise() { + // Both paths share seed derivation (same cell_index for + // single-algorithm grid). Grid uses run_trial_observed while + // run_baseline uses run_trial — both produce fire-for-fire + // identical timelines for the same algorithm (asserted by + // the trial-driver tests), so the metric values must match. + let grid = Grid { + algorithms: vec![AlgorithmSpec::classic_vardiff_state()], + share_rates: vec![12.0], + scenarios: vec![Scenario::Stable, Scenario::Step { delta_pct: -50 }], + trial_count: 3, + base_seed: 0xCAFE, + }; + + let grid_results = grid.run(); + let from_grid = &grid_results["Cumul / Step / FullClamp*"]; + + let legacy_cells = vec![ + Cell { + shares_per_minute: 12.0, + scenario: Scenario::Stable, + }, + Cell { + shares_per_minute: 12.0, + scenario: Scenario::Step { delta_pct: -50 }, + }, + ]; + let legacy = run_baseline(&legacy_cells, 3, 0xCAFE); + + assert_eq!(from_grid.len(), legacy.len()); + for (g, l) in from_grid.iter().zip(legacy.iter()) { + assert_eq!(g.shares_per_minute, l.shares_per_minute); + assert_eq!(g.scenario, l.scenario); + assert_eq!(g.get("convergence_rate"), l.get("convergence_rate")); + assert_eq!(g.get("settled_accuracy_p50"), l.get("settled_accuracy_p50")); + if l.get("reaction_rate").is_some() { + assert_eq!(g.get("reaction_rate"), l.get("reaction_rate")); + } + } + } + + #[test] + fn grid_can_hold_multiple_algorithms() { + let grid = Grid { + algorithms: vec![ + AlgorithmSpec::classic_vardiff_state(), + AlgorithmSpec::classic_composed(), + ], + share_rates: vec![12.0], + scenarios: vec![Scenario::Stable], + trial_count: 3, + base_seed: 0xDEAD, + }; + + let results = grid.run(); + assert_eq!(results.len(), 2); + assert!(results.contains_key("Cumul / Step / FullClamp*")); + assert!(results.contains_key("Cumul / Step / FullClamp")); + assert_eq!(results["Cumul / Step / FullClamp*"].len(), 1); + assert_eq!(results["Cumul / Step / FullClamp"].len(), 1); + } + + #[test] + fn classic_composed_emits_introspection_metrics_through_grid() { + // Composed populates last_decision → run_trial_observed + // populates tick.h_estimate → bias/variance/overshoot metrics + // can produce non-None values. Sanity-check via the trial + // structure rather than metric values directly. + let grid = Grid { + algorithms: vec![AlgorithmSpec::classic_composed()], + share_rates: vec![12.0], + scenarios: vec![Scenario::Stable], + trial_count: 1, + base_seed: 0xBEEF, + }; + let results = grid.run(); + // The trial inside the grid would have had h_estimate + // populated; that's the property bias/variance need. Direct + // verification requires constructing a trial outside the grid; + // this test asserts the metric trait wiring is reachable. + assert!(results.contains_key("Cumul / Step / FullClamp")); + } + + #[test] + fn algorithm_spec_new_accepts_custom_factory() { + let spec = AlgorithmSpec::new("CustomAlgo", |clock| { + let inner = AsObservable(VardiffState::new_with_clock(2.5, clock).unwrap()); + VardiffBox(Box::new(inner)) + }); + assert_eq!(spec.name, "CustomAlgo"); + let clock = Arc::new(MockClock::new(0)); + let v = (spec.factory)(clock); + assert_eq!(v.min_allowed_hashrate(), 2.5); + } + + // ---- Parametric ---- + + #[test] + fn parametric_factory_constructs_and_runs() { + let spec = AlgorithmSpec::parametric(); + assert_eq!(spec.name, "Cumul / Poisson-z2.58 / FullClamp"); + let clock = Arc::new(MockClock::new(0)); + let v = (spec.factory)(clock); + assert_eq!(v.min_allowed_hashrate(), 1.0); + } + + #[test] + fn parametric_runs_through_grid() { + let grid = Grid { + algorithms: vec![AlgorithmSpec::parametric()], + share_rates: vec![12.0], + scenarios: vec![Scenario::Stable], + trial_count: 2, + base_seed: 0xCAFE, + }; + let results = grid.run(); + assert!(results.contains_key("Cumul / Poisson-z2.58 / FullClamp")); + let cells = &results["Cumul / Poisson-z2.58 / FullClamp"]; + assert_eq!(cells.len(), 1); + // Parametric is observable (it's a Composed) — bias/variance + // metrics should be present (even if their values are noisy + // with trial_count=2). + let cell = &cells[0]; + assert!(cell.metrics.contains_key("bias")); + assert!(cell.metrics.contains_key("variance")); + // The standard behavioral metrics should also be there. + assert!(cell.get("convergence_rate").is_some()); + assert!(cell.get("jitter_p50_per_min").is_some()); + } + + // ---- EWMA-60s ---- + + #[test] + fn ewma_60s_factory_constructs_and_runs() { + let spec = AlgorithmSpec::ewma_60s(); + assert_eq!(spec.name, "Ewma60s / Poisson-z2.58 / Partial-e0.5"); + let clock = Arc::new(MockClock::new(0)); + let v = (spec.factory)(clock); + assert_eq!(v.min_allowed_hashrate(), 1.0); + } + + #[test] + fn ewma_60s_runs_through_grid() { + let grid = Grid { + algorithms: vec![AlgorithmSpec::ewma_60s()], + share_rates: vec![12.0], + scenarios: vec![Scenario::Stable, Scenario::Step { delta_pct: -50 }], + trial_count: 2, + base_seed: 0xCAFE, + }; + let results = grid.run(); + assert!(results.contains_key("Ewma60s / Poisson-z2.58 / Partial-e0.5")); + let cells = &results["Ewma60s / Poisson-z2.58 / Partial-e0.5"]; + assert_eq!(cells.len(), 2); + } + + // ---- Sliding-Window ---- + + #[test] + fn sliding_window_factory_constructs_and_runs() { + let spec = AlgorithmSpec::sliding_window(10); + assert_eq!(spec.name, "Slide10t / Poisson-z2.58 / FullNoClamp"); + let clock = Arc::new(MockClock::new(0)); + let v = (spec.factory)(clock); + assert_eq!(v.min_allowed_hashrate(), 1.0); + } + + #[test] + fn sliding_window_runs_through_grid() { + let grid = Grid { + algorithms: vec![AlgorithmSpec::sliding_window(10)], + share_rates: vec![12.0], + scenarios: vec![Scenario::Stable, Scenario::Step { delta_pct: -50 }], + trial_count: 2, + base_seed: 0xCAFE, + }; + let results = grid.run(); + assert!(results.contains_key("Slide10t / Poisson-z2.58 / FullNoClamp")); + let cells = &results["Slide10t / Poisson-z2.58 / FullNoClamp"]; + assert_eq!(cells.len(), 2); + // Sliding-Window is observable (it's a Composed) — bias / + // variance / ramp_target_overshoot metrics should populate. + // (For ColdStart cells which we don't include here, overshoot + // would also populate. With Stable + Step only, we expect + // bias/variance on the Stable cell.) + assert!(cells[0].metrics.contains_key("bias")); + assert!(cells[0].metrics.contains_key("variance")); + } + + #[test] + fn sliding_window_with_different_window_sizes_produces_different_names() { + let s10 = AlgorithmSpec::sliding_window(10); + let s30 = AlgorithmSpec::sliding_window(30); + let s120 = AlgorithmSpec::sliding_window(120); + assert_eq!(s10.name, "Slide10t / Poisson-z2.58 / FullNoClamp"); + assert_eq!(s30.name, "Slide30t / Poisson-z2.58 / FullNoClamp"); + assert_eq!(s120.name, "Slide120t / Poisson-z2.58 / FullNoClamp"); + } + + // ---- ParametricStrict ---- + + #[test] + fn parametric_strict_factory_constructs_and_runs() { + let spec = AlgorithmSpec::parametric_strict(); + assert_eq!(spec.name, "Cumul / Poisson-z3.00 / FullClamp"); + let clock = Arc::new(MockClock::new(0)); + let v = (spec.factory)(clock); + assert_eq!(v.min_allowed_hashrate(), 1.0); + } + + #[test] + fn parametric_strict_runs_through_grid() { + let grid = Grid { + algorithms: vec![AlgorithmSpec::parametric_strict()], + share_rates: vec![6.0, 30.0], + scenarios: vec![Scenario::Stable, Scenario::Step { delta_pct: -50 }], + trial_count: 2, + base_seed: 0xCAFE, + }; + let results = grid.run(); + assert!(results.contains_key("Cumul / Poisson-z3.00 / FullClamp")); + assert_eq!(results["Cumul / Poisson-z3.00 / FullClamp"].len(), 2 * 2); + } + + #[test] + fn parametric_strict_fires_less_than_default_on_stable_load() { + // The strict boundary should reduce false-fire rate on stable + // load — that's the entire point of pushing z higher. Run both + // algorithms paired on the same stable cell and check that + // strict jitter ≤ default jitter. + let grid = Grid { + algorithms: vec![ + AlgorithmSpec::parametric(), + AlgorithmSpec::parametric_strict(), + ], + share_rates: vec![6.0], + scenarios: vec![Scenario::Stable], + trial_count: 30, + base_seed: 0xCAFE, + }; + let results = grid.run_paired(); + let default_jitter = results["Cumul / Poisson-z2.58 / FullClamp"][0] + .get("jitter_mean_per_min") + .unwrap_or(0.0); + let strict_jitter = results["Cumul / Poisson-z3.00 / FullClamp"][0] + .get("jitter_mean_per_min") + .unwrap_or(0.0); + assert!( + strict_jitter <= default_jitter, + "strict_jitter ({}) should be ≤ default_jitter ({}) under stable load", + strict_jitter, + default_jitter, + ); + } + + // ---- ClassicPartialRetarget ---- + + #[test] + fn classic_partial_retarget_factory_constructs_and_runs() { + let spec = AlgorithmSpec::classic_partial_retarget(0.3); + assert_eq!(spec.name, "Cumul / Step / Partial-e0.3"); + let clock = Arc::new(MockClock::new(0)); + let v = (spec.factory)(clock); + assert_eq!(v.min_allowed_hashrate(), 1.0); + } + + #[test] + fn classic_partial_retarget_different_eta_produces_different_names() { + assert_eq!( + AlgorithmSpec::classic_partial_retarget(0.3).name, + "Cumul / Step / Partial-e0.3", + ); + assert_eq!( + AlgorithmSpec::classic_partial_retarget(0.5).name, + "Cumul / Step / Partial-e0.5", + ); + assert_eq!( + AlgorithmSpec::classic_partial_retarget(1.0).name, + "Cumul / Step / Partial-e1", + ); + } + + #[test] + fn classic_partial_retarget_runs_through_grid() { + let grid = Grid { + algorithms: vec![AlgorithmSpec::classic_partial_retarget(0.3)], + share_rates: vec![6.0, 12.0], + scenarios: vec![Scenario::ColdStart, Scenario::Stable], + trial_count: 2, + base_seed: 0xCAFE, + }; + let results = grid.run(); + assert!(results.contains_key("Cumul / Step / Partial-e0.3")); + assert_eq!(results["Cumul / Step / Partial-e0.3"].len(), 4); + } + + // ---- FullRemedy ---- + + #[test] + fn full_remedy_factory_constructs_and_runs() { + let spec = AlgorithmSpec::full_remedy(); + assert_eq!(spec.name, "Ewma120s / Poisson-z2.58 / Partial-e0.2"); + let clock = Arc::new(MockClock::new(0)); + let v = (spec.factory)(clock); + assert_eq!(v.min_allowed_hashrate(), 1.0); + } + + #[test] + fn full_remedy_runs_through_grid() { + let grid = Grid { + algorithms: vec![AlgorithmSpec::full_remedy()], + share_rates: vec![6.0, 60.0], + scenarios: vec![ + Scenario::ColdStart, + Scenario::Stable, + Scenario::Step { delta_pct: -50 }, + ], + trial_count: 2, + base_seed: 0xCAFE, + }; + let results = grid.run(); + assert!(results.contains_key("Ewma120s / Poisson-z2.58 / Partial-e0.2")); + assert_eq!(results["Ewma120s / Poisson-z2.58 / Partial-e0.2"].len(), 6); + // FullRemedy is a Composed under the hood, so it's observable — + // bias/variance metrics must populate on Stable cells. + let stable_lowspm = results["Ewma120s / Poisson-z2.58 / Partial-e0.2"] + .iter() + .find(|c| c.shares_per_minute == 6.0 && c.scenario == Scenario::Stable) + .expect("Stable@SPM=6 cell present"); + assert!(stable_lowspm.metrics.contains_key("bias")); + assert!(stable_lowspm.metrics.contains_key("variance")); + } + + #[test] + fn full_remedy_distinct_from_ewma_60s() { + // The full_remedy uses EWMA-120, not EWMA-60. Both algorithms + // share the same axis types but with different parameters — + // their behavior must differ at some metric to be a meaningful + // distinct algorithm. + let grid = Grid { + algorithms: vec![AlgorithmSpec::ewma_60s(), AlgorithmSpec::full_remedy()], + share_rates: vec![6.0], + scenarios: vec![Scenario::Stable, Scenario::Step { delta_pct: -50 }], + trial_count: 30, + base_seed: 0xCAFE, + }; + let results = grid.run_paired(); + let ewma = &results["Ewma60s / Poisson-z2.58 / Partial-e0.5"]; + let fr = &results["Ewma120s / Poisson-z2.58 / Partial-e0.2"]; + let any_differ = ewma.iter().zip(fr.iter()).any(|(a, b)| { + [ + "jitter_mean_per_min", + "settled_accuracy_p50", + "variance_p50", + ] + .iter() + .any(|k| a.get(k) != b.get(k)) + }); + assert!( + any_differ, + "FullRemedy (EWMA-120 + η=0.2) must differ from EWMA-60s (EWMA-60 + η=0.5) \ + on at least one metric", + ); + } + + // ---- FullRemedy parametric variant ---- + + #[test] + fn full_remedy_with_default_args_matches_full_remedy_behavior() { + // `full_remedy_with(120, 0.2, 2.576)` is the same composition as + // `full_remedy()`. Under the derived-name scheme they now share an + // identical name (the name IS the composition), so they must also + // produce the identical name — proving the equivalence structurally. + assert_eq!( + AlgorithmSpec::full_remedy().name, + AlgorithmSpec::full_remedy_with(120, 0.2, 2.576).name, + "full_remedy and full_remedy_with(120, 0.2, 2.576) are the \ + same composition and must derive the same name", + ); + assert_eq!( + AlgorithmSpec::full_remedy().name, + "Ewma120s / Poisson-z2.58 / Partial-e0.2", + ); + } + + #[test] + fn full_remedy_with_sweep_distinguishes_parameter_changes() { + // Two FullRemedy variants differing in one axis must produce a + // different name and at least one different metric — otherwise + // the sweep produces collapsed/indistinguishable rows. + let grid = Grid { + algorithms: vec![ + AlgorithmSpec::full_remedy_with(120, 0.1, 2.576), + AlgorithmSpec::full_remedy_with(120, 1.0, 2.576), + ], + share_rates: vec![6.0], + scenarios: vec![Scenario::ColdStart, Scenario::Step { delta_pct: -50 }], + trial_count: 30, + base_seed: 0xCAFE, + }; + let results = grid.run_paired(); + let cautious = &results["Ewma120s / Poisson-z2.58 / Partial-e0.1"]; + let aggressive = &results["Ewma120s / Poisson-z2.58 / Partial-e1"]; + // η=0.1 caps per-fire moves at 10% of the gap; η=1.0 is full + // retargets. The ramp overshoot tail must differ at SPM=6 cold + // start (the canonical η-sensitive cell). + let cautious_cs = cautious + .iter() + .find(|c| c.scenario == Scenario::ColdStart) + .expect("ColdStart cell present"); + let aggressive_cs = aggressive + .iter() + .find(|c| c.scenario == Scenario::ColdStart) + .expect("ColdStart cell present"); + assert_ne!( + cautious_cs.get("ramp_target_overshoot_p90"), + aggressive_cs.get("ramp_target_overshoot_p90"), + "η=0.1 and η=1.0 must produce different ramp overshoot tails" + ); + } + + // ---- Multi-algorithm Pareto-style comparison ---- + + #[test] + fn multi_algorithm_grid_produces_one_result_set_per_algorithm() { + // "Algorithm as grid axis" lets one run characterize multiple + // algorithms on the same cells, ready for Pareto comparison. + let grid = Grid { + algorithms: vec![ + AlgorithmSpec::classic_vardiff_state(), + AlgorithmSpec::classic_composed(), + AlgorithmSpec::parametric(), + AlgorithmSpec::ewma_60s(), + ], + share_rates: vec![12.0], + scenarios: vec![Scenario::Stable], + trial_count: 2, + base_seed: 0xCAFE, + }; + let results = grid.run(); + assert_eq!(results.len(), 4); + assert!(results.contains_key("Cumul / Step / FullClamp*")); + assert!(results.contains_key("Cumul / Step / FullClamp")); + assert!(results.contains_key("Cumul / Poisson-z2.58 / FullClamp")); + assert!(results.contains_key("Ewma60s / Poisson-z2.58 / Partial-e0.5")); + for name in &["Cumul / Step / FullClamp*", "Cumul / Step / FullClamp", "Cumul / Poisson-z2.58 / FullClamp", "Ewma60s / Poisson-z2.58 / Partial-e0.5"] { + assert_eq!(results[*name].len(), 1, "{} should have 1 cell", name); + } + } + + // ---- Orthogonality regression tests ---- + // + // The framework's load-bearing claim is: hold three axes constant, + // vary the fourth, attribute the metric change to that one axis. + // These tests verify the claim empirically: + // + // 1. A real axis swap (`ClassicComposed` → `Parametric`, + // Boundary-only) MUST produce a measurable behavioral + // difference — otherwise the framework can't distinguish + // axis-attributable changes. + // + // 2. The unchanged axes preserve structural state (share + // counters, timestamps) across the swap — confirms that + // identical Estimator + Update stages really do + // behave identically under the same observe sequence. + // + // Without these, future axis additions could silently re-couple + // axes and degrade the "swap one, see one metric change" promise. + + #[test] + fn boundary_axis_swap_produces_measurable_metric_change() { + // Classic vs Parametric differ ONLY in the Boundary axis. + // At SPM=60 with |Δ|=25% the Boundary swap should affect + // detection — Parametric's rate-aware threshold is well below + // Classic's step ladder at moderate `dt_secs`, so reaction- + // related metrics ought to diverge. Assert that at least *some* + // observed metric value differs. + let grid = Grid { + algorithms: vec![ + AlgorithmSpec::classic_composed(), + AlgorithmSpec::parametric(), + ], + share_rates: vec![60.0], + scenarios: vec![Scenario::Step { delta_pct: -25 }], + trial_count: 50, + base_seed: 0xCAFE, + }; + let results = grid.run(); + let c = &results["Cumul / Step / FullClamp"][0]; + let p = &results["Cumul / Poisson-z2.58 / FullClamp"][0]; + + let metrics_to_check = [ + "convergence_rate", + "settled_accuracy_p50", + "jitter_p50_per_min", + "reaction_rate", + "reaction_p50_secs", + ]; + let any_differ = metrics_to_check.iter().any(|k| c.get(k) != p.get(k)); + assert!( + any_differ, + "Boundary axis swap (Classic → Parametric) must produce at least \ + one metric change; all checked metrics matched. This would mean \ + the framework can't distinguish boundary-axis behavior changes \ + from no-op." + ); + } + + #[test] + fn unchanged_axes_preserve_structural_state_across_boundary_swap() { + // Classic and Parametric share Estimator + Update. + // For the same observe sequence, the share counters and + // last_update_timestamp should track identically (until the + // boundary-driven decision diverges and fires). + let clock_c = Arc::new(MockClock::new(0)); + let clock_p = Arc::new(MockClock::new(0)); + let mut c = (AlgorithmSpec::classic_composed().factory)(clock_c.clone()); + let mut p = (AlgorithmSpec::parametric().factory)(clock_p.clone()); + + // Initial state must match. + assert_eq!(c.last_update_timestamp(), p.last_update_timestamp()); + assert_eq!(c.shares_since_last_update(), p.shares_since_last_update()); + assert_eq!(c.min_allowed_hashrate(), p.min_allowed_hashrate()); + + // Apply the same observe sequence; share counters must move + // identically. + for n in &[10u32, 25, 12, 50] { + c.add_shares(*n); + p.add_shares(*n); + assert_eq!( + c.shares_since_last_update(), + p.shares_since_last_update(), + "share counters must track identically under same observe sequence", + ); + } + } + + #[test] + fn run_paired_produces_identical_metrics_for_same_algorithm_twice() { + // Running the same algorithm through `run_paired` twice (same + // seeds) should produce identical metric values — proves the + // paired-seed mechanism works as advertised. (Under the derived-name + // scheme, two copies of the same composition collapse to one map + // key, so we run two separate grids and compare instead.) + let make_grid = || Grid { + algorithms: vec![AlgorithmSpec::full_remedy()], + share_rates: vec![12.0], + scenarios: vec![Scenario::Stable, Scenario::Step { delta_pct: -50 }], + trial_count: 20, + base_seed: 0xCAFE, + }; + + let key = "Ewma120s / Poisson-z2.58 / Partial-e0.2"; + let paired_a = make_grid().run_paired(); + let paired_b = make_grid().run_paired(); + let a = &paired_a[key]; + let b = &paired_b[key]; + + assert_eq!(a.len(), b.len()); + for (a_cell, b_cell) in a.iter().zip(b.iter()) { + assert_eq!(a_cell.shares_per_minute, b_cell.shares_per_minute); + assert_eq!(a_cell.scenario, b_cell.scenario); + for metric_key in &[ + "convergence_rate", + "settled_accuracy_p50", + "jitter_mean_per_min", + "reaction_rate", + ] { + assert_eq!( + a_cell.get(metric_key), + b_cell.get(metric_key), + "{} mismatch on cell {:?}", + metric_key, + a_cell.scenario, + ); + } + } + } + + #[test] + fn run_paired_seed_for_cell_does_not_depend_on_algo_idx() { + // Two grids: one with VardiffState first, one with ClassicComposed + // first. Under `run_paired`, the cell at (spm=12, Stable) gets + // the same trial seeds in both — so VardiffState's metrics on + // that cell must match across the two grids. + let grid_a = Grid { + algorithms: vec![ + AlgorithmSpec::classic_vardiff_state(), + AlgorithmSpec::classic_composed(), + ], + share_rates: vec![12.0], + scenarios: vec![Scenario::Stable], + trial_count: 10, + base_seed: 0xDEAD, + }; + let grid_b = Grid { + algorithms: vec![ + AlgorithmSpec::classic_composed(), + AlgorithmSpec::classic_vardiff_state(), + ], + share_rates: vec![12.0], + scenarios: vec![Scenario::Stable], + trial_count: 10, + base_seed: 0xDEAD, + }; + + let a = grid_a.run_paired(); + let b = grid_b.run_paired(); + + // VardiffState's results must be identical across both grids. + assert_eq!( + a["Cumul / Step / FullClamp*"][0].get("convergence_rate"), + b["Cumul / Step / FullClamp*"][0].get("convergence_rate"), + ); + assert_eq!( + a["Cumul / Step / FullClamp*"][0].get("jitter_mean_per_min"), + b["Cumul / Step / FullClamp*"][0].get("jitter_mean_per_min"), + ); + } + + #[test] + fn estimator_axis_swap_produces_measurable_metric_change() { + // ClassicComposed vs EWMA-60s differ in 3 axes (Estimator, + // Boundary, Update). Even more permissive: just assert some + // metric is different — confirms that swapping any axis + // (including the introspection-sensitive Estimator) is + // detectable end-to-end. + let grid = Grid { + algorithms: vec![AlgorithmSpec::classic_composed(), AlgorithmSpec::ewma_60s()], + share_rates: vec![12.0], + scenarios: vec![Scenario::Stable], + trial_count: 20, + base_seed: 0xCAFE, + }; + let results = grid.run(); + let c = &results["Cumul / Step / FullClamp"][0]; + let e = &results["Ewma60s / Poisson-z2.58 / Partial-e0.5"][0]; + + let metrics_to_check = [ + "convergence_rate", + "settled_accuracy_p50", + "jitter_p50_per_min", + ]; + let any_differ = metrics_to_check.iter().any(|k| c.get(k) != e.get(k)); + assert!( + any_differ, + "Estimator+Boundary+Update axis swap (Classic → EWMA-60s) must produce \ + at least one metric change." + ); + } + + #[test] + fn ckpool_factory_constructs_and_runs() { + let clock = Arc::new(channels_sv2::vardiff::MockClock::new(0)); + let vb = (AlgorithmSpec::ckpool().factory)(clock); + assert_eq!(vb.shares_since_last_update(), 0); + } + + #[test] + fn ckpool_runs_through_grid() { + let grid = Grid { + algorithms: vec![AlgorithmSpec::ckpool()], + share_rates: vec![6.0, 60.0], + scenarios: vec![ + Scenario::ColdStart, + Scenario::Stable, + Scenario::Step { delta_pct: -50 }, + ], + trial_count: 2, + base_seed: 0xCAFE, + }; + let results = grid.run(); + assert!(results.contains_key("Ckpool60-300s / Hyst-0.5-1.33-g72 / CkpoolRetgt-m1")); + assert_eq!(results["Ckpool60-300s / Hyst-0.5-1.33-g72 / CkpoolRetgt-m1"].len(), 6); + // Ckpool is Composed, so introspection works. + let stable_highspm = results["Ckpool60-300s / Hyst-0.5-1.33-g72 / CkpoolRetgt-m1"] + .iter() + .find(|c| c.shares_per_minute == 60.0 && c.scenario == Scenario::Stable) + .expect("Stable@SPM=60 cell present"); + assert!(stable_highspm.metrics.contains_key("bias")); + assert!(stable_highspm.metrics.contains_key("variance")); + } + + #[test] + fn ckpool_with_parametric_constructs_and_runs() { + let grid = Grid { + algorithms: vec![AlgorithmSpec::ckpool_with(30, 180, 0.4, 1.5)], + share_rates: vec![12.0], + scenarios: vec![Scenario::Stable], + trial_count: 2, + base_seed: 0xBEEF, + }; + let results = grid.run(); + let name = AlgorithmSpec::ckpool_with(30, 180, 0.4, 1.5).name; + assert!( + results.contains_key(&name), + "Expected key '{}', got: {:?}", + name, + results.keys().collect::>() + ); + } +} diff --git a/sv2/channels-sv2/sim/src/lib.rs b/sv2/channels-sv2/sim/src/lib.rs new file mode 100644 index 0000000000..83e6e65d66 --- /dev/null +++ b/sv2/channels-sv2/sim/src/lib.rs @@ -0,0 +1,117 @@ +//! # Vardiff simulation framework +//! +//! Deterministic in-process simulation harness for characterizing the +//! behavioral attributes of any [`channels_sv2::vardiff::Vardiff`] +//! implementation. The framework decomposes a vardiff algorithm into +//! three sequential stages (Estimator, Boundary, UpdateRule) and +//! characterizes each so metric changes can be attributed to the +//! stage that changed. See `sim/docs/DESIGN.md` for +//! the architectural reference and `sim/docs/FINDINGS.md` for the +//! cross-algorithm characterization results. +//! +//! ## What this crate provides +//! +//! - [`run_trial`]: drives a single [`channels_sv2::vardiff::Vardiff`] +//! implementation through `duration_secs` of simulated time against a +//! Poisson share stream and a programmable hashrate schedule, recording +//! a dense per-tick [`TickRecord`] timeline. +//! - [`run_trial_observed`]: as above, but also populates the optional +//! introspection fields (δ, θ, H̃) for algorithms that implement +//! [`Observable`] (e.g. `Composed` from the +//! [`composed`] module). +//! - [`HashrateSchedule`]: step-function description of the miner's true +//! hashrate over time — supports stable, step-change, and arbitrary +//! piecewise-constant scenarios. +//! - [`XorShift64`]: deterministic RNG used for share-arrival sampling. +//! Trials are fully reproducible from a `(config, schedule, seed)` triple. +//! - [`metrics`]: distribution-computing functions over `Vec` — +//! convergence time, settled accuracy, steady-state jitter, reaction time, +//! reaction sensitivity. Each metric returns a [`Distribution`] supporting +//! percentile queries (p10–p99), mean, and count. +//! - [`composed`]: the three-stage pipeline (Estimator, Boundary, +//! UpdateRule) and the `Composed` adapter that carries +//! `impl Vardiff`. +//! +//! ## Unit conventions +//! +//! Two kinds of "percentage-like" quantities flow through the +//! framework. They use different conventions, so the same numeric +//! value `0.10` means different things depending on where you see it: +//! +//! | Location | Convention | Example | +//! | --- | --- | --- | +//! | Boundary threshold / deviation (`δ`, `θ` in [`composed`]) | percentage points | `δ = 60.0` ⇔ 60% | +//! | `bias_*`, `ramp_target_overshoot_*` in [`MetricValues`] | fraction | `bias_mean = 0.10` ⇔ +10% | +//! | `settled_accuracy_*` in [`MetricValues`] | fraction | `0.04` ⇔ 4% off truth | +//! | `convergence_rate`, `reaction_rate` | fraction in [0, 1] | `0.95` ⇔ 95% | +//! | `jitter_*_per_min` | rate (fires/minute) | `0.04` ⇔ 0.04 fires/min | +//! | `convergence_p*_secs`, `reaction_p*_secs` | seconds | `420.0` ⇔ 420 seconds | +//! | `variance_*` | dimensionless (population variance of `H̃/H_true`) | `0.01` ⇔ σ²(H̃/H) = 0.01 | +//! +//! The percentage-point convention for δ and θ is preserved for +//! bit-equivalence with `VardiffState`'s internal formula +//! (`hashrate_delta_percentage = ... * 100.0`). Everywhere else uses +//! fractions because the underlying math is fractional. Key names with +//! `_secs` / `_per_min` suffixes carry their units in the name; others +//! are documented in the metric impl that emits them. +//! +//! ## Quickstart +//! +//! ```ignore +//! use std::sync::Arc; +//! use channels_sv2::vardiff::MockClock; +//! use channels_sv2::VardiffState; +//! use vardiff_sim::{run_trial, HashrateSchedule, TrialConfig}; +//! +//! let clock = Arc::new(MockClock::new(0)); +//! let vardiff = VardiffState::new_with_clock(1.0, clock.clone()).unwrap(); +//! let schedule = HashrateSchedule::stable(1.0e15); // 1 PH/s constant +//! let config = TrialConfig::default(); +//! let trial = run_trial(vardiff, clock, config, &schedule, /* seed */ 0xDEADBEEF); +//! println!("Algorithm fired {} times", trial.fire_count()); +//! ``` + +pub mod baseline; +pub mod composed; +pub mod grid; +pub mod metrics; +pub mod naming; +pub mod regression; +pub mod rng; +pub mod schedule; +pub mod trial; + +pub use baseline::{phases_to_trial, Cell, CellResult, Phase, Scenario, RAMP_SEGMENTS}; + +pub use grid::{ + run_cell_with_algorithm, AlgorithmSpec, AsObservable, Grid, ObservableVardiff, VardiffBox, + VardiffFactory, +}; + +pub use composed::{ + classic_composed, AcceleratingPartialRetarget, AdaptivePoissonCusum, + AsymmetricCusumBoundary, Boundary, CkpoolEstimator, ClassicComposed, Composed, + CumulativeCounter, Estimator, EstimatorContext, EstimatorSnapshot, EwmaEstimator, + FullRetargetNoClamp, FullRetargetWithClamp, GuardedAccelRetarget, HysteresisGate, + PartialRetarget, PoissonCI, SignPersistenceCusumBoundary, SlidingWindowEstimator, + SpmRatioEstimator, StepFunction, TimeBiasEwmaEstimator, UpdateRule, +}; + +pub use metrics::{ + bootstrap_percentile_ci, convergence_time_distribution, convergence_time_for_trial, + derived_registry, jitter_distribution, jitter_for_trial, reaction_sensitivity, + reaction_time_distribution, reaction_time_for_trial, registry, registry_by_id, + settled_accuracy_distribution, settled_accuracy_for_trial, BaselineValue, Bias, + ComprehensiveFitness, ConvergenceTime, CounterAgeSensitivity, DecouplingScore, DerivedMetric, + Direction, Distribution, EqualWeightFitness, Jitter, LogErrorRegret, Metric, MetricCategory, + MetricClass, + MetricValues, OperationalFitness, RampTargetOvershoot, ReactionAsymmetry, ReactionTime, + ScenarioFilter, + SettledAccuracy, SettledReactionTime, SummaryFmt, SummarySpec, Tolerance, ToleranceCheck, + Variance, CI_SEED, DEFAULT_CI_RESAMPLES, DEFAULT_JITTER_CEILING_PER_MIN, +}; +pub use rng::{sample_exponential, sample_poisson, XorShift64}; +pub use schedule::HashrateSchedule; +pub use trial::{ + run_trial, run_trial_observed, DecisionRecord, Observable, TickRecord, Trial, TrialConfig, +}; diff --git a/sv2/channels-sv2/sim/src/metrics.rs b/sv2/channels-sv2/sim/src/metrics.rs new file mode 100644 index 0000000000..4d1b9d8cb5 --- /dev/null +++ b/sv2/channels-sv2/sim/src/metrics.rs @@ -0,0 +1,4575 @@ +//! Metric computation over collections of [`Trial`] results. +//! +//! ## Registry-driven metrics +//! +//! Every metric is a `Box` in the [`registry`]. Each metric +//! impl owns four things about itself: +//! +//! 1. **Computation**: [`Metric::compute`] takes the trials for one cell +//! and returns a [`MetricValues`] — a flat list of named `Option` +//! values that this metric emits. +//! 2. **Tolerance policy**: [`Metric::tolerance_checks`] declares which +//! keys are compared against baseline and by what rule. The regression +//! comparator iterates the registry and applies each declared check +//! uniformly; there is no hardcoded per-metric logic in +//! `regression.rs`. +//! 3. **Cell applicability**: [`Metric::applies_to`] gates whether the +//! metric runs on a given cell. Reaction metrics return `true` only +//! for `Step` scenarios; the other metrics apply to every cell. +//! 4. **Classification**: [`Metric::category`] and [`Metric::class`] +//! surface what kind of metric this is and whether failures are +//! must-have / should-have / report-only. Used by the comparator and +//! the markdown renderer. +//! +//! Adding a new metric (bias, overshoot, decoupling score, etc.) is one +//! new `impl Metric` with no edits to baseline.rs's serializer or +//! regression.rs's comparator — they read everything they need through +//! the trait. +//! +//! ## Free-function entry points +//! +//! Per-trial and per-distribution metric implementations are also +//! exposed as free functions (`convergence_time_for_trial`, +//! `convergence_time_distribution`, etc.) for callers that want +//! direct access without going through the `Metric` trait. The +//! trait impls dispatch to these. + +use crate::baseline::{Cell, Scenario}; +use crate::trial::Trial; +use std::collections::HashMap; +use std::fmt::Debug; + +// ============================================================================ +// Distribution +// ============================================================================ + +/// Default number of bootstrap resamples used to compute CIs for +/// percentiles emitted by metric implementations. 1000 is enough for +/// stable 95% CIs at our typical N=1000 trial counts. +pub const DEFAULT_CI_RESAMPLES: usize = 1000; + +/// Deterministic seed for the bootstrap RNG used inside metric CI +/// computation. Fixed so every regenerate produces byte-identical +/// CI bounds. +pub const CI_SEED: u64 = 0xC1_C1_C1_C1_C1_C1_C1_C1; + +/// A sorted collection of numeric trial-derived values, plus accessors +/// for summary statistics. +#[derive(Clone)] +pub struct Distribution { + /// Sorted ascending. NaN values are filtered out at construction. + sorted: Vec, +} + +impl Distribution { + /// Constructs a distribution from a vector of values. NaN values + /// are silently dropped. + pub fn new(values: Vec) -> Self { + let mut sorted: Vec = values.into_iter().filter(|x| !x.is_nan()).collect(); + sorted.sort_by(|a, b| a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Equal)); + Self { sorted } + } + + /// Returns the value at the given percentile rank `p ∈ [0, 100]` + /// using nearest-rank interpolation. `None` if empty. + pub fn percentile(&self, p: f64) -> Option { + if self.sorted.is_empty() { + return None; + } + let n = self.sorted.len(); + let idx = ((p / 100.0) * (n as f64 - 1.0)).round() as usize; + Some(self.sorted[idx.min(n - 1)]) + } + + /// Returns the arithmetic mean. `None` if empty. + pub fn mean(&self) -> Option { + if self.sorted.is_empty() { + return None; + } + Some(self.sorted.iter().sum::() / self.sorted.len() as f64) + } + + /// Number of values. + pub fn count(&self) -> usize { + self.sorted.len() + } + + pub fn p10(&self) -> Option { + self.percentile(10.0) + } + pub fn p25(&self) -> Option { + self.percentile(25.0) + } + pub fn p50(&self) -> Option { + self.percentile(50.0) + } + pub fn p75(&self) -> Option { + self.percentile(75.0) + } + pub fn p90(&self) -> Option { + self.percentile(90.0) + } + pub fn p95(&self) -> Option { + self.percentile(95.0) + } + pub fn p99(&self) -> Option { + self.percentile(99.0) + } + + /// Returns the percentile point estimate plus its bootstrap 95% CI + /// bounds: `(point, ci_low, ci_high)`. Each component is + /// independently `Option` — empty distribution yields `(None, None, + /// None)`; very small distributions yield a point estimate without + /// CI bounds. + /// + /// Uses [`bootstrap_percentile_ci`] internally with `n_resamples` + /// and the deterministic [`CI_SEED`]. + pub fn percentile_ci( + &self, + p: f64, + n_resamples: usize, + ) -> (Option, Option, Option) { + let point = self.percentile(p); + if self.sorted.len() < 2 { + return (point, None, None); + } + let mut rng = crate::rng::XorShift64::new(CI_SEED); + let (lo, hi) = bootstrap_percentile_ci(&self.sorted, p, n_resamples, &mut rng); + (point, lo, hi) + } + + /// Convenience: compute the percentile and its bootstrap CI, then + /// record both in `mv` under the given `key`. Equivalent to + /// `mv.set_with_ci(key, point, ci_low, ci_high)`. Used by every + /// percentile-emitting metric impl. + pub fn record_percentile(&self, mv: &mut MetricValues, key: &'static str, p: f64) { + let (point, lo, hi) = self.percentile_ci(p, DEFAULT_CI_RESAMPLES); + mv.set_with_ci(key, point, lo, hi); + } +} + +/// Normal-approximation 95% confidence interval on a binomial +/// proportion `p` with sample size `n`. Returns `(low, high)`, both +/// clamped to `[0, 1]`. For `n < 10` returns `(None, None)` — the +/// normal approximation isn't reliable. +/// +/// Used by [`ConvergenceTime`] and [`ReactionTime`] to emit CI bounds +/// alongside the rate point estimates. +pub fn proportion_ci(p: f64, n: usize) -> (Option, Option) { + if n < 10 { + return (None, None); + } + let z = 1.96_f64; + let half = z * (p * (1.0 - p) / n as f64).sqrt(); + let low = (p - half).max(0.0); + let high = (p + half).min(1.0); + (Some(low), Some(high)) +} + +impl std::fmt::Debug for Distribution { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "Distribution(n={}", self.count())?; + if let Some(p) = self.p50() { + write!(f, " p50={p:.3}")?; + } + if let Some(p) = self.p90() { + write!(f, " p90={p:.3}")?; + } + if let Some(p) = self.p99() { + write!(f, " p99={p:.3}")?; + } + if let Some(m) = self.mean() { + write!(f, " mean={m:.3}")?; + } + write!(f, ")") + } +} + +// ============================================================================ +// The Metric trait and supporting types +// ============================================================================ + +/// Which conceptual category a metric belongs to. Used by the +/// Markdown renderer to group sections and by the regression +/// comparator to classify failures. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum MetricCategory { + /// Directly observable behavioral property (convergence, + /// reactivity, accuracy, jitter). + Behavioral, + /// Statistical estimator property derived from many trials (bias, + /// variance, MSE). + Estimator, + /// Static or per-impl property (cost, state size, complexity). + Structural, + /// Behavior under stress conditions (stall, overshoot, transient + /// recovery). + Robustness, +} + +/// Whether a regression on this metric should fail CI, warn, or just be +/// reported. Made explicit so the implicit policy in the previous +/// hardcoded comparator becomes inspectable. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum MetricClass { + /// Failures fail CI. + MustHave, + /// Failures emit a warning but don't fail CI. + ShouldHave, + /// Always reported, never asserted. + ReportOnly, +} + +/// Flat key → value bag emitted by a metric for a single cell. Keys are +/// `&'static str` because every metric knows its key set at compile +/// time. The order matches insertion order so the TOML serializer can +/// produce deterministic output. +/// +/// Each entry optionally carries a `(ci_low, ci_high)` pair so a +/// percentile estimate can sit alongside its bootstrap CI bounds. +/// The serializer emits these as separate `_ci_low` / +/// `_ci_high` lines mechanically; metrics record them via +/// [`MetricValues::set_with_ci`]. +/// +/// Each value is a [`MetricEntry`]: a `(key, point, ci)` triple +/// where `point` is the point estimate and `ci` is the optional +/// 95% bootstrap CI. +pub type MetricEntry = (&'static str, Option, Option<(f64, f64)>); + +#[derive(Debug, Clone, Default)] +pub struct MetricValues { + /// `(key, value, ci)` triples in insertion order. The CI is + /// optional per entry — only percentile metrics emit it. + pub values: Vec, +} + +impl MetricValues { + pub fn new() -> Self { + Self::default() + } + + /// Records a value with no CI bound. Use `None` for "not + /// computable in this cell" (e.g., a percentile of an empty + /// distribution). + pub fn set(&mut self, key: &'static str, value: Option) { + self.values.push((key, value, None)); + } + + /// Records a percentile point estimate plus its bootstrap CI + /// bounds. The serializer emits the CI as additional `_ci_low` / + /// `_ci_high` lines. If either bound is `None`, the corresponding + /// line is omitted. + pub fn set_with_ci( + &mut self, + key: &'static str, + value: Option, + ci_low: Option, + ci_high: Option, + ) { + let ci = match (ci_low, ci_high) { + (Some(lo), Some(hi)) => Some((lo, hi)), + _ => None, + }; + self.values.push((key, value, ci)); + } + + /// Looks up a value by key. Returns `None` if the key is absent or + /// its stored value is `None`. + pub fn get(&self, key: &str) -> Option { + self.values + .iter() + .find(|(k, _, _)| *k == key) + .and_then(|(_, v, _)| *v) + } + + /// Looks up the CI bounds for a key. Returns `None` if absent or + /// no CI was recorded. + pub fn get_ci(&self, key: &str) -> Option<(f64, f64)> { + self.values + .iter() + .find(|(k, _, _)| *k == key) + .and_then(|(_, _, ci)| *ci) + } + + /// Iterates over `(key, value, ci)` triples in insertion order. + pub fn iter(&self) -> impl Iterator + '_ { + self.values.iter().copied() + } +} + +/// Direction of improvement for a metric. The regression comparator +/// uses this to decide which side of the baseline distribution is +/// "regressing." +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Direction { + /// Smaller values are better (jitter, settled-accuracy error, + /// overshoot, latency percentiles). + LowerIsBetter, + /// Larger values are better (convergence_rate, reaction_rate, + /// decoupling score). + HigherIsBetter, + /// Either direction away from baseline is a regression. Used for + /// signed quantities like `reaction_asymmetry` where moving toward + /// or away from zero both signal a behavioral shift. + Either, +} + +/// One side of the baseline's value with an optional bootstrap CI +/// bound. The comparator constructs this from three lookups in the +/// baseline TOML: the point estimate at `` plus the CI bounds at +/// `_ci_low` and `_ci_high`. +/// +/// When CIs are absent (older baseline, or distribution too small to +/// bootstrap), the comparator falls back to point-estimate-based +/// tolerance. +#[derive(Debug, Clone, Copy)] +pub struct BaselineValue { + pub point: f64, + pub ci_low: Option, + pub ci_high: Option, +} + +/// A regression tolerance policy. The comparator applies the policy +/// between a [`BaselineValue`] (point + CI bounds) and a current +/// scalar; a `Some(description)` return marks a failure. +/// +/// Semantics: the metric defines a *regressing direction* via the +/// embedded [`Direction`]. The check fails iff the current value is +/// outside the baseline's CI envelope *plus* an extra slack budget, +/// in the regressing direction. The extra slack is either an absolute +/// floor (`extra_abs`) or a multiplicative band on top of the CI +/// bound — whichever is larger. +/// +/// When the baseline has no CI bounds (older format), the check +/// degrades gracefully: the CI envelope collapses to a point, so +/// "outside the envelope" becomes "more than `extra_abs` (or +/// `extra_mul × point`) away from the point estimate in the +/// regressing direction." +#[derive(Debug, Clone, Copy)] +pub enum Tolerance { + /// Statistical-noise-aware bound. + WithinCi { + direction: Direction, + /// Additional absolute slack beyond the CI bound before + /// flagging. Always applied. For metrics like jitter where + /// the baseline can be exactly zero, `extra_abs` is the only + /// thing the check effectively does. + extra_abs: f64, + /// Optional additional multiplicative slack (`extra_mul × + /// baseline_point`). Useful for naturally multiplicative + /// metrics (latency percentiles, overshoot magnitudes) where + /// "20% above baseline" makes sense regardless of the + /// absolute scale. If `Some(0.10)`, allow up to 10% beyond + /// the CI bound. `None` → only `extra_abs` applies. + extra_mul: Option, + }, + /// No assertion. Diff is emitted in the report but never fails CI. + ReportOnly, +} + +impl Tolerance { + /// Returns `None` if the tolerance is satisfied, `Some(description)` + /// otherwise. + pub fn apply(&self, baseline: BaselineValue, current: f64) -> Option { + match self { + Tolerance::ReportOnly => None, + Tolerance::WithinCi { + direction, + extra_abs, + extra_mul, + } => { + // The CI envelope. If absent, collapse to a point. + let lo = baseline.ci_low.unwrap_or(baseline.point); + let hi = baseline.ci_high.unwrap_or(baseline.point); + + // Slack added on top of the CI bound. We compute the + // larger of the absolute and multiplicative slack + // against the relevant endpoint. + let abs_at_hi = extra_mul + .map(|m| (hi.abs()) * m) + .unwrap_or(0.0) + .max(*extra_abs); + let abs_at_lo = extra_mul + .map(|m| (lo.abs()) * m) + .unwrap_or(0.0) + .max(*extra_abs); + + let upper_bound = hi + abs_at_hi; + let lower_bound = lo - abs_at_lo; + + let outside_high = current > upper_bound; + let outside_low = current < lower_bound; + + let regressed = match direction { + Direction::LowerIsBetter => outside_high, + Direction::HigherIsBetter => outside_low, + Direction::Either => outside_high || outside_low, + }; + + if regressed { + Some(format!( + "{:?}: current = {:.4} outside [{:.4}, {:.4}] \ + (CI [{:.4}, {:.4}] + slack ±max(abs={}, mul={:?}))", + direction, current, lower_bound, upper_bound, lo, hi, extra_abs, extra_mul, + )) + } else { + None + } + } + } + } +} + +/// A single (key, tolerance) check declared by a metric for a cell. +#[derive(Debug, Clone, Copy)] +pub struct ToleranceCheck { + /// The MetricValues key to look up in both baseline and current. + pub key: &'static str, + pub tolerance: Tolerance, +} + +/// The framework's central metric trait. Each metric is a +/// self-contained module owning its computation, classification, +/// applicability, and tolerance policy. The regression comparator and +/// baseline serializer iterate `registry()` and ask each metric for +/// what they need; there is no per-metric switch anywhere else in the +/// crate. +pub trait Metric: Send + Sync + Debug { + /// Short identifier — used as the key into [`crate::baseline::CellResult::metrics`]. + fn id(&self) -> &'static str; + + /// Conceptual category. + fn category(&self) -> MetricCategory; + + /// Regression-policy class. + fn class(&self) -> MetricClass; + + /// Whether this metric should be computed for the given cell. + /// Default: yes. Reaction-related metrics override to gate on + /// `Step` scenarios. + fn applies_to(&self, _cell: &Cell) -> bool { + true + } + + /// Compute the aggregate values for this cell. + fn compute(&self, trials: &[Trial], cell: &Cell) -> MetricValues; + + /// Declarative tolerance policy. Returns the checks to apply + /// between baseline and current values for this cell. + fn tolerance_checks(&self, _cell: &Cell) -> Vec { + vec![] + } + + /// Optional Poisson-noise-floor reference for a specific key. + /// Returns `None` by default; metrics with a closed-form lower + /// bound (SettledAccuracy, RampTargetOvershoot, Jitter) override. + fn fundamental_limit(&self, _cell: &Cell, _key: &str) -> Option { + None + } + + /// Declarative summary specs for the top-of-MD TL;DR section. + /// Default returns empty — metrics that want to surface a + /// headline (key, direction, scenario filter) override. + fn summary_specs(&self) -> Vec { + Vec::new() + } + + /// Renders this metric's contribution to the Markdown report. May + /// emit zero, one, or multiple `## section` blocks. Default impl + /// is a no-op so metrics that haven't migrated yet (or that have + /// no sensible Markdown rendering) don't appear in the report. + /// + /// The order of section emission across the report is the order + /// of [`registry`]. Within a section a metric chooses how to + /// arrange its data (typically rows = cells, columns = + /// percentiles, but reaction-time also emits a 2D + /// rates × deltas sensitivity table). + fn render_markdown(&self, _results: &[crate::baseline::CellResult], _w: &mut String) {} +} + +/// One headline row in the TL;DR summary table at the top of each +/// algorithm's Markdown report. A metric declares one or more of +/// these via [`Metric::summary_specs`]; the renderer iterates the +/// matching cells and finds the best / worst value across share +/// rates. +#[derive(Debug, Clone, Copy)] +pub struct SummarySpec { + /// Human-readable label shown in the summary table. + pub label: &'static str, + /// The MetricValues key to look up. + pub key: &'static str, + /// Whether smaller / larger values are better. + pub direction: Direction, + /// Which cells to consider when finding best/worst. + pub scenario_filter: ScenarioFilter, + /// How to render the value in the summary table. + pub fmt: SummaryFmt, +} + +/// Cell-scenario filter for a [`SummarySpec`]. The summary renderer +/// only considers cells whose scenario matches. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ScenarioFilter { + /// Any cell with the key — e.g. for derived/cross-cell metrics. + Any, + Stable, + ColdStart, + StepDelta(i32), + SettledStepDelta { settle_minutes: u64, delta_pct: i32 }, +} + +/// Value-formatting choice for a [`SummarySpec`]. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum SummaryFmt { + /// `12.3%` (multiplied by 100). + Percentage, + /// `12m` or `12m 34s`. + Duration, + /// `0.034` with 3 significant figures. + Float3, + /// `0.04` fires/min — same as Float3 plus `/min` suffix. + RatePerMin, +} + +/// The canonical metric registry. Used by `baseline::run_cell` to +/// drive computation and by `baseline::serialize_*` / `regression::compare_to_baseline` +/// to drive iteration. +/// +/// The constants here MUST match `crate::baseline::{QUIET_WINDOW_SECS, +/// SETTLE_BUFFER_SECS, MIN_SETTLED_WINDOW_SECS, STEP_EVENT_AT_SECS, +/// REACT_WINDOW_SECS}` — they're duplicated here to avoid a +/// metrics → baseline import cycle at construction time. If those +/// constants change, update this function. +pub fn registry() -> Vec> { + use crate::baseline::{ + MIN_SETTLED_WINDOW_SECS, QUIET_WINDOW_SECS, REACT_WINDOW_SECS, SETTLE_BUFFER_SECS, + STEP_EVENT_AT_SECS, + }; + // Settle-after for the introspection-driven metrics (bias / + // variance / overshoot): pick something well past Phase 1 ramp + // (~5 min for 5-OOM cold start) and the post-fire settle buffer. + // 12 min = 720s leaves the last 18 min of a 30-min trial for the + // estimator to stabilize before we evaluate its bias/variance. + const INTROSPECTION_SETTLE_AFTER_SECS: u64 = 12 * 60; + + vec![ + Box::new(ConvergenceTime { + quiet_window_secs: QUIET_WINDOW_SECS, + }), + Box::new(SettledAccuracy), + Box::new(Jitter { + quiet_window_secs: QUIET_WINDOW_SECS, + settle_buffer_secs: SETTLE_BUFFER_SECS, + min_settled_window_secs: MIN_SETTLED_WINDOW_SECS, + }), + Box::new(ReactionTime { + event_at_secs: STEP_EVENT_AT_SECS, + react_window_secs: REACT_WINDOW_SECS, + }), + Box::new(SettledReactionTime), + Box::new(Bias { + settle_after_secs: INTROSPECTION_SETTLE_AFTER_SECS, + }), + Box::new(Variance { + settle_after_secs: INTROSPECTION_SETTLE_AFTER_SECS, + }), + Box::new(RampTargetOvershoot), + Box::new(UpwardStepMagnitude), + Box::new(LogErrorRegret), + Box::new(FireDecisiveness { + settle_after_secs: 0, + }), + Box::new(StepCorrection { + event_at_secs: STEP_EVENT_AT_SECS, + react_window_secs: REACT_WINDOW_SECS, + }), + ] +} + +/// Convenience for the comparator and serializer: build a +/// `HashMap` from the registry so a lookup by +/// id is O(1). +pub fn registry_by_id() -> HashMap<&'static str, Box> { + registry().into_iter().map(|m| (m.id(), m)).collect() +} + +// ============================================================================ +// Convergence time — per-trial + distribution helpers +// ============================================================================ + +/// Per-trial convergence time. See module docs for the precise +/// definition. +pub fn convergence_time_for_trial(trial: &Trial, quiet_window_secs: u64) -> Option { + let fires = trial.fires(); + if fires.is_empty() { + return Some(0); + } + for (i, fire) in fires.iter().enumerate() { + let quiet_end = fire.t_secs.saturating_add(quiet_window_secs); + if quiet_end > trial.config.duration_secs { + break; + } + let has_subsequent_in_window = fires[i + 1..].iter().any(|f2| f2.t_secs <= quiet_end); + if !has_subsequent_in_window { + return Some(fire.t_secs); + } + } + None +} + +/// Convergence-time distribution across a set of trials. Returns +/// `(rate, distribution)`. +pub fn convergence_time_distribution( + trials: &[Trial], + quiet_window_secs: u64, +) -> (f64, Distribution) { + if trials.is_empty() { + return (0.0, Distribution::new(vec![])); + } + let mut times: Vec = Vec::with_capacity(trials.len()); + let mut converged = 0usize; + for trial in trials { + if let Some(t) = convergence_time_for_trial(trial, quiet_window_secs) { + converged += 1; + times.push(t as f64); + } + } + let rate = converged as f64 / trials.len() as f64; + (rate, Distribution::new(times)) +} + +// ============================================================================ +// Settled accuracy — per-trial + distribution helpers +// ============================================================================ + +pub fn settled_accuracy_for_trial(trial: &Trial) -> Option { + let true_h = trial.true_hashrate_at_end as f64; + if true_h <= 0.0 { + return None; + } + let final_h = trial.final_hashrate as f64; + Some((final_h / true_h - 1.0).abs()) +} + +pub fn settled_accuracy_distribution(trials: &[Trial]) -> Distribution { + let values: Vec = trials + .iter() + .filter_map(settled_accuracy_for_trial) + .collect(); + Distribution::new(values) +} + +// ============================================================================ +// Steady-state jitter — per-trial + distribution helpers +// ============================================================================ + +pub fn jitter_for_trial( + trial: &Trial, + quiet_window_secs: u64, + settle_buffer_secs: u64, + min_settled_window_secs: u64, +) -> Option { + let convergence_time = convergence_time_for_trial(trial, quiet_window_secs)?; + let start = convergence_time.saturating_add(settle_buffer_secs); + let end = trial.config.duration_secs; + if end < start.saturating_add(min_settled_window_secs) { + return None; + } + let settled_fires = trial + .ticks + .iter() + .filter(|t| t.fired && t.t_secs >= start && t.t_secs <= end) + .count(); + let window_minutes = (end - start) as f64 / 60.0; + if window_minutes <= 0.0 { + return None; + } + Some(settled_fires as f64 / window_minutes) +} + +pub fn jitter_distribution( + trials: &[Trial], + quiet_window_secs: u64, + settle_buffer_secs: u64, + min_settled_window_secs: u64, +) -> Distribution { + let values: Vec = trials + .iter() + .filter_map(|t| { + jitter_for_trial( + t, + quiet_window_secs, + settle_buffer_secs, + min_settled_window_secs, + ) + }) + .collect(); + Distribution::new(values) +} + +// ============================================================================ +// Reaction time + sensitivity — per-trial + distribution helpers +// ============================================================================ + +pub fn reaction_time_for_trial( + trial: &Trial, + event_at_secs: u64, + react_window_secs: u64, +) -> Option { + let window_end = event_at_secs.saturating_add(react_window_secs); + let first_post_event_fire = trial + .ticks + .iter() + .find(|t| t.fired && t.t_secs > event_at_secs && t.t_secs <= window_end); + first_post_event_fire.map(|t| t.t_secs - event_at_secs) +} + +pub fn reaction_time_distribution( + trials: &[Trial], + event_at_secs: u64, + react_window_secs: u64, +) -> (f64, Distribution) { + if trials.is_empty() { + return (0.0, Distribution::new(vec![])); + } + let mut times: Vec = Vec::with_capacity(trials.len()); + let mut reacted = 0usize; + for trial in trials { + if let Some(t) = reaction_time_for_trial(trial, event_at_secs, react_window_secs) { + reacted += 1; + times.push(t as f64); + } + } + let rate = reacted as f64 / trials.len() as f64; + (rate, Distribution::new(times)) +} + +pub fn reaction_sensitivity(trials: &[Trial], event_at_secs: u64, react_window_secs: u64) -> f64 { + reaction_time_distribution(trials, event_at_secs, react_window_secs).0 +} + +// ============================================================================ +// Metric implementations +// ============================================================================ + +/// Time from trial start to first quiet window. Emits convergence_rate +/// plus p10/p50/p90/p95/p99 of the converged-trial time distribution. +#[derive(Debug, Clone)] +pub struct ConvergenceTime { + pub quiet_window_secs: u64, +} + +impl Metric for ConvergenceTime { + fn id(&self) -> &'static str { + "convergence_time" + } + fn category(&self) -> MetricCategory { + MetricCategory::Behavioral + } + fn class(&self) -> MetricClass { + MetricClass::MustHave + } + fn compute(&self, trials: &[Trial], _cell: &Cell) -> MetricValues { + let (rate, dist) = convergence_time_distribution(trials, self.quiet_window_secs); + let mut v = MetricValues::new(); + let (rate_lo, rate_hi) = proportion_ci(rate, trials.len()); + v.set_with_ci("convergence_rate", Some(rate), rate_lo, rate_hi); + dist.record_percentile(&mut v, "convergence_p10_secs", 10.0); + dist.record_percentile(&mut v, "convergence_p50_secs", 50.0); + dist.record_percentile(&mut v, "convergence_p90_secs", 90.0); + dist.record_percentile(&mut v, "convergence_p95_secs", 95.0); + dist.record_percentile(&mut v, "convergence_p99_secs", 99.0); + v.set("convergence_mean_secs", dist.mean()); + v + } + fn tolerance_checks(&self, _cell: &Cell) -> Vec { + vec![ + ToleranceCheck { + key: "convergence_rate", + tolerance: Tolerance::WithinCi { + direction: Direction::HigherIsBetter, + extra_abs: 0.02, // 2 percentage points beyond CI + extra_mul: None, + }, + }, + ToleranceCheck { + key: "convergence_p90_secs", + tolerance: Tolerance::WithinCi { + direction: Direction::LowerIsBetter, + extra_abs: 60.0, // 1 minute + extra_mul: Some(0.10), // 10% beyond CI + }, + }, + ] + } + fn summary_specs(&self) -> Vec { + vec![ + SummarySpec { + label: "cold-start convergence rate", + key: "convergence_rate", + direction: Direction::HigherIsBetter, + scenario_filter: ScenarioFilter::ColdStart, + fmt: SummaryFmt::Percentage, + }, + SummarySpec { + label: "cold-start p90 time", + key: "convergence_p90_secs", + direction: Direction::LowerIsBetter, + scenario_filter: ScenarioFilter::ColdStart, + fmt: SummaryFmt::Duration, + }, + ] + } + fn render_markdown(&self, results: &[crate::baseline::CellResult], w: &mut String) { + use crate::baseline::{find_cell, fmt_duration, unique_rates}; + w.push_str("## Convergence time (cold start: 10 GH/s → 1 PH/s)\n\n"); + w.push_str("| share/min | rate | p10 | p50 | p90 | p99 | mean |\n"); + w.push_str("| --- | --- | --- | --- | --- | --- | --- |\n"); + for spm in unique_rates(results) { + if let Some(r) = find_cell(results, spm, "cold_start_10gh_to_1ph") { + w.push_str(&format!( + "| {} | {:.1}% | {} | {} | {} | {} | {} |\n", + spm, + r.get("convergence_rate").unwrap_or(0.0) * 100.0, + fmt_duration(r.get("convergence_p10_secs")), + fmt_duration(r.get("convergence_p50_secs")), + fmt_duration(r.get("convergence_p90_secs")), + fmt_duration(r.get("convergence_p99_secs")), + fmt_duration(r.get("convergence_mean_secs")), + )); + } + } + w.push('\n'); + } +} + +/// `|final_hashrate / true_hashrate − 1|` at trial end. Emits p10–p99. +#[derive(Debug, Clone)] +pub struct SettledAccuracy; + +impl SettledAccuracy { + /// Poisson noise floor on `|realized_rate − true_rate| / true_rate` + /// integrated over a `window_secs`-wide post-settle window at the + /// given share rate. The relative stddev is `1/√λ̄` with `λ̄ = spm + /// × window / 60`. Percentile floors map through the standard + /// half-normal absolute-deviation distribution: + /// `|X| ~ |Normal(0, σ²)|` has + /// `p50 = 0.674σ`, `p90 = 1.645σ`, `p99 = 2.576σ`. + /// + /// This is a *lower* bound — the actual algorithm's settled + /// accuracy can be higher (worse) if the algorithm's estimator + /// has additional bias, or lower (better) if it integrates across + /// multiple windows (EWMA, sliding average). Use as + /// order-of-magnitude reference, not exact prediction. + pub fn poisson_floor(spm: f32, window_secs: u64, percentile: f64) -> Option { + let lambda_bar = (spm as f64) * (window_secs as f64) / 60.0; + if lambda_bar <= 0.0 { + return None; + } + let sigma = 1.0 / lambda_bar.sqrt(); + // Half-normal percentile quantiles (Φ⁻¹((1+p)/2) for p ∈ [0, 1]): + // p10 = 0.126σ, p50 = 0.674σ, p90 = 1.645σ, p95 = 1.960σ, p99 = 2.576σ. + let z = match percentile as u32 { + 10 => 0.126, + 50 => 0.674, + 90 => 1.645, + 95 => 1.960, + 99 => 2.576, + _ => return None, + }; + Some(z * sigma) + } +} + +impl Metric for SettledAccuracy { + fn id(&self) -> &'static str { + "settled_accuracy" + } + fn category(&self) -> MetricCategory { + MetricCategory::Behavioral + } + fn fundamental_limit(&self, cell: &Cell, key: &str) -> Option { + if cell.scenario != Scenario::Stable { + // Floors are meaningful for stable-load measurement only. + return None; + } + let percentile = match key { + "settled_accuracy_p10" => 10.0, + "settled_accuracy_p50" => 50.0, + "settled_accuracy_p90" => 90.0, + "settled_accuracy_p95" => 95.0, + "settled_accuracy_p99" => 99.0, + _ => return None, + }; + Self::poisson_floor( + cell.shares_per_minute, + crate::baseline::MIN_SETTLED_WINDOW_SECS, + percentile, + ) + } + fn class(&self) -> MetricClass { + MetricClass::MustHave + } + fn compute(&self, trials: &[Trial], _cell: &Cell) -> MetricValues { + let dist = settled_accuracy_distribution(trials); + let mut v = MetricValues::new(); + dist.record_percentile(&mut v, "settled_accuracy_p10", 10.0); + dist.record_percentile(&mut v, "settled_accuracy_p50", 50.0); + dist.record_percentile(&mut v, "settled_accuracy_p90", 90.0); + dist.record_percentile(&mut v, "settled_accuracy_p95", 95.0); + dist.record_percentile(&mut v, "settled_accuracy_p99", 99.0); + v.set("settled_accuracy_mean", dist.mean()); + v + } + fn tolerance_checks(&self, _cell: &Cell) -> Vec { + vec![ + ToleranceCheck { + key: "settled_accuracy_p50", + tolerance: Tolerance::WithinCi { + direction: Direction::LowerIsBetter, + extra_abs: 0.05, + extra_mul: Some(0.15), + }, + }, + ToleranceCheck { + key: "settled_accuracy_p90", + tolerance: Tolerance::WithinCi { + direction: Direction::LowerIsBetter, + extra_abs: 0.05, + extra_mul: Some(0.15), + }, + }, + ] + } + fn summary_specs(&self) -> Vec { + vec![ + SummarySpec { + label: "settled accuracy p50 (stable)", + key: "settled_accuracy_p50", + direction: Direction::LowerIsBetter, + scenario_filter: ScenarioFilter::Stable, + fmt: SummaryFmt::Percentage, + }, + SummarySpec { + label: "settled accuracy p99 (stable)", + key: "settled_accuracy_p99", + direction: Direction::LowerIsBetter, + scenario_filter: ScenarioFilter::Stable, + fmt: SummaryFmt::Percentage, + }, + ] + } + fn render_markdown(&self, results: &[crate::baseline::CellResult], w: &mut String) { + use crate::baseline::{find_cell, fmt_pct, unique_rates}; + w.push_str("## Settled accuracy (stable load, post-convergence)\n\n"); + w.push_str("`|final_hashrate / true_hashrate - 1|` at trial end. Smaller is better.\n\n"); + w.push_str("| share/min | p10 | p50 | p90 | p99 | mean |\n"); + w.push_str("| --- | --- | --- | --- | --- | --- |\n"); + for spm in unique_rates(results) { + if let Some(r) = find_cell(results, spm, "stable_1ph") { + w.push_str(&format!( + "| {} | {} | {} | {} | {} | {} |\n", + spm, + fmt_pct(r.get("settled_accuracy_p10")), + fmt_pct(r.get("settled_accuracy_p50")), + fmt_pct(r.get("settled_accuracy_p90")), + fmt_pct(r.get("settled_accuracy_p99")), + fmt_pct(r.get("settled_accuracy_mean")), + )); + } + } + w.push('\n'); + } +} + +/// Post-convergence fires per minute. Emits p50/p90/p95/p99 and mean. +#[derive(Debug, Clone)] +pub struct Jitter { + pub quiet_window_secs: u64, + pub settle_buffer_secs: u64, + pub min_settled_window_secs: u64, +} + +impl Metric for Jitter { + fn id(&self) -> &'static str { + "jitter" + } + fn category(&self) -> MetricCategory { + MetricCategory::Behavioral + } + fn class(&self) -> MetricClass { + MetricClass::MustHave + } + fn fundamental_limit(&self, cell: &Cell, _key: &str) -> Option { + // A rate-aware boundary (PoissonCI with z = 2.576, 99% CI) has + // a ~1% per-tick false-fire rate under H₀ on each tail, so + // ~2% two-sided. At 1 tick / min that's ~0.02 fires/min as the + // "well-calibrated boundary" floor. Independent of share rate + // for PoissonCI-style boundaries; share-rate-blind boundaries + // (Classic) violate this floor at low SPM. + if cell.scenario == Scenario::Stable { + Some(0.02) + } else { + None + } + } + fn compute(&self, trials: &[Trial], _cell: &Cell) -> MetricValues { + let dist = jitter_distribution( + trials, + self.quiet_window_secs, + self.settle_buffer_secs, + self.min_settled_window_secs, + ); + let mut v = MetricValues::new(); + dist.record_percentile(&mut v, "jitter_p10_per_min", 10.0); + dist.record_percentile(&mut v, "jitter_p50_per_min", 50.0); + dist.record_percentile(&mut v, "jitter_p90_per_min", 90.0); + dist.record_percentile(&mut v, "jitter_p95_per_min", 95.0); + dist.record_percentile(&mut v, "jitter_p99_per_min", 99.0); + v.set("jitter_mean_per_min", dist.mean()); + v + } + fn tolerance_checks(&self, _cell: &Cell) -> Vec { + vec![ + ToleranceCheck { + key: "jitter_p50_per_min", + tolerance: Tolerance::WithinCi { + direction: Direction::LowerIsBetter, + extra_abs: 0.02, + extra_mul: None, + }, + }, + ToleranceCheck { + key: "jitter_p95_per_min", + tolerance: Tolerance::WithinCi { + direction: Direction::LowerIsBetter, + extra_abs: 0.05, + extra_mul: Some(0.25), + }, + }, + ] + } + fn summary_specs(&self) -> Vec { + vec![SummarySpec { + label: "stable-load jitter (mean)", + key: "jitter_mean_per_min", + direction: Direction::LowerIsBetter, + scenario_filter: ScenarioFilter::Stable, + fmt: SummaryFmt::RatePerMin, + }] + } + fn render_markdown(&self, results: &[crate::baseline::CellResult], w: &mut String) { + use crate::baseline::{find_cell, fmt_f, unique_rates}; + w.push_str("## Steady-state jitter (fires per minute)\n\n"); + w.push_str( + "Post-convergence rate of vardiff fires. Smaller is better — \ + ideal is zero under stable load.\n\n", + ); + w.push_str("| share/min | p10 | p50 | p90 | p99 | mean |\n"); + w.push_str("| --- | --- | --- | --- | --- | --- |\n"); + for spm in unique_rates(results) { + if let Some(r) = find_cell(results, spm, "stable_1ph") { + w.push_str(&format!( + "| {} | {} | {} | {} | {} | {} |\n", + spm, + fmt_f(r.get("jitter_p10_per_min")), + fmt_f(r.get("jitter_p50_per_min")), + fmt_f(r.get("jitter_p90_per_min")), + fmt_f(r.get("jitter_p99_per_min")), + fmt_f(r.get("jitter_mean_per_min")), + )); + } + } + w.push('\n'); + } +} + +/// First fire after a scheduled step change. Emits the reaction rate +/// (a.k.a. sensitivity) plus the p10/p50/p90/p99 of reaction time +/// across reacting trials. +/// +/// Applies only to `Step` scenarios. The tolerance for `reaction_rate` +/// is split by |Δ| magnitude: +/// +/// - `|Δ| ≥ 50%`: rate must be at least `baseline − 0.02` (algorithm +/// must detect genuine large changes). +/// - `|Δ| ≤ 5%`: rate must be at most `baseline + 0.05` (algorithm +/// must not fire on noise). +/// - mid-range (10–25%): no assertion. Legitimate algorithmic +/// trade-offs live here; reviewers judge by inspecting the curve. +/// +/// `reaction_p50_secs` is always asserted at `baseline × 1.20`. +#[derive(Debug, Clone)] +pub struct ReactionTime { + pub event_at_secs: u64, + pub react_window_secs: u64, +} + +impl Metric for ReactionTime { + fn id(&self) -> &'static str { + "reaction_time" + } + fn category(&self) -> MetricCategory { + MetricCategory::Behavioral + } + fn class(&self) -> MetricClass { + MetricClass::MustHave + } + fn applies_to(&self, cell: &Cell) -> bool { + matches!(cell.scenario, Scenario::Step { .. }) + } + fn compute(&self, trials: &[Trial], _cell: &Cell) -> MetricValues { + let (rate, dist) = + reaction_time_distribution(trials, self.event_at_secs, self.react_window_secs); + let mut v = MetricValues::new(); + let (rate_lo, rate_hi) = proportion_ci(rate, trials.len()); + v.set_with_ci("reaction_rate", Some(rate), rate_lo, rate_hi); + dist.record_percentile(&mut v, "reaction_p10_secs", 10.0); + dist.record_percentile(&mut v, "reaction_p50_secs", 50.0); + dist.record_percentile(&mut v, "reaction_p90_secs", 90.0); + dist.record_percentile(&mut v, "reaction_p99_secs", 99.0); + v.set("reaction_mean_secs", dist.mean()); + v + } + fn tolerance_checks(&self, cell: &Cell) -> Vec { + let mut checks = vec![]; + + // Δ-magnitude-conditioned tolerance on reaction_rate: + // - |Δ| ≥ 50%: algorithm must detect (HigherIsBetter, fails if + // reaction rate drops outside the baseline CI). + // - |Δ| ≤ 5%: algorithm must not fire on noise (LowerIsBetter, + // fails if reaction rate climbs outside the baseline CI). + // - mid-range (10–25%): no assertion; trade-off region. + let delta_mag = match cell.scenario { + Scenario::Step { delta_pct } => Some(delta_pct.unsigned_abs()), + _ => None, + }; + match delta_mag { + Some(d) if d >= 50 => checks.push(ToleranceCheck { + key: "reaction_rate", + tolerance: Tolerance::WithinCi { + direction: Direction::HigherIsBetter, + extra_abs: 0.02, + extra_mul: None, + }, + }), + Some(d) if d <= 5 => checks.push(ToleranceCheck { + key: "reaction_rate", + tolerance: Tolerance::WithinCi { + direction: Direction::LowerIsBetter, + extra_abs: 0.05, + extra_mul: None, + }, + }), + _ => {} + } + + checks.push(ToleranceCheck { + key: "reaction_p50_secs", + tolerance: Tolerance::WithinCi { + direction: Direction::LowerIsBetter, + extra_abs: 60.0, + extra_mul: Some(0.20), + }, + }); + checks + } + fn summary_specs(&self) -> Vec { + vec![ + SummarySpec { + label: "reaction rate at −50% step", + key: "reaction_rate", + direction: Direction::HigherIsBetter, + scenario_filter: ScenarioFilter::StepDelta(-50), + fmt: SummaryFmt::Percentage, + }, + SummarySpec { + label: "reaction rate at +50% step", + key: "reaction_rate", + direction: Direction::HigherIsBetter, + scenario_filter: ScenarioFilter::StepDelta(50), + fmt: SummaryFmt::Percentage, + }, + ] + } + fn render_markdown(&self, results: &[crate::baseline::CellResult], w: &mut String) { + use crate::baseline::{find_cell, fmt_duration, unique_rates}; + let rates = unique_rates(results); + + // ---- Reaction time to a 50% drop ---- + w.push_str("## Reaction time to a 50% drop (step at 15 min)\n\n"); + w.push_str("| share/min | reacted | p10 | p50 | p90 | p99 | mean |\n"); + w.push_str("| --- | --- | --- | --- | --- | --- | --- |\n"); + for spm in &rates { + if let Some(r) = find_cell(results, *spm, "step_minus_50_at_15min") { + w.push_str(&format!( + "| {} | {:.1}% | {} | {} | {} | {} | {} |\n", + spm, + r.get("reaction_rate").unwrap_or(0.0) * 100.0, + fmt_duration(r.get("reaction_p10_secs")), + fmt_duration(r.get("reaction_p50_secs")), + fmt_duration(r.get("reaction_p90_secs")), + fmt_duration(r.get("reaction_p99_secs")), + fmt_duration(r.get("reaction_mean_secs")), + )); + } + } + w.push('\n'); + + // ---- Reaction sensitivity curve (all step deltas × rates) ---- + w.push_str("## Reaction sensitivity (P[fire within 5 min of step change])\n\n"); + w.push_str("| Δ% |"); + for spm in &rates { + w.push_str(&format!(" {} |", spm)); + } + w.push_str("\n| ---"); + for _ in &rates { + w.push_str(" | ---"); + } + w.push_str(" |\n"); + + let deltas: [i32; 8] = [-50, -25, -10, -5, 5, 10, 25, 50]; + for delta in &deltas { + let scenario_key = if *delta >= 0 { + format!("step_plus_{}_at_15min", delta.unsigned_abs()) + } else { + format!("step_minus_{}_at_15min", delta.unsigned_abs()) + }; + let sign = if *delta >= 0 { "+" } else { "" }; + w.push_str(&format!("| {}{}% |", sign, delta)); + for spm in &rates { + let cell_value = find_cell(results, *spm, &scenario_key) + .and_then(|r| r.get("reaction_rate")) + .map(|r| format!(" {:.2} |", r)) + .unwrap_or_else(|| " — |".to_string()); + w.push_str(&cell_value); + } + w.push('\n'); + } + w.push('\n'); + } +} + +/// Reaction time for [`Scenario::SettledStep`] scenarios. The event time +/// is derived from the cell's `settle_minutes` field (not hardcoded), +/// and the observation window is 60 minutes — long enough to capture +/// the slow reactions that occur at high counter ages. +/// +/// Emits: `settled_reaction_rate`, `settled_reaction_rate_5min`, +/// `settled_reaction_p10_secs` through `settled_reaction_p99_secs`. +#[derive(Debug, Clone)] +pub struct SettledReactionTime; + +impl Metric for SettledReactionTime { + fn id(&self) -> &'static str { + "settled_reaction_time" + } + fn category(&self) -> MetricCategory { + MetricCategory::Behavioral + } + fn class(&self) -> MetricClass { + MetricClass::MustHave + } + fn applies_to(&self, cell: &Cell) -> bool { + matches!(cell.scenario, Scenario::SettledStep { .. }) + } + fn compute(&self, trials: &[Trial], cell: &Cell) -> MetricValues { + let settle_minutes = match cell.scenario { + Scenario::SettledStep { settle_minutes, .. } => settle_minutes, + _ => return MetricValues::new(), + }; + let event_at_secs = settle_minutes * 60; + let window_60min = 60 * 60; + let window_5min = 5 * 60; + + let (rate_60, dist_60) = reaction_time_distribution(trials, event_at_secs, window_60min); + let (rate_5, _) = reaction_time_distribution(trials, event_at_secs, window_5min); + + // Actual counter age at step time: time since the last fire + // before the event. This shows whether the intended settle + // duration actually produces the expected counter age, or + // whether jitter fires keep the counter young. + let actual_ages: Vec = trials + .iter() + .map(|trial| { + let last_fire_before = trial + .ticks + .iter() + .filter(|t| t.fired && t.t_secs <= event_at_secs) + .map(|t| t.t_secs) + .max() + .unwrap_or(0); + (event_at_secs - last_fire_before) as f64 + }) + .collect(); + let age_dist = Distribution::new(actual_ages); + + let mut v = MetricValues::new(); + let (rate_lo, rate_hi) = proportion_ci(rate_60, trials.len()); + v.set_with_ci("settled_reaction_rate", Some(rate_60), rate_lo, rate_hi); + v.set("settled_reaction_rate_5min", Some(rate_5)); + dist_60.record_percentile(&mut v, "settled_reaction_p10_secs", 10.0); + dist_60.record_percentile(&mut v, "settled_reaction_p25_secs", 25.0); + dist_60.record_percentile(&mut v, "settled_reaction_p50_secs", 50.0); + dist_60.record_percentile(&mut v, "settled_reaction_p75_secs", 75.0); + dist_60.record_percentile(&mut v, "settled_reaction_p90_secs", 90.0); + dist_60.record_percentile(&mut v, "settled_reaction_p95_secs", 95.0); + dist_60.record_percentile(&mut v, "settled_reaction_p99_secs", 99.0); + v.set("settled_reaction_mean_secs", dist_60.mean()); + // Actual counter age at step time + age_dist.record_percentile(&mut v, "actual_counter_age_p10_secs", 10.0); + age_dist.record_percentile(&mut v, "actual_counter_age_p50_secs", 50.0); + age_dist.record_percentile(&mut v, "actual_counter_age_p90_secs", 90.0); + v.set("actual_counter_age_mean_secs", age_dist.mean()); + v + } + fn tolerance_checks(&self, cell: &Cell) -> Vec { + let delta_mag = match cell.scenario { + Scenario::SettledStep { delta_pct, .. } => delta_pct.unsigned_abs(), + _ => return vec![], + }; + let mut checks = vec![]; + if delta_mag >= 50 { + checks.push(ToleranceCheck { + key: "settled_reaction_rate", + tolerance: Tolerance::WithinCi { + direction: Direction::HigherIsBetter, + extra_abs: 0.02, + extra_mul: None, + }, + }); + } + checks + } + fn summary_specs(&self) -> Vec { + vec![ + SummarySpec { + label: "reaction rate (60min counter, -50%)", + key: "settled_reaction_rate", + direction: Direction::HigherIsBetter, + scenario_filter: ScenarioFilter::SettledStepDelta { + settle_minutes: 60, + delta_pct: -50, + }, + fmt: SummaryFmt::Percentage, + }, + SummarySpec { + label: "reaction p50 (60min counter, -50%)", + key: "settled_reaction_p50_secs", + direction: Direction::LowerIsBetter, + scenario_filter: ScenarioFilter::SettledStepDelta { + settle_minutes: 60, + delta_pct: -50, + }, + fmt: SummaryFmt::Duration, + }, + ] + } + fn render_markdown(&self, results: &[crate::baseline::CellResult], w: &mut String) { + use crate::baseline::{fmt_duration, fmt_pct, unique_rates}; + + let settled_results: Vec<&crate::baseline::CellResult> = results + .iter() + .filter(|r| matches!(r.scenario, Scenario::SettledStep { .. })) + .collect(); + if settled_results.is_empty() { + return; + } + + let rates = unique_rates(results); + let settle_values: Vec = { + let mut sv: Vec = settled_results + .iter() + .filter_map(|r| match r.scenario { + Scenario::SettledStep { settle_minutes, .. } => Some(settle_minutes), + _ => None, + }) + .collect(); + sv.sort_unstable(); + sv.dedup(); + sv + }; + + // For each delta direction, emit a 2D table: share_rate × counter_age + for (label, delta_sign) in &[("-50% step", -50i32), ("+50% step", 50i32)] { + w.push_str(&format!( + "## Reaction time to {} by counter age\n\n", + label + )); + w.push_str("| share/min |"); + for sm in &settle_values { + w.push_str(&format!(" {}min |", sm)); + } + w.push_str("\n| --- |"); + for _ in &settle_values { + w.push_str(" --- |"); + } + w.push('\n'); + + for &spm in &rates { + w.push_str(&format!("| {} |", spm)); + for &sm in &settle_values { + let key = format!("settled_{}min_step_{}_{}", sm, + if *delta_sign >= 0 { "plus" } else { "minus" }, + delta_sign.unsigned_abs()); + let cell = results.iter().find(|r| { + r.shares_per_minute as u32 == spm && r.scenario_key() == key + }); + let val = cell.and_then(|c| c.get("settled_reaction_p50_secs")); + w.push_str(&format!(" {} |", fmt_duration(val))); + } + w.push('\n'); + } + w.push('\n'); + + // Also emit the reaction rate (60-min window) table + w.push_str(&format!( + "### Reaction rate (60-min window) — {}\n\n", + label + )); + w.push_str("| share/min |"); + for sm in &settle_values { + w.push_str(&format!(" {}min |", sm)); + } + w.push_str("\n| --- |"); + for _ in &settle_values { + w.push_str(" --- |"); + } + w.push('\n'); + + for &spm in &rates { + w.push_str(&format!("| {} |", spm)); + for &sm in &settle_values { + let key = format!("settled_{}min_step_{}_{}", sm, + if *delta_sign >= 0 { "plus" } else { "minus" }, + delta_sign.unsigned_abs()); + let cell = results.iter().find(|r| { + r.shares_per_minute as u32 == spm && r.scenario_key() == key + }); + let val = cell.and_then(|c| c.get("settled_reaction_rate")); + w.push_str(&format!(" {} |", fmt_pct(val))); + } + w.push('\n'); + } + w.push('\n'); + } + + // Actual counter age table (one table, using -50% step data) + w.push_str("## Actual counter age at step time (p50)\n\n"); + w.push_str( + "Shows the actual time since last fire before the step event. \ + If jitter fires keep the counter young, this will be much less \ + than the intended settle duration.\n\n", + ); + w.push_str("| share/min |"); + for sm in &settle_values { + w.push_str(&format!(" settle={}min |", sm)); + } + w.push_str("\n| --- |"); + for _ in &settle_values { + w.push_str(" --- |"); + } + w.push('\n'); + + for &spm in &rates { + w.push_str(&format!("| {} |", spm)); + for &sm in &settle_values { + let key = format!("settled_{}min_step_minus_50", sm); + let cell = results.iter().find(|r| { + r.shares_per_minute as u32 == spm && r.scenario_key() == key + }); + let val = cell.and_then(|c| c.get("actual_counter_age_p50_secs")); + w.push_str(&format!(" {} |", fmt_duration(val))); + } + w.push('\n'); + } + w.push('\n'); + } +} + +/// Estimator bias: `E[H̃ − H_true] / H_true` averaged over post-settle +/// ticks. Positive = systematic over-estimate; negative = under-estimate. +/// +/// Requires per-tick `h_estimate` (populated by `run_trial_observed` +/// against `Observable` algorithms). For non-observable algorithms +/// (`VardiffState` through `AsObservable`), `h_estimate` is `None` and +/// this metric emits `None` values which the TOML serializer omits. +/// +/// Applies to `Stable` and `ColdStart` scenarios — true hashrate is +/// constant in both. For `Step` scenarios bias-vs-which-true is +/// ambiguous, so the metric doesn't apply. +#[derive(Debug, Clone)] +pub struct Bias { + pub settle_after_secs: u64, +} + +impl Bias { + fn render_section( + &self, + w: &mut String, + results: &[crate::baseline::CellResult], + scenario_label: &str, + scenario_key: &str, + ) { + use crate::baseline::{find_cell, fmt_pct, unique_rates}; + let rates = unique_rates(results); + let mut wrote_header = false; + for spm in &rates { + let Some(r) = find_cell(results, *spm, scenario_key) else { + continue; + }; + // Skip cells that didn't emit bias at all (non-observable + // algorithms; bias_mean key missing entirely). + if !r.metrics.contains_key("bias") { + continue; + } + if !wrote_header { + w.push_str(&format!("### Bias — {}\n\n", scenario_label)); + w.push_str("| share/min | p10 | p50 | p90 | p99 | mean |\n"); + w.push_str("| --- | --- | --- | --- | --- | --- |\n"); + wrote_header = true; + } + w.push_str(&format!( + "| {} | {} | {} | {} | {} | {} |\n", + spm, + fmt_pct(r.get("bias_p10")), + fmt_pct(r.get("bias_p50")), + fmt_pct(r.get("bias_p90")), + fmt_pct(r.get("bias_p99")), + fmt_pct(r.get("bias_mean")), + )); + } + if wrote_header { + w.push('\n'); + } + } +} + +impl Metric for Bias { + fn id(&self) -> &'static str { + "bias" + } + fn category(&self) -> MetricCategory { + MetricCategory::Estimator + } + fn class(&self) -> MetricClass { + MetricClass::ShouldHave + } + fn applies_to(&self, cell: &Cell) -> bool { + matches!(cell.scenario, Scenario::Stable | Scenario::ColdStart) + } + fn render_markdown(&self, results: &[crate::baseline::CellResult], w: &mut String) { + // Bias requires observable algorithms; for non-observable ones + // (VardiffState through AsObservable) every value is None and + // the section is omitted entirely. + let has_any = results + .iter() + .any(|r| r.get("bias_mean").is_some() || r.get("bias_p50").is_some()); + if !has_any { + return; + } + w.push_str("## Estimator bias\n\n"); + w.push_str( + "`E[H̃ − H_true] / H_true` averaged over post-settle ticks. \ + Positive = systematic over-estimate. Populated only for \ + algorithms that expose introspection (e.g. ClassicComposed, \ + Parametric, EWMA-60s).\n\n", + ); + self.render_section(w, results, "stable load", "stable_1ph"); + self.render_section(w, results, "cold start", "cold_start_10gh_to_1ph"); + } + fn compute(&self, trials: &[Trial], _cell: &Cell) -> MetricValues { + let mut per_trial_means: Vec = Vec::new(); + for trial in trials { + let true_h = trial.true_hashrate_at_end as f64; + if true_h <= 0.0 { + continue; + } + let per_tick_bias: Vec = trial + .ticks + .iter() + .filter(|t| t.t_secs >= self.settle_after_secs) + .filter_map(|t| t.h_estimate.map(|h| (h as f64 - true_h) / true_h)) + .collect(); + if !per_tick_bias.is_empty() { + let mean = per_tick_bias.iter().sum::() / per_tick_bias.len() as f64; + per_trial_means.push(mean); + } + } + let dist = Distribution::new(per_trial_means.clone()); + let overall_mean = if per_trial_means.is_empty() { + None + } else { + Some(per_trial_means.iter().sum::() / per_trial_means.len() as f64) + }; + let mut v = MetricValues::new(); + v.set("bias_mean", overall_mean); + dist.record_percentile(&mut v, "bias_p10", 10.0); + dist.record_percentile(&mut v, "bias_p50", 50.0); + dist.record_percentile(&mut v, "bias_p90", 90.0); + dist.record_percentile(&mut v, "bias_p99", 99.0); + v + } +} + +/// Estimator variance: variance of `H̃ / H_true` over post-settle +/// ticks (relative variance, dimensionless). Same applicability +/// constraints as [`Bias`]. +#[derive(Debug, Clone)] +pub struct Variance { + pub settle_after_secs: u64, +} + +impl Variance { + fn render_section( + &self, + w: &mut String, + results: &[crate::baseline::CellResult], + scenario_label: &str, + scenario_key: &str, + ) { + use crate::baseline::{find_cell, fmt_f, unique_rates}; + let rates = unique_rates(results); + let mut wrote_header = false; + for spm in &rates { + let Some(r) = find_cell(results, *spm, scenario_key) else { + continue; + }; + if !r.metrics.contains_key("variance") { + continue; + } + if !wrote_header { + w.push_str(&format!("### Variance — {}\n\n", scenario_label)); + w.push_str("| share/min | p10 | p50 | p90 | p99 | mean |\n"); + w.push_str("| --- | --- | --- | --- | --- | --- |\n"); + wrote_header = true; + } + w.push_str(&format!( + "| {} | {} | {} | {} | {} | {} |\n", + spm, + fmt_f(r.get("variance_p10")), + fmt_f(r.get("variance_p50")), + fmt_f(r.get("variance_p90")), + fmt_f(r.get("variance_p99")), + fmt_f(r.get("variance_mean")), + )); + } + if wrote_header { + w.push('\n'); + } + } +} + +impl Metric for Variance { + fn id(&self) -> &'static str { + "variance" + } + fn category(&self) -> MetricCategory { + MetricCategory::Estimator + } + fn class(&self) -> MetricClass { + MetricClass::ShouldHave + } + fn applies_to(&self, cell: &Cell) -> bool { + matches!(cell.scenario, Scenario::Stable | Scenario::ColdStart) + } + fn render_markdown(&self, results: &[crate::baseline::CellResult], w: &mut String) { + let has_any = results.iter().any(|r| r.get("variance_mean").is_some()); + if !has_any { + return; + } + w.push_str("## Estimator variance\n\n"); + w.push_str( + "Population variance of `H̃ / H_true` over post-settle ticks \ + (dimensionless). Populated only for algorithms that expose \ + introspection.\n\n", + ); + self.render_section(w, results, "stable load", "stable_1ph"); + self.render_section(w, results, "cold start", "cold_start_10gh_to_1ph"); + } + fn compute(&self, trials: &[Trial], _cell: &Cell) -> MetricValues { + let mut per_trial_variances: Vec = Vec::new(); + for trial in trials { + let true_h = trial.true_hashrate_at_end as f64; + if true_h <= 0.0 { + continue; + } + let normalized: Vec = trial + .ticks + .iter() + .filter(|t| t.t_secs >= self.settle_after_secs) + .filter_map(|t| t.h_estimate.map(|h| h as f64 / true_h)) + .collect(); + if normalized.len() < 2 { + continue; + } + let mean = normalized.iter().sum::() / normalized.len() as f64; + // Population variance: sum((x - mean)²) / N. + let variance = normalized.iter().map(|x| (x - mean).powi(2)).sum::() + / normalized.len() as f64; + per_trial_variances.push(variance); + } + let dist = Distribution::new(per_trial_variances.clone()); + let overall_mean = if per_trial_variances.is_empty() { + None + } else { + Some(per_trial_variances.iter().sum::() / per_trial_variances.len() as f64) + }; + let mut v = MetricValues::new(); + v.set("variance_mean", overall_mean); + dist.record_percentile(&mut v, "variance_p10", 10.0); + dist.record_percentile(&mut v, "variance_p50", 50.0); + dist.record_percentile(&mut v, "variance_p90", 90.0); + dist.record_percentile(&mut v, "variance_p99", 99.0); + v + } +} + +/// Ramp target overshoot: `max(new_hashrate on fires) / H_true − 1`, +/// clamped at 0. Measures how far the algorithm's actual *target* +/// (not its internal belief) climbs above truth during the cold-start +/// ramp. +/// +/// ## Reading the metric +/// +/// `new_hashrate` is the value the algorithm actually sets as its +/// next target on a fire. Only fire-ticks contribute (non-fire ticks +/// have `new_hashrate = None`, filtered out). The clamp logic in +/// `FullRetargetWithClamp` bounds inflated `h_estimate` values into +/// the bounded ramp (3× max per fire), so `new_hashrate` reflects the +/// algorithm's *actual* target trajectory rather than estimator-noise +/// tails. +/// +/// ## Works for any algorithm +/// +/// This metric does NOT require introspection (`Observable`). +/// `VardiffState` populates `new_hashrate` on fires through the +/// standard `Vardiff::try_vardiff` return value, so this metric works +/// end-to-end for the production algorithm too. +/// +/// ## Applicability +/// +/// Cold-start only. For `Stable` the algorithm starts at truth and +/// doesn't ramp; for `Step` the relevant post-step transient is +/// captured by `reaction_*` metrics. +#[derive(Debug, Clone, Default)] +pub struct RampTargetOvershoot; + +impl Metric for RampTargetOvershoot { + fn id(&self) -> &'static str { + "ramp_target_overshoot" + } + fn category(&self) -> MetricCategory { + MetricCategory::Robustness + } + fn class(&self) -> MetricClass { + MetricClass::ShouldHave + } + fn applies_to(&self, cell: &Cell) -> bool { + matches!(cell.scenario, Scenario::ColdStart) + } + fn fundamental_limit(&self, cell: &Cell, key: &str) -> Option { + // Floor: an algorithm that fires from a single-minute window + // at the moment current_h ≈ truth will see Poisson(λ̄) + // observations with relative stddev 1/√λ̄ where λ̄ = spm × 1 + // minute = spm. The p99 of the relative *upper* deviation is + // z₉₉ × 1/√λ̄ with z₉₉ ≈ 2.326. Lower percentiles use the + // corresponding upper-tail z. + if cell.scenario != Scenario::ColdStart { + return None; + } + let lambda_bar = cell.shares_per_minute as f64; + if lambda_bar <= 0.0 { + return None; + } + // Upper-tail standard-normal quantiles Φ⁻¹(p): + let z = match key { + "ramp_target_overshoot_p10" => 0.0, // upper-tail p10 deviation is 0 + "ramp_target_overshoot_p50" => 0.0, // upper-tail median deviation is 0 + "ramp_target_overshoot_p90" => 1.282, // Φ⁻¹(0.90) + "ramp_target_overshoot_p99" => 2.326, // Φ⁻¹(0.99) + _ => return None, + }; + Some(z / lambda_bar.sqrt()) + } + fn compute(&self, trials: &[Trial], _cell: &Cell) -> MetricValues { + let mut per_trial: Vec = Vec::new(); + for trial in trials { + let true_h = trial.true_hashrate_at_end as f64; + if true_h <= 0.0 { + continue; + } + // Peak of new_hashrate over fire ticks. filter_map drops + // non-fire ticks automatically (their new_hashrate is None). + let peak = trial + .ticks + .iter() + .filter_map(|t| t.new_hashrate.map(|h| h as f64)) + .fold(f64::NEG_INFINITY, f64::max); + if peak.is_finite() && peak > 0.0 { + per_trial.push(((peak / true_h) - 1.0).max(0.0)); + } + } + let dist = Distribution::new(per_trial); + let mut v = MetricValues::new(); + dist.record_percentile(&mut v, "ramp_target_overshoot_p10", 10.0); + dist.record_percentile(&mut v, "ramp_target_overshoot_p50", 50.0); + dist.record_percentile(&mut v, "ramp_target_overshoot_p90", 90.0); + dist.record_percentile(&mut v, "ramp_target_overshoot_p99", 99.0); + v.set("ramp_target_overshoot_mean", dist.mean()); + v + } + fn tolerance_checks(&self, _cell: &Cell) -> Vec { + vec![ + ToleranceCheck { + key: "ramp_target_overshoot_p50", + tolerance: Tolerance::WithinCi { + direction: Direction::LowerIsBetter, + extra_abs: 0.05, + extra_mul: Some(0.20), + }, + }, + ToleranceCheck { + key: "ramp_target_overshoot_p99", + tolerance: Tolerance::WithinCi { + direction: Direction::LowerIsBetter, + extra_abs: 0.10, + extra_mul: Some(0.20), + }, + }, + ] + } + fn summary_specs(&self) -> Vec { + vec![SummarySpec { + label: "ramp target overshoot p99 (cold start)", + key: "ramp_target_overshoot_p99", + direction: Direction::LowerIsBetter, + scenario_filter: ScenarioFilter::ColdStart, + fmt: SummaryFmt::Percentage, + }] + } + fn render_markdown(&self, results: &[crate::baseline::CellResult], w: &mut String) { + use crate::baseline::{find_cell, fmt_pct, unique_rates}; + let has_any = results + .iter() + .any(|r| r.get("ramp_target_overshoot_p50").is_some()); + if !has_any { + return; + } + w.push_str("## Ramp target overshoot (cold start)\n\n"); + w.push_str( + "`max(new_hashrate on fires) / H_true − 1`: how far the \ + algorithm's actual *target* (not its belief) climbs past \ + truth during the cold-start ramp. Reads `new_hashrate` \ + (the actual target the algorithm set), so it's unaffected \ + by estimator-belief noise. Works for any algorithm that \ + fires, including those without introspection.\n\n", + ); + w.push_str("| share/min | p10 | p50 | p90 | p99 | mean |\n"); + w.push_str("| --- | --- | --- | --- | --- | --- |\n"); + for spm in unique_rates(results) { + if let Some(r) = find_cell(results, spm, "cold_start_10gh_to_1ph") { + if !r.metrics.contains_key("ramp_target_overshoot") { + continue; + } + w.push_str(&format!( + "| {} | {} | {} | {} | {} | {} |\n", + spm, + fmt_pct(r.get("ramp_target_overshoot_p10")), + fmt_pct(r.get("ramp_target_overshoot_p50")), + fmt_pct(r.get("ramp_target_overshoot_p90")), + fmt_pct(r.get("ramp_target_overshoot_p99")), + fmt_pct(r.get("ramp_target_overshoot_mean")), + )); + } + } + w.push('\n'); + } +} + +// ============================================================================ +// Upward step magnitude — per-trial distribution metric +// ============================================================================ + +/// Per-trial metric measuring how aggressively vardiff raises difficulty +/// during steady-state operation. +/// +/// For each trial in the `Stable` scenario, all upward difficulty +/// adjustments (fires where `new_hashrate > current_hashrate_before`) +/// are identified and the ratio `new_hashrate / current_hashrate_before` +/// is recorded. The per-trial value is the maximum upward ratio observed +/// in that trial (or 1.0 if no upward fires occurred). The distribution +/// across trials is then summarized as p50/p90/p95/p99. +/// +/// The p95 value is the headline metric: it captures how large the +/// 95th-percentile worst-case upward jump is under stable load. Lower +/// values indicate gentler retargeting. +#[derive(Debug, Clone, Default)] +pub struct UpwardStepMagnitude; + +impl Metric for UpwardStepMagnitude { + fn id(&self) -> &'static str { + "upward_step_magnitude" + } + fn category(&self) -> MetricCategory { + MetricCategory::Behavioral + } + fn class(&self) -> MetricClass { + MetricClass::ShouldHave + } + fn applies_to(&self, cell: &Cell) -> bool { + matches!(cell.scenario, Scenario::Stable) + } + fn compute(&self, trials: &[Trial], _cell: &Cell) -> MetricValues { + let mut per_trial: Vec = Vec::with_capacity(trials.len()); + for trial in trials { + // Collect all upward step ratios in this trial. + let mut ratios: Vec = Vec::new(); + for tick in &trial.ticks { + if tick.fired { + if let Some(new_h) = tick.new_hashrate { + let old_h = tick.current_hashrate_before; + if new_h > old_h && old_h > 0.0 { + ratios.push(new_h as f64 / old_h as f64); + } + } + } + } + // Per-trial value: p95 of upward ratios in this trial, or + // 1.0 (no change) if no upward fires occurred. + if ratios.is_empty() { + per_trial.push(1.0); + } else { + ratios.sort_by(|a, b| a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Equal)); + let idx = ((0.95_f64) * (ratios.len() as f64 - 1.0)).round() as usize; + per_trial.push(ratios[idx.min(ratios.len() - 1)]); + } + } + let dist = Distribution::new(per_trial); + let mut v = MetricValues::new(); + dist.record_percentile(&mut v, "upward_step_magnitude_p50", 50.0); + dist.record_percentile(&mut v, "upward_step_magnitude_p90", 90.0); + dist.record_percentile(&mut v, "upward_step_magnitude_p95", 95.0); + dist.record_percentile(&mut v, "upward_step_magnitude_p99", 99.0); + v.set("upward_step_magnitude_mean", dist.mean()); + v + } + fn tolerance_checks(&self, _cell: &Cell) -> Vec { + vec![ToleranceCheck { + key: "upward_step_magnitude_p95", + tolerance: Tolerance::WithinCi { + direction: Direction::LowerIsBetter, + extra_abs: 0.05, + extra_mul: Some(0.20), + }, + }] + } + fn summary_specs(&self) -> Vec { + vec![SummarySpec { + label: "upward step magnitude p95 (stable)", + key: "upward_step_magnitude_p95", + direction: Direction::LowerIsBetter, + scenario_filter: ScenarioFilter::Stable, + fmt: SummaryFmt::Float3, + }] + } + fn render_markdown(&self, results: &[crate::baseline::CellResult], w: &mut String) { + use crate::baseline::{find_cell, fmt_f, unique_rates}; + let has_any = results + .iter() + .any(|r| r.get("upward_step_magnitude_p95").is_some()); + if !has_any { + return; + } + w.push_str("## Upward step magnitude (stable load)\n\n"); + w.push_str( + "`new_hashrate / old_hashrate` for upward difficulty adjustments \ + during steady-state. Per-trial p95 of ratios, then distribution \ + across trials. Values near 1.0 indicate gentle retargeting; \ + values >> 1.0 indicate aggressive jumps.\n\n", + ); + w.push_str("| share/min | p50 | p90 | p95 | p99 | mean |\n"); + w.push_str("| --- | --- | --- | --- | --- | --- |\n"); + for spm in unique_rates(results) { + if let Some(r) = find_cell(results, spm, "stable_1ph") { + if !r.metrics.contains_key("upward_step_magnitude") { + continue; + } + w.push_str(&format!( + "| {} | {} | {} | {} | {} | {} |\n", + spm, + fmt_f(r.get("upward_step_magnitude_p50")), + fmt_f(r.get("upward_step_magnitude_p90")), + fmt_f(r.get("upward_step_magnitude_p95")), + fmt_f(r.get("upward_step_magnitude_p99")), + fmt_f(r.get("upward_step_magnitude_mean")), + )); + } + } + w.push('\n'); + } +} + +// ============================================================================ +// Log-error regret + control effort +// ============================================================================ + +/// Linear log-error regret and directional control effort — the +/// decomposition derived in `docs/THEORY.md` (§10). Computed from the +/// universal trajectory `(H_est, H_true, fires)`, so it works for every +/// algorithm including the non-introspectable monolith. +/// +/// In the natural error coordinate `e = ln(H_est / H_true)`: +/// +/// - **regret** is the time-average of `|e|` (LINEAR, not `e²` — §9.4: +/// a quadratic loss is structurally blind to small persistent +/// degradation, the failing-ASIC case). Split by sign: +/// - `regret_over` — mean `|e|` while `e > 0` (over-difficulty; the +/// costly, self-starving death-spiral side, §5.2). +/// - `regret_under` — mean `|e|` while `e < 0` (under-difficulty; the +/// cheap side — old work stays valid). +/// - **effort** is `Σ (Δ ln D)²` over fires, where `Δ ln D = +/// ln(new_hashrate / old_hashrate)`. Split by direction: +/// - `effort_up` — tightening fires (raise difficulty; reject +/// in-flight shares — costly). +/// - `effort_down` — easing fires (lower difficulty; ~free). +/// +/// `H_true(t)` is reconstructed from the cell's scenario schedule, +/// sampled at each tick-interval midpoint (matching how `run_trial` +/// samples load). All four values are time-averaged within the trial +/// and then averaged across trials. +/// +/// `ReportOnly` for now: this metric is being introduced alongside the +/// existing fitness metrics, not yet asserted in regression. +#[derive(Debug, Clone, Default)] +pub struct LogErrorRegret; + +impl LogErrorRegret { + /// Per-trial `(regret_over, regret_under, effort_up, effort_down)`, + /// regret terms time-averaged over the trial's covered duration. + fn per_trial(trial: &Trial, schedule: &crate::schedule::HashrateSchedule) -> [f64; 4] { + let mut reg_over = 0.0f64; + let mut reg_under = 0.0f64; + let mut eff_up = 0.0f64; + let mut eff_down = 0.0f64; + let mut covered = 0.0f64; + let mut last_t = 0u64; + for tick in &trial.ticks { + let dt = (tick.t_secs - last_t) as f64; + let mid = (last_t + tick.t_secs) / 2; + last_t = tick.t_secs; + let h_true = schedule.at(mid) as f64; + let h_est = tick.current_hashrate_before as f64; + if dt > 0.0 && h_true > 0.0 && h_est > 0.0 { + let e = (h_est / h_true).ln(); + let c = dt * e.abs(); + if e >= 0.0 { + reg_over += c; + } else { + reg_under += c; + } + covered += dt; + } + if tick.fired { + if let Some(nh) = tick.new_hashrate { + let old = tick.current_hashrate_before as f64; + if old > 0.0 && nh as f64 > 0.0 { + let dlog = (nh as f64 / old).ln(); + let c = dlog * dlog; + if dlog >= 0.0 { + eff_up += c; + } else { + eff_down += c; + } + } + } + } + } + if covered > 0.0 { + reg_over /= covered; + reg_under /= covered; + } + [reg_over, reg_under, eff_up, eff_down] + } +} + +impl Metric for LogErrorRegret { + fn id(&self) -> &'static str { + "log_error_regret" + } + fn category(&self) -> MetricCategory { + MetricCategory::Behavioral + } + fn class(&self) -> MetricClass { + MetricClass::ReportOnly + } + fn compute(&self, trials: &[Trial], cell: &Cell) -> MetricValues { + let (_, schedule) = cell.scenario.build(cell.shares_per_minute); + let mut acc = [0.0f64; 4]; + for t in trials { + let p = Self::per_trial(t, &schedule); + for i in 0..4 { + acc[i] += p[i]; + } + } + let n = trials.len().max(1) as f64; + let mut v = MetricValues::new(); + v.set("regret_over", Some(acc[0] / n)); + v.set("regret_under", Some(acc[1] / n)); + v.set("regret_lin", Some((acc[0] + acc[1]) / n)); + v.set("effort_up", Some(acc[2] / n)); + v.set("effort_down", Some(acc[3] / n)); + v.set("effort", Some((acc[2] + acc[3]) / n)); + v + } + fn render_markdown(&self, results: &[crate::baseline::CellResult], w: &mut String) { + use crate::baseline::unique_rates; + let has_any = results.iter().any(|r| r.get("regret_lin").is_some()); + if !has_any { + return; + } + w.push_str("## Log-error regret & control effort\n\n"); + w.push_str( + "Linear log-error regret `⟨|e|⟩`, `e = ln(H_est/H_true)`, split by \ + sign; control effort `Σ(Δln D)²` split by fire direction. Lower is \ + better on every column. See `docs/THEORY.md` §10. Per scenario class.\n\n", + ); + for (label, key) in &[ + ("stable load", "stable_1ph"), + ("cold start", "cold_start_10gh_to_1ph"), + ("−50% step", "step_minus_50_at_15min"), + ("+50% step", "step_plus_50_at_15min"), + ] { + let rows: Vec<&crate::baseline::CellResult> = results + .iter() + .filter(|r| r.scenario_key() == *key && r.get("regret_lin").is_some()) + .collect(); + if rows.is_empty() { + continue; + } + w.push_str(&format!("### {}\n\n", label)); + w.push_str( + "| share/min | regret | reg_over | reg_under | effort | eff_up | eff_down |\n", + ); + w.push_str("| --- | --- | --- | --- | --- | --- | --- |\n"); + let mut spms = unique_rates(results); + spms.sort_unstable(); + for spm in spms { + if let Some(r) = rows.iter().find(|r| r.shares_per_minute as u32 == spm) { + let g = |k: &str| r.get(k).map(|v| format!("{:.4}", v)).unwrap_or_else(|| "—".into()); + w.push_str(&format!( + "| {} | {} | {} | {} | {} | {} | {} |\n", + spm, + g("regret_lin"), + g("regret_over"), + g("regret_under"), + g("effort"), + g("effort_up"), + g("effort_down"), + )); + } + } + w.push('\n'); + } + } +} + +// ============================================================================ +// Bootstrap CI helper +// ============================================================================ + +/// Bootstrap confidence interval for a percentile. Resamples `values` +/// with replacement `n_resamples` times, computes the percentile for +/// each resample, and returns the (2.5%, 97.5%) bounds — a 95% CI +/// using the percentile method. +/// +/// Returns `(None, None)` if `values` is empty. +/// +/// Uses the framework's deterministic `XorShift64` RNG so CIs are +/// reproducible across runs given the same seed. Exposed as a free +/// function; a future refactor could integrate it into the [`Metric`] +/// trait so every percentile metric automatically +/// emits its CI bounds alongside. +/// +/// **Host-width assumption.** The index sample +/// `(rng.next_u64() as usize) % n` truncates to `u32` on 32-bit +/// targets, which biases the sample distribution toward lower indices +/// for `n > 2^32`. In practice `values.len()` is the trial count +/// (typically 100–10000), so the truncation is harmless on every +/// host. If the sim crate is ever ported to a 32-bit target with +/// `values.len() > 2^32` (unlikely), the modulo logic needs widening. +pub fn bootstrap_percentile_ci( + values: &[f64], + percentile: f64, + n_resamples: usize, + rng: &mut crate::rng::XorShift64, +) -> (Option, Option) { + if values.is_empty() { + return (None, None); + } + let n = values.len(); + let mut bootstrap_samples: Vec = Vec::with_capacity(n_resamples); + for _ in 0..n_resamples { + let mut resample: Vec = Vec::with_capacity(n); + for _ in 0..n { + // 64-bit-host assumption: `as usize` is a no-op on 64-bit; + // on 32-bit it truncates the high bits, which is fine for + // `n` up to 2^32. See module docstring above. + let idx = (rng.next_u64() as usize) % n; + resample.push(values[idx]); + } + let d = Distribution::new(resample); + if let Some(p) = d.percentile(percentile) { + bootstrap_samples.push(p); + } + } + let dist = Distribution::new(bootstrap_samples); + (dist.percentile(2.5), dist.percentile(97.5)) +} + +// ============================================================================ +// Stage-aware metrics +// ============================================================================ + +/// Stage 3: mean margin by which delta exceeded threshold at fire ticks. +/// Higher = fires are more decisive (clear signal, not marginal noise). +#[derive(Debug, Clone)] +pub struct FireDecisiveness { + pub settle_after_secs: u64, +} + +impl Metric for FireDecisiveness { + fn id(&self) -> &'static str { + "fire_decisiveness" + } + fn category(&self) -> MetricCategory { + MetricCategory::Behavioral + } + fn class(&self) -> MetricClass { + MetricClass::ReportOnly + } + fn applies_to(&self, cell: &Cell) -> bool { + // Meaningful for step scenarios (fires after real change) and stable (noise fires) + matches!(cell.scenario, Scenario::Stable | Scenario::Step { .. }) + } + fn compute(&self, trials: &[Trial], _cell: &Cell) -> MetricValues { + let mut margins: Vec = Vec::new(); + for trial in trials { + for tick in &trial.ticks { + if !tick.fired || tick.t_secs < self.settle_after_secs { + continue; + } + if let (Some(d), Some(t)) = (tick.delta, tick.threshold) { + if d >= t { + margins.push(d - t); + } + } + } + } + let mut v = MetricValues::new(); + if margins.is_empty() { + v.set("fire_decisiveness_mean", None); + v.set("fire_decisiveness_p50", None); + } else { + let mean = margins.iter().sum::() / margins.len() as f64; + v.set("fire_decisiveness_mean", Some(mean)); + margins.sort_by(|a, b| a.partial_cmp(b).unwrap()); + let p50 = margins[margins.len() / 2]; + v.set("fire_decisiveness_p50", Some(p50)); + } + v + } + fn tolerance_checks(&self, _cell: &Cell) -> Vec { + vec![] + } +} + +/// Stage 4: what fraction of the needed correction did the first fire +/// after a step change accomplish? +/// Value of 1.0 = perfect single-fire correction. +/// PartialRetarget(η) should produce approximately η. +#[derive(Debug, Clone)] +pub struct StepCorrection { + pub event_at_secs: u64, + pub react_window_secs: u64, +} + +impl Metric for StepCorrection { + fn id(&self) -> &'static str { + "step_correction" + } + fn category(&self) -> MetricCategory { + MetricCategory::Behavioral + } + fn class(&self) -> MetricClass { + MetricClass::ReportOnly + } + fn applies_to(&self, cell: &Cell) -> bool { + matches!(cell.scenario, Scenario::Step { .. }) + } + fn compute(&self, trials: &[Trial], cell: &Cell) -> MetricValues { + let true_h_after = match cell.scenario { + Scenario::Step { delta_pct } => { + let base = 1.0e15f32; + base * (1.0 + delta_pct as f32 / 100.0) + } + _ => return MetricValues::new(), + }; + + let mut corrections: Vec = Vec::new(); + for trial in trials { + // Find first fire after the step event + if let Some(tick) = trial.ticks.iter().find(|t| { + t.fired + && t.t_secs > self.event_at_secs + && t.t_secs <= self.event_at_secs + self.react_window_secs + }) { + let new_h = tick.new_hashrate.unwrap_or(tick.current_hashrate_before); + let current_h = tick.current_hashrate_before; + let needed = true_h_after - current_h; + if needed.abs() > 1.0 { + let achieved = new_h - current_h; + corrections.push((achieved / needed) as f64); + } + } + } + + let mut v = MetricValues::new(); + if corrections.is_empty() { + v.set("step_correction_mean", None); + v.set("step_correction_p50", None); + } else { + let mean = corrections.iter().sum::() / corrections.len() as f64; + v.set("step_correction_mean", Some(mean)); + corrections.sort_by(|a, b| a.partial_cmp(b).unwrap()); + let p50 = corrections[corrections.len() / 2]; + v.set("step_correction_p50", Some(p50)); + } + v + } + fn tolerance_checks(&self, _cell: &Cell) -> Vec { + vec![] + } +} + +// ============================================================================ +// Derived-metric constants +// ============================================================================ + +/// The default upper bound on jitter (fires/min) above which the +/// algorithm is considered "noisy". Used by [`SelectivityScore`] to +/// normalize the jitter term. +pub const DEFAULT_JITTER_CEILING_PER_MIN: f64 = 0.5; + +// ============================================================================ +// Derived metrics: cross-cell aggregations +// ============================================================================ + +/// A derived metric is computed *across* cells of the grid rather than +/// from raw trials of a single cell. Each derived metric emits one +/// `MetricValues` per share rate; the serializer renders them in a +/// `[derived..spm_]` TOML section, and the regression +/// comparator iterates the derived registry alongside the per-cell +/// registry. +pub trait DerivedMetric: Send + Sync + Debug { + /// Stable identifier (used as the section name in TOML). + fn id(&self) -> &'static str; + + /// `MustHave` / `ShouldHave` / `ReportOnly`. + fn class(&self) -> MetricClass; + + /// Computes the metric across all cells in the result set and + /// returns one `MetricValues` per share rate, ordered ascending + /// by share rate. Share rates for which the derived inputs are + /// missing are simply absent from the returned vector. + fn compute(&self, results: &[crate::baseline::CellResult]) -> Vec<(f32, MetricValues)>; + + /// Tolerance checks applied at one share rate during regression. + fn tolerance_checks(&self, spm: f32) -> Vec; + + /// Render the metric's section into the Markdown report. + fn render_markdown(&self, results: &[crate::baseline::CellResult], w: &mut String); + + /// Headline summary specs for the TL;DR section. Default empty. + /// Derived metrics that surface a headline override. + fn summary_specs(&self) -> Vec { + Vec::new() + } +} + +/// The canonical derived-metric registry: decoupling score plus +/// reaction-asymmetry. The serializer and comparator iterate this in +/// order. +pub fn derived_registry() -> Vec> { + vec![ + Box::new(OperationalFitness), + Box::new(EqualWeightFitness), + Box::new(CounterAgeSensitivity), + Box::new(ComprehensiveFitness), + Box::new(DecouplingScore), + Box::new(ReactionAsymmetry), + ] +} + +// ---- DecouplingScore ------------------------------------------------------- + +/// Per-share-rate summary of the variance-vs-detection trade-off: +/// +/// ```text +/// score = reaction_rate(Step −50%) × clamp(1 − jitter_p50 / J_max, 0, 1) +/// ``` +/// +/// Higher is better. `1.0` indicates perfect decoupling (algorithm +/// reacts at large changes and has zero jitter under stable load). +/// Lower scores mean the trade-off is biting at that share rate. +#[derive(Debug, Clone, Default)] +pub struct DecouplingScore; + +impl DerivedMetric for DecouplingScore { + fn id(&self) -> &'static str { + "decoupling_score" + } + + fn class(&self) -> MetricClass { + MetricClass::MustHave + } + + fn compute(&self, results: &[crate::baseline::CellResult]) -> Vec<(f32, MetricValues)> { + // Group inputs by share rate. Pull point estimates plus CI + // bounds for both inputs (jitter_p50 and reaction_rate). The + // score is then computed with worst-case substitution for + // the lower bound and best-case for the upper bound — a + // monotonic propagation that respects each input's + // direction-of-improvement. + // + // The key is `shares_per_minute as u32`, fine for canonical + // 6/12/30/60/120; fractional rates would collide. + #[derive(Default, Clone, Copy)] + struct Inputs { + jitter: Option, + jitter_ci: Option<(f64, f64)>, + reaction: Option, + reaction_ci: Option<(f64, f64)>, + } + let mut by_spm: HashMap = HashMap::new(); + for r in results { + let spm_key = r.shares_per_minute as u32; + let entry = by_spm.entry(spm_key).or_default(); + match r.scenario { + Scenario::Stable => { + if let Some(j) = r.get("jitter_p50_per_min") { + entry.jitter = Some(j); + entry.jitter_ci = r.get_ci("jitter_p50_per_min"); + } + } + Scenario::Step { delta_pct: -50 } => { + if let Some(rate) = r.get("reaction_rate") { + entry.reaction = Some(rate); + entry.reaction_ci = r.get_ci("reaction_rate"); + } + } + _ => {} + } + } + + let mut entries: Vec<_> = by_spm.into_iter().collect(); + entries.sort_by_key(|&(spm, _)| spm); + + let score_of = |r: f64, j: f64| -> f64 { + let factor = (1.0 - (j / DEFAULT_JITTER_CEILING_PER_MIN)).clamp(0.0, 1.0); + r * factor + }; + + entries + .into_iter() + .filter_map(|(spm, inputs)| { + let (Some(j), Some(r)) = (inputs.jitter, inputs.reaction) else { + return None; + }; + let point = score_of(r, j); + // Worst-case bound: lowest r, highest j → lowest score. + // Best-case bound: highest r, lowest j → highest score. + // Both inputs need CIs for the derived CI to be meaningful. + let ci = match (inputs.reaction_ci, inputs.jitter_ci) { + (Some((r_lo, r_hi)), Some((j_lo, j_hi))) => { + let lo = score_of(r_lo, j_hi); + let hi = score_of(r_hi, j_lo); + Some((lo, hi)) + } + _ => None, + }; + let mut mv = MetricValues::new(); + mv.set_with_ci("score", Some(point), ci.map(|(l, _)| l), ci.map(|(_, h)| h)); + Some((spm as f32, mv)) + }) + .collect() + } + + fn tolerance_checks(&self, _spm: f32) -> Vec { + // Higher is better; flag if the score drops outside the + // baseline CI by more than 0.05 (5 percentage points). + vec![ToleranceCheck { + key: "score", + tolerance: Tolerance::WithinCi { + direction: Direction::HigherIsBetter, + extra_abs: 0.05, + extra_mul: None, + }, + }] + } + + fn summary_specs(&self) -> Vec { + vec![SummarySpec { + label: "decoupling score", + key: "score", + direction: Direction::HigherIsBetter, + scenario_filter: ScenarioFilter::Any, + fmt: SummaryFmt::Float3, + }] + } + + fn render_markdown(&self, results: &[crate::baseline::CellResult], w: &mut String) { + let scores = self.compute(results); + if scores.is_empty() { + return; + } + w.push_str("## Decoupling score (per share rate)\n\n"); + w.push_str(&format!( + "`reaction_rate(Step−50) × clamp(1 − jitter_p50 / J_max, 0, 1)` where \ + `J_max = {:.2}` fires/min. Higher is better. Score of 1.0 = perfect \ + decoupling between reactivity and jitter.\n\n", + DEFAULT_JITTER_CEILING_PER_MIN + )); + w.push_str("| share/min | decoupling score |\n"); + w.push_str("| --- | --- |\n"); + for (spm, mv) in scores { + let cell = match mv.get("score") { + Some(s) => format!("{:.3}", s), + None => "—".to_string(), + }; + w.push_str(&format!("| {} | {} |\n", spm as u32, cell)); + } + w.push('\n'); + } +} + +// ---- OperationalFitness --------------------------------------------------- + +/// Per-share-rate composite metric weighted for real-world pool operation. +/// +/// Goal statement: "The ideal vardiff algorithm keeps shares flowing at a +/// predictable rate without ever surprising the miner with a difficulty it +/// can't meet. When hashrate changes, it should notice within a few minutes +/// — but it should never react so aggressively that it causes rejected +/// shares or connection loss." +/// +/// ```text +/// fitness = 0.15 × reaction_rate(Step −10%) +/// + 0.10 × reaction_rate(Step −50%) +/// + 0.25 × clamp(1 − jitter_mean / 0.30, 0, 1) +/// + 0.25 × clamp(1 − (step_magnitude_p95 − 1.0) / 0.5, 0, 1) +/// + 0.15 × convergence_rate × clamp(1 − conv_p50 / 600s, 0, 1) +/// + 0.10 × clamp(1 − overshoot_p99, 0, 1) +/// ``` +/// +/// The `step_magnitude_safety` term penalizes large upward difficulty +/// jumps — the direct causal precursor to `difficulty-too-low` share +/// rejections and miner timeout disconnections. A p95 step of 1.0× +/// (no upward adjustment) scores 1.0; a 1.5× jump (50% increase) +/// scores 0.0. +/// +/// Convergence is both pass/fail (rate) AND speed (p50 time). +/// A 60s convergence scores 1.0; 600s (10 min) scores 0.0. +/// +/// Higher is better. Weights reflect operational priorities: +/// +/// Harm-avoidance cluster (60% total): +/// - Jitter control (25%): predictable share rate in steady state. +/// - Step magnitude safety (25%): never surprise the miner with an +/// unreachable difficulty. A single large upward jump causes ~2 min +/// of lost mining (miner timeout + reconnect + re-negotiate). +/// - Overshoot safety (10%): cold-start ramp shouldn't overshoot truth. +/// +/// Reactivity cluster (25% total): +/// - Small-change detection (15%): detect 10% hashrate declines +/// (failing ASICs, thermal throttling) within a few retarget windows. +/// - Large-change detection (10%): detect catastrophic 50% drops. +/// +/// Convergence (15%): new miners must reach correct difficulty reasonably fast. +#[derive(Debug, Clone, Default)] +pub struct OperationalFitness; + +impl DerivedMetric for OperationalFitness { + fn id(&self) -> &'static str { + "operational_fitness" + } + + fn class(&self) -> MetricClass { + MetricClass::MustHave + } + + fn compute(&self, results: &[crate::baseline::CellResult]) -> Vec<(f32, MetricValues)> { + #[derive(Default, Clone)] + struct Inputs { + reaction_10: Option, + reaction_50: Option, + jitter_mean: Option, + step_magnitude_p95: Option, + convergence_rate: Option, + convergence_p50_secs: Option, + overshoot_p99: Option, + } + let mut by_spm: HashMap = HashMap::new(); + for r in results { + let spm_key = r.shares_per_minute as u32; + let entry = by_spm.entry(spm_key).or_default(); + match r.scenario { + Scenario::Stable => { + if let Some(j) = r.get("jitter_mean_per_min") { + entry.jitter_mean = Some(j); + } + if let Some(s) = r.get("upward_step_magnitude_p95") { + entry.step_magnitude_p95 = Some(s); + } + } + Scenario::Step { delta_pct: -10 } => { + if let Some(rate) = r.get("reaction_rate") { + entry.reaction_10 = Some(rate); + } + } + Scenario::Step { delta_pct: -50 } => { + if let Some(rate) = r.get("reaction_rate") { + entry.reaction_50 = Some(rate); + } + } + Scenario::ColdStart => { + if let Some(rate) = r.get("convergence_rate") { + entry.convergence_rate = Some(rate); + } + if let Some(t) = r.get("convergence_p50_secs") { + entry.convergence_p50_secs = Some(t); + } + if let Some(ov) = r.get("ramp_target_overshoot_p99") { + entry.overshoot_p99 = Some(ov); + } + } + _ => {} + } + } + + let mut entries: Vec<_> = by_spm.into_iter().collect(); + entries.sort_by_key(|&(spm, _)| spm); + + // Convergence speed ceiling: 600s (10 min) = score 0. + // Faster convergence → higher score (linear scaling). + const CONV_CEILING_SECS: f64 = 600.0; + + entries + .into_iter() + .filter_map(|(spm, inp)| { + let r10 = inp.reaction_10.unwrap_or(0.0); + let r50 = inp.reaction_50.unwrap_or(0.0); + let jitter = inp.jitter_mean.unwrap_or(1.0); + let step_mag = inp.step_magnitude_p95.unwrap_or(1.5); + let conv_rate = inp.convergence_rate.unwrap_or(0.0); + let conv_secs = inp.convergence_p50_secs.unwrap_or(CONV_CEILING_SECS); + let overshoot = inp.overshoot_p99.unwrap_or(1.0); + + let jitter_factor = (1.0 - jitter / 0.30).clamp(0.0, 1.0); + let overshoot_factor = (1.0 - overshoot).clamp(0.0, 1.0); + // Step magnitude safety: penalizes large upward difficulty jumps. + // 1.0× (no jump) → 1.0; 1.5× (50% jump) → 0.0; linear between. + let step_safety = (1.0 - (step_mag - 1.0) / 0.5).clamp(0.0, 1.0); + // Convergence factor: combines rate (did it converge?) with speed (how fast?) + // conv_rate gates: if it didn't converge, speed is irrelevant (score 0). + // Speed: 60s → 1.0, 600s → 0.0, linear between. + let speed_factor = (1.0 - conv_secs / CONV_CEILING_SECS).clamp(0.0, 1.0); + let convergence_factor = conv_rate * speed_factor; + + let score = 0.15 * r10 + + 0.10 * r50 + + 0.25 * jitter_factor + + 0.25 * step_safety + + 0.15 * convergence_factor + + 0.10 * overshoot_factor; + + let mut mv = MetricValues::new(); + mv.set("score", Some(score)); + mv.set("reaction_10_component", Some(r10)); + mv.set("reaction_50_component", Some(r50)); + mv.set("jitter_component", Some(jitter_factor)); + mv.set("step_safety_component", Some(step_safety)); + mv.set("convergence_component", Some(convergence_factor)); + mv.set("overshoot_component", Some(overshoot_factor)); + Some((spm as f32, mv)) + }) + .collect() + } + + fn tolerance_checks(&self, _spm: f32) -> Vec { + vec![ToleranceCheck { + key: "score", + tolerance: Tolerance::WithinCi { + direction: Direction::HigherIsBetter, + extra_abs: 0.05, + extra_mul: None, + }, + }] + } + + fn summary_specs(&self) -> Vec { + vec![SummarySpec { + label: "operational fitness", + key: "score", + direction: Direction::HigherIsBetter, + scenario_filter: ScenarioFilter::Any, + fmt: SummaryFmt::Float3, + }] + } + + fn render_markdown(&self, results: &[crate::baseline::CellResult], w: &mut String) { + let scores = self.compute(results); + if scores.is_empty() { + return; + } + w.push_str("## Operational fitness (per share rate)\n\n"); + w.push_str( + "`0.15×react(-10%) + 0.1×react(-50%) + 0.25×jitter + \ + 0.25×step_safety + 0.15×convergence + 0.1×overshoot`. Higher is better.\n\n", + ); + w.push_str( + "| share/min | fitness | react-10% | react-50% | jitter | step-safe | conv | overshoot |\n", + ); + w.push_str("| --- | --- | --- | --- | --- | --- | --- | --- |\n"); + for (spm, mv) in scores { + let s = |k: &str| match mv.get(k) { + Some(v) => format!("{:.3}", v), + None => "—".to_string(), + }; + w.push_str(&format!( + "| {} | {} | {} | {} | {} | {} | {} | {} |\n", + spm as u32, + s("score"), + s("reaction_10_component"), + s("reaction_50_component"), + s("jitter_component"), + s("step_safety_component"), + s("convergence_component"), + s("overshoot_component"), + )); + } + w.push('\n'); + } +} + +// ---- EqualWeightFitness ----------------------------------------------------- + +/// **DEPRECATED — superseded by [`LogErrorRegret`] + the regret/effort +/// radar (`bin/regret-radar`).** See `docs/THEORY.md` §10: the six +/// equal-weighted axes are correlated projections of one trade-off, the +/// `/0.30`-style ceilings are arbitrary, and equal weighting rewards the +/// midpoint of a trade-off curve rather than the frontier. Retained only +/// because the maximin parameter-sweep bins (`sweep-balanced`, +/// `sweep-estimators`, `sweep-signpersist*`, `sweep-voladapt`) still +/// score against it; those will migrate to regret/effort scoring during +/// the retune, at which point this is removed. +/// +/// Same sub-metrics as OperationalFitness but with uniform 1/6 weighting. +/// +/// Removes the structural advantage that harm-avoidance-dominant algorithms +/// get from the 60/25/15 cluster weighting. Useful for seeing the "unbiased" +/// ranking where no metric cluster is privileged. +/// +/// ```text +/// fitness = (1/6) × reaction_rate(Step −10%) +/// + (1/6) × reaction_rate(Step −50%) +/// + (1/6) × clamp(1 − jitter_mean / 0.30, 0, 1) +/// + (1/6) × clamp(1 − (step_magnitude_p95 − 1.0) / 0.5, 0, 1) +/// + (1/6) × convergence_rate × clamp(1 − conv_p50 / 600s, 0, 1) +/// + (1/6) × clamp(1 − overshoot_p99, 0, 1) +/// ``` +#[derive(Debug, Clone, Default)] +pub struct EqualWeightFitness; + +impl DerivedMetric for EqualWeightFitness { + fn id(&self) -> &'static str { + "equal_weight_fitness" + } + + fn class(&self) -> MetricClass { + MetricClass::ShouldHave + } + + fn compute(&self, results: &[crate::baseline::CellResult]) -> Vec<(f32, MetricValues)> { + #[derive(Default, Clone)] + struct Inputs { + reaction_10: Option, + reaction_50: Option, + jitter_mean: Option, + step_magnitude_p95: Option, + convergence_rate: Option, + convergence_p50_secs: Option, + overshoot_p99: Option, + } + let mut by_spm: HashMap = HashMap::new(); + for r in results { + let spm_key = r.shares_per_minute as u32; + let entry = by_spm.entry(spm_key).or_default(); + match r.scenario { + Scenario::Stable => { + if let Some(j) = r.get("jitter_mean_per_min") { + entry.jitter_mean = Some(j); + } + if let Some(s) = r.get("upward_step_magnitude_p95") { + entry.step_magnitude_p95 = Some(s); + } + } + Scenario::Step { delta_pct: -10 } => { + if let Some(rate) = r.get("reaction_rate") { + entry.reaction_10 = Some(rate); + } + } + Scenario::Step { delta_pct: -50 } => { + if let Some(rate) = r.get("reaction_rate") { + entry.reaction_50 = Some(rate); + } + } + Scenario::ColdStart => { + if let Some(rate) = r.get("convergence_rate") { + entry.convergence_rate = Some(rate); + } + if let Some(t) = r.get("convergence_p50_secs") { + entry.convergence_p50_secs = Some(t); + } + if let Some(ov) = r.get("ramp_target_overshoot_p99") { + entry.overshoot_p99 = Some(ov); + } + } + _ => {} + } + } + + let mut entries: Vec<_> = by_spm.into_iter().collect(); + entries.sort_by_key(|&(spm, _)| spm); + + const CONV_CEILING_SECS: f64 = 600.0; + const W: f64 = 1.0 / 6.0; + + entries + .into_iter() + .filter_map(|(spm, inp)| { + let r10 = inp.reaction_10.unwrap_or(0.0); + let r50 = inp.reaction_50.unwrap_or(0.0); + let jitter = inp.jitter_mean.unwrap_or(1.0); + let step_mag = inp.step_magnitude_p95.unwrap_or(1.5); + let conv_rate = inp.convergence_rate.unwrap_or(0.0); + let conv_secs = inp.convergence_p50_secs.unwrap_or(CONV_CEILING_SECS); + let overshoot = inp.overshoot_p99.unwrap_or(1.0); + + let jitter_factor = (1.0 - jitter / 0.30).clamp(0.0, 1.0); + let overshoot_factor = (1.0 - overshoot).clamp(0.0, 1.0); + let step_safety = (1.0 - (step_mag - 1.0) / 0.5).clamp(0.0, 1.0); + let speed_factor = (1.0 - conv_secs / CONV_CEILING_SECS).clamp(0.0, 1.0); + let convergence_factor = conv_rate * speed_factor; + + let score = W * r10 + + W * r50 + + W * jitter_factor + + W * step_safety + + W * convergence_factor + + W * overshoot_factor; + + let mut mv = MetricValues::new(); + mv.set("score", Some(score)); + mv.set("reaction_10", Some(r10)); + mv.set("reaction_50", Some(r50)); + mv.set("jitter", Some(jitter_factor)); + mv.set("step_safety", Some(step_safety)); + mv.set("convergence", Some(convergence_factor)); + mv.set("overshoot", Some(overshoot_factor)); + Some((spm as f32, mv)) + }) + .collect() + } + + fn tolerance_checks(&self, _spm: f32) -> Vec { + vec![ToleranceCheck { + key: "score", + tolerance: Tolerance::WithinCi { + direction: Direction::HigherIsBetter, + extra_abs: 0.05, + extra_mul: None, + }, + }] + } + + fn summary_specs(&self) -> Vec { + vec![SummarySpec { + label: "equal-weight fitness", + key: "score", + direction: Direction::HigherIsBetter, + scenario_filter: ScenarioFilter::Any, + fmt: SummaryFmt::Float3, + }] + } + + fn render_markdown(&self, results: &[crate::baseline::CellResult], w: &mut String) { + let scores = self.compute(results); + if scores.is_empty() { + return; + } + w.push_str("## Equal-weight fitness (per share rate)\n\n"); + w.push_str( + "Each sub-metric weighted 1/6. No cluster bias. Higher is better.\n\n", + ); + w.push_str( + "| share/min | fitness | react-10% | react-50% | jitter | step-safe | conv | overshoot |\n", + ); + w.push_str("| --- | --- | --- | --- | --- | --- | --- | --- |\n"); + for (spm, mv) in scores { + let s = |k: &str| match mv.get(k) { + Some(v) => format!("{:.3}", v), + None => "—".to_string(), + }; + w.push_str(&format!( + "| {} | {} | {} | {} | {} | {} | {} | {} |\n", + spm as u32, + s("score"), + s("reaction_10"), + s("reaction_50"), + s("jitter"), + s("step_safety"), + s("convergence"), + s("overshoot"), + )); + } + w.push('\n'); + } +} + +// ---- ReactionAsymmetry ----------------------------------------------------- + +/// Per-share-rate measurement of direction-aware blindness: +/// +/// ```text +/// asymmetry_at_δ = reaction_rate(Step +δ%) − reaction_rate(Step −δ%) +/// ``` +/// +/// for each `δ ∈ {5, 10, 25, 50}` present in the grid. Positive +/// values mean the algorithm reacts faster to up-steps than to +/// down-steps; negative values mean the reverse. Symmetric algorithms +/// score ≈ 0 at every magnitude. +/// +/// Catches direction-aware regressions that don't move any single +/// reaction-rate metric outside its individual tolerance: an +/// algorithm that loses 5% on the down-side and gains 5% on the +/// up-side passes per-cell checks but shifts the asymmetry by 10 +/// percentage points. +#[derive(Debug, Clone, Default)] +pub struct ReactionAsymmetry; + +impl ReactionAsymmetry { + /// Step magnitudes (absolute value of `delta_pct`) at which we + /// compute asymmetry, paired with their static-string keys. + /// Algorithm registry's canonical step grid has both +δ and −δ + /// for each. + const MAGNITUDES: &'static [(u32, &'static str)] = &[ + (5, "asymmetry_at_5"), + (10, "asymmetry_at_10"), + (25, "asymmetry_at_25"), + (50, "asymmetry_at_50"), + ]; +} + +impl DerivedMetric for ReactionAsymmetry { + fn id(&self) -> &'static str { + "reaction_asymmetry" + } + + fn class(&self) -> MetricClass { + MetricClass::ShouldHave + } + + fn compute(&self, results: &[crate::baseline::CellResult]) -> Vec<(f32, MetricValues)> { + // Build a lookup from (spm, delta_pct) → (rate, ci). + type RateWithCi = (f64, Option<(f64, f64)>); + let mut by_pair: HashMap<(u32, i32), RateWithCi> = HashMap::new(); + for r in results { + if let Scenario::Step { delta_pct } = r.scenario { + if let Some(rate) = r.get("reaction_rate") { + let ci = r.get_ci("reaction_rate"); + by_pair.insert((r.shares_per_minute as u32, delta_pct), (rate, ci)); + } + } + } + + // For each share rate, emit asymmetry at each magnitude that + // has both +δ and −δ cells. + let mut spms: Vec = by_pair.keys().map(|(spm, _)| *spm).collect(); + spms.sort_unstable(); + spms.dedup(); + + spms.into_iter() + .filter_map(|spm| { + let mut mv = MetricValues::new(); + let mut any = false; + let mut max_abs: f64 = 0.0; + let mut max_abs_ci_lo: f64 = 0.0; + let mut max_abs_ci_hi: f64 = 0.0; + let mut have_max_ci = true; + for &(mag, key) in Self::MAGNITUDES { + let up = by_pair.get(&(spm, mag as i32)); + let down = by_pair.get(&(spm, -(mag as i32))); + if let (Some((u, u_ci)), Some((d, d_ci))) = (up, down) { + let delta = u - d; + // CI on the difference: worst-case low = + // u_lo − d_hi, worst-case high = u_hi − d_lo. + // Requires both endpoints to have CIs. + let ci = match (u_ci, d_ci) { + (Some((u_lo, u_hi)), Some((d_lo, d_hi))) => { + Some((u_lo - d_hi, u_hi - d_lo)) + } + _ => None, + }; + if let Some((lo, hi)) = ci { + mv.set_with_ci(key, Some(delta), Some(lo), Some(hi)); + } else { + mv.set(key, Some(delta)); + have_max_ci = false; + } + if delta.abs() > max_abs { + max_abs = delta.abs(); + if let Some((lo, hi)) = ci { + // The worst-case |asymmetry| envelope + // takes the larger absolute bound of + // [lo, hi]. The best-case is + // |smallest in absolute value|, but + // since both lo and hi are around the + // point estimate, a clean lower + // bound is the point absolute value + // minus the half-width. + let half_width = (hi - lo) / 2.0; + max_abs_ci_lo = (max_abs - half_width).max(0.0); + max_abs_ci_hi = max_abs + half_width; + } + } + any = true; + } + } + if any { + // Aggregate: the largest |asymmetry| across all + // step magnitudes at this share rate. Surfaces the + // strongest direction-bias in a single number for + // the TL;DR table. + if have_max_ci && max_abs > 0.0 { + mv.set_with_ci( + "max_abs_asymmetry", + Some(max_abs), + Some(max_abs_ci_lo), + Some(max_abs_ci_hi), + ); + } else { + mv.set("max_abs_asymmetry", Some(max_abs)); + } + Some((spm as f32, mv)) + } else { + None + } + }) + .collect() + } + + fn tolerance_checks(&self, _spm: f32) -> Vec { + // Asymmetry is a signed quantity around zero. `Direction::Either` + // makes the check two-sided: a movement of more than 0.10 + // (10 percentage points) in either direction beyond the + // baseline CI signals a structural shift in the algorithm's + // direction-aware response. We also check the + // `max_abs_asymmetry` aggregate as `LowerIsBetter` so a + // direction-flip at any magnitude is caught. + let mut checks: Vec = Self::MAGNITUDES + .iter() + .map(|&(_, key)| ToleranceCheck { + key, + tolerance: Tolerance::WithinCi { + direction: Direction::Either, + extra_abs: 0.10, + extra_mul: None, + }, + }) + .collect(); + checks.push(ToleranceCheck { + key: "max_abs_asymmetry", + tolerance: Tolerance::WithinCi { + direction: Direction::LowerIsBetter, + extra_abs: 0.10, + extra_mul: None, + }, + }); + checks + } + + fn summary_specs(&self) -> Vec { + // Compress the four per-magnitude rows into one headline: + // `max_abs_asymmetry` is the largest direction-bias the + // algorithm exhibits at any step magnitude at this share + // rate. Lower (closer to zero) is better. + vec![SummarySpec { + label: "max |reaction asymmetry|", + key: "max_abs_asymmetry", + direction: Direction::LowerIsBetter, + scenario_filter: ScenarioFilter::Any, + fmt: SummaryFmt::Float3, + }] + } + + fn render_markdown(&self, results: &[crate::baseline::CellResult], w: &mut String) { + let computed = self.compute(results); + if computed.is_empty() { + return; + } + w.push_str("## Reaction asymmetry (per share rate)\n\n"); + w.push_str( + "`reaction_rate(+δ%) − reaction_rate(−δ%)`. Positive = \ + responds faster to up-steps; negative = responds faster \ + to down-steps; near zero = symmetric.\n\n", + ); + // Header row. + w.push_str("| share/min |"); + for &(mag, _) in Self::MAGNITUDES { + w.push_str(&format!(" δ={}% |", mag)); + } + w.push('\n'); + w.push_str("| ---"); + for _ in Self::MAGNITUDES { + w.push_str(" | ---"); + } + w.push_str(" |\n"); + // Data rows. + for (spm, mv) in computed { + w.push_str(&format!("| {} |", spm as u32)); + for &(_, key) in Self::MAGNITUDES { + let cell = match mv.get(key) { + Some(v) => format!(" {:+.2} ", v), + None => " — ".to_string(), + }; + w.push_str(&cell); + w.push('|'); + } + w.push('\n'); + } + w.push('\n'); + } +} + +// ---- CounterAgeSensitivity ------------------------------------------------- + +/// Counter-age sensitivity: measures how well the algorithm detects +/// partial hashrate degradation (-10%) when the counter is mature +/// (60 min since last fire). +/// +/// The **score** is the `settled_reaction_rate` from the +/// `SettledStep { settle_minutes: 60, delta_pct: -10 }` cell — the +/// probability of detecting a 10% hashrate drop within 60 minutes at +/// a mature counter age. This directly answers the operationally +/// relevant question: "can the algorithm notice slow degradation +/// (thermal throttle, failing ASICs) under typical conditions?" +/// +/// Diagnostic ratios (p50 reaction time at 60-min / 5-min counter) +/// are also emitted for both -50% and -10% steps, explaining *why* +/// the score is what it is. +#[derive(Debug, Clone, Default)] +pub struct CounterAgeSensitivity; + +impl DerivedMetric for CounterAgeSensitivity { + fn id(&self) -> &'static str { + "counter_age_sensitivity" + } + + fn class(&self) -> MetricClass { + MetricClass::MustHave + } + + fn compute(&self, results: &[crate::baseline::CellResult]) -> Vec<(f32, MetricValues)> { + #[derive(Default)] + struct Inputs { + young_50_p50: Option, + mature_50_p50: Option, + young_10_p50: Option, + mature_10_p50: Option, + mature_10_rate: Option, + } + + let mut by_spm: HashMap = HashMap::new(); + + for r in results { + let spm = r.shares_per_minute as u32; + let entry = by_spm.entry(spm).or_default(); + match r.scenario { + Scenario::SettledStep { + settle_minutes: 5, + delta_pct: -50, + } => { + entry.young_50_p50 = r.get("settled_reaction_p50_secs"); + } + Scenario::SettledStep { + settle_minutes: 60, + delta_pct: -50, + } => { + entry.mature_50_p50 = r.get("settled_reaction_p50_secs"); + } + Scenario::SettledStep { + settle_minutes: 5, + delta_pct: -10, + } => { + entry.young_10_p50 = r.get("settled_reaction_p50_secs"); + } + Scenario::SettledStep { + settle_minutes: 60, + delta_pct: -10, + } => { + entry.mature_10_p50 = r.get("settled_reaction_p50_secs"); + entry.mature_10_rate = r.get("settled_reaction_rate"); + } + _ => {} + } + } + + let mut entries: Vec<_> = by_spm.into_iter().collect(); + entries.sort_by_key(|&(spm, _)| spm); + + entries + .into_iter() + .filter_map(|(spm, inp)| { + let mut mv = MetricValues::new(); + let mut has_any = false; + + // Diagnostic ratios + if let (Some(y), Some(m)) = (inp.young_50_p50, inp.mature_50_p50) { + if y > 0.0 { + mv.set("ratio_50pct", Some(m / y)); + has_any = true; + } + } + if let (Some(y), Some(m)) = (inp.young_10_p50, inp.mature_10_p50) { + if y > 0.0 { + mv.set("ratio_10pct", Some(m / y)); + has_any = true; + } + } + + // Score: P[detect -10% drop within 60min at mature counter] + // This is the operationally relevant capability measure. + if let Some(rate) = inp.mature_10_rate { + mv.set("score", Some(rate)); + has_any = true; + } + + if has_any { + Some((spm as f32, mv)) + } else { + None + } + }) + .collect() + } + + fn tolerance_checks(&self, _spm: f32) -> Vec { + vec![ToleranceCheck { + key: "score", + tolerance: Tolerance::WithinCi { + direction: Direction::HigherIsBetter, + extra_abs: 0.05, + extra_mul: None, + }, + }] + } + + fn summary_specs(&self) -> Vec { + vec![ + SummarySpec { + label: "mature-counter detection (-10%)", + key: "score", + direction: Direction::HigherIsBetter, + scenario_filter: ScenarioFilter::Any, + fmt: SummaryFmt::Percentage, + }, + SummarySpec { + label: "counter-age ratio (-50%)", + key: "ratio_50pct", + direction: Direction::LowerIsBetter, + scenario_filter: ScenarioFilter::Any, + fmt: SummaryFmt::Float3, + }, + ] + } + + fn render_markdown(&self, results: &[crate::baseline::CellResult], w: &mut String) { + let computed = self.compute(results); + if computed.is_empty() { + return; + } + w.push_str("## Counter-age sensitivity (per share rate)\n\n"); + w.push_str( + "Score = P[detect -10% drop within 60 min at 60-min counter age]. \ + Higher is better — the operationally relevant measure of whether \ + the algorithm can notice partial degradation under typical conditions. \ + Ratios show p50 reaction time at mature vs young counter for diagnostics.\n\n", + ); + w.push_str("| share/min | score | ratio (-50%) | ratio (-10%) |\n"); + w.push_str("| --- | --- | --- | --- |\n"); + for (spm, mv) in &computed { + let score = mv + .get("score") + .map(|v| format!("{:.1}%", v * 100.0)) + .unwrap_or_else(|| "—".to_string()); + let r50 = mv + .get("ratio_50pct") + .map(|v| format!("{:.1}×", v)) + .unwrap_or_else(|| "—".to_string()); + let r10 = mv + .get("ratio_10pct") + .map(|v| format!("{:.1}×", v)) + .unwrap_or_else(|| "—".to_string()); + w.push_str(&format!("| {} | {} | {} | {} |\n", *spm as u32, score, r50, r10)); + } + w.push('\n'); + } +} + +// ---- ComprehensiveFitness ------------------------------------------------- + +/// Composite metric that combines [`OperationalFitness`] (80%) with +/// counter-age independence (20%). This is the single scalar the +/// automated parameter search should optimize. +/// +/// ```text +/// comprehensive = 0.80 × operational_fitness + 0.20 × counter_age_score +/// ``` +/// +/// Where `counter_age_score` is `CounterAgeSensitivity.score` (1.0 for +/// age-independent algorithms, approaching 0.0 for algorithms whose +/// reaction time degrades linearly with counter age). +#[derive(Debug, Clone, Default)] +pub struct ComprehensiveFitness; + +impl DerivedMetric for ComprehensiveFitness { + fn id(&self) -> &'static str { + "comprehensive_fitness" + } + + fn class(&self) -> MetricClass { + MetricClass::MustHave + } + + fn compute(&self, results: &[crate::baseline::CellResult]) -> Vec<(f32, MetricValues)> { + let op_scores: HashMap = OperationalFitness + .compute(results) + .into_iter() + .filter_map(|(spm, mv)| mv.get("score").map(|s| (spm as u32, s))) + .collect(); + + let ca_scores: HashMap = CounterAgeSensitivity + .compute(results) + .into_iter() + .filter_map(|(spm, mv)| mv.get("score").map(|s| (spm as u32, s))) + .collect(); + + let mut spms: Vec = op_scores.keys().copied().collect(); + spms.sort_unstable(); + + spms.into_iter() + .filter_map(|spm| { + let op = *op_scores.get(&spm)?; + let ca = ca_scores.get(&spm).copied().unwrap_or(1.0); + let comprehensive = 0.80 * op + 0.20 * ca; + + let mut mv = MetricValues::new(); + mv.set("score", Some(comprehensive)); + mv.set("operational_component", Some(op)); + mv.set("counter_age_component", Some(ca)); + Some((spm as f32, mv)) + }) + .collect() + } + + fn tolerance_checks(&self, _spm: f32) -> Vec { + vec![ToleranceCheck { + key: "score", + tolerance: Tolerance::WithinCi { + direction: Direction::HigherIsBetter, + extra_abs: 0.05, + extra_mul: None, + }, + }] + } + + fn summary_specs(&self) -> Vec { + vec![SummarySpec { + label: "comprehensive fitness", + key: "score", + direction: Direction::HigherIsBetter, + scenario_filter: ScenarioFilter::Any, + fmt: SummaryFmt::Float3, + }] + } + + fn render_markdown(&self, results: &[crate::baseline::CellResult], w: &mut String) { + let computed = self.compute(results); + if computed.is_empty() { + return; + } + w.push_str("## Comprehensive fitness (per share rate)\n\n"); + w.push_str( + "`0.80 × operational_fitness + 0.20 × counter_age_independence`. \ + Higher is better.\n\n", + ); + w.push_str("| share/min | comprehensive | operational | counter-age |\n"); + w.push_str("| --- | --- | --- | --- |\n"); + for (spm, mv) in &computed { + let comp = mv + .get("score") + .map(|v| format!("{:.3}", v)) + .unwrap_or_else(|| "—".to_string()); + let op = mv + .get("operational_component") + .map(|v| format!("{:.3}", v)) + .unwrap_or_else(|| "—".to_string()); + let ca = mv + .get("counter_age_component") + .map(|v| format!("{:.3}", v)) + .unwrap_or_else(|| "—".to_string()); + w.push_str(&format!("| {} | {} | {} | {} |\n", *spm as u32, comp, op, ca)); + } + w.push('\n'); + } +} + +// ============================================================================ +// Tests +// ============================================================================ + +#[cfg(test)] +mod tests { + use super::*; + use crate::baseline::CellResult; + use crate::trial::{TickRecord, TrialConfig}; + + /// Constructs a trial whose ticks each carry an observed + /// `h_estimate`. Used by the bias / variance / overshoot tests. + /// `true_h` becomes `true_hashrate_at_end`; one tick per element + /// at 60-second intervals. + fn trial_with_observed_ticks(true_h: f32, h_estimates: &[f32]) -> Trial { + let duration = (h_estimates.len() as u64) * 60; + let config = TrialConfig { + duration_secs: duration, + ..TrialConfig::default() + }; + let ticks: Vec = h_estimates + .iter() + .enumerate() + .map(|(i, &h)| TickRecord { + t_secs: (i as u64 + 1) * 60, + n_shares: 0, + fired: false, + new_hashrate: None, + current_hashrate_before: true_h, + delta: None, + threshold: None, + h_estimate: Some(h), + ratio_std: None, + effective_n: None, + }) + .collect(); + Trial { + config, + seed: 0, + ticks, + final_hashrate: true_h, + true_hashrate_at_end: true_h, + } + } + + fn cold_start_cell() -> Cell { + Cell { + shares_per_minute: 12.0, + scenario: Scenario::ColdStart, + } + } + + fn trial_with_fires(duration_secs: u64, fire_times: &[u64]) -> Trial { + let config = TrialConfig { + duration_secs, + ..TrialConfig::default() + }; + let ticks = fire_times + .iter() + .map(|&t| TickRecord { + t_secs: t, + n_shares: 0, + fired: true, + new_hashrate: Some(1.0), + current_hashrate_before: 1.0, + delta: None, + threshold: None, + h_estimate: None, + ratio_std: None, + effective_n: None, + }) + .collect(); + Trial { + config, + seed: 0, + ticks, + final_hashrate: 1.0e15, + true_hashrate_at_end: 1.0e15, + } + } + + fn trial_with_final_and_true(final_h: f32, true_h: f32) -> Trial { + let config = TrialConfig::default(); + Trial { + config, + seed: 0, + ticks: vec![], + final_hashrate: final_h, + true_hashrate_at_end: true_h, + } + } + + fn stable_cell() -> Cell { + Cell { + shares_per_minute: 12.0, + scenario: Scenario::Stable, + } + } + + fn step_cell(delta_pct: i32) -> Cell { + Cell { + shares_per_minute: 12.0, + scenario: Scenario::Step { delta_pct }, + } + } + + // ---- Distribution ---- + + #[test] + fn distribution_empty_returns_none_for_stats() { + let d = Distribution::new(vec![]); + assert!(d.percentile(50.0).is_none()); + assert!(d.mean().is_none()); + assert_eq!(d.count(), 0); + } + + #[test] + fn distribution_percentiles_use_nearest_rank() { + let values: Vec = (1..=100).map(|i| i as f64).collect(); + let d = Distribution::new(values); + let p50 = d.p50().unwrap(); + assert!(p50 == 50.0 || p50 == 51.0); + assert_eq!(d.p99().unwrap(), 99.0); + assert_eq!(d.p10().unwrap(), 11.0); + } + + #[test] + fn distribution_mean_is_arithmetic_mean() { + let d = Distribution::new(vec![1.0, 2.0, 3.0, 4.0, 5.0]); + assert_eq!(d.mean().unwrap(), 3.0); + } + + #[test] + fn distribution_filters_nan() { + let d = Distribution::new(vec![1.0, f64::NAN, 2.0]); + assert_eq!(d.count(), 2); + assert_eq!(d.mean().unwrap(), 1.5); + } + + // ---- Convergence helper ---- + + #[test] + fn convergence_no_fires_means_converged_at_zero() { + let t = trial_with_fires(1800, &[]); + assert_eq!(convergence_time_for_trial(&t, 300), Some(0)); + } + + #[test] + fn convergence_picks_first_fire_followed_by_quiet_window() { + let t = trial_with_fires(1800, &[60, 300, 360, 420]); + assert_eq!(convergence_time_for_trial(&t, 600), Some(420)); + } + + #[test] + fn convergence_returns_none_when_fires_never_quiet_down() { + let fires: Vec = (0..30).map(|i| (i + 1) * 60).collect(); + let t = trial_with_fires(1800, &fires); + assert_eq!(convergence_time_for_trial(&t, 600), None); + } + + #[test] + fn convergence_late_fire_too_close_to_trial_end_is_dnf() { + let t = trial_with_fires(1800, &[1700]); + assert_eq!(convergence_time_for_trial(&t, 600), None); + } + + #[test] + fn convergence_rate_aggregates_correctly() { + let trials = vec![ + trial_with_fires(1800, &[]), + trial_with_fires(1800, &[60, 1100]), + { + let fires: Vec = (0..30).map(|i| (i + 1) * 60).collect(); + trial_with_fires(1800, &fires) + }, + ]; + let (rate, dist) = convergence_time_distribution(&trials, 600); + assert!((rate - 2.0 / 3.0).abs() < 1e-9); + assert_eq!(dist.count(), 2); + } + + // ---- Settled accuracy helper ---- + + #[test] + fn settled_accuracy_perfect_estimate_is_zero() { + let t = trial_with_final_and_true(1.0e15, 1.0e15); + assert_eq!(settled_accuracy_for_trial(&t).unwrap(), 0.0); + } + + #[test] + fn settled_accuracy_50_percent_over_is_half() { + let t = trial_with_final_and_true(1.5e15, 1.0e15); + assert!((settled_accuracy_for_trial(&t).unwrap() - 0.5).abs() < 1e-6); + } + + #[test] + fn settled_accuracy_50_percent_under_is_half() { + let t = trial_with_final_and_true(0.5e15, 1.0e15); + assert!((settled_accuracy_for_trial(&t).unwrap() - 0.5).abs() < 1e-6); + } + + #[test] + fn settled_accuracy_zero_truth_returns_none() { + let t = trial_with_final_and_true(1.0e15, 0.0); + assert!(settled_accuracy_for_trial(&t).is_none()); + } + + // ---- Jitter helper ---- + + #[test] + fn jitter_counts_post_settle_fires_per_minute() { + let t = trial_with_fires(1800, &[60, 700, 1000, 1500]); + let j = jitter_for_trial(&t, 300, 120, 600).unwrap(); + assert!((j - 3.0 / 27.0).abs() < 1e-6, "jitter = {j}"); + } + + #[test] + fn jitter_zero_when_no_settled_fires() { + let t = trial_with_fires(1800, &[60]); + let j = jitter_for_trial(&t, 300, 120, 600).unwrap(); + assert_eq!(j, 0.0); + } + + #[test] + fn jitter_none_when_trial_did_not_converge() { + let fires: Vec = (0..30).map(|i| (i + 1) * 60).collect(); + let t = trial_with_fires(1800, &fires); + assert!(jitter_for_trial(&t, 600, 120, 600).is_none()); + } + + // ---- Reaction helpers ---- + + #[test] + fn reaction_time_finds_first_post_event_fire_in_window() { + let t = trial_with_fires(1800, &[60, 500, 950, 1100]); + assert_eq!(reaction_time_for_trial(&t, 900, 300), Some(50)); + } + + #[test] + fn reaction_time_none_when_no_fire_in_window() { + let t = trial_with_fires(1800, &[60, 1100]); + assert!(reaction_time_for_trial(&t, 900, 120).is_none()); + } + + #[test] + fn reaction_time_ignores_fires_at_or_before_event() { + let t = trial_with_fires(1800, &[900, 1500]); + assert!(reaction_time_for_trial(&t, 900, 300).is_none()); + } + + #[test] + fn reaction_sensitivity_aggregates_to_fraction() { + let trials = vec![ + trial_with_fires(1800, &[1000]), + trial_with_fires(1800, &[1100]), + trial_with_fires(1800, &[60]), + trial_with_fires(1800, &[]), + ]; + let sensitivity = reaction_sensitivity(&trials, 900, 300); + assert!((sensitivity - 0.5).abs() < 1e-9); + } + + // ---- Metric trait ---- + + #[test] + fn metric_values_set_and_get_round_trip() { + let mut v = MetricValues::new(); + v.set("a", Some(1.5)); + v.set("b", None); + v.set("c", Some(3.0)); + assert_eq!(v.get("a"), Some(1.5)); + assert_eq!(v.get("b"), None); + assert_eq!(v.get("c"), Some(3.0)); + assert_eq!(v.get("missing"), None); + } + + #[test] + fn metric_values_iterate_in_insertion_order() { + let mut v = MetricValues::new(); + v.set("first", Some(1.0)); + v.set("second", Some(2.0)); + v.set("third", Some(3.0)); + let keys: Vec<&str> = v.iter().map(|(k, _, _)| k).collect(); + assert_eq!(keys, vec!["first", "second", "third"]); + } + + #[test] + fn metric_values_set_with_ci_round_trips() { + let mut v = MetricValues::new(); + v.set_with_ci("p50", Some(0.5), Some(0.45), Some(0.55)); + v.set_with_ci("p99", Some(0.9), None, None); // CI dropped if either side None + assert_eq!(v.get("p50"), Some(0.5)); + assert_eq!(v.get_ci("p50"), Some((0.45, 0.55))); + assert_eq!(v.get("p99"), Some(0.9)); + assert_eq!(v.get_ci("p99"), None); + } + + /// Helper: synthesize a BaselineValue with no CI (collapsed to a + /// point). Used by tolerance tests to exercise the point-based + /// fallback path. + fn bv_point(point: f64) -> BaselineValue { + BaselineValue { + point, + ci_low: None, + ci_high: None, + } + } + + /// Helper: synthesize a BaselineValue with an explicit CI envelope. + fn bv_ci(point: f64, lo: f64, hi: f64) -> BaselineValue { + BaselineValue { + point, + ci_low: Some(lo), + ci_high: Some(hi), + } + } + + #[test] + fn tolerance_higher_is_better_fails_when_current_below_ci_minus_slack() { + let t = Tolerance::WithinCi { + direction: Direction::HigherIsBetter, + extra_abs: 0.01, + extra_mul: None, + }; + // CI [0.93, 0.97], extra_abs 0.01 → fails below 0.92. + assert!(t.apply(bv_ci(0.95, 0.93, 0.97), 0.91).is_some()); + assert!(t.apply(bv_ci(0.95, 0.93, 0.97), 0.92).is_none()); // edge + assert!(t.apply(bv_ci(0.95, 0.93, 0.97), 1.0).is_none()); + } + + #[test] + fn tolerance_lower_is_better_fails_when_current_above_ci_plus_slack() { + let t = Tolerance::WithinCi { + direction: Direction::LowerIsBetter, + extra_abs: 0.02, + extra_mul: None, + }; + // CI [0.03, 0.05], extra_abs 0.02 → fails above 0.07. + assert!(t.apply(bv_ci(0.04, 0.03, 0.05), 0.08).is_some()); + assert!(t.apply(bv_ci(0.04, 0.03, 0.05), 0.07).is_none()); // edge + assert!(t.apply(bv_ci(0.04, 0.03, 0.05), 0.03).is_none()); + } + + #[test] + fn tolerance_with_no_ci_degrades_to_point_check() { + // Without CI, the envelope collapses to the point. The check + // is then "current within point ± extra_abs (in regressing + // direction)". + let t = Tolerance::WithinCi { + direction: Direction::LowerIsBetter, + extra_abs: 0.02, + extra_mul: None, + }; + assert!(t.apply(bv_point(0.04), 0.07).is_some()); + assert!(t.apply(bv_point(0.04), 0.06).is_none()); // edge + assert!(t.apply(bv_point(0.04), 0.03).is_none()); + } + + #[test] + fn tolerance_extra_mul_scales_with_baseline() { + let t = Tolerance::WithinCi { + direction: Direction::LowerIsBetter, + extra_abs: 0.0, + extra_mul: Some(0.10), + }; + // No CI; point = 100; mul = 0.10 → fails above 110. + assert!(t.apply(bv_point(100.0), 111.0).is_some()); + assert!(t.apply(bv_point(100.0), 110.0).is_none()); // edge + assert!(t.apply(bv_point(100.0), 50.0).is_none()); + } + + #[test] + fn tolerance_either_direction_is_two_sided() { + let t = Tolerance::WithinCi { + direction: Direction::Either, + extra_abs: 0.05, + extra_mul: None, + }; + // Baseline 0.00 with no CI; symmetric ±0.05 budget. + assert!(t.apply(bv_point(0.0), 0.06).is_some()); + assert!(t.apply(bv_point(0.0), -0.06).is_some()); + assert!(t.apply(bv_point(0.0), 0.04).is_none()); + assert!(t.apply(bv_point(0.0), -0.04).is_none()); + } + + #[test] + fn tolerance_baseline_zero_with_only_extra_mul_still_caught_by_extra_abs() { + // baseline=0, extra_mul=0.25, extra_abs=0.01 → max slack is + // max(0×0.25=0, 0.01) = 0.01. So current=0.02 fails. + let t = Tolerance::WithinCi { + direction: Direction::LowerIsBetter, + extra_abs: 0.01, + extra_mul: Some(0.25), + }; + assert!(t.apply(bv_point(0.0), 0.02).is_some()); + assert!(t.apply(bv_point(0.0), 0.005).is_none()); + } + + #[test] + fn tolerance_report_only_never_fails() { + let t = Tolerance::ReportOnly; + assert!(t.apply(bv_point(1.0), 1000.0).is_none()); + } + + #[test] + fn registry_returns_metrics_in_canonical_order() { + let r = registry(); + let ids: Vec<&str> = r.iter().map(|m| m.id()).collect(); + assert_eq!( + ids, + vec![ + "convergence_time", + "settled_accuracy", + "jitter", + "reaction_time", + "settled_reaction_time", + "bias", + "variance", + "ramp_target_overshoot", + "upward_step_magnitude", + "log_error_regret", + "fire_decisiveness", + "step_correction", + ] + ); + } + + #[test] + fn log_error_regret_splits_over_and_under_by_sign() { + use crate::baseline::TRUE_HASHRATE; + use crate::grid::AlgorithmSpec; + use crate::trial::run_trial_observed; + use channels_sv2::vardiff::MockClock; + use std::sync::Arc; + + // Cold start: H_est begins far BELOW truth, so e<0 throughout the + // ramp → all regret must land in regret_under, none in regret_over. + let cell = Cell { + shares_per_minute: 12.0, + scenario: Scenario::ColdStart, + }; + let (config, schedule) = cell.scenario.build(cell.shares_per_minute); + let algo = AlgorithmSpec::balanced(); + let trials: Vec<_> = (0..50) + .map(|i| { + let clock = Arc::new(MockClock::new(0)); + run_trial_observed((algo.factory)(clock.clone()), clock, config.clone(), &schedule, i) + }) + .collect(); + + let mv = LogErrorRegret.compute(&trials, &cell); + let over = mv.get("regret_over").unwrap(); + let under = mv.get("regret_under").unwrap(); + let total = mv.get("regret_lin").unwrap(); + // Cold start under-shoots truth, so under-difficulty dominates. + assert!(under > over, "under {under} should exceed over {over} on cold start"); + assert!((over + under - total).abs() < 1e-9, "regret_lin must equal over+under"); + assert!(total > 0.0, "a real ramp must accrue some regret"); + // Sanity: a stable trial starting AT truth accrues far less regret. + let stable_cell = Cell { shares_per_minute: 12.0, scenario: Scenario::Stable }; + let (sc, ss) = stable_cell.scenario.build(12.0); + let _ = TRUE_HASHRATE; // documents the start-at-truth assumption + let stable_trials: Vec<_> = (0..50) + .map(|i| { + let clock = Arc::new(MockClock::new(0)); + run_trial_observed((algo.factory)(clock.clone()), clock, sc.clone(), &ss, i) + }) + .collect(); + let stable_total = LogErrorRegret.compute(&stable_trials, &stable_cell).get("regret_lin").unwrap(); + assert!(stable_total < total, "stable regret {stable_total} should be below cold-start {total}"); + } + + #[test] + fn derived_registry_returns_metrics_in_canonical_order() { + let r = derived_registry(); + let ids: Vec<&str> = r.iter().map(|m| m.id()).collect(); + assert_eq!( + ids, + vec![ + "operational_fitness", + "equal_weight_fitness", + "counter_age_sensitivity", + "comprehensive_fitness", + "decoupling_score", + "reaction_asymmetry" + ] + ); + } + + #[test] + fn reaction_time_only_applies_to_step_scenarios() { + let m = ReactionTime { + event_at_secs: 900, + react_window_secs: 300, + }; + assert!(!m.applies_to(&stable_cell())); + assert!(m.applies_to(&step_cell(-50))); + assert!(m.applies_to(&step_cell(10))); + } + + #[test] + fn reaction_time_tolerance_splits_by_delta_magnitude() { + let m = ReactionTime { + event_at_secs: 900, + react_window_secs: 300, + }; + + // |Δ| ≥ 50 → reaction_rate gets HigherIsBetter check (must detect). + let checks = m.tolerance_checks(&step_cell(-50)); + assert!(checks.iter().any(|c| { + c.key == "reaction_rate" + && matches!( + c.tolerance, + Tolerance::WithinCi { + direction: Direction::HigherIsBetter, + .. + } + ) + })); + + // |Δ| ≤ 5 → reaction_rate gets LowerIsBetter check (must not fire on noise). + let checks = m.tolerance_checks(&step_cell(5)); + assert!(checks.iter().any(|c| { + c.key == "reaction_rate" + && matches!( + c.tolerance, + Tolerance::WithinCi { + direction: Direction::LowerIsBetter, + .. + } + ) + })); + + // |Δ| = 25 (mid-range) → no rate check. + let checks = m.tolerance_checks(&step_cell(25)); + assert!(!checks.iter().any(|c| c.key == "reaction_rate")); + + // p50_secs is always present. + for delta in &[-50, -25, -10, -5, 5, 10, 25, 50] { + let checks = m.tolerance_checks(&step_cell(*delta)); + assert!(checks.iter().any(|c| c.key == "reaction_p50_secs")); + } + } + + #[test] + fn convergence_metric_compute_round_trips_through_metric_values() { + let m = ConvergenceTime { + quiet_window_secs: 600, + }; + // Trial 1: no fires → converges at 0. + // Trial 2: single fire at 1100 → converges at 1100 (no subsequent + // fire, and 1100 + 600 = 1700 ≤ 1800 fits in trial). + // The earlier `[60, 1100]` pattern *would* converge at 60 because + // 1100 is past 60's 600s quiet window; that bug is what motivates + // checking the round-trip explicitly here. + let trials = vec![trial_with_fires(1800, &[]), trial_with_fires(1800, &[1100])]; + let v = m.compute(&trials, &stable_cell()); + assert_eq!(v.get("convergence_rate"), Some(1.0)); + // p50 of converged times {0, 1100}: nearest-rank idx = round(0.5*1) = 1 → 1100. + assert_eq!(v.get("convergence_p50_secs"), Some(1100.0)); + } + + #[test] + fn settled_accuracy_metric_emits_all_percentiles() { + let m = SettledAccuracy; + let trials = vec![ + trial_with_final_and_true(1.0e15, 1.0e15), + trial_with_final_and_true(1.5e15, 1.0e15), + trial_with_final_and_true(0.5e15, 1.0e15), + ]; + let v = m.compute(&trials, &stable_cell()); + assert!(v.get("settled_accuracy_p50").is_some()); + assert!(v.get("settled_accuracy_p90").is_some()); + } + + // ---- Bias ---- + + #[test] + fn bias_zero_when_h_estimate_matches_true() { + let trial = trial_with_observed_ticks(1.0e15, &[1.0e15; 20]); + let m = Bias { + settle_after_secs: 0, + }; + let v = m.compute(&[trial], &stable_cell()); + assert_eq!(v.get("bias_mean"), Some(0.0)); + assert_eq!(v.get("bias_p50"), Some(0.0)); + } + + #[test] + fn bias_positive_when_overestimating() { + let trial = trial_with_observed_ticks(1.0e15, &[1.1e15; 20]); + let m = Bias { + settle_after_secs: 0, + }; + let v = m.compute(&[trial], &stable_cell()); + let bias = v.get("bias_mean").unwrap(); + // f32 precision in (1.1e15 / 1.0e15 - 1.0) gives ~0.10000000149. + // Loose tolerance to absorb the f32 rounding. + assert!((bias - 0.1).abs() < 1e-5, "bias = {}", bias); + } + + #[test] + fn bias_none_when_no_observed_ticks() { + // trial_with_fires builds TickRecords with h_estimate = None; + // bias has no data and emits None values. + let trial = trial_with_fires(1800, &[60]); + let m = Bias { + settle_after_secs: 0, + }; + let v = m.compute(&[trial], &stable_cell()); + assert!(v.get("bias_mean").is_none()); + assert!(v.get("bias_p50").is_none()); + } + + #[test] + fn bias_does_not_apply_to_step_scenarios() { + let m = Bias { + settle_after_secs: 0, + }; + assert!(m.applies_to(&stable_cell())); + assert!(m.applies_to(&cold_start_cell())); + assert!(!m.applies_to(&step_cell(-50))); + assert!(!m.applies_to(&step_cell(25))); + } + + #[test] + fn bias_respects_settle_after_window() { + // 5 ticks: first 3 are below truth (Phase 1 ramp), last 2 are on + // truth. With settle_after_secs cutting at 200, the first 3 are + // excluded (they're at t=60, 120, 180 — all < 200) and the last + // 2 (t=240, 300) contribute bias=0. + let trial = trial_with_observed_ticks(1.0e15, &[0.5e15, 0.7e15, 0.9e15, 1.0e15, 1.0e15]); + let m = Bias { + settle_after_secs: 200, + }; + let v = m.compute(&[trial], &stable_cell()); + assert_eq!(v.get("bias_mean"), Some(0.0)); + } + + // ---- Variance ---- + + #[test] + fn variance_zero_when_h_estimate_constant() { + let trial = trial_with_observed_ticks(1.0e15, &[1.0e15; 20]); + let m = Variance { + settle_after_secs: 0, + }; + let v = m.compute(&[trial], &stable_cell()); + assert_eq!(v.get("variance_mean"), Some(0.0)); + } + + #[test] + fn variance_positive_when_h_estimate_varies() { + // Alternate 0.9 and 1.1 of truth. Normalized values are 0.9 and 1.1, + // mean = 1.0, population variance = ((0.9-1)² + (1.1-1)²) / 2 = 0.01. + let mut estimates = Vec::with_capacity(20); + for i in 0..20 { + estimates.push(if i % 2 == 0 { 0.9e15 } else { 1.1e15 }); + } + let trial = trial_with_observed_ticks(1.0e15, &estimates); + let m = Variance { + settle_after_secs: 0, + }; + let v = m.compute(&[trial], &stable_cell()); + let var = v.get("variance_mean").unwrap(); + // f32 precision again — relax tolerance. + assert!((var - 0.01).abs() < 1e-4, "variance = {}", var); + } + + #[test] + fn variance_none_when_too_few_ticks() { + let trial = trial_with_observed_ticks(1.0e15, &[1.0e15]); // only 1 tick + let m = Variance { + settle_after_secs: 0, + }; + let v = m.compute(&[trial], &stable_cell()); + assert!(v.get("variance_mean").is_none()); + } + + // ---- Phase 1 overshoot ---- + + // ---- Ramp target overshoot ---- + // + // The complementary metric that uses new_hashrate instead of + // h_estimate, so it works for VardiffState (non-observable) too + // and is unaffected by the U256 truncation artifact documented + // in FINDINGS.md §3. + + /// Construct a trial whose only ticks are fires with specified + /// `new_hashrate` values. Used by ramp_target_overshoot tests. + fn trial_with_fire_targets(targets: &[(u64, f32)], true_h: f32) -> Trial { + let config = TrialConfig { + duration_secs: 1800, + ..TrialConfig::default() + }; + let ticks = targets + .iter() + .map(|&(t, h)| TickRecord { + t_secs: t, + n_shares: 0, + fired: true, + new_hashrate: Some(h), + current_hashrate_before: 1.0e10, + delta: None, + threshold: None, + h_estimate: None, + ratio_std: None, + effective_n: None, + }) + .collect(); + Trial { + config, + seed: 0, + ticks, + final_hashrate: targets.last().map(|t| t.1).unwrap_or(0.0), + true_hashrate_at_end: true_h, + } + } + + #[test] + fn ramp_target_overshoot_captures_peak_new_hashrate_above_truth() { + // Targets that overshoot to 1.5e15 before settling at 1e15. + // Peak/true = 1.5; overshoot = 0.5 = 50%. + let trial = trial_with_fire_targets(&[(60, 1.0e14), (120, 1.5e15), (180, 1.0e15)], 1.0e15); + let m = RampTargetOvershoot; + let v = m.compute(&[trial], &cold_start_cell()); + let p50 = v.get("ramp_target_overshoot_p50").unwrap(); + assert!((p50 - 0.5).abs() < 1e-5, "p50 = {}", p50); + } + + #[test] + fn ramp_target_overshoot_zero_when_targets_below_truth() { + // All targets below truth — no overshoot. + let trial = trial_with_fire_targets(&[(60, 3.0e14), (120, 7.0e14), (180, 9.0e14)], 1.0e15); + let m = RampTargetOvershoot; + let v = m.compute(&[trial], &cold_start_cell()); + assert_eq!(v.get("ramp_target_overshoot_p50"), Some(0.0)); + } + + #[test] + fn ramp_target_overshoot_works_without_h_estimate() { + // The whole point: works for non-observable algorithms. + // trial_with_fire_targets sets h_estimate = None on every + // tick; the metric must still produce a value. + let trial = trial_with_fire_targets(&[(60, 1.5e15)], 1.0e15); + let m = RampTargetOvershoot; + let v = m.compute(&[trial], &cold_start_cell()); + assert!(v.get("ramp_target_overshoot_p50").is_some()); + assert!((v.get("ramp_target_overshoot_p50").unwrap() - 0.5).abs() < 1e-5); + } + + #[test] + fn ramp_target_overshoot_none_when_no_fires() { + // Trial with zero fires can't have a target peak. + let trial = trial_with_fires(1800, &[]); + let m = RampTargetOvershoot; + let v = m.compute(&[trial], &cold_start_cell()); + assert!(v.get("ramp_target_overshoot_p50").is_none()); + } + + #[test] + fn ramp_target_overshoot_only_applies_to_cold_start() { + let m = RampTargetOvershoot; + assert!(m.applies_to(&cold_start_cell())); + assert!(!m.applies_to(&stable_cell())); + assert!(!m.applies_to(&step_cell(-50))); + assert!(!m.applies_to(&step_cell(50))); + } + + #[test] + fn ramp_target_overshoot_aggregates_across_trials() { + // Three trials with different peak overshoots: 20%, 50%, 80%. + let trials = vec![ + trial_with_fire_targets(&[(60, 1.2e15)], 1.0e15), + trial_with_fire_targets(&[(60, 1.5e15)], 1.0e15), + trial_with_fire_targets(&[(60, 1.8e15)], 1.0e15), + ]; + let m = RampTargetOvershoot; + let v = m.compute(&trials, &cold_start_cell()); + // Sorted ascending: [0.2, 0.5, 0.8]. Nearest-rank percentile + // indexing: p50 → index round(0.5×2) = 1 → 0.5. + let p50 = v.get("ramp_target_overshoot_p50").unwrap(); + assert!((p50 - 0.5).abs() < 1e-5); + // p90 → index round(0.9×2) = 2 → 0.8. + let p90 = v.get("ramp_target_overshoot_p90").unwrap(); + assert!((p90 - 0.8).abs() < 1e-5); + } + + // ---- Bootstrap CI ---- + + #[test] + fn bootstrap_ci_returns_none_for_empty() { + let mut rng = crate::rng::XorShift64::new(0xCAFE); + let (lo, hi) = bootstrap_percentile_ci(&[], 50.0, 100, &mut rng); + assert!(lo.is_none()); + assert!(hi.is_none()); + } + + #[test] + fn bootstrap_ci_brackets_point_estimate_on_clean_data() { + let values: Vec = (1..=100).map(|i| i as f64).collect(); + let point = Distribution::new(values.clone()).p50().unwrap(); + let mut rng = crate::rng::XorShift64::new(0xBEEF); + let (lo, hi) = bootstrap_percentile_ci(&values, 50.0, 200, &mut rng); + let lo = lo.unwrap(); + let hi = hi.unwrap(); + assert!(lo <= point, "lo={} > point={}", lo, point); + assert!(hi >= point, "hi={} < point={}", hi, point); + // Reasonable bracket width for 100-sample data with 200 resamples. + assert!(hi - lo < 30.0, "ci width = {}", hi - lo); + } + + #[test] + fn bootstrap_ci_is_deterministic_for_fixed_seed() { + let values: Vec = (1..=50).map(|i| i as f64).collect(); + let mut rng_a = crate::rng::XorShift64::new(0xDEAD); + let mut rng_b = crate::rng::XorShift64::new(0xDEAD); + let ci_a = bootstrap_percentile_ci(&values, 50.0, 100, &mut rng_a); + let ci_b = bootstrap_percentile_ci(&values, 50.0, 100, &mut rng_b); + assert_eq!(ci_a, ci_b); + } + + // ---- Decoupling score ---- + + /// Helper to extract `score` from a (spm, MetricValues) pair. + fn score_at(scores: &[(f32, MetricValues)], spm: f32) -> Option { + scores + .iter() + .find(|(s, _)| *s == spm) + .and_then(|(_, mv)| mv.get("score")) + } + + #[test] + fn decoupling_score_combines_stable_jitter_and_step_reaction() { + let mut stable = CellResult::new(12.0, Scenario::Stable); + let mut jit = MetricValues::new(); + jit.set("jitter_p50_per_min", Some(0.1)); + stable.metrics.insert("jitter", jit); + + let mut step = CellResult::new(12.0, Scenario::Step { delta_pct: -50 }); + let mut react = MetricValues::new(); + react.set("reaction_rate", Some(0.8)); + step.metrics.insert("reaction_time", react); + + let scores = DecouplingScore.compute(&[stable, step]); + assert_eq!(scores.len(), 1); + // reaction_rate (0.8) × clamp(1 − 0.1/0.5, 0, 1) = 0.8 × 0.8 = 0.64 + let score = score_at(&scores, 12.0).unwrap(); + assert!((score - 0.64).abs() < 1e-9, "score = {}", score); + } + + #[test] + fn decoupling_score_omits_share_rate_when_one_input_missing() { + let mut stable = CellResult::new(12.0, Scenario::Stable); + let mut jit = MetricValues::new(); + jit.set("jitter_p50_per_min", Some(0.1)); + stable.metrics.insert("jitter", jit); + // No Step cell at this rate. + + let scores = DecouplingScore.compute(&[stable]); + assert!(scores.is_empty()); + } + + #[test] + fn decoupling_score_clamps_jitter_above_ceiling_to_zero_factor() { + // jitter at the ceiling: (1 - 0.5/0.5) = 0, factor clamps to 0, + // score = reaction_rate * 0 = 0. + let mut stable = CellResult::new(12.0, Scenario::Stable); + let mut jit = MetricValues::new(); + jit.set("jitter_p50_per_min", Some(0.5)); + stable.metrics.insert("jitter", jit); + + let mut step = CellResult::new(12.0, Scenario::Step { delta_pct: -50 }); + let mut react = MetricValues::new(); + react.set("reaction_rate", Some(1.0)); + step.metrics.insert("reaction_time", react); + + let scores = DecouplingScore.compute(&[stable, step]); + assert_eq!(score_at(&scores, 12.0), Some(0.0)); + } + + #[test] + fn decoupling_scores_sorted_by_share_rate() { + // Build cells out of order; expect sorted ascending output. + let mut cells = Vec::new(); + for &spm in &[12.0f32, 60.0, 6.0] { + let mut s = CellResult::new(spm, Scenario::Stable); + let mut j = MetricValues::new(); + j.set("jitter_p50_per_min", Some(0.05)); + s.metrics.insert("jitter", j); + cells.push(s); + + let mut st = CellResult::new(spm, Scenario::Step { delta_pct: -50 }); + let mut r = MetricValues::new(); + r.set("reaction_rate", Some(0.9)); + st.metrics.insert("reaction_time", r); + cells.push(st); + } + let scores = DecouplingScore.compute(&cells); + assert_eq!(scores.len(), 3); + assert_eq!(scores[0].0, 6.0); + assert_eq!(scores[1].0, 12.0); + assert_eq!(scores[2].0, 60.0); + } + + // ---- Reaction asymmetry ---- + + fn step_cell_with_rate(spm: f32, delta_pct: i32, rate: f64) -> CellResult { + let mut c = CellResult::new(spm, Scenario::Step { delta_pct }); + let mut mv = MetricValues::new(); + mv.set("reaction_rate", Some(rate)); + c.metrics.insert("reaction_time", mv); + c + } + + #[test] + fn reaction_asymmetry_computes_signed_delta_per_magnitude() { + let cells = vec![ + step_cell_with_rate(12.0, 50, 0.95), + step_cell_with_rate(12.0, -50, 0.85), + step_cell_with_rate(12.0, 25, 0.6), + step_cell_with_rate(12.0, -25, 0.7), + ]; + let out = ReactionAsymmetry.compute(&cells); + assert_eq!(out.len(), 1); + let (spm, mv) = &out[0]; + assert_eq!(*spm, 12.0); + let a50 = mv.get("asymmetry_at_50").unwrap(); + let a25 = mv.get("asymmetry_at_25").unwrap(); + assert!((a50 - 0.10).abs() < 1e-9, "asymmetry_at_50 = {}", a50); + assert!((a25 - (-0.10)).abs() < 1e-9, "asymmetry_at_25 = {}", a25); + } + + #[test] + fn reaction_asymmetry_omits_magnitudes_missing_one_side() { + // Only +50 present; no −50 → no asymmetry_at_50 emitted. + let cells = vec![step_cell_with_rate(12.0, 50, 0.95)]; + let out = ReactionAsymmetry.compute(&cells); + assert!(out.is_empty(), "no symmetric pair → no spm row"); + } + + #[test] + fn reaction_asymmetry_renders_per_magnitude_columns() { + let cells = vec![ + step_cell_with_rate(12.0, 50, 0.95), + step_cell_with_rate(12.0, -50, 0.85), + ]; + let mut out = String::new(); + ReactionAsymmetry.render_markdown(&cells, &mut out); + assert!(out.contains("Reaction asymmetry")); + assert!(out.contains("δ=50%")); + assert!(out.contains("+0.10")); // signed format + } + + // ---- CounterAgeSensitivity ---- + + fn settled_cell(spm: f32, settle_minutes: u64, delta_pct: i32, p50_secs: f64) -> CellResult { + settled_cell_with_rate(spm, settle_minutes, delta_pct, p50_secs, 1.0) + } + + fn settled_cell_with_rate( + spm: f32, + settle_minutes: u64, + delta_pct: i32, + p50_secs: f64, + reaction_rate: f64, + ) -> CellResult { + let mut r = CellResult::new( + spm, + Scenario::SettledStep { + settle_minutes, + delta_pct, + }, + ); + let mut mv = MetricValues::new(); + mv.set("settled_reaction_rate", Some(reaction_rate)); + mv.set("settled_reaction_p50_secs", Some(p50_secs)); + r.metrics.insert("settled_reaction_time", mv); + r + } + + #[test] + fn counter_age_sensitivity_ratio_1_for_age_independent() { + let cells = vec![ + settled_cell(12.0, 5, -50, 120.0), + settled_cell(12.0, 60, -50, 120.0), + settled_cell_with_rate(12.0, 60, -10, 300.0, 0.85), + ]; + let out = CounterAgeSensitivity.compute(&cells); + assert_eq!(out.len(), 1); + let (spm, mv) = &out[0]; + assert_eq!(*spm, 12.0); + let ratio = mv.get("ratio_50pct").unwrap(); + assert!((ratio - 1.0).abs() < 0.01, "ratio should be 1.0, got {}", ratio); + // Score is the mature-counter -10% detection rate + let score = mv.get("score").unwrap(); + assert!((score - 0.85).abs() < 0.01, "score should be 0.85, got {}", score); + } + + #[test] + fn counter_age_sensitivity_high_ratio_for_age_dependent() { + let cells = vec![ + settled_cell(12.0, 5, -50, 120.0), + settled_cell(12.0, 60, -50, 1200.0), + settled_cell_with_rate(12.0, 60, -10, 3000.0, 0.05), // barely detects + ]; + let out = CounterAgeSensitivity.compute(&cells); + assert_eq!(out.len(), 1); + let (_, mv) = &out[0]; + let ratio = mv.get("ratio_50pct").unwrap(); + assert!((ratio - 10.0).abs() < 0.01, "ratio should be 10.0, got {}", ratio); + // Score is the low detection rate + let score = mv.get("score").unwrap(); + assert!((score - 0.05).abs() < 0.01, "score should be 0.05, got {}", score); + } + + #[test] + fn counter_age_sensitivity_empty_without_settled_cells() { + let cells = vec![CellResult::new(12.0, Scenario::Stable)]; + let out = CounterAgeSensitivity.compute(&cells); + assert!(out.is_empty()); + } + + #[test] + fn counter_age_sensitivity_handles_missing_mature_cell() { + // Only young cell, no mature — should produce no output + let cells = vec![settled_cell(12.0, 5, -50, 120.0)]; + let out = CounterAgeSensitivity.compute(&cells); + assert!(out.is_empty()); + } + + #[test] + fn counter_age_sensitivity_multiple_share_rates() { + let cells = vec![ + settled_cell(6.0, 5, -50, 120.0), + settled_cell(6.0, 60, -50, 600.0), + settled_cell_with_rate(6.0, 60, -10, 1800.0, 0.50), + settled_cell(20.0, 5, -50, 60.0), + settled_cell(20.0, 60, -50, 60.0), + settled_cell_with_rate(20.0, 60, -10, 300.0, 0.90), + ]; + let out = CounterAgeSensitivity.compute(&cells); + assert_eq!(out.len(), 2); + // spm=6: ratio=5.0, score=0.50 + let (spm6, mv6) = &out[0]; + assert_eq!(*spm6, 6.0); + assert!((mv6.get("ratio_50pct").unwrap() - 5.0).abs() < 0.01); + assert!((mv6.get("score").unwrap() - 0.50).abs() < 0.01); + // spm=20: ratio=1.0, score=0.90 + let (spm20, mv20) = &out[1]; + assert_eq!(*spm20, 20.0); + assert!((mv20.get("ratio_50pct").unwrap() - 1.0).abs() < 0.01); + assert!((mv20.get("score").unwrap() - 0.90).abs() < 0.01); + } + + // ---- ComprehensiveFitness ---- + + #[test] + fn comprehensive_fitness_combines_operational_and_counter_age() { + let mut cells = vec![ + CellResult::new(12.0, Scenario::Stable), + CellResult::new(12.0, Scenario::Step { delta_pct: -10 }), + CellResult::new(12.0, Scenario::Step { delta_pct: -50 }), + CellResult::new(12.0, Scenario::ColdStart), + settled_cell(12.0, 5, -50, 120.0), + settled_cell(12.0, 60, -50, 120.0), + settled_cell_with_rate(12.0, 60, -10, 300.0, 0.80), + ]; + let mut stable_mv = MetricValues::new(); + stable_mv.set("jitter_mean_per_min", Some(0.0)); + stable_mv.set("upward_step_magnitude_p95", Some(1.0)); + cells[0].metrics.insert("jitter", stable_mv); + let mut step_mag_mv = MetricValues::new(); + step_mag_mv.set("upward_step_magnitude_p95", Some(1.0)); + cells[0].metrics.insert("upward_step_magnitude", step_mag_mv); + + let out = ComprehensiveFitness.compute(&cells); + assert!(!out.is_empty()); + let (spm, mv) = &out[0]; + assert_eq!(*spm, 12.0); + let comp = mv.get("score").unwrap(); + let op = mv.get("operational_component").unwrap(); + let ca = mv.get("counter_age_component").unwrap(); + // counter_age_component = mature-counter detection rate = 0.80 + assert!((ca - 0.80).abs() < 0.01); + let expected = 0.80 * op + 0.20 * ca; + assert!( + (comp - expected).abs() < 0.001, + "comprehensive={} != 0.80*{}+0.20*{}={}", + comp, op, ca, expected + ); + } + + #[test] + fn comprehensive_fitness_penalizes_age_dependent() { + // Good: detects 90% at mature counter; Bad: detects 5% + let cells_good = vec![ + settled_cell_with_rate(12.0, 60, -10, 300.0, 0.90), + ]; + let cells_bad = vec![ + settled_cell_with_rate(12.0, 60, -10, 3000.0, 0.05), + ]; + let ca_good = CounterAgeSensitivity.compute(&cells_good); + let ca_bad = CounterAgeSensitivity.compute(&cells_bad); + let score_good = ca_good[0].1.get("score").unwrap(); + let score_bad = ca_bad[0].1.get("score").unwrap(); + assert!( + score_good > score_bad, + "high detection rate ({}) should score higher than low ({})", + score_good, + score_bad + ); + } + + #[test] + fn comprehensive_fitness_defaults_to_1_without_counter_age_data() { + let cells = vec![ + CellResult::new(12.0, Scenario::Stable), + CellResult::new(12.0, Scenario::ColdStart), + ]; + let out = ComprehensiveFitness.compute(&cells); + if !out.is_empty() { + let (_, mv) = &out[0]; + let ca = mv.get("counter_age_component").unwrap_or(1.0); + assert!((ca - 1.0).abs() < 0.01, "should default to 1.0 without data"); + } + } +} diff --git a/sv2/channels-sv2/sim/src/naming.rs b/sv2/channels-sv2/sim/src/naming.rs new file mode 100644 index 0000000000..eebbfe8d3b --- /dev/null +++ b/sv2/channels-sv2/sim/src/naming.rs @@ -0,0 +1,71 @@ +//! Drift-proof algorithm naming derived from the three composed parts. +//! +//! A composed algorithm's name is built from the `code()` of each of its +//! three stages ([`Estimator`], [`Boundary`], [`UpdateRule`]). Because +//! each `code()` is computed from the concrete type's live parameters, +//! the name can never drift away from what the algorithm actually does. +//! +//! The display name uses `" / "` separators (e.g. +//! `"Ewma120s / Poisson-z2.58 / Partial-e0.2"`); [`sanitize_filename`] +//! converts it to a filesystem-safe form for `baseline_{name}.toml`. + +use crate::composed::{Boundary, Estimator, UpdateRule}; + +/// Display name: `"Estimator / Boundary / Update"`. +pub fn triple_name(e: &dyn Estimator, b: &dyn Boundary, u: &dyn UpdateRule) -> String { + format!("{} / {} / {}", e.code(), b.code(), u.code()) +} + +/// Filesystem-safe variant of a display name: `" / "` → `"__"`, spaces +/// removed, and the monolith marker `'*'` mapped to `"-monolith"` so the +/// `VardiffState` monolith and `ClassicComposed` produce different +/// filenames even though they are fire-equivalent. +pub fn sanitize_filename(display_name: &str) -> String { + display_name + .replace(" / ", "__") + .replace(' ', "") + .replace('*', "-monolith") +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::composed::{ + CumulativeCounter, EwmaEstimator, FullRetargetWithClamp, PartialRetarget, PoissonCI, + StepFunction, + }; + + #[test] + fn triple_name_full_remedy() { + let name = triple_name( + &EwmaEstimator::new(120), + &PoissonCI::default_parametric(), + &PartialRetarget::new(0.2), + ); + assert_eq!(name, "Ewma120s / Poisson-z2.58 / Partial-e0.2"); + } + + #[test] + fn sanitize_replaces_separators_and_spaces() { + assert_eq!( + sanitize_filename("Ewma120s / Poisson-z2.58 / Partial-e0.2"), + "Ewma120s__Poisson-z2.58__Partial-e0.2" + ); + } + + #[test] + fn sanitize_monolith_marker_differs_from_composed() { + let composed = triple_name( + &CumulativeCounter::new(), + &StepFunction::classic_table(), + &FullRetargetWithClamp::classic(), + ); + let monolith = format!("{composed}*"); + assert_ne!( + sanitize_filename(&composed), + sanitize_filename(&monolith), + "monolith and composed must produce different filenames" + ); + assert!(sanitize_filename(&monolith).ends_with("-monolith")); + } +} diff --git a/sv2/channels-sv2/sim/src/regression.rs b/sv2/channels-sv2/sim/src/regression.rs new file mode 100644 index 0000000000..9894f91482 --- /dev/null +++ b/sv2/channels-sv2/sim/src/regression.rs @@ -0,0 +1,718 @@ +//! Regression testing against a checked-in baseline. +//! +//! Loads a committed baseline TOML, re-runs the same characterization +//! grid against the current algorithm, and asserts each metric is +//! within tolerance of the recorded value. +//! +//! ## Registry-driven comparator +//! +//! Tolerance policy lives on each [`crate::metrics::Metric`] impl — +//! `compare_to_baseline` iterates [`crate::metrics::registry`], pulls +//! [`crate::metrics::Metric::tolerance_checks`] for each cell, and +//! applies them uniformly. Adding a metric is one new `impl Metric` +//! with no edits here. +//! +//! The parser is correspondingly uniform: it reads every numeric cell +//! field into a flat `HashMap` and lets each metric +//! decide which keys it cares about, rather than parsing into a typed +//! `CellBaseline` struct with per-metric fields. + +use std::collections::HashMap; + +use crate::baseline::{Cell, CellResult, Scenario}; +use crate::metrics; + +/// Parsed baseline document — the in-memory representation of a +/// `baseline_.toml` file. +#[derive(Debug, Clone)] +pub struct BaselineDoc { + pub meta: BaselineMeta, + /// Keyed by the full cell key (e.g., `spm_12.stable_1ph`). + pub cells: HashMap, + /// Derived-metric values, keyed by `.spm_` (e.g., + /// `decoupling_score.spm_6`). Each value is a flat key→f64 map of + /// the derived metric's outputs at that share rate. + pub derived: HashMap>, +} + +#[derive(Debug, Clone)] +pub struct BaselineMeta { + pub algorithm: String, + pub trial_count: usize, + pub base_seed: u64, +} + +/// A single cell's baseline values. Carries a flat `raw` map of +/// every numeric field in the TOML; the metric impls decide which +/// keys they want to compare. The two cell-coordinate fields +/// (`shares_per_minute`, `scenario`) are extracted explicitly so the +/// comparator can reconstruct a [`Cell`] for `metric.applies_to(...)` +/// and `metric.tolerance_checks(...)`. +#[derive(Debug, Clone, Default)] +pub struct CellBaseline { + pub shares_per_minute: f32, + pub scenario: String, + /// Every numeric (`f64`) field from this cell's TOML section, + /// keyed by its TOML name (`convergence_rate`, + /// `jitter_p50_per_min`, etc.). Looked up by metric tolerance + /// checks. + pub raw: HashMap, +} + +/// A single tolerance violation found by comparing a current +/// measurement against the baseline. +#[derive(Debug, Clone)] +pub struct Discrepancy { + pub cell_key: String, + pub metric: String, + pub baseline: f64, + pub current: f64, + pub tolerance: String, +} + +impl std::fmt::Display for Discrepancy { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{}: {} = {:.4} vs baseline {:.4} (tolerance: {})", + self.cell_key, self.metric, self.current, self.baseline, self.tolerance, + ) + } +} + +#[derive(Debug, Default)] +pub struct ComparisonReport { + pub failures: Vec, + pub baseline_cells_not_in_current: Vec, + pub current_cells_not_in_baseline: Vec, +} + +impl ComparisonReport { + pub fn is_clean(&self) -> bool { + self.failures.is_empty() + && self.baseline_cells_not_in_current.is_empty() + && self.current_cells_not_in_baseline.is_empty() + } +} + +// ============================================================================ +// TOML parsing +// ============================================================================ + +/// Parses a baseline TOML document. Implements the small subset of +/// TOML our serializer emits. +pub fn parse_baseline_toml(input: &str) -> Result { + let mut current_section: Option = None; + let mut meta_kv: HashMap = HashMap::new(); + let mut cells_kv: HashMap> = HashMap::new(); + let mut derived_kv: HashMap> = HashMap::new(); + + for (line_no, raw_line) in input.lines().enumerate() { + let line = raw_line.trim(); + if line.is_empty() || line.starts_with('#') { + continue; + } + if let Some(section) = line.strip_prefix('[').and_then(|s| s.strip_suffix(']')) { + current_section = Some(section.to_string()); + continue; + } + let (key, raw_value) = line + .split_once('=') + .ok_or_else(|| ParseError::MalformedLine(line_no + 1, line.to_string()))?; + let key = key.trim().to_string(); + let value = parse_value(raw_value.trim()) + .ok_or_else(|| ParseError::MalformedValue(line_no + 1, raw_value.trim().to_string()))?; + match current_section.as_deref() { + Some("meta") => { + meta_kv.insert(key, value); + } + Some(s) if s.starts_with("cell.") => { + let cell_key = s.strip_prefix("cell.").unwrap().to_string(); + cells_kv.entry(cell_key).or_default().insert(key, value); + } + Some(s) if s.starts_with("derived.") => { + let derived_key = s.strip_prefix("derived.").unwrap().to_string(); + derived_kv + .entry(derived_key) + .or_default() + .insert(key, value); + } + Some(other) => { + return Err(ParseError::UnknownSection(line_no + 1, other.to_string())); + } + None => { + return Err(ParseError::OrphanKey(line_no + 1, key)); + } + } + } + + let meta = BaselineMeta { + algorithm: meta_kv + .get("algorithm") + .and_then(RawValue::as_string) + .ok_or(ParseError::MissingMetaKey("algorithm"))?, + trial_count: meta_kv + .get("trial_count") + .and_then(RawValue::as_int) + .ok_or(ParseError::MissingMetaKey("trial_count"))? as usize, + base_seed: meta_kv + .get("base_seed") + .and_then(RawValue::as_u64) + .ok_or(ParseError::MissingMetaKey("base_seed"))?, + }; + + let mut cells = HashMap::with_capacity(cells_kv.len()); + for (key, kv) in cells_kv { + let shares_per_minute = kv + .get("shares_per_minute") + .and_then(RawValue::as_float) + .ok_or(ParseError::MissingCellKey(key.clone(), "shares_per_minute"))? + as f32; + let scenario = kv + .get("scenario") + .and_then(RawValue::as_string) + .ok_or(ParseError::MissingCellKey(key.clone(), "scenario"))?; + + // Every other numeric field is shoveled into `raw` as f64. The + // metric tolerance checks look up by key name; metrics that + // don't care about a particular key simply don't reference it. + let mut raw: HashMap = HashMap::new(); + for (k, v) in &kv { + if k == "shares_per_minute" || k == "scenario" { + continue; + } + if let Some(f) = v.as_float() { + raw.insert(k.clone(), f); + } + } + + cells.insert( + key, + CellBaseline { + shares_per_minute, + scenario, + raw, + }, + ); + } + + // Convert derived RawValue maps to flat HashMap, + // dropping non-numeric values (shouldn't occur for derived + // sections in practice but defended against just in case). + let derived: HashMap> = derived_kv + .into_iter() + .map(|(k, kv)| { + let flat: HashMap = kv + .into_iter() + .filter_map(|(k2, v)| v.as_float().map(|f| (k2, f))) + .collect(); + (k, flat) + }) + .collect(); + + Ok(BaselineDoc { + meta, + cells, + derived, + }) +} + +#[derive(Debug, Clone)] +enum RawValue { + Int(i64), + /// Unsigned integer wider than `i64::MAX` (e.g., `base_seed` which + /// can be any `u64`). + Uint(u64), + Float(f64), + Str(String), +} + +impl RawValue { + fn as_float(&self) -> Option { + match self { + RawValue::Int(i) => Some(*i as f64), + RawValue::Uint(u) => Some(*u as f64), + RawValue::Float(f) => Some(*f), + RawValue::Str(_) => None, + } + } + fn as_int(&self) -> Option { + match self { + RawValue::Int(i) => Some(*i), + RawValue::Uint(u) if *u <= i64::MAX as u64 => Some(*u as i64), + _ => None, + } + } + fn as_u64(&self) -> Option { + match self { + RawValue::Uint(u) => Some(*u), + RawValue::Int(i) if *i >= 0 => Some(*i as u64), + _ => None, + } + } + fn as_string(&self) -> Option { + match self { + RawValue::Str(s) => Some(s.clone()), + _ => None, + } + } +} + +fn parse_value(s: &str) -> Option { + if let Some(quoted) = s.strip_prefix('"').and_then(|q| q.strip_suffix('"')) { + return Some(RawValue::Str(quoted.to_string())); + } + if let Some(hex) = s.strip_prefix("0x").or_else(|| s.strip_prefix("0X")) { + return u64::from_str_radix(hex, 16).ok().map(RawValue::Uint); + } + if let Ok(i) = s.parse::() { + return Some(RawValue::Int(i)); + } + if let Ok(u) = s.parse::() { + return Some(RawValue::Uint(u)); + } + if let Ok(f) = s.parse::() { + return Some(RawValue::Float(f)); + } + None +} + +#[derive(Debug, Clone)] +pub enum ParseError { + MalformedLine(usize, String), + MalformedValue(usize, String), + UnknownSection(usize, String), + OrphanKey(usize, String), + MissingMetaKey(&'static str), + MissingCellKey(String, &'static str), +} + +impl std::fmt::Display for ParseError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + ParseError::MalformedLine(l, s) => write!(f, "line {l}: malformed line {s:?}"), + ParseError::MalformedValue(l, s) => write!(f, "line {l}: malformed value {s:?}"), + ParseError::UnknownSection(l, s) => write!(f, "line {l}: unknown section [{s}]"), + ParseError::OrphanKey(l, k) => write!(f, "line {l}: key {k:?} outside any section"), + ParseError::MissingMetaKey(k) => write!(f, "missing required meta key {k:?}"), + ParseError::MissingCellKey(c, k) => { + write!(f, "cell {c:?}: missing required key {k:?}") + } + } + } +} + +impl std::error::Error for ParseError {} + +// ============================================================================ +// Comparison +// ============================================================================ + +/// Compares a fresh baseline run against the checked-in baseline. +/// +/// Iterates [`metrics::registry`] for each cell and applies the +/// declared `tolerance_checks`. Adding a new metric is one new +/// `impl Metric` in `metrics.rs` — no edit here required. +pub fn compare_to_baseline(current: &[CellResult], baseline: &BaselineDoc) -> ComparisonReport { + let mut report = ComparisonReport::default(); + + // Index current results by cell key for O(1) lookup. + let current_by_key: HashMap = current + .iter() + .map(|r| { + ( + format!("spm_{}.{}", r.shares_per_minute as u32, r.scenario_key()), + r, + ) + }) + .collect(); + + let registry = metrics::registry(); + + for (cell_key, b) in &baseline.cells { + let Some(c) = current_by_key.get(cell_key) else { + report.baseline_cells_not_in_current.push(cell_key.clone()); + continue; + }; + + // Reconstruct the Cell so each metric can decide applies_to / + // tolerance_checks. We trust the baseline's recorded + // `shares_per_minute` and `scenario` here — if the parsed + // scenario string doesn't map to a known Scenario variant we + // skip the cell with a warning rather than fail (the comparator + // is a regression check, not a schema validator). + let Some(scenario) = Scenario::from_key(&b.scenario) else { + // Unrecognized scenario in baseline — skip rather than panic. + // This shouldn't happen with the checked-in baseline but + // guards against schema drift. + continue; + }; + let cell = Cell { + shares_per_minute: b.shares_per_minute, + scenario, + }; + + for metric in ®istry { + if !metric.applies_to(&cell) { + continue; + } + for check in metric.tolerance_checks(&cell) { + let baseline_point = b.raw.get(check.key).copied(); + let ci_low_key = format!("{}_ci_low", check.key); + let ci_high_key = format!("{}_ci_high", check.key); + let baseline_ci_low = b.raw.get(&ci_low_key).copied(); + let baseline_ci_high = b.raw.get(&ci_high_key).copied(); + let current_val = c.get(check.key); + if let (Some(point), Some(cv)) = (baseline_point, current_val) { + let bv = metrics::BaselineValue { + point, + ci_low: baseline_ci_low, + ci_high: baseline_ci_high, + }; + if let Some(rule_desc) = check.tolerance.apply(bv, cv) { + report.failures.push(Discrepancy { + cell_key: cell_key.clone(), + metric: check.key.to_string(), + baseline: point, + current: cv, + tolerance: rule_desc, + }); + } + } + } + } + } + + for cell_key in current_by_key.keys() { + if !baseline.cells.contains_key(cell_key) { + report.current_cells_not_in_baseline.push(cell_key.clone()); + } + } + + // Derived metrics: iterate derived_registry(), compute current + // values from the current cell results, look up the matching + // baseline section, and apply per-derived-metric tolerance with + // baseline CI bounds. + for derived in metrics::derived_registry() { + let current_per_spm = derived.compute(current); + for (spm, current_mv) in current_per_spm { + let baseline_key = format!("{}.spm_{}", derived.id(), spm as u32); + let baseline_kv = match baseline.derived.get(&baseline_key) { + Some(kv) => kv, + None => continue, // baseline lacks this spm; not a failure + }; + for check in derived.tolerance_checks(spm) { + let current_val = current_mv.get(check.key); + let baseline_point = baseline_kv.get(check.key).copied(); + let baseline_ci_low = baseline_kv.get(&format!("{}_ci_low", check.key)).copied(); + let baseline_ci_high = baseline_kv.get(&format!("{}_ci_high", check.key)).copied(); + if let (Some(point), Some(cv)) = (baseline_point, current_val) { + let bv = metrics::BaselineValue { + point, + ci_low: baseline_ci_low, + ci_high: baseline_ci_high, + }; + if let Some(rule_desc) = check.tolerance.apply(bv, cv) { + report.failures.push(Discrepancy { + cell_key: baseline_key.clone(), + metric: check.key.to_string(), + baseline: point, + current: cv, + tolerance: rule_desc, + }); + } + } + } + } + } + + report +} + +// ============================================================================ +// Tests +// ============================================================================ + +#[cfg(test)] +mod tests { + use super::*; + use crate::baseline::{default_cells, run_baseline}; + use crate::metrics::MetricValues; + + /// Builder shorthand used by the comparator tests. + fn cell_result_with( + spm: f32, + scenario: Scenario, + metric_id: &'static str, + kvs: &[(&'static str, f64)], + ) -> CellResult { + let mut cr = CellResult::new(spm, scenario); + let mut mv = MetricValues::new(); + for &(k, v) in kvs { + mv.set(k, Some(v)); + } + cr.metrics.insert(metric_id, mv); + cr + } + + #[test] + fn parser_handles_minimal_document() { + let toml = r#" +# A comment +[meta] +algorithm = "VardiffState" +trial_count = 1000 +base_seed = 0xDEADBEEF + +[cell.spm_12.stable_1ph] +shares_per_minute = 12 +scenario = "stable_1ph" +convergence_rate = 0.95 +jitter_p50_per_min = 0.04 + "#; + let doc = parse_baseline_toml(toml).expect("should parse"); + assert_eq!(doc.meta.algorithm, "VardiffState"); + assert_eq!(doc.meta.trial_count, 1000); + assert_eq!(doc.meta.base_seed, 0xDEADBEEF); + let cell = &doc.cells["spm_12.stable_1ph"]; + assert_eq!(cell.shares_per_minute, 12.0); + assert_eq!(cell.scenario, "stable_1ph"); + assert_eq!(cell.raw.get("convergence_rate"), Some(&0.95)); + assert_eq!(cell.raw.get("jitter_p50_per_min"), Some(&0.04)); + assert!(cell.raw.get("reaction_rate").is_none()); + } + + #[test] + fn parser_handles_u64_base_seed_beyond_i64_max() { + let hex_toml = r#" +[meta] +algorithm = "VardiffState" +trial_count = 1000 +base_seed = 0xDEADBEEFCAFEF00D + "#; + let doc = parse_baseline_toml(hex_toml).expect("hex base_seed should parse"); + assert_eq!(doc.meta.base_seed, 0xDEAD_BEEF_CAFE_F00D); + + let decimal_toml = r#" +[meta] +algorithm = "VardiffState" +trial_count = 1000 +base_seed = 16045690984503111693 + "#; + let doc = parse_baseline_toml(decimal_toml).expect("large decimal base_seed should parse"); + assert_eq!(doc.meta.base_seed, 16045690984503111693u64); + } + + #[test] + fn parser_rejects_orphan_key() { + let toml = "orphan = 1\n"; + assert!(matches!( + parse_baseline_toml(toml).unwrap_err(), + ParseError::OrphanKey(_, _) + )); + } + + #[test] + fn parser_rejects_missing_required_meta_keys() { + let toml = "[meta]\nalgorithm = \"X\"\n"; + assert!(matches!( + parse_baseline_toml(toml).unwrap_err(), + ParseError::MissingMetaKey("trial_count") + )); + } + + #[test] + fn comparison_reports_clean_for_identical_run() { + let toml = r#" +[meta] +algorithm = "VardiffState" +trial_count = 1 +base_seed = 1 + +[cell.spm_12.stable_1ph] +shares_per_minute = 12 +scenario = "stable_1ph" +convergence_rate = 0.95 +jitter_p50_per_min = 0.04 +jitter_p95_per_min = 0.20 + "#; + let baseline = parse_baseline_toml(toml).unwrap(); + + let mut cr = CellResult::new(12.0, Scenario::Stable); + let mut conv = MetricValues::new(); + conv.set("convergence_rate", Some(0.95)); + cr.metrics.insert("convergence_time", conv); + let mut jit = MetricValues::new(); + jit.set("jitter_p50_per_min", Some(0.04)); + jit.set("jitter_p95_per_min", Some(0.20)); + cr.metrics.insert("jitter", jit); + + let report = compare_to_baseline(&[cr], &baseline); + assert!(report.is_clean(), "Expected clean report, got {report:#?}"); + } + + #[test] + fn comparison_flags_convergence_rate_drop() { + let toml = r#" +[meta] +algorithm = "VardiffState" +trial_count = 1 +base_seed = 1 + +[cell.spm_12.stable_1ph] +shares_per_minute = 12 +scenario = "stable_1ph" +convergence_rate = 0.95 + "#; + let baseline = parse_baseline_toml(toml).unwrap(); + let cr = cell_result_with( + 12.0, + Scenario::Stable, + "convergence_time", + &[("convergence_rate", 0.80)], // dropped by 15pp + ); + let report = compare_to_baseline(&[cr], &baseline); + assert_eq!(report.failures.len(), 1); + assert_eq!(report.failures[0].metric, "convergence_rate"); + } + + #[test] + fn comparison_flags_jitter_increase_beyond_absolute_tolerance() { + let toml = r#" +[meta] +algorithm = "VardiffState" +trial_count = 1 +base_seed = 1 + +[cell.spm_12.stable_1ph] +shares_per_minute = 12 +scenario = "stable_1ph" +jitter_p50_per_min = 0.04 + "#; + let baseline = parse_baseline_toml(toml).unwrap(); + let cr = cell_result_with( + 12.0, + Scenario::Stable, + "jitter", + &[("jitter_p50_per_min", 0.10)], // 0.04 + 0.06 > 0.04 + 0.02 + ); + let report = compare_to_baseline(&[cr], &baseline); + assert_eq!(report.failures.len(), 1); + assert_eq!(report.failures[0].metric, "jitter_p50_per_min"); + } + + #[test] + fn comparison_flags_reaction_rate_drop_at_large_delta() { + let toml = r#" +[meta] +algorithm = "VardiffState" +trial_count = 1 +base_seed = 1 + +[cell.spm_12.step_minus_50_at_15min] +shares_per_minute = 12 +scenario = "step_minus_50_at_15min" +reaction_rate = 0.90 + "#; + let baseline = parse_baseline_toml(toml).unwrap(); + let cr = cell_result_with( + 12.0, + Scenario::Step { delta_pct: -50 }, + "reaction_time", + &[("reaction_rate", 0.80)], // -0.10 vs -0.02 tolerance + ); + let report = compare_to_baseline(&[cr], &baseline); + assert_eq!(report.failures.len(), 1); + assert_eq!(report.failures[0].metric, "reaction_rate"); + } + + #[test] + fn comparison_does_not_flag_mid_range_reaction_rate_changes() { + // |Δ| = 25 is the mid-range with no rate assertion. A 0.20pp + // drop is large but should not fail. + let toml = r#" +[meta] +algorithm = "VardiffState" +trial_count = 1 +base_seed = 1 + +[cell.spm_12.step_minus_25_at_15min] +shares_per_minute = 12 +scenario = "step_minus_25_at_15min" +reaction_rate = 0.90 + "#; + let baseline = parse_baseline_toml(toml).unwrap(); + let cr = cell_result_with( + 12.0, + Scenario::Step { delta_pct: -25 }, + "reaction_time", + &[("reaction_rate", 0.70)], + ); + let report = compare_to_baseline(&[cr], &baseline); + assert!( + report.failures.is_empty(), + "mid-range Δ should not gate; got failures: {:#?}", + report.failures + ); + } + + #[test] + fn comparison_reports_missing_cells_on_both_sides() { + let toml = r#" +[meta] +algorithm = "VardiffState" +trial_count = 1 +base_seed = 1 + +[cell.spm_12.stable_1ph] +shares_per_minute = 12 +scenario = "stable_1ph" + "#; + let baseline = parse_baseline_toml(toml).unwrap(); + let cr = cell_result_with(12.0, Scenario::ColdStart, "convergence_time", &[]); + let report = compare_to_baseline(&[cr], &baseline); + assert_eq!(report.baseline_cells_not_in_current.len(), 1); + assert_eq!(report.current_cells_not_in_baseline.len(), 1); + } + + /// The slow regression test. Runs the full 80-cell baseline at the + /// same seed / trial_count as the checked-in baseline and asserts + /// every cell is within tolerance. + #[test] + #[ignore = "slow regression test; run with `cargo test --release -- --ignored`"] + fn classic_algorithm_no_regression() { + let baseline_str = include_str!("../baseline_VardiffState.toml"); + let baseline = parse_baseline_toml(baseline_str).expect("baseline parses"); + + let cells = default_cells(); + let current = run_baseline(&cells, baseline.meta.trial_count, baseline.meta.base_seed); + + let report = compare_to_baseline(¤t, &baseline); + + if !report.is_clean() { + let mut msg = String::new(); + if !report.failures.is_empty() { + msg.push_str(&format!( + "\n{} tolerance failures:\n", + report.failures.len() + )); + for d in &report.failures { + msg.push_str(&format!(" {}\n", d)); + } + } + if !report.baseline_cells_not_in_current.is_empty() { + msg.push_str("\nbaseline cells not in current:\n"); + for k in &report.baseline_cells_not_in_current { + msg.push_str(&format!(" {}\n", k)); + } + } + if !report.current_cells_not_in_baseline.is_empty() { + msg.push_str("\ncurrent cells not in baseline:\n"); + for k in &report.current_cells_not_in_baseline { + msg.push_str(&format!(" {}\n", k)); + } + } + panic!("Regression detected:{}", msg); + } + } +} diff --git a/sv2/channels-sv2/sim/src/rng.rs b/sv2/channels-sv2/sim/src/rng.rs new file mode 100644 index 0000000000..6582aaa813 --- /dev/null +++ b/sv2/channels-sv2/sim/src/rng.rs @@ -0,0 +1,245 @@ +//! Deterministic RNG and exponential-distribution sampling for trial simulation. +//! +//! Uses XorShift64 rather than the `rand` crate because: +//! - Reproducibility across crate versions: we hand-roll the bit operations +//! so two runs of the framework, possibly years apart with different +//! transitive dependency versions, produce identical share-arrival streams +//! from the same seed. +//! - Minimal dependency footprint for the sim crate. +//! +//! XorShift64 is statistically adequate for sampling Poisson inter-arrival +//! times in this context. It is not cryptographically secure and not +//! recommended for any use beyond simulation. + +/// XorShift64 pseudo-random number generator. +/// +/// Algorithm from George Marsaglia, "Xorshift RNGs" (2003). 64-bit state, +/// period 2^64 - 1. +#[derive(Debug, Clone)] +pub struct XorShift64 { + state: u64, +} + +impl XorShift64 { + /// Constructs a new generator from the given seed. Zero is replaced with + /// a non-zero constant since XorShift cannot have a zero state. + pub fn new(seed: u64) -> Self { + Self { + state: if seed == 0 { + 0xDEAD_BEEF_CAFE_F00D + } else { + seed + }, + } + } + + /// Generates the next u64 in the stream. + pub fn next_u64(&mut self) -> u64 { + let mut x = self.state; + x ^= x << 13; + x ^= x >> 7; + x ^= x << 17; + self.state = x; + x + } + + /// Returns a uniformly-distributed f64 in the open interval (0, 1). + /// + /// Never returns exactly 0 (which would make `ln(u)` undefined for + /// exponential sampling) and never returns exactly 1. + pub fn next_f64(&mut self) -> f64 { + // Take 53 bits of randomness (f64 mantissa precision). + let bits = self.next_u64() >> 11; // 53 bits, range [0, 2^53) + // Map [0, 2^53) → (0, 1): add 1 to numerator to exclude 0, divide by + // (2^53 + 1) to keep result strictly < 1. + ((bits as f64) + 1.0) / ((1u64 << 53) as f64 + 1.0) + } +} + +/// Samples one value from `Exp(rate)` — the exponential distribution with the +/// given rate parameter (events per unit time). +/// +/// Returns the inter-arrival time. If `rate` is non-positive or non-finite, +/// returns `f64::INFINITY` (interpreted by callers as "next event never +/// happens within the trial window"). +/// +/// Uses inverse-CDF sampling: `T = -ln(U) / λ` where `U ~ Uniform(0, 1)`. +pub fn sample_exponential(rng: &mut XorShift64, rate: f64) -> f64 { + if rate <= 0.0 || !rate.is_finite() { + return f64::INFINITY; + } + -rng.next_f64().ln() / rate +} + +/// Samples one value from `Poisson(λ)` — the number of events in a unit time +/// interval given an average rate of `lambda` events per interval. +/// +/// Uses Knuth's algorithm for `λ < 30` (exact, but slow for large `λ`) and a +/// normal approximation for `λ >= 30` (accurate to within ~1% of the true +/// distribution's variance, very fast). The threshold is conservative — Knuth +/// is fine well past 30 — and chosen so the normal approximation's tail +/// behavior is reliable for our use cases (share counts during long ticks). +/// +/// Returns 0 for non-positive, NaN, or infinite `lambda`. Saturates at +/// `u32::MAX` for absurdly large `lambda` (the trial-loop math can produce +/// extreme values during early cold-start ticks before the algorithm reacts). +pub fn sample_poisson(rng: &mut XorShift64, lambda: f64) -> u32 { + if !lambda.is_finite() || lambda <= 0.0 { + return 0; + } + if lambda < 30.0 { + poisson_knuth(rng, lambda) + } else { + poisson_normal(rng, lambda) + } +} + +/// Knuth's algorithm for Poisson sampling: multiply uniforms until the running +/// product falls below `e^(-λ)`. The number of multiplications minus one is +/// the sample. O(λ) expected work. +fn poisson_knuth(rng: &mut XorShift64, lambda: f64) -> u32 { + let l = (-lambda).exp(); + if l == 0.0 { + // Numerically underflowed (λ very large) — should have gone via normal + // approximation, but defend against the boundary. + return poisson_normal(rng, lambda); + } + let mut k = 0u32; + let mut p = 1.0; + loop { + // Pathological cap: stops runaway loops if `e^(-λ)` is denormalized. + if k >= 10_000 { + return k; + } + p *= rng.next_f64(); + if p <= l { + return k; + } + k = k.saturating_add(1); + } +} + +/// Normal approximation for Poisson: `λ + sqrt(λ) * Z` where `Z ~ N(0, 1)`, +/// rounded and clamped to non-negative. Accurate for `λ >= ~10`; we use 30 as +/// the threshold to give the approximation some margin. O(1). +fn poisson_normal(rng: &mut XorShift64, lambda: f64) -> u32 { + // Box-Muller transform for one N(0, 1) sample. + let u1 = rng.next_f64(); + let u2 = rng.next_f64(); + let z = (-2.0 * u1.ln()).sqrt() * (std::f64::consts::TAU * u2).cos(); + let raw = lambda + lambda.sqrt() * z; + if !raw.is_finite() || raw <= 0.0 { + return 0; + } + if raw >= u32::MAX as f64 { + return u32::MAX; + } + raw.round() as u32 +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn xorshift64_is_deterministic_from_seed() { + let mut a = XorShift64::new(42); + let mut b = XorShift64::new(42); + for _ in 0..1000 { + assert_eq!(a.next_u64(), b.next_u64()); + } + } + + #[test] + fn xorshift64_zero_seed_is_remapped() { + let mut zero = XorShift64::new(0); + // First output should not be zero (state was remapped, not left as 0). + assert_ne!(zero.next_u64(), 0); + } + + #[test] + fn next_f64_is_in_open_unit_interval() { + let mut rng = XorShift64::new(1); + for _ in 0..10_000 { + let u = rng.next_f64(); + assert!(u > 0.0 && u < 1.0, "next_f64 returned {u}, expected (0, 1)"); + } + } + + #[test] + fn exponential_mean_approximates_one_over_rate() { + let mut rng = XorShift64::new(7); + let rate = 0.5; // Exp(0.5) has mean 2.0 + let n = 100_000; + let mean: f64 = (0..n) + .map(|_| sample_exponential(&mut rng, rate)) + .sum::() + / n as f64; + // Standard error of mean for Exp(0.5) over n samples is 2 / sqrt(n) ≈ 0.0063. + // 6-sigma envelope is ±0.04 — very forgiving. + assert!( + (mean - 2.0).abs() < 0.04, + "Exp(0.5) sample mean {mean} should be near 2.0" + ); + } + + #[test] + fn exponential_nonpositive_rate_returns_infinity() { + let mut rng = XorShift64::new(1); + assert!(sample_exponential(&mut rng, 0.0).is_infinite()); + assert!(sample_exponential(&mut rng, -1.0).is_infinite()); + assert!(sample_exponential(&mut rng, f64::NAN).is_infinite()); + } + + #[test] + fn poisson_zero_or_negative_lambda_returns_zero() { + let mut rng = XorShift64::new(1); + assert_eq!(sample_poisson(&mut rng, 0.0), 0); + assert_eq!(sample_poisson(&mut rng, -1.0), 0); + assert_eq!(sample_poisson(&mut rng, f64::NAN), 0); + assert_eq!(sample_poisson(&mut rng, f64::INFINITY), 0); + } + + #[test] + fn poisson_small_lambda_mean_approximates_lambda() { + // Knuth path: λ = 5.0 + let mut rng = XorShift64::new(42); + let n = 50_000; + let sum: u64 = (0..n).map(|_| sample_poisson(&mut rng, 5.0) as u64).sum(); + let mean = sum as f64 / n as f64; + // SE of mean for Poisson(5) over n=50k samples is sqrt(5/50000) ≈ 0.010. + // 5-sigma envelope is ±0.05. + assert!( + (mean - 5.0).abs() < 0.05, + "Poisson(5) sample mean {mean} should be near 5.0" + ); + } + + #[test] + fn poisson_large_lambda_mean_approximates_lambda() { + // Normal-approximation path: λ = 1000.0 + let mut rng = XorShift64::new(42); + let n = 10_000; + let sum: u64 = (0..n) + .map(|_| sample_poisson(&mut rng, 1000.0) as u64) + .sum(); + let mean = sum as f64 / n as f64; + // SE of mean for Poisson(1000) over n=10k samples is sqrt(1000/10000) ≈ 0.32. + // 5-sigma envelope is ±1.6. + assert!( + (mean - 1000.0).abs() < 1.6, + "Poisson(1000) sample mean {mean} should be near 1000.0" + ); + } + + #[test] + fn poisson_is_deterministic_from_seed() { + let mut a = XorShift64::new(123); + let mut b = XorShift64::new(123); + for _ in 0..1000 { + // Mix of small and large λ to exercise both paths + assert_eq!(sample_poisson(&mut a, 3.0), sample_poisson(&mut b, 3.0)); + assert_eq!(sample_poisson(&mut a, 500.0), sample_poisson(&mut b, 500.0)); + } + } +} diff --git a/sv2/channels-sv2/sim/src/schedule.rs b/sv2/channels-sv2/sim/src/schedule.rs new file mode 100644 index 0000000000..4b7aca244d --- /dev/null +++ b/sv2/channels-sv2/sim/src/schedule.rs @@ -0,0 +1,128 @@ +//! Hashrate schedule describing the miner's true hashrate over simulated time. +//! +//! A trial's miner is modeled as a step function over time. The simplest case +//! is a constant hashrate ([`HashrateSchedule::stable`]); other scenarios +//! exercise the algorithm's response to genuine load changes via step +//! transitions, brief throttling episodes, etc. + +/// Specifies the miner's true hashrate as a piecewise-constant step function +/// over simulated time. +/// +/// Segments are stored sorted by start time. A query at time `t` returns the +/// hashrate of the most recent segment with `start_secs <= t`. The schedule +/// must contain at least one segment starting at time 0. +#[derive(Debug, Clone)] +pub struct HashrateSchedule { + /// Sorted ascending by `start_secs`. First entry always has `start_secs == 0`. + segments: Vec<(u64, f32)>, +} + +impl HashrateSchedule { + /// Constructs a schedule from `segments`, which need not be sorted. The + /// schedule is normalized: segments are sorted ascending by start time + /// and a `(0, _)` entry is required. + /// + /// # Panics + /// Panics if `segments` is empty or does not contain a segment starting + /// at time 0. + pub fn new(mut segments: Vec<(u64, f32)>) -> Self { + assert!( + !segments.is_empty(), + "HashrateSchedule must contain at least one segment" + ); + segments.sort_by_key(|&(t, _)| t); + assert_eq!( + segments[0].0, 0, + "HashrateSchedule must contain a segment starting at time 0" + ); + Self { segments } + } + + /// A schedule with a single constant hashrate for the entire trial. + pub fn stable(hashrate: f32) -> Self { + Self::new(vec![(0, hashrate)]) + } + + /// A schedule that holds `before` until `change_at_secs`, then `after` + /// thereafter. Convenient for "miner doubled hashrate" or "miner halved + /// hashrate" scenarios. + pub fn step(before: f32, after: f32, change_at_secs: u64) -> Self { + Self::new(vec![(0, before), (change_at_secs, after)]) + } + + /// A schedule that drops to `during` between `start_secs` and `end_secs`, + /// then recovers to `baseline`. Models a transient throttle or partial + /// failure that resolves itself. + pub fn throttle(baseline: f32, during: f32, start_secs: u64, end_secs: u64) -> Self { + Self::new(vec![ + (0, baseline), + (start_secs, during), + (end_secs, baseline), + ]) + } + + /// Returns the hashrate at simulated time `t`. + pub fn at(&self, t: u64) -> f32 { + let mut current = self.segments[0].1; + for &(start, h) in &self.segments { + if t >= start { + current = h; + } else { + break; + } + } + current + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn stable_returns_same_hashrate_at_any_time() { + let s = HashrateSchedule::stable(1.0e15); + assert_eq!(s.at(0), 1.0e15); + assert_eq!(s.at(60), 1.0e15); + assert_eq!(s.at(3600), 1.0e15); + } + + #[test] + fn step_changes_at_the_right_time() { + let s = HashrateSchedule::step(1.0e15, 5.0e14, 900); + assert_eq!(s.at(0), 1.0e15); + assert_eq!(s.at(899), 1.0e15); + assert_eq!(s.at(900), 5.0e14); + assert_eq!(s.at(1800), 5.0e14); + } + + #[test] + fn throttle_dips_and_recovers() { + let s = HashrateSchedule::throttle(1.0e15, 7.0e14, 900, 1200); + assert_eq!(s.at(0), 1.0e15); + assert_eq!(s.at(900), 7.0e14); + assert_eq!(s.at(1199), 7.0e14); + assert_eq!(s.at(1200), 1.0e15); + assert_eq!(s.at(1800), 1.0e15); + } + + #[test] + fn segments_passed_unsorted_are_normalized() { + let s = HashrateSchedule::new(vec![(900, 5.0e14), (0, 1.0e15), (1800, 1.0e15)]); + assert_eq!(s.at(0), 1.0e15); + assert_eq!(s.at(900), 5.0e14); + assert_eq!(s.at(1800), 1.0e15); + } + + #[test] + #[should_panic(expected = "starting at time 0")] + fn missing_zero_segment_panics() { + let _ = HashrateSchedule::new(vec![(60, 1.0e15)]); + } + + #[test] + #[should_panic(expected = "at least one segment")] + fn empty_schedule_panics() { + let _ = HashrateSchedule::new(vec![]); + } +} diff --git a/sv2/channels-sv2/sim/src/trial.rs b/sv2/channels-sv2/sim/src/trial.rs new file mode 100644 index 0000000000..a5cca2d446 --- /dev/null +++ b/sv2/channels-sv2/sim/src/trial.rs @@ -0,0 +1,517 @@ +//! Single-trial simulation execution. +//! +//! A trial drives a vardiff implementation through `duration_secs` of +//! simulated time, recording every tick. The simulation steps in +//! `tick_interval_secs` increments (matching the algorithm's ticker +//! cadence in production); at each tick a Poisson-distributed share count +//! is sampled and added to the vardiff state, then `try_vardiff` is +//! called, then a [`TickRecord`] is pushed onto the trial. +//! +//! This per-tick model is preferred over individual share-arrival sampling +//! for two reasons: +//! +//! 1. **Rate independence.** Poisson sampling works for any λ from +//! near-zero to millions; inter-arrival sampling would need sub-second +//! time resolution to model high share rates accurately. +//! 2. **Algorithm fidelity.** The algorithm only acts at tick boundaries, +//! so within-tick share timing is irrelevant to its behavior. Per-tick +//! sampling produces identical algorithm outcomes at a fraction of the +//! cost. +//! +//! ## Glass-box recording +//! +//! Every tick is recorded as a [`TickRecord`], not just the moments +//! the algorithm fires. Each record carries universal observables +//! (timestamp, share count, fire flag, new hashrate) plus optional +//! introspection fields (δ, θ, H̃). For algorithms that implement +//! [`Observable`] the introspection fields are populated by +//! [`run_trial_observed`]; for algorithms that don't, the optional +//! fields are `None` and only the universal observables are +//! available. +//! +//! Behavioral metrics (convergence, settled accuracy, jitter, +//! reaction time, ramp_target_overshoot) operate on `trial.fires()` — +//! a filtered view over `trial.ticks` selecting only `fired == true`. +//! Introspection-only metrics (bias, variance) consume the optional +//! δ/θ/H̃ fields populated by `run_trial_observed` for algorithms +//! that implement `Observable`. +//! +//! ## Schedule-change approximation +//! +//! The expected share count for a tick is computed from the +//! [`HashrateSchedule`] evaluated at the tick interval's **midpoint**. +//! For schedules whose transitions land at tick boundaries (the default +//! scenarios in [`crate::baseline`] all do — step at `15min = 900s = +//! 15 × tick_interval`), the midpoint correctly identifies the segment +//! that covers the entire tick and the simulation is exact. +//! +//! For schedules that transition *mid-tick*, the midpoint approximation +//! treats the entire tick as if it were at the rate of whichever segment +//! contains the midpoint. The error is bounded — at most one tick's +//! worth of shares charged to the wrong segment — but if a caller cares +//! about sub-tick-precision schedule changes, they should either align +//! changes to tick boundaries or extend `run_trial` to split intervals at +//! schedule boundaries. +//! +//! See [`run_trial`] for the entry point. + +use crate::rng::{sample_poisson, XorShift64}; +use crate::schedule::HashrateSchedule; +use bitcoin::Target; +use channels_sv2::target::hash_rate_to_target; +use channels_sv2::vardiff::{MockClock, Vardiff}; +use std::sync::Arc; + +/// Configuration parameters for a single simulation trial. +#[derive(Debug, Clone)] +pub struct TrialConfig { + /// Duration of the trial in simulated seconds. + pub duration_secs: u64, + /// The algorithm's initial belief about miner hashrate (H/s). + /// Determines the initial target. If far from the schedule's true + /// hashrate, the trial exercises convergence (Phase 1). + pub initial_hashrate: f32, + /// Configured shares-per-minute target the algorithm tries to achieve. + pub shares_per_minute: f32, + /// Cadence at which the algorithm's tick fires, in simulated seconds. + /// Defaults to 60; should match production for realistic measurement. + pub tick_interval_secs: u64, +} + +impl Default for TrialConfig { + fn default() -> Self { + Self { + // 30 simulated minutes is enough to observe Phase 1 + Phase 3 + // in the most common scenarios; long enough to be statistically + // useful, short enough that 1000 trials complete in seconds of + // wall clock. + duration_secs: 30 * 60, + initial_hashrate: 1.0e10, + shares_per_minute: 12.0, + tick_interval_secs: 60, + } + } +} + +/// Re-exported from production: a snapshot of the algorithm's +/// decision at a single tick. +/// +/// Captured by [`Observable::last_decision`] after each `try_vardiff` +/// call and pasted into the corresponding [`TickRecord`] by +/// [`run_trial_observed`]. `None` for ticks where the algorithm +/// returned early before computing a decision (i.e., `dt_secs <= 15`). +/// +/// The concrete struct lives in +/// [`channels_sv2::vardiff::composed::DecisionRecord`] so production +/// `Composed` instances can populate it without depending on the sim +/// crate. +pub use channels_sv2::vardiff::composed::DecisionRecord; + +/// Algorithms that expose introspection of their last decision. +/// +/// Implemented by `Composed` (in the [`crate::composed`] +/// module). Production `Vardiff` impls such as `VardiffState` do *not* +/// implement this trait — they have no internal decision to expose. The +/// trial driver [`run_trial_observed`] is generic over `V: Vardiff + +/// Observable` and uses [`Observable::last_decision`] to populate the +/// optional δ / θ / H̃ fields on each [`TickRecord`]. +/// +/// The contract: after a call to [`Vardiff::try_vardiff`], the implementor +/// returns: +/// +/// - `Some(record)` if try_vardiff reached the decision point (computed +/// δ and θ before deciding to fire or hold). +/// - `None` if try_vardiff returned early before computing the decision +/// (e.g., `dt_secs <= 15` guard). +pub trait Observable { + fn last_decision(&self) -> Option; +} + +/// A single per-tick record captured during a trial. +/// +/// Universal fields (timestamp, share count, fire flag, new hashrate, +/// current hashrate) are always populated. Introspection fields +/// (δ, θ, H̃) are populated only when the trial is driven by +/// [`run_trial_observed`] against an [`Observable`] vardiff +/// implementation; otherwise they're `None`. +#[derive(Debug, Clone)] +pub struct TickRecord { + /// Simulated time at the end of this tick. + pub t_secs: u64, + /// Number of shares observed in the interval ending at this tick. + pub n_shares: u32, + /// True iff `try_vardiff` returned `Ok(Some(_))` on this tick. + pub fired: bool, + /// The new hashrate the algorithm set; `Some` iff `fired`. + pub new_hashrate: Option, + /// The algorithm's hashrate entering this tick (i.e., before any + /// fire occurring at this tick). + pub current_hashrate_before: f32, + + /// Test statistic δ at this tick. `None` for non-observable + /// algorithms, or for ticks where try_vardiff returned early before + /// computing δ (i.e., `dt_secs <= 15`). + pub delta: Option, + /// Decision threshold θ at this tick. `None` for non-observable + /// algorithms or early-return ticks. + pub threshold: Option, + /// Estimator's belief H̃ at this tick. `None` for non-observable + /// algorithms or early-return ticks. + pub h_estimate: Option, + /// Estimator's reported uncertainty at this tick. `None` for + /// estimators that don't track uncertainty or for non-observable + /// algorithms. + pub ratio_std: Option, + /// Effective sample size at this tick. + pub effective_n: Option, +} + +/// Result of running a single trial. +#[derive(Debug, Clone)] +pub struct Trial { + /// The configuration the trial was run under. + pub config: TrialConfig, + /// The seed that produced this trial. Carried in the result so that + /// a failing trial can be reproduced in isolation by replaying with + /// the same `(config, schedule, seed)` triple. + pub seed: u64, + /// Per-tick records, in chronological order. Length is + /// `duration_secs / tick_interval_secs`. Fires are the subset where + /// `fired == true`; access them ergonomically via [`Trial::fires`]. + pub ticks: Vec, + /// The algorithm's hashrate estimate at trial end. + pub final_hashrate: f32, + /// The true miner hashrate (from the schedule) at trial end. + pub true_hashrate_at_end: f32, +} + +impl Trial { + /// Returns the subset of `ticks` where the algorithm fired, as a + /// collected `Vec<&TickRecord>` for ergonomic indexed access in + /// metric functions. One allocation per call; insignificant in + /// practice for trials with ~30 ticks. + pub fn fires(&self) -> Vec<&TickRecord> { + self.ticks.iter().filter(|t| t.fired).collect() + } + + /// Number of fire events in this trial. + pub fn fire_count(&self) -> usize { + self.ticks.iter().filter(|t| t.fired).count() + } +} + +/// Runs one simulation trial against a vardiff implementation that does +/// not expose introspection. The trial captures fires and universal +/// observables; the introspection fields of [`TickRecord`] (δ, θ, H̃) +/// are all `None`. +/// +/// For algorithms that implement [`Observable`] (e.g., `Composed<...>`), +/// prefer [`run_trial_observed`] to populate the introspection fields. +/// +/// Given a fixed `(config, schedule, seed)` triple, the trial is fully +/// reproducible — the same algorithm produces an identical tick timeline +/// every time. +pub fn run_trial( + vardiff: V, + clock: Arc, + config: TrialConfig, + schedule: &HashrateSchedule, + seed: u64, +) -> Trial { + run_trial_with_observer(vardiff, clock, config, schedule, seed, |_| None) +} + +/// Runs one simulation trial against a vardiff implementation that +/// exposes introspection. Identical to [`run_trial`] except that the +/// δ / θ / H̃ fields on each [`TickRecord`] are populated from +/// [`Observable::last_decision`] after each `try_vardiff` call. +/// +/// Use this driver to characterize algorithms via the richer metrics +/// (bias, variance, overshoot, etc.) that consume the introspection +/// fields. Bit-equivalence with [`run_trial`] holds on the universal +/// fields by construction — the only difference is whether the +/// optional fields are `Some` or `None`. +pub fn run_trial_observed( + vardiff: V, + clock: Arc, + config: TrialConfig, + schedule: &HashrateSchedule, + seed: u64, +) -> Trial { + run_trial_with_observer(vardiff, clock, config, schedule, seed, |v| { + v.last_decision() + }) +} + +/// Internal trial driver shared by [`run_trial`] and +/// [`run_trial_observed`]. The `observe` closure is called once per +/// tick, after `try_vardiff` returns, and its result populates the +/// introspection fields of the corresponding [`TickRecord`]. +/// +/// At each tick: +/// +/// 1. Compute the expected share count for the interval as +/// `λ = (true_hashrate / estimated_hashrate) * shares_per_minute * +/// (tick_interval_secs / 60)`. The schedule is evaluated at the +/// interval midpoint, which is exact for schedules that change at +/// tick boundaries. +/// 2. Sample `n_shares ~ Poisson(λ)`. +/// 3. Bulk-add the count to the vardiff state via [`Vardiff::add_shares`]. +/// 4. Advance the clock to the tick boundary, call `try_vardiff`. +/// 5. Invoke the observer (`None` for [`run_trial`], `Some(decision)` +/// for [`run_trial_observed`] when the algorithm computed a decision). +/// 6. Push a [`TickRecord`] capturing everything. +fn run_trial_with_observer Option>( + mut vardiff: V, + clock: Arc, + config: TrialConfig, + schedule: &HashrateSchedule, + seed: u64, + mut observe: F, +) -> Trial { + clock.set(0); + + let mut rng = XorShift64::new(seed); + let mut current_hashrate = config.initial_hashrate; + let mut current_target = hashrate_to_target_safe(current_hashrate, config.shares_per_minute); + let n_ticks_hint = (config.duration_secs / config.tick_interval_secs.max(1)) as usize; + let mut ticks: Vec = Vec::with_capacity(n_ticks_hint); + + let mut last_tick_at: u64 = 0; + let mut tick_at: u64 = config.tick_interval_secs; + + while tick_at <= config.duration_secs { + // Sample share count for this tick interval using the true + // hashrate at the interval midpoint. For schedules that change + // at a tick boundary (the default scenarios), the midpoint + // correctly identifies the segment that covers the entire + // interval. + let interval_midpoint = (last_tick_at + tick_at) / 2; + let true_h = schedule.at(interval_midpoint) as f64; + let est_h = current_hashrate as f64; + let interval_secs = (tick_at - last_tick_at) as f64; + + let lambda = if est_h > 0.0 { + (true_h / est_h) * (config.shares_per_minute as f64) * (interval_secs / 60.0) + } else { + 0.0 + }; + let n_shares = sample_poisson(&mut rng, lambda); + vardiff.add_shares(n_shares); + + // Advance the clock to the tick boundary and invoke the algorithm. + let hashrate_before = current_hashrate; + clock.set(tick_at); + let result = + vardiff.try_vardiff(current_hashrate, ¤t_target, config.shares_per_minute); + + // Snapshot the algorithm's last decision (if observable). The + // observer is called *after* try_vardiff so that the decision + // record reflects the call that just completed. + let decision = observe(&vardiff); + + let (fired, new_hashrate_opt) = match &result { + Ok(Some(new_h)) => (true, Some(*new_h)), + _ => (false, None), + }; + + ticks.push(TickRecord { + t_secs: tick_at, + n_shares, + fired, + new_hashrate: new_hashrate_opt, + current_hashrate_before: hashrate_before, + delta: decision.as_ref().map(|d| d.delta), + threshold: decision.as_ref().map(|d| d.threshold), + h_estimate: decision.as_ref().map(|d| d.h_estimate), + ratio_std: decision + .as_ref() + .and_then(|d| d.uncertainty.map(|u| u.ratio_std)), + effective_n: decision + .as_ref() + .and_then(|d| d.uncertainty.map(|u| u.effective_n)), + }); + + if let Some(new_h) = new_hashrate_opt { + current_hashrate = new_h; + current_target = hashrate_to_target_safe(new_h, config.shares_per_minute); + } + + last_tick_at = tick_at; + tick_at = tick_at.saturating_add(config.tick_interval_secs); + } + + Trial { + true_hashrate_at_end: schedule.at(config.duration_secs), + config, + seed, + ticks, + final_hashrate: current_hashrate, + } +} + +/// Wraps `hash_rate_to_target` with floor values on inputs so degenerate +/// edge cases (zero or negative hashrate or share rate, which can arise +/// from extreme algorithm output during testing) don't propagate errors. +/// +/// Hashrate is floored at 1.0 H/s — the smallest physically meaningful +/// value and well below any miner's true rate, so this clamp can't +/// influence realistic trials. Share rate is floored at 0.001 spm to +/// prevent division by zero in the underlying conversion. +fn hashrate_to_target_safe(hashrate: f32, shares_per_minute: f32) -> Target { + hash_rate_to_target( + hashrate.max(1.0) as f64, + shares_per_minute.max(0.001) as f64, + ) + .expect("hash_rate_to_target with positive inputs should not fail") +} + +#[cfg(test)] +mod tests { + use super::*; + use channels_sv2::VardiffState; + + fn make_vardiff() -> (VardiffState, Arc) { + let clock = Arc::new(MockClock::new(0)); + let vardiff = + VardiffState::new_with_clock(1.0, clock.clone()).expect("vardiff state should build"); + (vardiff, clock) + } + + #[test] + fn smoke_test_stable_load_produces_a_trial() { + let (vardiff, clock) = make_vardiff(); + let config = TrialConfig::default(); + let schedule = HashrateSchedule::stable(1.0e15); + let trial = run_trial(vardiff, clock, config, &schedule, 0xCAFE); + assert_eq!(trial.true_hashrate_at_end, 1.0e15); + // Phase 1 ramp-up from default 1e10 → 1e15 should produce + // multiple fires. + assert!( + trial.fire_count() >= 1, + "Expected at least one fire during Phase 1 ramp, got {}", + trial.fire_count() + ); + // The tick count should match the trial duration / interval. + assert_eq!(trial.ticks.len(), 30); + } + + #[test] + fn trial_is_deterministic_for_same_seed() { + let (v1, c1) = make_vardiff(); + let (v2, c2) = make_vardiff(); + let config = TrialConfig::default(); + let schedule = HashrateSchedule::stable(1.0e15); + let t1 = run_trial(v1, c1, config.clone(), &schedule, 12345); + let t2 = run_trial(v2, c2, config, &schedule, 12345); + assert_eq!(t1.ticks.len(), t2.ticks.len()); + for (a, b) in t1.ticks.iter().zip(t2.ticks.iter()) { + assert_eq!(a.t_secs, b.t_secs); + assert_eq!(a.fired, b.fired); + assert_eq!( + a.new_hashrate.map(f32::to_bits), + b.new_hashrate.map(f32::to_bits) + ); + } + assert_eq!(t1.final_hashrate.to_bits(), t2.final_hashrate.to_bits()); + } + + #[test] + fn different_seeds_produce_different_trials() { + let (v1, c1) = make_vardiff(); + let (v2, c2) = make_vardiff(); + let config = TrialConfig::default(); + let schedule = HashrateSchedule::stable(1.0e15); + let t1 = run_trial(v1, c1, config.clone(), &schedule, 1); + let t2 = run_trial(v2, c2, config, &schedule, 2); + let fires_1 = t1.fires(); + let fires_2 = t2.fires(); + let same = fires_1.len() == fires_2.len() + && fires_1 + .iter() + .zip(fires_2.iter()) + .all(|(a, b)| a.t_secs == b.t_secs); + assert!( + !same, + "Two seeds produced identical fire timelines; RNG broken?" + ); + } + + #[test] + fn step_change_in_schedule_is_observable() { + let (vardiff, clock) = make_vardiff(); + let config = TrialConfig { + duration_secs: 30 * 60, + initial_hashrate: 1.0e15, + shares_per_minute: 12.0, + tick_interval_secs: 60, + }; + // Halve hashrate at 15 min — algorithm should respond. + let schedule = HashrateSchedule::step(1.0e15, 5.0e14, 15 * 60); + let trial = run_trial(vardiff, clock, config, &schedule, 9001); + let post_step_fires = trial + .ticks + .iter() + .filter(|t| t.fired && t.t_secs > 15 * 60) + .count(); + assert!( + post_step_fires >= 1, + "Expected at least one fire after 50% load drop at 15 min; got {} post-step fires (total {})", + post_step_fires, + trial.fire_count(), + ); + } + + /// Regression test for the share-rate-cap bug fixed in Phase 4.5. At + /// high share rates and a cold start, the previous inter-arrival + /// simulation produced ~1 share/sec regardless of configured rate, + /// leaving the algorithm permanently stuck at the initial estimate. + /// With per-tick Poisson sampling the algorithm should converge + /// correctly. + #[test] + fn high_share_rate_cold_start_converges() { + let (vardiff, clock) = make_vardiff(); + let config = TrialConfig { + duration_secs: 30 * 60, + initial_hashrate: 1.0e10, + shares_per_minute: 120.0, + tick_interval_secs: 60, + }; + let schedule = HashrateSchedule::stable(1.0e15); + let trial = run_trial(vardiff, clock, config, &schedule, 0xC0FFEE); + + assert!( + trial.fire_count() >= 2, + "Expected ≥ 2 fires during cold-start ramp; got {}", + trial.fire_count() + ); + + let ratio = trial.final_hashrate as f64 / trial.true_hashrate_at_end as f64; + assert!( + ratio > 0.1 && ratio < 10.0, + "Final estimate {} is more than 10× off from truth {}; ratio = {}", + trial.final_hashrate, + trial.true_hashrate_at_end, + ratio, + ); + } + + #[test] + fn non_observable_algorithm_leaves_introspection_fields_none() { + // VardiffState does not implement Observable. Running it via the + // regular run_trial driver must populate the universal fields + // and leave delta / threshold / h_estimate as None. + let (vardiff, clock) = make_vardiff(); + let config = TrialConfig::default(); + let schedule = HashrateSchedule::stable(1.0e15); + let trial = run_trial(vardiff, clock, config, &schedule, 42); + for tick in &trial.ticks { + assert!( + tick.delta.is_none(), + "delta should be None for non-observable algorithm" + ); + assert!(tick.threshold.is_none(), "threshold should be None"); + assert!(tick.h_estimate.is_none(), "h_estimate should be None"); + } + } +} diff --git a/sv2/channels-sv2/sim/z_sweep.md b/sv2/channels-sv2/sim/z_sweep.md new file mode 100644 index 0000000000..92e9ab804c --- /dev/null +++ b/sv2/channels-sv2/sim/z_sweep.md @@ -0,0 +1,76 @@ +# FullRemedy z sweep (1000 trials/cell, base_seed = 0xdeadbeefcafef00d) + +Pareto-explore the PoissonCI z parameter on the FullRemedy family. Holds the other two FullRemedy axes fixed (`EwmaEstimator(τ = 120s)`, `PartialRetarget(η = 0.2)`) and varies only z. Higher z widens the threshold, suppressing false fires under stable load at the cost of slower reaction on small steps. + +## Decoupling score (higher = better) + +`reaction_rate(Step−50) × clamp(1 − jitter_p50 / J_max, 0, 1)`, J_max = 0.50 fires/min. 1.0 = perfect; > 0.8 = strong; < 0.3 = poor. + +| SPM | z=1.960 | z=2.326 | z=2.576 | z=3.000 | z=3.500 | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.815 | 0.800 | 0.877 | 0.844 | 0.808 | +| 12 | 0.878 | 0.895 | 0.974 | 0.967 | 0.959 | +| 30 | 0.909 | 1.000 | 1.000 | 1.000 | 1.000 | +| 60 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | +| 120 | 1.000 | 1.000 | 1.000 | 1.000 | 1.000 | + +## Jitter mean under stable load (lower = better) + +Fires per minute, post-convergence. Higher z directly raises the threshold floor, suppressing stable-load fires — this is the metric z was introduced to bound. + +| SPM | z=1.960 | z=2.326 | z=2.576 | z=3.000 | z=3.500 | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.064 | 0.046 | 0.034 | 0.016 | 0.005 | +| 12 | 0.058 | 0.040 | 0.028 | 0.011 | 0.003 | +| 30 | 0.042 | 0.024 | 0.016 | 0.005 | 0.001 | +| 60 | 0.023 | 0.011 | 0.006 | 0.002 | 0.001 | +| 120 | 0.007 | 0.002 | 0.001 | 0.001 | 0.000 | + +## Reaction rate at −50% step (higher = better) + +Fraction of trials that fire within 5 min of a 50% drop in true hashrate. Higher z lifts the threshold; if it lifts past the post-step δ at low SPM, reaction rate collapses. + +| SPM | z=1.960 | z=2.326 | z=2.576 | z=3.000 | z=3.500 | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.93 | 0.89 | 0.88 | 0.84 | 0.81 | +| 12 | 0.99 | 0.99 | 0.97 | 0.97 | 0.96 | +| 30 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | +| 60 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | +| 120 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | + +## Reaction rate at −10% step (higher = better) + +Small-step sensitivity. A 10% drop is the hardest signal to distinguish from Poisson noise; z controls how readily the algorithm fires on it. + +| SPM | z=1.960 | z=2.326 | z=2.576 | z=3.000 | z=3.500 | +| --- | --- | --- | --- | --- | --- | +| 6 | 0.43 | 0.36 | 0.33 | 0.27 | 0.20 | +| 12 | 0.45 | 0.40 | 0.36 | 0.28 | 0.20 | +| 30 | 0.51 | 0.43 | 0.38 | 0.30 | 0.23 | +| 60 | 0.54 | 0.49 | 0.45 | 0.38 | 0.30 | +| 120 | 0.68 | 0.62 | 0.57 | 0.48 | 0.39 | + +## Ramp target overshoot p90 — cold start (lower = better) + +Higher z means the algorithm fires less readily on the Phase-1-end Poisson spike; this trades against responsiveness on slow ramps. + +| SPM | z=1.960 | z=2.326 | z=2.576 | z=3.000 | z=3.500 | +| --- | --- | --- | --- | --- | --- | +| 6 | 6.8% | 3.0% | 0.0% | 0.0% | 0.0% | +| 12 | 3.0% | 0.0% | 0.0% | 0.0% | 0.0% | +| 30 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | +| 60 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | +| 120 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | + +## Ramp target overshoot p99 — cold start (lower = better) + +Worst-trial tail of the ramp overshoot distribution. + +| SPM | z=1.960 | z=2.326 | z=2.576 | z=3.000 | z=3.500 | +| --- | --- | --- | --- | --- | --- | +| 6 | 16.2% | 12.1% | 10.0% | 7.0% | 3.0% | +| 12 | 12.7% | 7.6% | 5.9% | 2.6% | 0.0% | +| 30 | 4.8% | 3.2% | 0.7% | 0.1% | 0.0% | +| 60 | 2.3% | 0.3% | 0.0% | 0.0% | 0.0% | +| 120 | 0.3% | 0.0% | 0.0% | 0.0% | 0.0% | + diff --git a/sv2/channels-sv2/src/target.rs b/sv2/channels-sv2/src/target.rs index abd233df1b..1f917130de 100644 --- a/sv2/channels-sv2/src/target.rs +++ b/sv2/channels-sv2/src/target.rs @@ -5,7 +5,7 @@ use alloc::string::String; use binary_sv2::U256; use bitcoin::{hash_types::BlockHash, hashes::Hash, Target}; use core::{cmp::max, fmt::Write, ops::Div}; -use primitive_types::U256 as U256Primitive; +use primitive_types::{U256 as U256Primitive, U512}; /// Converts a `u256` to a [`BlockHash`] type. pub fn u256_to_block_hash(v: U256<'static>) -> BlockHash { @@ -181,22 +181,97 @@ pub fn hash_rate_from_target(target: U256<'static>, share_per_min: f64) -> Resul let numerator = max_target - (target - U256Primitive::one()); // now we calculate the denominator s(t+1) // *100 here to move the fractional bit up so we can make this an int later - let shares_occurrency_frequence = 60_f64 / (share_per_min) * 100.0; + let shares_occurrency_frequence = 60_f64 / (share_per_min) * 100_000.0; // note that t+1 cannot be zero because t unsigned. Therefore the denominator is zero if and // only if s is zero. let shares_occurrency_frequence = shares_occurrency_frequence as u128; if shares_occurrency_frequence == 0_u128 { return Err(InputError::DivisionByZero); } - let shares_occurrency_frequence = from_u128_to_u256(shares_occurrency_frequence); let target_plus_one = U256Primitive::from_big_endian(target_arr.as_ref()) .checked_add(U256Primitive::one()) .ok_or(InputError::ArithmeticOverflow)?; + // Widen to U512 for the multiply: at large targets (close to 2^256, e.g. + // a broadcast SetTarget carrying `requested_max_target`), the product + // `(t+1) * shares_occurrency_frequence` exceeds U256 even though the + // final ratio `numerator / denominator` is small. Doing the math in + // U512 preserves the precision gained from the *100_000 scaling without + // re-introducing the spurious overflow on legitimate high-target inputs. + let target_plus_one = U512::from(target_plus_one); + let shares_occurrency_frequence = U512::from(shares_occurrency_frequence); let denominator = target_plus_one .checked_mul(shares_occurrency_frequence) - .and_then(|e| e.checked_div(U256Primitive::from(100))) + .and_then(|e| e.checked_div(U512::from(100_000u64))) .ok_or(InputError::ArithmeticOverflow)?; - let result = numerator.div(denominator).low_u128(); + let result = U512::from(numerator) + .checked_div(denominator) + .ok_or(InputError::DivisionByZero)? + .low_u128(); // we multiply back by 100 so that it cancels with the same factor at the denominator Ok(result as f64) } + +#[cfg(test)] +mod tests { + use super::*; + use binary_sv2::U256; + + /// Builds a `binary_sv2::U256` from a 32-byte big-endian array. + /// `hash_rate_from_target` reads its input as little-endian then reverses, + /// so we must hand it the LE form here. + fn target_from_be(be: [u8; 32]) -> U256<'static> { + let mut le = be; + le.reverse(); + U256::from(le) + } + + /// Regression for the U256 multiply-overflow in `hash_rate_from_target` + /// that surfaced after the *100 → *100_000 scaling fix. + /// + /// On the deployed slot-2 pool, `translator_sv2` (vardiff disabled) calls + /// `hash_rate_from_target` on every upstream `SetTarget`. Vardiff drives + /// the channel target up to its `requested_max_target` (≈ 2^253) when the + /// channel is idle, and the resulting `(t+1) * shares_occurrency_frequence` + /// product overflowed U256, returning `InputError::ArithmeticOverflow`. + /// + /// Each case below is a real `maximum_target` captured from the slot-2 + /// translator log at `share_per_minute = 6.0`. The expected behavior is + /// that the function returns `Ok(_)` (a small but well-defined hashrate) + /// rather than erroring. + #[test] + fn hash_rate_from_target_does_not_overflow_on_high_targets() { + // Real targets from translator_sv2_slot2 logs, 2026-05-17. + let captures: &[[u8; 32]] = &[ + // 0x0000223d_a20843f8_b916c86e_4debea00_774ec094_ccd6a4eb_62605782_03599fb5 + [ + 0x00, 0x00, 0x22, 0x3d, 0xa2, 0x08, 0x43, 0xf8, 0xb9, 0x16, 0xc8, 0x6e, 0x4d, 0xeb, + 0xea, 0x00, 0x77, 0x4e, 0xc0, 0x94, 0xcc, 0xd6, 0xa4, 0xeb, 0x62, 0x60, 0x57, 0x82, + 0x03, 0x59, 0x9f, 0xb5, + ], + // 0x0a3d70a3_d70a3d70_a3d70a3d_70a3d70a_3d70a3d7_0a3d70a3_d70a3d70_a3d70a3c + [ + 0x0a, 0x3d, 0x70, 0xa3, 0xd7, 0x0a, 0x3d, 0x70, 0xa3, 0xd7, 0x0a, 0x3d, 0x70, 0xa3, + 0xd7, 0x0a, 0x3d, 0x70, 0xa3, 0xd7, 0x0a, 0x3d, 0x70, 0xa3, 0xd7, 0x0a, 0x3d, 0x70, + 0xa3, 0xd7, 0x0a, 0x3c, + ], + // 0x1745d174_5d1745d1_745d1745_d1745d17_45d1745d_1745d174_5d1745d1_745d1744 + // (channel `requested_max_target` for the JDC extended channel) + [ + 0x17, 0x45, 0xd1, 0x74, 0x5d, 0x17, 0x45, 0xd1, 0x74, 0x5d, 0x17, 0x45, 0xd1, 0x74, + 0x5d, 0x17, 0x45, 0xd1, 0x74, 0x5d, 0x17, 0x45, 0xd1, 0x74, 0x5d, 0x17, 0x45, 0xd1, + 0x74, 0x5d, 0x17, 0x44, + ], + ]; + + for be in captures { + let t = target_from_be(*be); + let h = + hash_rate_from_target(t, 6.0).expect("high targets must not overflow at spm=6.0"); + assert!( + h.is_finite() && h >= 0.0, + "expected finite non-negative hashrate, got {h} for target {:02x?}", + be + ); + } + } +} diff --git a/sv2/channels-sv2/src/vardiff/classic.rs b/sv2/channels-sv2/src/vardiff/classic.rs index 16d3f080d7..b718167829 100644 --- a/sv2/channels-sv2/src/vardiff/classic.rs +++ b/sv2/channels-sv2/src/vardiff/classic.rs @@ -1,196 +1,93 @@ -use crate::target::hash_rate_from_target; +use crate::vardiff::clock::{Clock, SystemClock}; use bitcoin::Target; -use tracing::debug; +use std::sync::Arc; /// Default minimum hashrate (H/s) if not specified. const DEFAULT_MIN_HASHRATE: f32 = 1.0; use super::{error::VardiffError, Vardiff}; -/// Represents the dynamic state for a variable difficulty (Vardiff) connection. +/// Variable difficulty controller — the upstream classic algorithm. /// -/// Tracks performance and adjusts the mining target to achieve a desired share rate. +/// Delegates to [`composed::classic_composed`], the three-stage +/// decomposition of the classic algorithm: `CumulativeCounter + +/// StepFunction(classic table) + FullRetargetWithClamp`. This keeps +/// production behavior identical to upstream classic vardiff while +/// reusing the composed pipeline that the simulation framework drives +/// (e.g. for clock injection in tests). +/// +/// Any production algorithm change (EWMA estimator, adaptive boundary, +/// partial retarget, …) ships as a separate, clean commit — it is +/// deliberately NOT bundled with the diagnostic simulation suite. #[derive(Debug)] pub struct VardiffState { - /// Count of shares received since the last difficulty adjustment. - pub shares_since_last_update: u32, - /// Unix timestamp (seconds) of the last difficulty adjustment. - pub timestamp_of_last_update: u64, - /// The lowest hashrate (H/s) the system will allow; values below this are clamped. - pub min_allowed_hashrate: f32, + inner: Box, } +impl std::panic::UnwindSafe for VardiffState {} +impl std::panic::RefUnwindSafe for VardiffState {} + impl VardiffState { /// Creates a new `VardiffState` with the default minimum hashrate. - /// - /// # Arguments - /// * `estimated_hashrate` - The initial hashrate estimate. pub fn new() -> Result { Self::new_with_min(DEFAULT_MIN_HASHRATE) } /// Creates a new `VardiffState` with a specific minimum hashrate. - /// - /// # Arguments - /// * `min_allowed_hashrate` - The minimum hashrate to enforce. pub fn new_with_min(min_allowed_hashrate: f32) -> Result { - let timestamp_secs = std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH)? - .as_secs(); + Self::new_with_clock(min_allowed_hashrate, Arc::new(SystemClock)) + } + /// Creates a new `VardiffState` with a specific minimum hashrate and + /// a custom clock (for simulation/testing). + pub fn new_with_clock( + min_allowed_hashrate: f32, + clock: Arc, + ) -> Result { Ok(VardiffState { - shares_since_last_update: 0, - timestamp_of_last_update: timestamp_secs, - min_allowed_hashrate, + inner: Box::new(crate::vardiff::composed::classic_composed( + min_allowed_hashrate, + clock, + )), }) } - - /// Sets the count of shares since the last update. - pub fn set_shares_since_last_update(&mut self, shares_since_last_update: u32) { - self.shares_since_last_update = shares_since_last_update; - } } impl Vardiff for VardiffState { fn last_update_timestamp(&self) -> u64 { - self.timestamp_of_last_update + self.inner.last_update_timestamp() } fn shares_since_last_update(&self) -> u32 { - self.shares_since_last_update + self.inner.shares_since_last_update() } fn min_allowed_hashrate(&self) -> f32 { - self.min_allowed_hashrate + self.inner.min_allowed_hashrate() } - /// Sets the timestamp of the last update. - fn set_timestamp_of_last_update(&mut self, timestamp_of_last_update: u64) { - self.timestamp_of_last_update = timestamp_of_last_update; + fn set_timestamp_of_last_update(&mut self, timestamp: u64) { + self.inner.set_timestamp_of_last_update(timestamp); } - /// Increments the share counter by one. fn increment_shares_since_last_update(&mut self) { - self.shares_since_last_update += 1; + self.inner.increment_shares_since_last_update(); + } + + fn add_shares(&mut self, n: u32) { + self.inner.add_shares(n); } - /// Resets the share counter and updates the timestamp to now. fn reset_counter(&mut self) -> Result<(), VardiffError> { - let timestamp_secs = std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH)? - .as_secs(); - self.set_timestamp_of_last_update(timestamp_secs); - self.set_shares_since_last_update(0); - Ok(()) + self.inner.reset_counter() } - /// Checks channel performance and potentially updates the hashrate and target. - /// - /// It calculates the realized share rate since the last update. If the - /// deviation from the target rate is significant enough (based on internal, - /// time-sensitive thresholds), it estimates a new hashrate and applies it. - /// - /// It returns `Ok(Some(new_hashrate))` when an update occurs, - /// `Ok(None)` when conditions don't warrant an update, and - /// `Err` for actual processing errors. fn try_vardiff( &mut self, hashrate: f32, target: &Target, shares_per_minute: f32, ) -> Result, VardiffError> { - let now = std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH) - .map_err(VardiffError::TimeError)? - .as_secs(); - - let delta_time = now - self.timestamp_of_last_update; - - if delta_time <= 15 { - return Ok(None); - } - - let realized_share_per_min = - self.shares_since_last_update as f64 / (delta_time as f64 / 60.0); - - debug!( - target: "vardiff", - "Hashrate update check triggered: - - Elapsed time: {}s - - Shares since last update: {} - - Realized shares per minute: {:.4} - - Current miner target: {:?}", - delta_time, - self.shares_since_last_update, - realized_share_per_min, - target - ); - - let mut new_hashrate = match hash_rate_from_target( - target.to_le_bytes().into(), - realized_share_per_min, - ) { - Ok(hashrate) => hashrate as f32, - Err(e) => { - debug!( - target: "vardiff", - "Target->Hashrate conversion failed: {:?}. Falling back using previous hashrate and realized_shares_per_minute", e - ); - hashrate * realized_share_per_min as f32 / shares_per_minute - } - }; - - let hashrate_delta = new_hashrate - hashrate; - let hashrate_delta_percentage = (hashrate_delta.abs() / hashrate) * 100.0; - - debug!( - target: "vardiff", - "Calculated new hashrate: {:.2} H/s (Δ {:.2}%, previous {:.2} H/s)", - new_hashrate, - hashrate_delta_percentage, - hashrate, - ); - - let should_update = match hashrate_delta_percentage { - pct if pct >= 100.0 => true, - pct if pct >= 60.0 && delta_time >= 60 => true, - pct if pct >= 50.0 && delta_time >= 120 => true, - pct if pct >= 45.0 && delta_time >= 180 => true, - pct if pct >= 30.0 && delta_time >= 240 => true, - pct if pct >= 15.0 && delta_time >= 300 => true, - _ => false, - }; - - if !should_update { - return Ok(None); - } - - // realized_share_per_min is 0.0 when d.difficulty_mgmt.shares_since_last_update is 0 - // so it's safe to compare realized_share_per_min with == 0.0 - if realized_share_per_min == 0.0 { - new_hashrate = match delta_time { - dt if dt <= 30 => hashrate / 1.5, - dt if dt < 60 => hashrate / 2.0, - _ => hashrate / 3.0, - }; - } else if hashrate_delta_percentage > 1000.0 { - new_hashrate = match delta_time { - dt if dt <= 30 => hashrate * 10.0, - dt if dt < 60 => hashrate * 5.0, - _ => hashrate * 3.0, - }; - } - if new_hashrate < self.min_allowed_hashrate { - debug!( - target: "vardiff", - "New hashrate {:.2} H/s below minimum threshold {:.2} H/s — clamping", - new_hashrate, - self.min_allowed_hashrate - ); - new_hashrate = self.min_allowed_hashrate; - } - self.reset_counter()?; - - Ok(Some(new_hashrate)) + self.inner.try_vardiff(hashrate, target, shares_per_minute) } } diff --git a/sv2/channels-sv2/src/vardiff/clock.rs b/sv2/channels-sv2/src/vardiff/clock.rs new file mode 100644 index 0000000000..4a413c6691 --- /dev/null +++ b/sv2/channels-sv2/src/vardiff/clock.rs @@ -0,0 +1,127 @@ +//! Time abstraction for the vardiff algorithm. +//! +//! The vardiff algorithm consults "current time" to compute elapsed-time gates +//! between share-rate evaluations. In production this is `SystemTime::now()`. +//! For simulation and high-throughput testing, a mockable [`Clock`] lets the +//! algorithm run against a controlled time source so that thousands of trials +//! of simulated minutes complete in milliseconds of wall clock. +//! +//! The injection mechanism is intentionally simple: [`VardiffState`] holds an +//! `Arc` that defaults to [`SystemClock`]. Production behavior is +//! identical to the pre-injection code; test code constructs a +//! [`VardiffState`] with [`VardiffState::new_with_clock`] passing a +//! [`MockClock`] and drives time forward explicitly. +//! +//! [`VardiffState`]: super::classic::VardiffState +//! [`VardiffState::new_with_clock`]: super::classic::VardiffState::new_with_clock + +use std::{ + fmt::Debug, + sync::atomic::{AtomicU64, Ordering}, +}; + +/// Source of "current time" for the vardiff algorithm. +/// +/// Returns seconds since the UNIX epoch in production, or any +/// monotonically-advancing reference point in test contexts. +/// +/// Implementations must be `Send + Sync` so they can be held by a +/// [`VardiffState`] stored in shared per-channel state across async tasks, +/// and `Debug` so [`VardiffState`] continues to derive `Debug`. +/// +/// [`VardiffState`]: super::classic::VardiffState +pub trait Clock: Debug + Send + Sync { + /// Returns the current time, in seconds. + fn now_secs(&self) -> u64; +} + +/// Production clock — reads from `std::time::SystemTime::now()`. +#[derive(Debug, Default, Clone, Copy)] +pub struct SystemClock; + +impl Clock for SystemClock { + fn now_secs(&self) -> u64 { + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .expect("system clock should be after UNIX_EPOCH") + .as_secs() + } +} + +/// Mock clock for tests and simulation. Time advances only when explicitly +/// requested via [`MockClock::advance`] or [`MockClock::set`]. +/// +/// Internally backed by an [`AtomicU64`] so the clock is `Send + Sync` and +/// can be shared between the algorithm (which reads time) and the test +/// driver (which advances time) without locking. The typical pattern: +/// +/// ```ignore +/// use std::sync::Arc; +/// use channels_sv2::vardiff::clock::MockClock; +/// +/// let clock = Arc::new(MockClock::new(0)); +/// let vardiff = VardiffState::new_with_clock(1.0, clock.clone()).unwrap(); +/// // ... drive a tick ... +/// clock.advance(60); // simulated time moves forward +/// ``` +#[derive(Debug, Default)] +pub struct MockClock { + now: AtomicU64, +} + +impl MockClock { + /// Constructs a new mock clock initialized to `now_secs`. + pub fn new(now_secs: u64) -> Self { + Self { + now: AtomicU64::new(now_secs), + } + } + + /// Advances simulated time by `secs` seconds. + pub fn advance(&self, secs: u64) { + self.now.fetch_add(secs, Ordering::Relaxed); + } + + /// Sets simulated time to exactly `secs` seconds. + pub fn set(&self, secs: u64) { + self.now.store(secs, Ordering::Relaxed); + } +} + +impl Clock for MockClock { + fn now_secs(&self) -> u64 { + self.now.load(Ordering::Relaxed) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::sync::Arc; + + #[test] + fn system_clock_returns_recent_time() { + let now = SystemClock.now_secs(); + // Sanity: after 2026, seconds since epoch should be > 1.7B and < 4B. + assert!(now > 1_700_000_000); + assert!(now < 4_000_000_000); + } + + #[test] + fn mock_clock_reflects_advance() { + let clock = MockClock::new(100); + assert_eq!(clock.now_secs(), 100); + clock.advance(50); + assert_eq!(clock.now_secs(), 150); + clock.set(1000); + assert_eq!(clock.now_secs(), 1000); + } + + #[test] + fn mock_clock_shared_via_arc_observes_external_updates() { + let clock = Arc::new(MockClock::new(0)); + let clock_for_reader: Arc = clock.clone(); + clock.advance(42); + assert_eq!(clock_for_reader.now_secs(), 42); + } +} diff --git a/sv2/channels-sv2/src/vardiff/composed/boundary.rs b/sv2/channels-sv2/src/vardiff/composed/boundary.rs new file mode 100644 index 0000000000..f8e73ccc03 --- /dev/null +++ b/sv2/channels-sv2/src/vardiff/composed/boundary.rs @@ -0,0 +1,1470 @@ +//! Boundary — Stage 2 of the three-stage vardiff pipeline. +//! +//! The Boundary computes the threshold θ that the deviation δ must +//! exceed for the algorithm to fire. It is the piece of the algorithm +//! that lives in decision theory: design pressure is Type I vs Type II +//! error rates, plus *rate-awareness* — the noise floor of δ depends on +//! share rate, so the threshold should too. +//! +//! The Boundary receives the full `EstimatorSnapshot` including optional +//! uncertainty, enabling uncertainty-aware implementations that adapt +//! their threshold based on estimator confidence. + +use std::fmt::Debug; +use std::sync::atomic::{AtomicBool, AtomicI8, AtomicU32, AtomicU64, Ordering}; + +use super::estimator::EstimatorSnapshot; + +/// The decision threshold θ that the deviation δ must exceed to fire. +/// Returns `f64` in percentage points (e.g., `60.0` means δ must be at +/// least 60%). +/// +/// Implementations: [`StepFunction`] (classic), [`PoissonCI`] +/// (rate-aware), [`CredibleIntervalBoundary`] (uncertainty-aware), +/// [`CusumBoundary`] (sequential-testing). +pub trait Boundary: Debug + Send + Sync { + fn threshold(&self, dt_secs: u64, shares_per_minute: f32, snap: &EstimatorSnapshot) -> f64; + + /// A short, drift-proof code derived from the boundary's actual + /// parameters. See [`super::Estimator::code`] for the rationale. + fn code(&self) -> String; +} + +/// A piecewise-constant threshold over `dt_secs`. Share-rate-blind. +/// +/// Constructed via [`StepFunction::classic_table`] for byte-for-byte +/// equivalence with `VardiffState::try_vardiff`'s threshold cascade: +/// +/// ```text +/// dt < 60s: θ = 100% (only very large δ fires; the >=100% short-circuit) +/// dt < 120s: θ = 60% +/// dt < 180s: θ = 50% +/// dt < 240s: θ = 45% +/// dt < 300s: θ = 30% +/// dt ≥ 300s: θ = 15% +/// ``` +/// +/// To explore other step functions (e.g., flatter at high `dt_secs`), +/// construct `StepFunction { table: custom_table }` directly. The table +/// MUST be sorted ascending by `dt_threshold` and MUST have a final entry +/// with `dt_threshold == u64::MAX` so the function is defined for all +/// inputs. +#[derive(Debug, Clone)] +pub struct StepFunction { + /// Sorted ascending by `dt_threshold`. For `dt_secs < dt_threshold` + /// the function returns `value`. The last entry must have + /// `dt_threshold == u64::MAX`. + pub table: Vec<(u64, f64)>, +} + +impl StepFunction { + /// The classic threshold ladder from `VardiffState::try_vardiff`. + pub fn classic_table() -> Self { + Self { + table: vec![ + (60, 100.0), + (120, 60.0), + (180, 50.0), + (240, 45.0), + (300, 30.0), + (u64::MAX, 15.0), + ], + } + } +} + +impl Boundary for StepFunction { + fn threshold(&self, dt_secs: u64, _shares_per_minute: f32, _snap: &EstimatorSnapshot) -> f64 { + for &(threshold_dt, value) in &self.table { + if dt_secs < threshold_dt { + return value; + } + } + // Unreachable when the table includes the required u64::MAX entry, + // but defensive fallback rather than panic. + self.table.last().map(|(_, v)| *v).unwrap_or(100.0) + } + + fn code(&self) -> String { + "Step".to_string() + } +} + +/// Parametric boundary: threshold derived from the Poisson confidence +/// interval on the realized share count under the null hypothesis (no +/// genuine change in miner hashrate). +/// +/// Formula (in *percentage points*, matching the deviation +/// convention): +/// +/// ```text +/// λ̄ = (SPM / 60) × Δt (expected share count under H₀) +/// θ_fraction = (z·√λ̄ + 0.5) / λ̄ + margin +/// θ_pct = θ_fraction × 100 +/// ``` +/// +/// The `z` coefficient gives the desired Type I error rate (e.g., +/// `z = 2.576` for ~1% per-tick false-fire rate under H₀). The +/// `margin` term adds a flat slack above the Poisson floor — without +/// it the algorithm fires too readily when the statistic happens to +/// sit just above the boundary on small-variance trials. The default +/// `(z = 2.576, margin = 0.05)` is the parameterization used by the +/// `Parametric` and `FullRemedy` algorithms in the registry. +/// +/// This boundary is the only stage where `Parametric` differs from +/// `ClassicComposed`; Estimator and UpdateRule are unchanged. +#[derive(Debug, Clone, Copy)] +pub struct PoissonCI { + /// Two-sided normal quantile. `2.576` ≈ 99% CI. + pub z: f64, + /// Additive margin in fractional form (e.g., `0.05` for +5%). + pub margin: f64, +} + +impl PoissonCI { + /// The default Parametric parameters: `z = 2.576` (99% CI), + /// `margin = 0.05` (+5%). + pub fn default_parametric() -> Self { + Self { + z: 2.576, + margin: 0.05, + } + } + + /// Construct with arbitrary `z` and `margin`. Use this to explore + /// the Type I error frontier: e.g. `with_z(3.0, 0.05)` for a 99.7% + /// CI ("3σ"), or `with_z(3.891, 0.05)` for 99.99%. + /// + /// **Why explore beyond the default?** The default `z = 2.576` gives + /// a ~1% per-tick false-fire rate under H₀, which is the right + /// trade-off when each tick is independent. But at very low share + /// rates the per-tick Poisson tail is heavy enough that even + /// 1-in-100 outliers cascade through the algorithm. See + /// `sim/docs/FINDINGS.md` § "Parametric SPM=6 cascade" for the + /// concrete failure mode that motivates exploring stricter z. + pub fn with_z(z: f64, margin: f64) -> Self { + Self { z, margin } + } + + /// 99.7% CI ("3σ") preset: `z = 3.0`, default margin. + /// Roughly 0.3% per-tick false-fire rate under H₀. + pub fn strict_3sigma() -> Self { + Self { + z: 3.0, + margin: 0.05, + } + } +} + +impl Boundary for PoissonCI { + fn threshold(&self, dt_secs: u64, shares_per_minute: f32, _snap: &EstimatorSnapshot) -> f64 { + // Expected share count under H₀ over the window. + let lambda_bar = (shares_per_minute as f64 / 60.0) * dt_secs as f64; + if lambda_bar <= 0.0 { + // Pathological — fall back to a very strict threshold so + // the algorithm only fires on overwhelming evidence. + return 100.0; + } + let bound_fraction = (self.z * lambda_bar.sqrt() + 0.5) / lambda_bar + self.margin; + // The deviation δ is in percentage points; + // convert the fractional bound to match. + bound_fraction * 100.0 + } + + fn code(&self) -> String { + format!("Poisson-z{:.2}", self.z) + } +} + +/// Credible-interval boundary: fires when the estimator's posterior +/// credible interval excludes ratio = 1.0, meaning the algorithm is +/// confident that the miner's hashrate differs from the current target. +/// +/// This boundary uses the estimator's reported `uncertainty.ratio_std` +/// directly, rather than inferring noise from dt_secs or SPM. This +/// makes it self-calibrating: a confident estimate (many ticks of data, +/// small ratio_std) triggers on small deviations; an uncertain estimate +/// (fresh after fire, large ratio_std) requires large deviations. +/// +/// ## Formula +/// +/// The deviation δ = |ratio - 1| × 100 (percentage points). +/// The boundary computes: +/// +/// ```text +/// θ = z × ratio_std × 100 +/// ``` +/// +/// Fire iff δ ≥ θ, i.e., the deviation is at least z standard deviations +/// from ratio=1.0. With z=1.96, this corresponds to a 95% credible +/// interval excluding 1.0. +/// +/// ## Fallback +/// +/// When `snap.uncertainty` is `None` (estimator doesn't report confidence), +/// falls back to PoissonCI behavior. This ensures the boundary works with +/// all estimators, not just Bayesian. +/// +/// ## Parameters +/// +/// - `z`: number of standard deviations required (1.96 = 95% CI, 2.576 = 99%) +/// - `fallback`: PoissonCI used when uncertainty is unavailable +#[derive(Debug, Clone, Copy)] +pub struct CredibleIntervalBoundary { + /// Z-score for the credible interval (e.g., 1.96 for 95% CI). + pub z: f64, + /// Fallback boundary for estimators that don't report uncertainty. + pub fallback: PoissonCI, +} + +impl CredibleIntervalBoundary { + /// 95% credible interval boundary. + pub fn new_95() -> Self { + Self { + z: 1.96, + fallback: PoissonCI::default_parametric(), + } + } + + /// Custom z-score credible interval boundary. + pub fn with_z(z: f64) -> Self { + Self { + z, + fallback: PoissonCI::default_parametric(), + } + } +} + +impl Boundary for CredibleIntervalBoundary { + fn threshold(&self, dt_secs: u64, shares_per_minute: f32, snap: &EstimatorSnapshot) -> f64 { + match &snap.uncertainty { + Some(u) if u.ratio_std > 0.0 && u.effective_n > 0.0 => { + // Fire when |ratio - 1.0| > z × ratio_std + // In percentage points (matching deviation convention): + self.z * u.ratio_std * 100.0 + } + _ => { + // No uncertainty available — delegate to PoissonCI + self.fallback.threshold(dt_secs, shares_per_minute, snap) + } + } + } + + fn code(&self) -> String { + format!("CredInt-z{:.2}", self.z) + } +} + +/// Sequential-testing boundary inspired by CUSUM (Cumulative Sum). +/// +/// Unlike PoissonCI (which treats each tick independently), this boundary +/// accounts for the fact that evidence accumulates over ticks. A genuine +/// hashrate change produces *persistent* deviations across all subsequent +/// ticks, not just one spike. The threshold shrinks faster with dt_secs +/// than PoissonCI, making it more sensitive to sustained changes. +/// +/// ## Formula +/// +/// ```text +/// n_ticks = dt_secs / tick_secs +/// θ = (sensitivity / n_ticks + floor) × 100 +/// ``` +/// +/// Where: +/// - `sensitivity`: how many ticks of sustained deviation needed to fire +/// (analogous to CUSUM's h/k ratio). Lower = more sensitive. +/// - `floor`: minimum threshold as a fraction (prevents firing on tiny +/// deviations even with many ticks). Acts as the "slack" k in CUSUM. +/// +/// The key difference from PoissonCI: PoissonCI threshold decreases as +/// 1/√n (Poisson CI width). CusumBoundary threshold decreases as 1/n +/// (linear evidence accumulation). At n=1 tick they're similar; at n=10 +/// ticks CUSUM is much tighter. +/// +/// ## When uncertainty is available +/// +/// If the estimator reports uncertainty, the floor is scaled by ratio_std +/// to avoid firing when the estimate itself is uncertain. +#[derive(Debug, Clone, Copy)] +pub struct CusumBoundary { + /// Ticks of sustained deviation needed to fire at maximum sensitivity. + /// Lower = fires faster. Typical range: 2.0–5.0. + pub sensitivity: f64, + /// Minimum fractional threshold regardless of accumulated evidence. + /// Prevents firing on tiny deviations. Typical: 0.03–0.10 (3–10%). + pub floor: f64, + /// Tick interval for converting dt_secs to tick count. + pub tick_secs: u64, +} + +impl CusumBoundary { + pub fn new(sensitivity: f64, floor: f64) -> Self { + Self { + sensitivity, + floor, + tick_secs: 60, + } + } +} + +/// Rate-adaptive CUSUM: sensitivity scales with share rate so the +/// boundary is appropriately conservative at low SPM (where Poisson +/// noise is high) and aggressive at high SPM (where noise is low). +/// +/// ```text +/// effective_sensitivity = base_sensitivity × √(SPM / reference_spm) +/// ``` +/// +/// At reference_spm, effective_sensitivity = base_sensitivity. At lower +/// SPM it's smaller (tighter → more conservative, less jitter). At higher +/// SPM it's larger (looser → but the EWMA estimate is better anyway). +#[derive(Debug, Clone, Copy)] +pub struct AdaptiveCusumBoundary { + pub base_sensitivity: f64, + pub reference_spm: f64, + pub floor: f64, + pub tick_secs: u64, +} + +impl AdaptiveCusumBoundary { + pub fn new(base_sensitivity: f64, floor: f64) -> Self { + Self { + base_sensitivity, + reference_spm: 30.0, + floor, + tick_secs: 60, + } + } +} + +impl Boundary for AdaptiveCusumBoundary { + fn threshold(&self, dt_secs: u64, shares_per_minute: f32, snap: &EstimatorSnapshot) -> f64 { + let n_ticks = (dt_secs as f64 / self.tick_secs as f64).max(1.0); + + // Rate-adaptive sensitivity: more conservative at low SPM + let spm_factor = ((shares_per_minute as f64) / self.reference_spm).sqrt(); + let sensitivity = self.base_sensitivity * spm_factor; + + let effective_floor = match &snap.uncertainty { + Some(u) if u.ratio_std > 0.0 => self.floor + u.ratio_std * 0.5, + _ => self.floor, + }; + + let threshold_fraction = (sensitivity / n_ticks) + effective_floor; + threshold_fraction * 100.0 + } + + fn code(&self) -> String { + format!("AdaptCusum-s{}-f{}", self.base_sensitivity, self.floor) + } +} + +/// Asymmetric rate-adaptive CUSUM: uses different thresholds for +/// tightening (miner over-performing) vs easing (miner under-performing). +/// +/// **Rationale:** Making difficulty harder costs ~1 rejected share per fire +/// (in-flight work becomes invalid). Making difficulty easier costs nothing +/// (old harder work is still valid). Therefore the boundary should: +/// - Fire **quickly** to ease difficulty (miner slowing → detect fast, free action) +/// - Fire **cautiously** to tighten difficulty (miner speeding → avoid rejecting in-flight shares) +/// +/// Direction is determined from the snapshot: if `realized_share_per_min > shares_per_minute`, +/// the miner is over-performing and firing would tighten (costly direction). +/// +/// The `tighten_multiplier` (>1.0) makes the threshold higher when tightening, +/// requiring more evidence before making difficulty harder. +#[derive(Debug, Clone, Copy)] +pub struct AsymmetricCusumBoundary { + /// Base sensitivity (same as AdaptiveCusumBoundary). + pub base_sensitivity: f64, + /// Reference SPM for rate scaling. + pub reference_spm: f64, + /// Minimum threshold floor. + pub floor: f64, + /// Multiplier applied to threshold when firing would TIGHTEN difficulty. + /// Values > 1.0 make tightening more conservative. Typical: 1.5–3.0. + pub tighten_multiplier: f64, + /// Tick interval. + pub tick_secs: u64, +} + +impl AsymmetricCusumBoundary { + /// Constructs with default reference_spm=30 and tick_secs=60. + /// `tighten_multiplier` controls the asymmetry: 1.0 = symmetric, + /// 2.0 = requires 2× more evidence to tighten than to ease. + pub fn new(base_sensitivity: f64, floor: f64, tighten_multiplier: f64) -> Self { + Self { + base_sensitivity, + reference_spm: 30.0, + floor, + tighten_multiplier: tighten_multiplier.max(1.0), + tick_secs: 60, + } + } +} + +impl Boundary for AsymmetricCusumBoundary { + fn threshold(&self, dt_secs: u64, shares_per_minute: f32, snap: &EstimatorSnapshot) -> f64 { + let n_ticks = (dt_secs as f64 / self.tick_secs as f64).max(1.0); + + let spm_factor = ((shares_per_minute as f64) / self.reference_spm).sqrt(); + let sensitivity = self.base_sensitivity * spm_factor; + + let effective_floor = match &snap.uncertainty { + Some(u) if u.ratio_std > 0.0 => self.floor + u.ratio_std * 0.5, + _ => self.floor, + }; + + let base_threshold = (sensitivity / n_ticks) + effective_floor; + + // Determine direction: is the miner over-performing (tighten) or under-performing (ease)? + // realized_spm > configured_spm means miner is faster → fire would tighten → costly + let would_tighten = snap.realized_share_per_min > shares_per_minute as f64; + + let threshold_fraction = if would_tighten { + base_threshold * self.tighten_multiplier + } else { + base_threshold + }; + + threshold_fraction * 100.0 + } + + fn code(&self) -> String { + format!( + "AsymCusum-s{}-f{}-t{}", + self.base_sensitivity, self.floor, self.tighten_multiplier + ) + } +} + +/// Sign-persistence CUSUM: an asymmetric rate-adaptive boundary that +/// additionally tracks consecutive ticks where the deviation has the same +/// sign and lowers the threshold when the sign has been consistent for +/// many ticks. +/// +/// **Insight (PID integral term analogy):** A persistent sub-threshold drift +/// in one direction — even if each individual tick is below the firing +/// threshold — represents strong evidence of a genuine hashrate change. +/// This boundary captures that insight: after `n` consecutive same-sign +/// ticks the threshold is reduced by `sign_persistence_discount × (n-1)`, +/// capped at `max_sign_discount`. +/// +/// ## State tracking +/// +/// The `Boundary` trait takes `&self` (immutable). To track sign persistence +/// across calls, this struct uses atomic types with `Ordering::Relaxed`. +/// This is safe because vardiff evaluation is single-threaded per channel; +/// the atomics are merely an interior-mutability mechanism, not a +/// cross-thread synchronization primitive. +pub struct SignPersistenceCusumBoundary { + /// Base sensitivity (same as AsymmetricCusumBoundary). + pub base_sensitivity: f64, + /// Reference SPM for rate scaling. + pub reference_spm: f64, + /// Minimum threshold floor. + pub floor: f64, + /// Multiplier applied when firing would TIGHTEN difficulty. + pub tighten_multiplier: f64, + /// Tick interval. + pub tick_secs: u64, + /// Threshold reduction per consecutive same-sign tick (fractional). + /// E.g., 0.02 = 2% reduction per tick. + pub sign_persistence_discount: f64, + /// Maximum total discount (fractional cap). + /// E.g., 0.4 = at most 40% threshold reduction. + pub max_sign_discount: f64, + /// Number of consecutive ticks with the same sign. + consecutive_count: AtomicU32, + /// Last observed sign: +1 (over-performing), -1 (under-performing), 0 (unset). + last_sign: AtomicI8, +} + +impl SignPersistenceCusumBoundary { + /// Constructs with default reference_spm=30 and tick_secs=60. + pub fn new( + base_sensitivity: f64, + floor: f64, + tighten_multiplier: f64, + sign_persistence_discount: f64, + max_sign_discount: f64, + ) -> Self { + Self { + base_sensitivity, + reference_spm: 30.0, + floor, + tighten_multiplier: tighten_multiplier.max(1.0), + tick_secs: 60, + sign_persistence_discount, + max_sign_discount, + consecutive_count: AtomicU32::new(0), + last_sign: AtomicI8::new(0), + } + } +} + +impl Debug for SignPersistenceCusumBoundary { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("SignPersistenceCusumBoundary") + .field("base_sensitivity", &self.base_sensitivity) + .field("reference_spm", &self.reference_spm) + .field("floor", &self.floor) + .field("tighten_multiplier", &self.tighten_multiplier) + .field("tick_secs", &self.tick_secs) + .field("sign_persistence_discount", &self.sign_persistence_discount) + .field("max_sign_discount", &self.max_sign_discount) + .field( + "consecutive_count", + &self.consecutive_count.load(Ordering::Relaxed), + ) + .field("last_sign", &self.last_sign.load(Ordering::Relaxed)) + .finish() + } +} + +impl Boundary for SignPersistenceCusumBoundary { + fn threshold(&self, dt_secs: u64, shares_per_minute: f32, snap: &EstimatorSnapshot) -> f64 { + // Step 1: Compute the base threshold exactly like AsymmetricCusumBoundary. + let n_ticks = (dt_secs as f64 / self.tick_secs as f64).max(1.0); + + let spm_factor = ((shares_per_minute as f64) / self.reference_spm).sqrt(); + let sensitivity = self.base_sensitivity * spm_factor; + + let effective_floor = match &snap.uncertainty { + Some(u) if u.ratio_std > 0.0 => self.floor + u.ratio_std * 0.5, + _ => self.floor, + }; + + let base_threshold_fraction = (sensitivity / n_ticks) + effective_floor; + + // Apply asymmetric tighten multiplier. + let would_tighten = snap.realized_share_per_min > shares_per_minute as f64; + let asymmetric_threshold = if would_tighten { + base_threshold_fraction * self.tighten_multiplier + } else { + base_threshold_fraction + }; + + // Step 2: Determine current sign. + let current_sign: i8 = if snap.realized_share_per_min > shares_per_minute as f64 { + 1 + } else { + -1 + }; + + // Step 3: Update sign persistence state. + let stored_sign = self.last_sign.load(Ordering::Relaxed); + let consecutive = if current_sign == stored_sign { + self.consecutive_count.fetch_add(1, Ordering::Relaxed) + 1 + } else { + self.last_sign.store(current_sign, Ordering::Relaxed); + self.consecutive_count.store(1, Ordering::Relaxed); + 1 + }; + + // Step 4: Compute discount from sign persistence. + let discount = + (self.sign_persistence_discount * (consecutive - 1) as f64).min(self.max_sign_discount); + + // Step 5: Apply discount and convert to percentage points. + asymmetric_threshold * (1.0 - discount) * 100.0 + } + + fn code(&self) -> String { + // Include params so sweep variants get distinct (drift-proof) names. + format!( + "SignPersist-s{}-f{}-t{}-d{}-dm{}", + self.base_sensitivity, + self.floor, + self.tighten_multiplier, + self.sign_persistence_discount, + self.max_sign_discount + ) + } +} + +impl Boundary for CusumBoundary { + fn threshold(&self, dt_secs: u64, _shares_per_minute: f32, snap: &EstimatorSnapshot) -> f64 { + let n_ticks = (dt_secs as f64 / self.tick_secs as f64).max(1.0); + + // Base floor — scaled by uncertainty if available + let effective_floor = match &snap.uncertainty { + Some(u) if u.ratio_std > 0.0 => self.floor + u.ratio_std * 0.5, + _ => self.floor, + }; + + // Threshold decreases as 1/n_ticks (sequential evidence accumulation) + let threshold_fraction = (self.sensitivity / n_ticks) + effective_floor; + + // Convert to percentage points (matching deviation convention) + threshold_fraction * 100.0 + } + + fn code(&self) -> String { + format!("Cusum-s{}-f{}", self.sensitivity, self.floor) + } +} + +/// Hysteresis-gate boundary inspired by ckpool's retarget decision logic. +/// +/// ckpool does NOT use a continuous threshold; instead it applies two +/// sequential gates: +/// +/// 1. **Data gate**: suppress evaluation entirely until either enough +/// shares have been observed OR enough time has elapsed. This prevents +/// decisions on statistically meaningless data. +/// +/// 2. **Hysteresis band**: once the data gate is satisfied, check whether +/// the diff-rate-ratio (drr = realized_rate / current_diff) falls +/// within a dead band around the target. If inside the band → no fire. +/// If outside → fire. +/// +/// In the three-stage framework, this maps to a boundary that returns +/// `f64::MAX` (never fire) when either gate suppresses, and a threshold +/// of 0.0 (always fire) when outside the hysteresis band. The binary +/// fire/don't-fire semantics are preserved exactly. +/// +/// ## Parameters +/// +/// - `min_shares`: minimum shares since last fire before evaluating +/// (ckpool: 72, derived from `window_secs / target_period`) +/// - `min_time_secs`: minimum seconds since last fire before evaluating +/// (ckpool: 240) +/// - `hysteresis_low`: lower bound multiplier on target rate (ckpool: 0.5) +/// — drr below `target × hysteresis_low` → fire (decrease difficulty) +/// - `hysteresis_high`: upper bound multiplier on target rate (ckpool: 1.33) +/// — drr above `target × hysteresis_high` → fire (increase difficulty) +/// +/// The data gate uses OR semantics (fire if EITHER threshold is met), +/// matching ckpool's `if (ssdc < 72 && tdiff < 240) return`. +#[derive(Debug, Clone, Copy)] +pub struct HysteresisGate { + /// Minimum shares before evaluating. ckpool default: 72. + pub min_shares: u32, + /// Minimum seconds before evaluating. ckpool default: 240. + pub min_time_secs: u64, + /// Lower hysteresis multiplier (fire below this). ckpool: 0.5. + pub hysteresis_low: f64, + /// Upper hysteresis multiplier (fire above this). ckpool: 1.33. + pub hysteresis_high: f64, +} + +impl HysteresisGate { + /// Construct with ckpool's default parameters. + pub fn ckpool_defaults() -> Self { + Self { + min_shares: 72, + min_time_secs: 240, + hysteresis_low: 0.5, + hysteresis_high: 1.33, + } + } + + /// Construct with custom parameters. + pub fn new( + min_shares: u32, + min_time_secs: u64, + hysteresis_low: f64, + hysteresis_high: f64, + ) -> Self { + Self { + min_shares, + min_time_secs, + hysteresis_low, + hysteresis_high, + } + } +} + +impl Boundary for HysteresisGate { + fn threshold(&self, dt_secs: u64, shares_per_minute: f32, snap: &EstimatorSnapshot) -> f64 { + // Gate 1: insufficient data — suppress fire. + // OR semantics: proceed if EITHER min_shares OR min_time is met. + let shares_met = snap.n_shares >= self.min_shares; + let time_met = dt_secs >= self.min_time_secs; + if !shares_met && !time_met { + return f64::MAX; + } + + // Gate 2: hysteresis band check. + // Compute the rate ratio: realized_spm / target_spm. + // If within the dead band [low, high] around 1.0 → suppress. + if shares_per_minute > 0.0 { + let rate_ratio = snap.realized_share_per_min / shares_per_minute as f64; + if rate_ratio >= self.hysteresis_low && rate_ratio <= self.hysteresis_high { + return f64::MAX; + } + } + + // Outside the hysteresis band with sufficient data → always fire. + 0.0 + } + + fn code(&self) -> String { + format!( + "Hyst-{}-{}-g{}", + self.hysteresis_low, self.hysteresis_high, self.min_shares + ) + } +} + +/// Asymmetric PoissonCI: applies a tighten multiplier when the miner is +/// over-performing (would tighten difficulty), making it harder to +/// increase difficulty than to decrease it. +/// +/// Uses the same Poisson confidence interval formula as [`PoissonCI`] but +/// multiplies the threshold by `tighten_multiplier` when the direction of +/// the deviation would tighten difficulty (reject in-flight shares). +#[derive(Debug, Clone, Copy)] +pub struct AsymmetricPoissonCI { + pub poisson: PoissonCI, + pub tighten_multiplier: f64, +} + +impl AsymmetricPoissonCI { + pub fn new(z: f64, margin: f64, tighten_multiplier: f64) -> Self { + Self { + poisson: PoissonCI::with_z(z, margin), + tighten_multiplier: tighten_multiplier.max(1.0), + } + } +} + +impl Boundary for AsymmetricPoissonCI { + fn threshold(&self, dt_secs: u64, shares_per_minute: f32, snap: &EstimatorSnapshot) -> f64 { + let base = self.poisson.threshold(dt_secs, shares_per_minute, snap); + let would_tighten = snap.realized_share_per_min > shares_per_minute as f64; + if would_tighten { + base * self.tighten_multiplier + } else { + base + } + } + + fn code(&self) -> String { + format!( + "AsymPoisson-z{:.2}-t{}", + self.poisson.z, self.tighten_multiplier + ) + } +} + +/// Volatility-adaptive boundary: a PoissonCI floor scaled by *recently +/// observed* share-rate volatility relative to the Poisson expectation. +/// +/// Motivation: the sweeps showed react−10% is bounded by a hard tradeoff — +/// a fixed boundary must choose between tight (good react−10%, bad jitter) +/// and loose (good jitter, bad react−10%). This boundary breaks the tradeoff +/// by adapting *per miner over time*: when the share stream is behaving like +/// clean Poisson noise (calm), it tightens toward the PoissonCI floor so a +/// genuine 10% drop is detected fast; when the stream is genuinely volatile +/// (the miner's rate is wandering), it loosens to avoid firing on noise. +/// +/// ## State (interior mutability) +/// +/// Two EWMAs over the per-tick realized rate, updated on every `threshold` +/// call (one call per tick): +/// - `mean_bits`: EWMA of realized shares-per-minute → the smoothed rate μ. +/// - `var_bits`: EWMA of the squared residual `(realized − μ)²` → observed +/// variance σ²_obs. +/// +/// The *expected* per-tick Poisson variance of the share count, expressed in +/// the same (shares-per-minute)² units, is `λ̄ · (60/dt)²` where +/// `λ̄ = SPM·dt/60` is the expected count. The **excess-volatility factor** +/// +/// ```text +/// vf = clamp( σ²_obs / σ²_poisson , 1.0 , vf_max ) +/// ``` +/// +/// is ≈1 when the stream is pure Poisson and grows when the rate is +/// genuinely moving. The threshold is the PoissonCI floor times `vf`: +/// +/// ```text +/// θ = poisson_ci(dt, SPM) · vf +/// ``` +/// +/// `alpha` is the EWMA smoothing in (0,1] (lower = longer memory); `vf_max` +/// caps how far volatility can loosen the boundary. +#[derive(Debug)] +pub struct VolatilityAdaptiveBoundary { + /// Underlying rate-aware floor. + pub poisson: PoissonCI, + /// EWMA smoothing factor for the mean/variance trackers, in (0, 1]. + pub alpha: f64, + /// Maximum volatility loosening multiplier (≥ 1.0). + pub vf_max: f64, + /// Tick interval in seconds (matches the trial driver cadence). + pub tick_secs: u64, + /// EWMA of realized shares-per-minute (μ), as f64 bits. NaN = uninit. + mean_bits: AtomicU64, + /// EWMA of squared residual (σ²_obs), as f64 bits. NaN = uninit. + var_bits: AtomicU64, +} + +impl Clone for VolatilityAdaptiveBoundary { + fn clone(&self) -> Self { + Self { + poisson: self.poisson, + alpha: self.alpha, + vf_max: self.vf_max, + tick_secs: self.tick_secs, + mean_bits: AtomicU64::new(self.mean_bits.load(Ordering::Relaxed)), + var_bits: AtomicU64::new(self.var_bits.load(Ordering::Relaxed)), + } + } +} + +impl VolatilityAdaptiveBoundary { + /// Construct with the default PoissonCI floor (z=2.576, margin=0.05). + /// `alpha` is the EWMA smoothing (e.g. 0.2 ≈ 5-tick memory); `vf_max` + /// caps the loosening (e.g. 4.0). + pub fn new(alpha: f64, vf_max: f64) -> Self { + Self { + poisson: PoissonCI::default_parametric(), + alpha: alpha.clamp(1e-3, 1.0), + vf_max: vf_max.max(1.0), + tick_secs: 60, + mean_bits: AtomicU64::new(f64::NAN.to_bits()), + var_bits: AtomicU64::new(f64::NAN.to_bits()), + } + } + + pub fn with_poisson(poisson: PoissonCI, alpha: f64, vf_max: f64) -> Self { + let mut b = Self::new(alpha, vf_max); + b.poisson = poisson; + b + } + + /// Update the EWMA mean/variance trackers with this tick's realized rate + /// and return the current excess-volatility factor in [1, vf_max]. + fn update_volatility_factor(&self, realized_spm: f64, expected_var_spm2: f64) -> f64 { + let prev_mean = f64::from_bits(self.mean_bits.load(Ordering::Relaxed)); + let prev_var = f64::from_bits(self.var_bits.load(Ordering::Relaxed)); + + // First observation: seed mean to the realized rate, variance to the + // Poisson expectation (factor starts neutral at ~1.0). + let (mean, var) = if prev_mean.is_nan() { + (realized_spm, expected_var_spm2.max(1e-9)) + } else { + let residual = realized_spm - prev_mean; + let mean = prev_mean + self.alpha * residual; + let var = (1.0 - self.alpha) * prev_var + self.alpha * residual * residual; + (mean, var) + }; + self.mean_bits.store(mean.to_bits(), Ordering::Relaxed); + self.var_bits.store(var.to_bits(), Ordering::Relaxed); + + if expected_var_spm2 <= 0.0 { + return 1.0; + } + (var / expected_var_spm2).clamp(1.0, self.vf_max) + } +} + +impl Boundary for VolatilityAdaptiveBoundary { + fn threshold(&self, dt_secs: u64, shares_per_minute: f32, snap: &EstimatorSnapshot) -> f64 { + let base = self.poisson.threshold(dt_secs, shares_per_minute, snap); + + // Expected count and its Poisson variance, converted to (SPM)² units. + // count ~ Poisson(λ̄), Var[count] = λ̄. realized_spm = count·60/dt, so + // Var[realized_spm] = λ̄·(60/dt)². + let dt = dt_secs.max(1) as f64; + let lambda_bar = (shares_per_minute as f64 / 60.0) * dt; + if lambda_bar <= 0.0 { + return base; + } + let scale = 60.0 / dt; + let expected_var_spm2 = lambda_bar * scale * scale; + + let vf = self.update_volatility_factor(snap.realized_share_per_min, expected_var_spm2); + base * vf + } + + fn code(&self) -> String { + format!( + "VolAdapt-z{:.2}-a{}-vf{}", + self.poisson.z, self.alpha, self.vf_max + ) + } +} + +/// Cold-start warm-up wrapper for any inner boundary `B`. +/// +/// Until the algorithm first converges, this returns threshold `0` — fire +/// on any deviation — so cold start retargets aggressively (paired with a +/// full/accelerating update rule it reaches truth in a couple of fires). +/// Once the realized share rate first lands within `converge_band` of the +/// configured target (i.e. `|realized/target − 1| ≤ converge_band`), the +/// wrapper latches "warmed up" PERMANENTLY and from then on delegates +/// entirely to the inner boundary `B`. +/// +/// Rationale: the cautious, tighten-reluctant steady-state policy exists to +/// avoid the death spiral — raising difficulty into a genuinely failing +/// miner and starving it of valid work. On a FRESH connection there is no +/// in-flight work worth protecting and no established baseline to spiral +/// away from, so that caution only costs ramp-up time. The simulation's +/// oracle (the τ-matched estimator with no policy) converges in ~2 min, +/// while the cautious champion takes ~15 min — i.e. ~13 min of the ramp is +/// policy-imposed, not estimator-imposed, and recoverable here. After the +/// one-time warm-up the full steady-state safety is in force. +/// +/// The latch is one-way (cold start happens once per connection); a later +/// genuine drop is handled by the inner boundary, not by re-entering +/// warm-up. +pub struct WarmupBoundary { + /// The steady-state boundary, active after warm-up completes. + pub inner: B, + /// Convergence band (fractional): warm-up ends the first time + /// `|realized/target − 1| ≤ converge_band`. E.g. 0.15 = within 15%. + pub converge_band: f64, + /// One-way latch: false during warm-up, true once converged. + warmed: AtomicBool, +} + +impl WarmupBoundary { + /// Wrap `inner` with a cold-start warm-up that ends once the realized + /// rate first lands within `converge_band` of target. + pub fn new(inner: B, converge_band: f64) -> Self { + Self { + inner, + converge_band: converge_band.max(0.0), + warmed: AtomicBool::new(false), + } + } +} + +impl Clone for WarmupBoundary { + fn clone(&self) -> Self { + Self { + inner: self.inner.clone(), + converge_band: self.converge_band, + warmed: AtomicBool::new(self.warmed.load(Ordering::Relaxed)), + } + } +} + +impl Debug for WarmupBoundary { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("WarmupBoundary") + .field("inner", &self.inner) + .field("converge_band", &self.converge_band) + .field("warmed", &self.warmed.load(Ordering::Relaxed)) + .finish() + } +} + +impl Boundary for WarmupBoundary { + fn threshold(&self, dt_secs: u64, shares_per_minute: f32, snap: &EstimatorSnapshot) -> f64 { + if self.warmed.load(Ordering::Relaxed) { + return self.inner.threshold(dt_secs, shares_per_minute, snap); + } + // Still warming. Check whether we've converged yet: realized rate + // within converge_band of target. Use realized (not h_estimate) so + // the test reflects observed performance, matching how the boundary + // sees deviation. + let target = shares_per_minute as f64; + if target > 0.0 { + let dev = (snap.realized_share_per_min / target - 1.0).abs(); + if dev <= self.converge_band { + // Latch warmed; from the NEXT tick on we delegate. This tick + // still fires aggressively (threshold 0) to land the final + // convergence step. + self.warmed.store(true, Ordering::Relaxed); + } + } + // Fire on any deviation during warm-up. + 0.0 + } + + fn code(&self) -> String { + format!("Warmup-b{}[{}]", self.converge_band, self.inner.code()) + } +} + +/// Dual-mode boundary: PoissonCI (conservative) below `spm_threshold`, an +/// arbitrary aggressive boundary `B` at or above it, switched on the miner's +/// configured shares-per-minute rate. +/// +/// Below `spm_threshold`, PoissonCI's wide confidence interval prevents +/// premature fires on sparse data (bitaxe / small miners) — sparse windows +/// produce noisy residual runs that destabilize sequential boundaries. At or +/// above the threshold, the data-rich boundary `B` enables fast reaction with +/// abundant evidence (large hashrate miners). +/// +/// This mimics ckpool's dual-window strategy at the boundary layer: +/// conservative when data is sparse, aggressive when data is abundant. `B` is +/// generic so the same low-SPM guard protects any high-SPM boundary — +/// AsymmetricCusum (see [`AdaptivePoissonCusum`]) or SignPersistence (see +/// [`AdaptiveSignPersist`]), both of which collapse at low SPM without it. +#[derive(Debug)] +pub struct AdaptiveBoundary { + /// Conservative boundary for the sparse-data regime. + pub poisson: PoissonCI, + /// Aggressive boundary for the data-rich regime. + pub high: B, + /// Configured SPM below which PoissonCI is used. At or above this, `high` + /// activates. + pub spm_threshold: u32, +} + +impl AdaptiveBoundary { + /// Construct with an explicit PoissonCI floor and high-SPM boundary. + pub fn with_high(poisson: PoissonCI, high: B, spm_threshold: u32) -> Self { + Self { + poisson, + high, + spm_threshold, + } + } +} + +impl Boundary for AdaptiveBoundary { + fn threshold(&self, dt_secs: u64, shares_per_minute: f32, snap: &EstimatorSnapshot) -> f64 { + if (shares_per_minute as u32) < self.spm_threshold { + self.poisson.threshold(dt_secs, shares_per_minute, snap) + } else { + self.high.threshold(dt_secs, shares_per_minute, snap) + } + } + + fn code(&self) -> String { + // Include the inner Poisson and high-boundary codes so two adaptive + // boundaries differing only in inner params get distinct names. Omit + // the Poisson code when it's the default, to keep the common case + // readable. The high boundary's own code() carries its identity, so + // CUSUM vs SignPersist is automatically distinguished here. + let default_poisson = PoissonCI::default_parametric(); + let poisson_is_default = + self.poisson.z == default_poisson.z && self.poisson.margin == default_poisson.margin; + if poisson_is_default { + format!("Adapt-spm{}[{}]", self.spm_threshold, self.high.code()) + } else { + format!( + "Adapt-spm{}[{}|{}]", + self.spm_threshold, + self.poisson.code(), + self.high.code() + ) + } + } +} + +/// Back-compat alias: the original PoissonCI ⇄ AsymmetricCusum dual-mode +/// boundary, now a specialization of [`AdaptiveBoundary`]. Existing callers +/// keep using `AdaptivePoissonCusum::new` / `::with_params`. +pub type AdaptivePoissonCusum = AdaptiveBoundary; + +impl AdaptiveBoundary { + /// Default CUSUM dual-mode boundary (sensitivity=1.5, tighten=3.0). + pub fn new(spm_threshold: u32) -> Self { + Self { + poisson: PoissonCI::default_parametric(), + high: AsymmetricCusumBoundary::new(1.5, 0.05, 3.0), + spm_threshold, + } + } + + /// Construct with explicit PoissonCI floor and CUSUM boundary. + pub fn with_params( + poisson: PoissonCI, + cusum: AsymmetricCusumBoundary, + spm_threshold: u32, + ) -> Self { + Self { + poisson, + high: cusum, + spm_threshold, + } + } +} + +/// Dual-mode boundary pairing PoissonCI (low SPM) with +/// [`SignPersistenceCusumBoundary`] (high SPM). The sign-persistence boundary +/// is excellent at high SPM but collapses at low SPM (it discounts its +/// threshold on same-sign residual runs, which sparse-data Poisson noise +/// produces spuriously). This alias gives it the same low-SPM guard the CUSUM +/// dual-mode uses. +pub type AdaptiveSignPersist = AdaptiveBoundary; + +impl AdaptiveBoundary { + /// Construct with the default PoissonCI floor and an explicit + /// sign-persistence boundary for the high-SPM regime. + pub fn sign_persist(high: SignPersistenceCusumBoundary, spm_threshold: u32) -> Self { + Self { + poisson: PoissonCI::default_parametric(), + high, + spm_threshold, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn dummy_snap() -> EstimatorSnapshot { + EstimatorSnapshot { + h_estimate: 1.0e15, + realized_share_per_min: 12.0, + n_shares: 12, + dt_secs: 60, + uncertainty: None, + } + } + + #[test] + fn adaptive_boundary_switches_on_spm_threshold() { + // Below the threshold it must return the PoissonCI floor; at/above it + // must defer to the wrapped high-SPM boundary. Use a SignPersist high + // boundary so we exercise the generic over a non-CUSUM type. + let b = AdaptiveSignPersist::sign_persist( + SignPersistenceCusumBoundary::new(1.5, 0.05, 3.0, 0.15, 0.4), + 8, + ); + let poisson = PoissonCI::default_parametric(); + + // Below threshold (4 SPM) → PoissonCI floor exactly. + let low = b.threshold(60, 4.0, &snap_with_realized(4.0)); + let expected_low = poisson.threshold(60, 4.0, &snap_with_realized(4.0)); + assert!( + (low - expected_low).abs() < 1e-9, + "below spm_threshold must use PoissonCI: got {low}, want {expected_low}" + ); + + // At/above threshold (20 SPM) → NOT the PoissonCI value (defers to the + // sign-persistence boundary, which differs from the Poisson floor). + let high = b.threshold(60, 20.0, &snap_with_realized(25.0)); + let poisson_high = poisson.threshold(60, 20.0, &snap_with_realized(25.0)); + assert!( + (high - poisson_high).abs() > 1e-9, + "at/above spm_threshold must use the high boundary, not PoissonCI" + ); + } + + fn snap_with_realized(realized_spm: f64) -> EstimatorSnapshot { + EstimatorSnapshot { + h_estimate: 1.0e15, + realized_share_per_min: realized_spm, + n_shares: realized_spm.round() as u32, + dt_secs: 60, + uncertainty: None, + } + } + + #[test] + fn warmup_fires_until_converged_then_latches_to_inner() { + // Inner boundary with an easily-distinguished, non-zero threshold. + let inner = AsymmetricCusumBoundary::new(1.0, 0.05, 3.0); + let target = 12.0f32; + let inner_theta = inner.threshold(60, target, &snap_with_realized(target as f64)); + assert!(inner_theta > 1e-9, "inner threshold should be non-zero for the test"); + + let w = WarmupBoundary::new(AsymmetricCusumBoundary::new(1.0, 0.05, 3.0), 0.15); + + // While far from target (realized 50% high), warm-up returns 0 (fire + // on any deviation) and does NOT latch. + for _ in 0..3 { + let t = w.threshold(60, target, &snap_with_realized(18.0)); + assert_eq!(t, 0.0, "warm-up must return 0 until converged"); + } + + // A tick within the 15% band latches warmed; this tick still returns + // 0 (fires the final convergence step). + let at_converge = w.threshold(60, target, &snap_with_realized(12.5)); // ~4% off + assert_eq!(at_converge, 0.0, "the converging tick still fires at 0"); + + // From now on it must delegate to the inner boundary — even though + // the realized rate is once again far off (a later disturbance must + // NOT re-enter warm-up; the latch is one-way). + let after = w.threshold(60, target, &snap_with_realized(18.0)); + let expect = inner.threshold(60, target, &snap_with_realized(18.0)); + assert!( + (after - expect).abs() < 1e-9, + "after warm-up must delegate to inner: got {after}, want {expect}" + ); + assert!(after > 1e-9, "delegated threshold should be the non-zero inner value"); + } + + #[test] + fn voladapt_loosens_under_volatility_and_tightens_when_calm() { + let spm = 12.0f32; + + // Calm stream: realized rate stays at the configured rate every tick. + // The volatility factor should converge to ~1.0, so the threshold + // matches the bare PoissonCI floor. + let calm = VolatilityAdaptiveBoundary::new(0.3, 8.0); + let poisson = PoissonCI::default_parametric(); + let base = poisson.threshold(60, spm, &dummy_snap()); + let mut calm_th = 0.0; + for _ in 0..40 { + calm_th = calm.threshold(60, spm, &snap_with_realized(12.0)); + } + // Calm → factor clamps to its 1.0 floor → threshold ≈ PoissonCI floor. + assert!( + (calm_th - base).abs() < 1e-6, + "calm threshold {calm_th} should equal PoissonCI floor {base}" + ); + + // Volatile stream: realized rate swings wildly tick to tick. Observed + // variance >> Poisson expectation → factor > 1 → threshold loosens + // above the bare floor. + let volatile = VolatilityAdaptiveBoundary::new(0.3, 8.0); + let mut vol_th = 0.0; + for i in 0..40 { + let realized = if i % 2 == 0 { 2.0 } else { 40.0 }; + vol_th = volatile.threshold(60, spm, &snap_with_realized(realized)); + } + assert!( + vol_th > base * 1.5, + "volatile threshold {vol_th} should be well above the floor {base}" + ); + } + + #[test] + fn classic_table_matches_vardiff_state_cascade() { + let b = StepFunction::classic_table(); + // Below the first boundary: 100% (only very large δ fires). + assert_eq!(b.threshold(0, 12.0, &dummy_snap()), 100.0); + assert_eq!(b.threshold(15, 12.0, &dummy_snap()), 100.0); + assert_eq!(b.threshold(59, 12.0, &dummy_snap()), 100.0); + // Each subsequent rung. + assert_eq!(b.threshold(60, 12.0, &dummy_snap()), 60.0); + assert_eq!(b.threshold(119, 12.0, &dummy_snap()), 60.0); + assert_eq!(b.threshold(120, 12.0, &dummy_snap()), 50.0); + assert_eq!(b.threshold(179, 12.0, &dummy_snap()), 50.0); + assert_eq!(b.threshold(180, 12.0, &dummy_snap()), 45.0); + assert_eq!(b.threshold(239, 12.0, &dummy_snap()), 45.0); + assert_eq!(b.threshold(240, 12.0, &dummy_snap()), 30.0); + assert_eq!(b.threshold(299, 12.0, &dummy_snap()), 30.0); + // Floor: 15% past dt = 300s. + assert_eq!(b.threshold(300, 12.0, &dummy_snap()), 15.0); + assert_eq!(b.threshold(1_800, 12.0, &dummy_snap()), 15.0); + assert_eq!(b.threshold(u64::MAX - 1, 12.0, &dummy_snap()), 15.0); + } + + #[test] + fn classic_threshold_is_share_rate_blind() { + // The classic ladder ignores share rate — the same dt produces the + // same threshold regardless of SPM. This is the property that + // motivates the Parametric boundary (which IS rate-aware). + let b = StepFunction::classic_table(); + for &spm in &[6.0f32, 12.0, 30.0, 60.0, 120.0] { + assert_eq!(b.threshold(120, spm, &dummy_snap()), 50.0); + assert_eq!(b.threshold(300, spm, &dummy_snap()), 15.0); + } + } + + // ---- PoissonCI ---- + + #[test] + fn poisson_ci_matches_reference_values() { + // At dt=1200s, hand-computed reference values: + // SPM=12 → θ ≈ 0.218 + // SPM=60 → θ ≈ 0.125 + // SPM=120 → θ ≈ 0.103 + // (using z=2.576, margin=0.05; θ_fraction = (z·√λ̄ + 0.5)/λ̄ + margin) + // Our boundary returns these × 100 (percentage points). + let b = PoissonCI::default_parametric(); + let t12 = b.threshold(1200, 12.0, &dummy_snap()); + let t60 = b.threshold(1200, 60.0, &dummy_snap()); + let t120 = b.threshold(1200, 120.0, &dummy_snap()); + assert!((t12 - 21.8).abs() < 0.1, "SPM=12 got {}", t12); + assert!((t60 - 12.5).abs() < 0.1, "SPM=60 got {}", t60); + assert!((t120 - 10.3).abs() < 0.1, "SPM=120 got {}", t120); + } + + #[test] + fn poisson_ci_is_rate_aware() { + // The defining property — unlike StepFunction. As SPM + // increases the threshold strictly decreases (the noise floor + // shrinks, so the algorithm can detect smaller real changes). + let b = PoissonCI::default_parametric(); + let t6 = b.threshold(600, 6.0, &dummy_snap()); + let t12 = b.threshold(600, 12.0, &dummy_snap()); + let t60 = b.threshold(600, 60.0, &dummy_snap()); + let t120 = b.threshold(600, 120.0, &dummy_snap()); + assert!(t6 > t12, "{} not > {}", t6, t12); + assert!(t12 > t60); + assert!(t60 > t120); + } + + #[test] + fn poisson_ci_returns_strict_threshold_on_degenerate_inputs() { + let b = PoissonCI::default_parametric(); + assert_eq!(b.threshold(0, 12.0, &dummy_snap()), 100.0); // dt = 0 → λ̄ = 0 + assert_eq!(b.threshold(60, 0.0, &dummy_snap()), 100.0); // SPM = 0 → λ̄ = 0 + } + + #[test] + fn poisson_ci_strict_3sigma_returns_higher_threshold_than_default() { + // The strict variant (z=3.0) sits above the default (z=2.576) + // at every λ̄ — that's the whole point: trade a higher + // missed-detection rate for a tighter false-fire rate. Holds + // across share rates. + let default = PoissonCI::default_parametric(); + let strict = PoissonCI::strict_3sigma(); + for &spm in &[6.0f32, 12.0, 30.0, 60.0, 120.0] { + for &dt in &[60u64, 300, 600, 1200] { + let d = default.threshold(dt, spm, &dummy_snap()); + let s = strict.threshold(dt, spm, &dummy_snap()); + assert!( + s > d, + "strict ({}) should be > default ({}) at dt={}, spm={}", + s, + d, + dt, + spm, + ); + } + } + } + + #[test] + fn poisson_ci_with_z_matches_strict_3sigma_preset() { + let a = PoissonCI::strict_3sigma(); + let b = PoissonCI::with_z(3.0, 0.05); + assert_eq!(a.z, b.z); + assert_eq!(a.margin, b.margin); + for &(dt, spm) in &[(60u64, 12.0f32), (600, 60.0), (1800, 120.0)] { + assert_eq!( + a.threshold(dt, spm, &dummy_snap()), + b.threshold(dt, spm, &dummy_snap()) + ); + } + } + + // ---- SignPersistenceCusumBoundary ---- + + #[test] + fn sign_persistence_first_tick_matches_asymmetric() { + // On the first call the sign-persistence boundary should return + // the same threshold as an equivalent AsymmetricCusumBoundary + // (discount is 0 on the first tick: consecutive=1, discount = 0.02*(1-1) = 0). + let asym = AsymmetricCusumBoundary::new(3.0, 0.05, 2.0); + let sp = SignPersistenceCusumBoundary::new(3.0, 0.05, 2.0, 0.02, 0.4); + + let snap = dummy_snap(); // realized_share_per_min=12.0 + let spm = 30.0f32; // realized < configured → under-performing → ease direction + + let t_asym = asym.threshold(120, spm, &snap); + let t_sp = sp.threshold(120, spm, &snap); + assert!( + (t_asym - t_sp).abs() < 1e-10, + "first tick: asymmetric={}, sign_persistence={}", + t_asym, + t_sp + ); + } + + #[test] + fn sign_persistence_decreases_threshold_on_consecutive_same_sign() { + let sp = SignPersistenceCusumBoundary::new(3.0, 0.05, 2.0, 0.02, 0.4); + // Under-performing snap: realized_spm=12 < configured_spm=30 + let snap = dummy_snap(); + let spm = 30.0f32; + + let t1 = sp.threshold(120, spm, &snap); + let t2 = sp.threshold(120, spm, &snap); + let t3 = sp.threshold(120, spm, &snap); + + // Each consecutive same-sign tick should reduce the threshold. + assert!( + t2 < t1, + "second tick {} should be less than first {}", + t2, + t1 + ); + assert!( + t3 < t2, + "third tick {} should be less than second {}", + t3, + t2 + ); + + // Verify the discount magnitude: tick 2 discount = 0.02*(2-1)=0.02 + let expected_t2 = t1 * (1.0 - 0.02); + assert!( + (t2 - expected_t2).abs() < 1e-10, + "t2={}, expected={}", + t2, + expected_t2 + ); + } + + #[test] + fn sign_persistence_resets_on_sign_reversal() { + let sp = SignPersistenceCusumBoundary::new(3.0, 0.05, 2.0, 0.02, 0.4); + let spm = 30.0f32; + + // Under-performing: realized=12 < spm=30 + let snap_under = dummy_snap(); + let _t1 = sp.threshold(120, spm, &snap_under); + let _t2 = sp.threshold(120, spm, &snap_under); + let t3 = sp.threshold(120, spm, &snap_under); // consecutive=3, discount=0.04 + + // Now flip sign: over-performing (realized=40 > spm=30) + let snap_over = EstimatorSnapshot { + h_estimate: 1.0e15, + realized_share_per_min: 40.0, + n_shares: 40, + dt_secs: 60, + uncertainty: None, + }; + + // After sign reversal, consecutive resets to 1 → discount = 0. + // But note: direction also changes (now tightening), so threshold + // itself may be different. The key property is that consecutive reset + // means no discount. + let t_reversed = sp.threshold(120, spm, &snap_over); + + // Compute what AsymmetricCusumBoundary would give for the over-performing case. + let asym = AsymmetricCusumBoundary::new(3.0, 0.05, 2.0); + let t_asym_over = asym.threshold(120, spm, &snap_over); + + assert!( + (t_reversed - t_asym_over).abs() < 1e-10, + "after reversal: got={}, expected asymmetric={}", + t_reversed, + t_asym_over + ); + + // Also verify t3 had an active discount (was less than the base). + let t_asym_under = asym.threshold(120, spm, &snap_under); + assert!( + t3 < t_asym_under, + "t3={} should be less than base asymmetric={}", + t3, + t_asym_under + ); + } + + #[test] + fn sign_persistence_caps_at_max_discount() { + // With discount=0.10 per tick and max=0.4, the cap is reached at + // consecutive=5 (discount = 0.10 * 4 = 0.40 = max). + let sp = SignPersistenceCusumBoundary::new(3.0, 0.05, 2.0, 0.10, 0.4); + let snap = dummy_snap(); // under-performing + let spm = 30.0f32; + + let t1 = sp.threshold(120, spm, &snap); // consecutive=1, discount=0.00 + let _t2 = sp.threshold(120, spm, &snap); // consecutive=2, discount=0.10 + let _t3 = sp.threshold(120, spm, &snap); // consecutive=3, discount=0.20 + let _t4 = sp.threshold(120, spm, &snap); // consecutive=4, discount=0.30 + let t5 = sp.threshold(120, spm, &snap); // consecutive=5, discount=0.40 (capped) + let t6 = sp.threshold(120, spm, &snap); // consecutive=6, discount=0.40 (still capped) + + let expected_capped = t1 * (1.0 - 0.4); + assert!( + (t5 - expected_capped).abs() < 1e-10, + "t5={}, expected capped={}", + t5, + expected_capped + ); + assert!( + (t6 - expected_capped).abs() < 1e-10, + "t6={}, expected capped={}", + t6, + expected_capped + ); + } +} diff --git a/sv2/channels-sv2/src/vardiff/composed/composed.rs b/sv2/channels-sv2/src/vardiff/composed/composed.rs new file mode 100644 index 0000000000..0a7c10b98f --- /dev/null +++ b/sv2/channels-sv2/src/vardiff/composed/composed.rs @@ -0,0 +1,181 @@ +//! The `Composed` adapter — bundles the three pipeline stages into a +//! single `Vardiff` implementation. +//! +//! `Composed` carries a blanket `impl Vardiff` so any +//! composition of (Estimator, Boundary, UpdateRule) is automatically a +//! valid production `Vardiff`. The `vardiff_sim` crate adds an +//! `impl Observable for Composed` extension to expose the per-tick +//! decision state for characterization runs. + +use std::sync::Arc; + +use bitcoin::Target; + +use crate::vardiff::{error::VardiffError, Clock, Vardiff}; + +use super::boundary::{Boundary, StepFunction}; +use super::decision::DecisionRecord; +use super::estimator::{CumulativeCounter, Estimator, EstimatorContext}; +use super::update::{FullRetargetWithClamp, UpdateRule}; + +/// A vardiff algorithm composed of three sequential pipeline stages. +/// +/// `Composed` is a drop-in replacement for `VardiffState` +/// for any production code path that holds a `Box` or +/// accepts an `impl Vardiff`. The three type parameters correspond to: +/// +/// - `E`: Estimator — how observations accumulate; produces belief about hashrate. +/// - `B`: Boundary — decides whether the deviation from target is signal or noise. +/// - `U`: UpdateRule — computes the new target when the algorithm fires. +/// +/// The deviation statistic (|h_estimate / current_h - 1| × 100) is +/// computed inline by the adapter — it's a fixed normalization step, +/// not a configurable axis. +#[derive(Debug)] +pub struct Composed { + pub estimator: E, + pub boundary: B, + pub update: U, + pub timestamp_of_last_update: u64, + pub min_allowed_hashrate: f32, + pub clock: Arc, + pub last_decision: Option, +} + +impl Composed +where + E: Estimator, + B: Boundary, + U: UpdateRule, +{ + pub fn new( + estimator: E, + boundary: B, + update: U, + min_allowed_hashrate: f32, + clock: Arc, + ) -> Self { + let timestamp_of_last_update = clock.now_secs(); + Self { + estimator, + boundary, + update, + timestamp_of_last_update, + min_allowed_hashrate, + clock, + last_decision: None, + } + } +} + +impl Vardiff for Composed +where + E: Estimator, + B: Boundary, + U: UpdateRule, +{ + fn last_update_timestamp(&self) -> u64 { + self.timestamp_of_last_update + } + fn shares_since_last_update(&self) -> u32 { + self.estimator.shares_count() + } + fn set_timestamp_of_last_update(&mut self, ts: u64) { + self.timestamp_of_last_update = ts; + } + fn increment_shares_since_last_update(&mut self) { + self.estimator.observe(1); + } + fn add_shares(&mut self, n: u32) { + self.estimator.observe(n); + } + fn min_allowed_hashrate(&self) -> f32 { + self.min_allowed_hashrate + } + + fn reset_counter(&mut self) -> Result<(), VardiffError> { + self.timestamp_of_last_update = self.clock.now_secs(); + self.estimator.on_fire(0.0, 0.0); + Ok(()) + } + + fn try_vardiff( + &mut self, + hashrate: f32, + target: &Target, + shares_per_minute: f32, + ) -> Result, VardiffError> { + self.last_decision = None; + + let now = self.clock.now_secs(); + let dt = now.saturating_sub(self.timestamp_of_last_update); + + if dt <= 15 { + return Ok(None); + } + + // Stage 1: Estimator produces its belief. + let ctx = EstimatorContext { + current_hashrate: hashrate, + current_target: target, + shares_per_minute, + }; + let snap = self.estimator.snapshot(dt, &ctx); + + // Deviation: fixed normalization (|ratio - 1| × 100). + let delta = if hashrate > 0.0 { + ((snap.h_estimate as f64 / hashrate as f64) - 1.0).abs() * 100.0 + } else { + 0.0 + }; + + // Stage 2: Boundary decides threshold. + let threshold = self.boundary.threshold(dt, shares_per_minute, &snap); + + self.last_decision = Some(DecisionRecord { + delta, + threshold, + h_estimate: snap.h_estimate, + uncertainty: snap.uncertainty, + }); + + if delta < threshold { + return Ok(None); + } + + // Stage 3: UpdateRule computes the new target. + let mut new_hashrate = + self.update + .next_hashrate(&snap, hashrate, delta, threshold, shares_per_minute); + + if new_hashrate < self.min_allowed_hashrate { + new_hashrate = self.min_allowed_hashrate; + } + + // Notify estimator of the fire. + self.timestamp_of_last_update = now; + self.estimator.on_fire(new_hashrate, hashrate); + + Ok(Some(new_hashrate)) + } +} + +// ============================================================================ +// ClassicComposed — the three-stage representation of VardiffState +// ============================================================================ + +/// The Classic algorithm expressed as a `Composed` triple. Asserted +/// fire-for-fire equivalent to `VardiffState` by the sim crate's +/// equivalence test suite. +pub type ClassicComposed = Composed; + +/// Constructs the Classic algorithm as a `Composed` triple. +pub fn classic_composed(min_hashrate: f32, clock: Arc) -> ClassicComposed { + Composed::new( + CumulativeCounter::new(), + StepFunction::classic_table(), + FullRetargetWithClamp::classic(), + min_hashrate, + clock, + ) +} diff --git a/sv2/channels-sv2/src/vardiff/composed/decision.rs b/sv2/channels-sv2/src/vardiff/composed/decision.rs new file mode 100644 index 0000000000..58c756f522 --- /dev/null +++ b/sv2/channels-sv2/src/vardiff/composed/decision.rs @@ -0,0 +1,25 @@ +//! Decision record — a snapshot of the per-tick state inside +//! [`super::Composed::try_vardiff`]. +//! +//! Carried as `last_decision: Option` on every +//! `Composed` instance. Production code can ignore the field; the +//! `vardiff_sim` crate's `Observable` extension trait reads it to +//! populate the per-tick `delta` / `threshold` / `h_estimate` columns +//! in the characterization output. + +use super::estimator::Uncertainty; + +/// The per-tick algorithm state captured by `Composed::try_vardiff` +/// just after δ and θ are computed. +#[derive(Debug, Clone, Copy)] +pub struct DecisionRecord { + /// Test statistic at this tick. + pub delta: f64, + /// Decision threshold at this tick. + pub threshold: f64, + /// Estimator's belief about miner hashrate at this tick. + pub h_estimate: f32, + /// Estimator's reported uncertainty at this tick (None if estimator + /// doesn't track uncertainty). + pub uncertainty: Option, +} diff --git a/sv2/channels-sv2/src/vardiff/composed/estimator.rs b/sv2/channels-sv2/src/vardiff/composed/estimator.rs new file mode 100644 index 0000000000..308036d82d --- /dev/null +++ b/sv2/channels-sv2/src/vardiff/composed/estimator.rs @@ -0,0 +1,1934 @@ +//! Estimator — Stage 1 of the three-stage vardiff pipeline. +//! +//! The Estimator carries observation history between ticks and exposes a +//! snapshot of its current belief about the miner's hashrate. It is the +//! piece of the algorithm that lives in statistical estimation theory: +//! design pressure is responsiveness (small effective window, high +//! variance) vs stability (large effective window, low variance but +//! potentially stale data). +//! +//! See `sim/docs/DESIGN.md` for the pipeline architecture. + +use crate::target::hash_rate_from_target; +use bitcoin::Target; +use std::collections::VecDeque; +use std::fmt::Debug; + +/// Per-tick context an [`Estimator`] needs to construct a snapshot. +/// +/// Assembled by the `Composed` adapter from the inputs to `try_vardiff` +/// and passed to [`Estimator::snapshot`]. Carries the *current* target +/// and hashrate so the estimator can compute `H̃` (its own belief about +/// hashrate) from the realized share rate — e.g., via the +/// `hash_rate_from_target` conversion that `VardiffState` uses. +#[derive(Debug, Clone)] +pub struct EstimatorContext<'a> { + pub current_hashrate: f32, + pub current_target: &'a Target, + pub shares_per_minute: f32, +} + +/// Uncertainty quantification from the Estimator. Enables the Boundary +/// to adapt its threshold based on how confident the estimate is, rather +/// than inferring confidence from proxy signals (dt_secs, SPM). +#[derive(Debug, Clone, Copy)] +pub struct Uncertainty { + /// Standard deviation of the ratio estimate (h_estimate / current_h). + /// Dimensionless. Smaller = more confident. + pub ratio_std: f64, + /// Effective independent sample count informing this estimate. + /// Analogous to 1/(1-discount) for Bayesian, tau/tick for EWMA. + pub effective_n: f64, +} + +/// The Estimator's belief at a tick — the primary handoff struct from +/// Stage 1 to all downstream stages. Carries both a point estimate and +/// optional uncertainty quantification. +#[derive(Debug, Clone)] +pub struct EstimatorSnapshot { + /// The estimator's belief about the miner's true hashrate (H/s). + pub h_estimate: f32, + /// Realized share rate over the window, in shares per minute. + /// Zero if `dt_secs == 0` or `n_shares == 0`. + pub realized_share_per_min: f64, + /// Raw share count observed since the last reset. + pub n_shares: u32, + /// Window duration in seconds (`now - timestamp_of_last_update`). + pub dt_secs: u64, + /// Optional uncertainty quantification. `None` for estimators that + /// don't track uncertainty (CumulativeCounter, EWMA, SlidingWindow). + /// `Some` for estimators that maintain a probabilistic belief + /// (BayesianEstimator). Downstream stages (especially Boundary) can + /// use this to auto-calibrate their thresholds. + pub uncertainty: Option, +} + +/// Axis 1: how the algorithm accumulates observation history and exposes +/// a snapshot of its current belief about the miner's hashrate. +/// +/// **Theory**: statistical estimation (bias, variance, MSE). +/// +/// **Design pressure**: responsiveness (small effective window, high +/// variance) vs stability (large effective window, low variance but +/// potentially stale data). +/// +/// Implementations: [`CumulativeCounter`] (classic), +/// [`EwmaEstimator`] (EWMA / FullRemedy), +/// [`SpmRatioEstimator`] (EWMA with pure SPM-ratio conversion), +/// [`SlidingWindowEstimator`] (Sliding-Window). +pub trait Estimator: Debug + Send + Sync { + /// Record `n_shares` new arrivals. + /// + /// **Calling convention**: callers may invoke this either once per + /// tick with the full batch count (`observe(12)`) or once per + /// individual share arrival (`observe(1)` × 12). Implementations + /// MUST produce correct results under both patterns. Estimators + /// that apply per-call temporal decay (e.g., EWMA) must accumulate + /// shares internally and defer the decay to `snapshot()`. + fn observe(&mut self, n_shares: u32); + + /// Notification that the algorithm fired and changed the target. + /// `new_hashrate` is the target being set; `old_hashrate` is what + /// it was before the fire. + /// + /// Estimators choose how to respond: + /// - Absolute-rate estimators (CumulativeCounter, EWMA, SlidingWindow): + /// full reset — old data is invalid under the new target. + /// - Ratio-based estimators (Bayesian): rescale posterior to center + /// on ratio=1.0 relative to the new target, preserving accumulated + /// confidence. + fn on_fire(&mut self, new_hashrate: f32, old_hashrate: f32); + + /// Compute a snapshot of the estimator's current belief. + fn snapshot(&self, dt_secs: u64, ctx: &EstimatorContext) -> EstimatorSnapshot; + + /// Return the raw share count, for the `Vardiff::shares_since_last_update` + /// trait method. Estimators that don't carry an integer count (e.g., + /// EWMA) may return a derived value such as `ceil(weighted_sum)`. + fn shares_count(&self) -> u32; + + /// A short, drift-proof code derived from the estimator's actual + /// parameters. Used (with the [`Boundary`](super::Boundary) and + /// [`UpdateRule`](super::UpdateRule) codes) to build the composed + /// algorithm's display name and filename. Because each `code()` is + /// built from the concrete type's live fields, the name can never + /// drift away from what the algorithm actually does. + fn code(&self) -> String; +} + +/// The classic estimator: a saturating cumulative share counter, with +/// `H̃` computed at snapshot time via `hash_rate_from_target` (with the +/// linear-scaling fallback used by `VardiffState`). +/// +/// This is one of the four trait impls that, when composed together, +/// reproduce `VardiffState` fire-for-fire. +#[derive(Debug, Default)] +pub struct CumulativeCounter { + shares: u32, +} + +impl CumulativeCounter { + pub fn new() -> Self { + Self { shares: 0 } + } +} + +impl Estimator for CumulativeCounter { + fn observe(&mut self, n_shares: u32) { + self.shares = self.shares.saturating_add(n_shares); + } + + fn on_fire(&mut self, _new_hashrate: f32, _old_hashrate: f32) { + self.shares = 0; + } + + fn shares_count(&self) -> u32 { + self.shares + } + + fn code(&self) -> String { + "Cumul".to_string() + } + + fn snapshot(&self, dt_secs: u64, ctx: &EstimatorContext) -> EstimatorSnapshot { + // dt_secs > 15 is guarded by the Composed adapter before snapshot() + // is called, but the divide-by-zero defense is cheap and makes this + // impl independently testable. + let realized_share_per_min = if dt_secs == 0 { + 0.0 + } else { + self.shares as f64 / (dt_secs as f64 / 60.0) + }; + + // Mirror VardiffState::try_vardiff: prefer hash_rate_from_target + // for exact U256-arithmetic conversion; fall back to linear scaling + // (mathematically equivalent when target was set for current_hashrate + // at the configured share rate) on conversion error. + let h_estimate = match hash_rate_from_target( + ctx.current_target.to_le_bytes().into(), + realized_share_per_min, + ) { + Ok(h) => h as f32, + Err(_) => ctx.current_hashrate * realized_share_per_min as f32 / ctx.shares_per_minute, + }; + + EstimatorSnapshot { + h_estimate, + realized_share_per_min, + n_shares: self.shares, + dt_secs, + uncertainty: None, + } + } +} + +/// Exponentially-weighted moving average estimator. Tracks a smoothed +/// per-tick share count: on each `observe(n)` call (one per tick), the +/// internal rate estimate decays toward `n` with continuous-time +/// constant `tau_secs`: +/// +/// ```text +/// α = exp(-tick_secs / tau_secs) +/// rate_per_tick ← α × rate_per_tick + (1 − α) × n +/// ``` +/// +/// ## Interpreting `tau_secs` +/// +/// `tau_secs` is the continuous-time exponential time constant: an +/// impulse decays to `1/e ≈ 36.8%` of its initial value after +/// `tau_secs` seconds of elapsed time. The *half-life* (decay to 50%) +/// is `tau_secs × ln(2) ≈ 0.69 × tau_secs`. +/// +/// Equivalent per-tick interpretation: at `tick_secs = tau_secs` (the +/// default, `60` and `60`), one tick decays the previous estimate by +/// `1 − e⁻¹ ≈ 63%` and weights the new observation by the same — the +/// EWMA has heavy short-term memory. To get the "lightly smoothed" +/// regime (`α ≈ 0.9`, fade over ~10 ticks) use `tau_secs ≈ 10 × +/// tick_secs` or more. +/// +/// ## Why one-observe-per-tick +/// +/// The `Estimator` trait's `observe(n_shares: u32)` doesn't carry the +/// time interval between calls — so this impl assumes each `observe` +/// represents exactly one tick of duration `tick_secs`. The Composed +/// adapter's trial driver calls `add_shares` once per tick, so this +/// `realized_share_per_min` returned from `snapshot` is the rate +/// estimate converted to shares-per-minute: `rate_per_tick × (60 / +/// tick_secs)`. +/// +/// ## Calling convention safety +/// +/// `observe()` simply accumulates shares into a pending counter. +/// The EWMA decay is applied once per `snapshot()` call (which the +/// `Composed` adapter calls once per vardiff tick). This makes the +/// estimator immune to whether the caller invokes `observe(12)` once +/// or `observe(1)` twelve times — both produce identical results. +/// +/// After snapshot computes the blended rate, `on_fire()` (or the next +/// `snapshot()` via atomic CAS) advances the tick state. The atomics +/// satisfy the `Send + Sync` trait bounds without actual concurrent +/// access — `Vardiff` objects are always behind `&mut self`. +#[derive(Debug)] +pub struct EwmaEstimator { + /// Time constant in seconds. Common values: 30, 60, 120, 300. + pub tau_secs: u64, + /// Tick interval in seconds. Must match the trial driver's tick + /// cadence for the EWMA's effective τ to be correct. + pub tick_secs: u64, + /// Current rate estimate in shares-per-tick (after last snapshot). + /// Stored as bits via AtomicU64 for Send+Sync. + rate_bits: std::sync::atomic::AtomicU64, + /// Shares accumulated since last snapshot (pending for next decay step). + pending_shares: std::sync::atomic::AtomicU32, + /// Number of ticks (snapshots) since the last reset. + n_ticks: std::sync::atomic::AtomicU32, +} + +impl EwmaEstimator { + /// Constructs an EWMA with the given time constant. `tick_secs` + /// defaults to 60 (matching the trial driver's default tick + /// interval). + pub fn new(tau_secs: u64) -> Self { + use std::sync::atomic::AtomicU32; + use std::sync::atomic::AtomicU64; + Self { + tau_secs, + tick_secs: 60, + rate_bits: AtomicU64::new(0.0f64.to_bits()), + pending_shares: AtomicU32::new(0), + n_ticks: AtomicU32::new(0), + } + } + + /// Decay factor per tick: `exp(-tick_secs / tau_secs)`. + fn alpha(&self) -> f64 { + (-(self.tick_secs as f64) / (self.tau_secs as f64)).exp() + } + + fn get_rate(&self) -> f64 { + f64::from_bits(self.rate_bits.load(std::sync::atomic::Ordering::Relaxed)) + } + + fn set_rate(&self, rate: f64) { + self.rate_bits + .store(rate.to_bits(), std::sync::atomic::Ordering::Relaxed); + } + + /// Returns the current smoothed rate (shares per tick). For testing. + pub fn rate_per_tick(&self) -> f64 { + self.get_rate() + } +} + +impl Estimator for EwmaEstimator { + fn observe(&mut self, n_shares: u32) { + *self.pending_shares.get_mut() = self.pending_shares.get_mut().saturating_add(n_shares); + } + + fn on_fire(&mut self, new_hashrate: f32, old_hashrate: f32) { + let pending = *self.pending_shares.get_mut(); + let n_ticks = *self.n_ticks.get_mut(); + + // Flush pending shares into the EWMA before rescaling. + if pending > 0 { + let n = pending as f64; + let rate = if n_ticks == 0 { + n + } else { + let alpha = self.alpha(); + alpha * self.get_rate() + (1.0 - alpha) * n + }; + self.set_rate(rate); + *self.n_ticks.get_mut() = n_ticks + 1; + *self.pending_shares.get_mut() = 0; + } + + if old_hashrate <= 0.0 || new_hashrate <= 0.0 { + self.set_rate(0.0); + *self.n_ticks.get_mut() = 0; + return; + } + + // Rescale: if target moved by R = new/old, future shares at + // the same true hashrate arrive at rate = old_rate / R. + let ratio = new_hashrate as f64 / old_hashrate as f64; + if ratio > 0.0 && ratio.is_finite() { + self.set_rate(self.get_rate() / ratio); + } else { + self.set_rate(0.0); + *self.n_ticks.get_mut() = 0; + } + } + + fn shares_count(&self) -> u32 { + self.pending_shares + .load(std::sync::atomic::Ordering::Relaxed) + } + + fn code(&self) -> String { + format!("Ewma{}s", self.tau_secs) + } + + fn snapshot(&self, dt_secs: u64, ctx: &EstimatorContext) -> EstimatorSnapshot { + // Apply EWMA decay with the pending shares as this tick's observation. + let pending = self + .pending_shares + .load(std::sync::atomic::Ordering::Relaxed); + let n_ticks = self.n_ticks.load(std::sync::atomic::Ordering::Relaxed); + let n = pending as f64; + + let rate = if n_ticks == 0 { + n + } else { + let alpha = self.alpha(); + alpha * self.get_rate() + (1.0 - alpha) * n + }; + + // Advance state: flush pending into rate, increment tick count. + self.set_rate(rate); + self.n_ticks + .store(n_ticks + 1, std::sync::atomic::Ordering::Relaxed); + self.pending_shares + .store(0, std::sync::atomic::Ordering::Relaxed); + + let realized_share_per_min = rate * (60.0 / self.tick_secs as f64); + let h_estimate = match hash_rate_from_target( + ctx.current_target.to_le_bytes().into(), + realized_share_per_min, + ) { + Ok(h) => h as f32, + Err(_) => ctx.current_hashrate * realized_share_per_min as f32 / ctx.shares_per_minute, + }; + EstimatorSnapshot { + h_estimate, + realized_share_per_min, + n_shares: self.shares_count(), + dt_secs, + uncertainty: None, + } + } +} + +/// SPM-ratio estimator: EWMA-smoothed share rate, converted to a +/// hashrate estimate purely via linear SPM-ratio scaling. +/// +/// This is mathematically equivalent to `EwmaEstimator`'s linear +/// fallback path (`current_hashrate * realized_spm / shares_per_minute`), +/// but uses it as the PRIMARY conversion — never attempting the +/// `hash_rate_from_target` U256 arithmetic path. This avoids any +/// precision issues from U256 truncation and makes the conversion +/// trivially auditable. +/// +/// ## EWMA smoothing +/// +/// Identical to [`EwmaEstimator`]: +/// +/// ```text +/// alpha = exp(-tick_secs / tau_secs) +/// rate_per_tick <- alpha * rate_per_tick + (1 - alpha) * n +/// ``` +/// +/// ## Snapshot conversion +/// +/// ```text +/// realized_spm = rate_per_tick * (60 / tick_secs) +/// h_estimate = current_hashrate * (realized_spm / shares_per_minute) +/// ``` +/// +/// No U256 arithmetic. No fallback branches. +/// +/// ## When to use +/// +/// Prefer this over `EwmaEstimator` when: +/// - The deployment has hit U256 precision edge cases (very low/high SPM) +/// - Simplicity and auditability are priorities +/// - The linear-scaling assumption holds (target was set for +/// `current_hashrate` at the configured `shares_per_minute`) +#[derive(Debug)] +pub struct SpmRatioEstimator { + /// Time constant in seconds. Common values: 30, 60, 120, 300. + pub tau_secs: u64, + /// Tick interval in seconds. Must match the trial driver's tick + /// cadence for the EWMA's effective tau to be correct. + pub tick_secs: u64, + /// Current rate estimate in shares-per-tick. + rate_per_tick: f64, + /// Number of observations since the last reset. The first + /// observation initializes `rate_per_tick` directly (no decay yet). + n_observations: u32, +} + +impl SpmRatioEstimator { + /// Constructs an SPM-ratio estimator with the given time constant. + /// `tick_secs` defaults to 60 (matching the trial driver's default + /// tick interval). + pub fn new(tau_secs: u64) -> Self { + Self { + tau_secs, + tick_secs: 60, + rate_per_tick: 0.0, + n_observations: 0, + } + } + + /// Decay factor per tick: `exp(-tick_secs / tau_secs)`. + fn alpha(&self) -> f64 { + (-(self.tick_secs as f64) / (self.tau_secs as f64)).exp() + } + + /// Returns the current smoothed rate (shares per tick). For testing. + pub fn rate_per_tick(&self) -> f64 { + self.rate_per_tick + } +} + +impl Estimator for SpmRatioEstimator { + fn observe(&mut self, n_shares: u32) { + let n = n_shares as f64; + if self.n_observations == 0 { + self.rate_per_tick = n; + } else { + let alpha = self.alpha(); + self.rate_per_tick = alpha * self.rate_per_tick + (1.0 - alpha) * n; + } + self.n_observations = self.n_observations.saturating_add(1); + } + + fn on_fire(&mut self, new_hashrate: f32, old_hashrate: f32) { + if old_hashrate <= 0.0 || new_hashrate <= 0.0 { + self.rate_per_tick = 0.0; + self.n_observations = 0; + return; + } + + // Rescale the smoothed rate by the retarget ratio, identical to + // EwmaEstimator: future shares at the same true hashrate arrive + // at rate = old_rate / R under the new (harder/easier) target. + let ratio = new_hashrate as f64 / old_hashrate as f64; + if ratio > 0.0 && ratio.is_finite() { + self.rate_per_tick /= ratio; + } else { + self.rate_per_tick = 0.0; + self.n_observations = 0; + } + } + + fn shares_count(&self) -> u32 { + self.rate_per_tick.round().max(0.0) as u32 + } + + fn code(&self) -> String { + "SpmRatio".to_string() + } + + fn snapshot(&self, dt_secs: u64, ctx: &EstimatorContext) -> EstimatorSnapshot { + let realized_share_per_min = self.rate_per_tick * (60.0 / self.tick_secs as f64); + + // Pure linear scaling — no U256 arithmetic. + let h_estimate = + ctx.current_hashrate * realized_share_per_min as f32 / ctx.shares_per_minute; + + EstimatorSnapshot { + h_estimate, + realized_share_per_min, + n_shares: self.shares_count(), + dt_secs, + uncertainty: None, + } + } +} + +/// Sliding-window estimator: holds the last `n_ticks` per-tick share +/// observations in a ring buffer and computes `H̃` from the buffer +/// average. +/// +/// ## Design simplification +/// +/// Like `EwmaEstimator`, this impl assumes one `observe(n_shares)` +/// call per tick of fixed duration `tick_secs`. The Composed adapter's +/// trial driver satisfies this. Custom callers should match the tick +/// cadence to keep the effective window length correct. +/// +/// ## Reset behavior +/// +/// `reset()` clears the buffer. The Composed adapter calls `reset()` +/// on every fire, so during the cold-start Phase 1 ramp (where the +/// algorithm fires every tick) the buffer holds only a single +/// observation — the estimator behaves identically to +/// `CumulativeCounter` during Phase 1. The sliding-window benefit +/// shows up only post-Phase-1 when the buffer fills with multiple +/// at-truth ticks of data. +/// +/// ## When to use +/// +/// Pair with [`crate::composed::FullRetargetNoClamp`] for the +/// canonical `SlidingWindow` composition (see `DESIGN.md` § +/// "Algorithm registry"), or with [`crate::composed::PartialRetarget`] +/// for a more damped variant. +/// Always with [`crate::composed::PoissonCI`] boundary so the +/// rate-aware threshold complements the smoothing. +#[derive(Debug)] +pub struct SlidingWindowEstimator { + /// Maximum number of per-tick observations to retain. The buffer + /// holds up to this many entries; older entries are dropped on + /// overflow. + pub n_ticks: usize, + /// Tick interval in seconds. Used to convert buffer count → time + /// when computing realized share rate. + pub tick_secs: u64, + /// Ring buffer of per-tick share counts. + buffer: VecDeque, +} + +impl SlidingWindowEstimator { + /// Constructs a sliding-window estimator with the given window + /// length in ticks. Default `tick_secs = 60` matches the trial + /// driver's tick cadence. + pub fn new(n_ticks: usize) -> Self { + Self { + n_ticks, + tick_secs: 60, + buffer: VecDeque::with_capacity(n_ticks), + } + } +} + +impl Estimator for SlidingWindowEstimator { + fn observe(&mut self, n_shares: u32) { + if self.buffer.len() >= self.n_ticks { + self.buffer.pop_front(); + } + self.buffer.push_back(n_shares); + } + + fn on_fire(&mut self, _new_hashrate: f32, _old_hashrate: f32) { + self.buffer.clear(); + } + + fn shares_count(&self) -> u32 { + // Saturating sum — at typical n_ticks (≤ 200) and per-tick + // counts (≤ a few thousand under realistic Poisson) overflow + // is unreachable. The saturate is defense in depth. + self.buffer + .iter() + .fold(0u32, |acc, &n| acc.saturating_add(n)) + } + + fn code(&self) -> String { + format!("Slide{}t", self.n_ticks) + } + + fn snapshot(&self, dt_secs: u64, ctx: &EstimatorContext) -> EstimatorSnapshot { + let n_actual = self.buffer.len(); + let total_shares: u64 = self.buffer.iter().map(|&x| x as u64).sum(); + // The effective time window covered by the buffer. + let window_secs = (n_actual as u64) * self.tick_secs; + let realized_share_per_min = if window_secs > 0 { + total_shares as f64 / (window_secs as f64 / 60.0) + } else { + 0.0 + }; + + // Same conversion path as CumulativeCounter and EwmaEstimator. + let h_estimate = match hash_rate_from_target( + ctx.current_target.to_le_bytes().into(), + realized_share_per_min, + ) { + Ok(h) => h as f32, + Err(_) => ctx.current_hashrate * realized_share_per_min as f32 / ctx.shares_per_minute, + }; + + EstimatorSnapshot { + h_estimate, + realized_share_per_min, + // Report the buffer total as n_shares — that's what the + // estimator's snapshot represents. + n_shares: total_shares.min(u32::MAX as u64) as u32, + dt_secs, + uncertainty: None, + } + } +} + +/// Bayesian Gamma-Poisson estimator with exponential discounting. +/// +/// Models the per-tick share rate as a Poisson process with unknown rate λ, +/// and maintains a Gamma posterior over a normalized ratio: +/// +/// ```text +/// ratio = true_rate / expected_rate +/// ratio ~ Gamma(alpha, beta) +/// ``` +/// +/// On each `observe(n_shares)` call (one per tick), the estimator: +/// 1. Discounts the prior: `alpha *= discount`, `beta *= discount` +/// 2. Updates with the observation: `alpha += n_shares`, `beta += 1.0` +/// +/// The `+= 1.0` for beta represents "one tick's worth of exposure" — the +/// posterior tracks *shares per tick* normalized by the expected count at +/// snapshot time. +/// +/// ## Why Gamma-Poisson? +/// +/// This is the conjugate Bayesian model for Poisson data: Gamma prior + +/// Poisson likelihood → Gamma posterior. The update is exact (no approximation) +/// and closed-form (no sampling required). The posterior automatically +/// provides uncertainty quantification (variance shrinks as data accumulates). +/// +/// ## Discount factor +/// +/// `discount ∈ (0, 1]` controls memory decay per tick: +/// - 0.99: effective memory ~100 ticks (slow, steady) +/// - 0.95: effective memory ~20 ticks (moderate) +/// - 0.90: effective memory ~10 ticks (fast, jittery) +/// +/// The effective memory length is approximately `1 / (1 - discount)` ticks. +/// +/// ## Relationship to EWMA +/// +/// Both have exponential memory. Key difference: EWMA tracks a point estimate +/// of shares-per-tick. Bayesian tracks the full Gamma posterior, which gives +/// both a point estimate (posterior mean) AND an uncertainty measure (posterior +/// variance). This uncertainty can inform downstream decisions (e.g., the +/// boundary can require higher confidence before firing when uncertainty is high). +/// +/// ## Break detection / mode-switching +/// +/// This estimator does NOT include break detection. That responsibility lives +/// in the Boundary axis. Keeping estimation pure lets us compose the Bayesian +/// estimator with different boundary strategies (PoissonCI, posterior-predictive, +/// etc.) independently. +#[derive(Debug, Clone)] +pub struct BayesianEstimator { + /// Gamma posterior shape parameter. Roughly "total discounted share count." + pub alpha: f64, + /// Gamma posterior rate parameter. Roughly "total discounted tick count." + pub beta: f64, + /// Exponential discount factor applied before each tick update. Range (0, 1]. + pub discount: f64, + /// Initial pseudo-observation strength. + pub prior_shares: f64, + /// Tick interval in seconds. + pub tick_secs: u64, + /// Total shares observed since last reset (for reporting). + shares_since_reset: u32, + /// Number of ticks since last reset. + n_ticks_since_reset: u32, +} + +impl BayesianEstimator { + /// Constructs a Bayesian estimator. + /// + /// `discount` in (0, 1]: exponential forgetting per tick. + /// `prior_shares`: initial pseudo-count strength. Higher = more + /// confident initial estimate. Typically 2.0–10.0. + pub fn new(discount: f64, prior_shares: f64) -> Self { + let prior_shares = prior_shares.max(0.01); + Self { + alpha: prior_shares, + beta: prior_shares, // ratio_mean = alpha/beta = 1.0 initially + discount: discount.clamp(0.001, 1.0), + prior_shares, + tick_secs: 60, + shares_since_reset: 0, + n_ticks_since_reset: 0, + } + } + + /// Posterior mean of the rate ratio. + pub fn ratio_mean(&self) -> f64 { + if self.beta <= 0.0 { + return 1.0; + } + (self.alpha / self.beta).clamp(1.0e-6, 1.0e6) + } + + /// Posterior variance of the rate ratio. + pub fn ratio_variance(&self) -> f64 { + if self.beta <= 0.0 { + return 1.0e6; + } + (self.alpha / (self.beta * self.beta)).max(0.0) + } + + /// Posterior standard deviation of the rate ratio. + pub fn ratio_std(&self) -> f64 { + self.ratio_variance().sqrt() + } +} + +impl Estimator for BayesianEstimator { + fn observe(&mut self, n_shares: u32) { + // Each observe = one tick of data. + // We accumulate shares and tick count; the actual Bayesian update + // happens at snapshot time when we have access to SPM (the expected + // rate). This deferred approach is needed because observe() doesn't + // receive context about the expected share rate. + self.shares_since_reset = self.shares_since_reset.saturating_add(n_shares); + self.n_ticks_since_reset = self.n_ticks_since_reset.saturating_add(1); + } + + fn on_fire(&mut self, _new_hashrate: f32, _old_hashrate: f32) { + // After a fire, the new target ≈ old_target × ratio_mean, so the + // true ratio relative to the new target should be ≈ 1.0. + // + // Preserve posterior mass proportional to accumulated data — this + // is the key difference from full-reset estimators. We shift the + // center to ratio=1.0 but keep confidence proportional to + // min(accumulated_info, cap). + // + // The cap prevents over-confidence: even if we've seen 100 ticks, + // after a target change we should be somewhat uncertain about + // whether the new target is exactly right. + let info_accumulated = self.alpha.min(self.beta); + let preserved = info_accumulated + .min(self.prior_shares * 4.0) + .max(self.prior_shares); + self.alpha = preserved; + self.beta = preserved; // ratio_mean = 1.0 + + self.shares_since_reset = 0; + self.n_ticks_since_reset = 0; + } + + fn shares_count(&self) -> u32 { + self.shares_since_reset + } + + fn code(&self) -> String { + format!("Bayes-d{}-p{}", self.discount, self.prior_shares) + } + + fn snapshot(&self, dt_secs: u64, ctx: &EstimatorContext) -> EstimatorSnapshot { + // Compute the posterior after incorporating ALL ticks since last reset. + // Each tick contributes (observed_shares_that_tick, expected_shares_per_tick) + // to the Gamma-Poisson update. Since we only have the total, we treat + // the whole window as one observation: + // alpha_new = discount^n * alpha_0 + total_observed + // beta_new = discount^n * beta_0 + total_expected + // + // This is mathematically equivalent to per-tick updates when the + // observation is concentrated in one window (which it is, since + // Composed resets on fire). + let n_ticks = self.n_ticks_since_reset as f64; + let total_observed = self.shares_since_reset as f64; + + // Expected shares for the entire window at current difficulty + let expected_per_tick = (ctx.shares_per_minute as f64) * (self.tick_secs as f64 / 60.0); + let total_expected = expected_per_tick * n_ticks; + + // Discount factor over the full window + let discount_factor = self.discount.powf(n_ticks); + + let alpha = discount_factor * self.alpha + total_observed; + let beta = discount_factor * self.beta + total_expected.max(1.0e-12); + + // Posterior mean ratio + let ratio_mean = if beta > 0.0 { + (alpha / beta).clamp(1.0e-6, 1.0e6) + } else { + 1.0 + }; + + // Convert ratio to hashrate estimate + let h_estimate = (ctx.current_hashrate as f64 * ratio_mean) as f32; + + let realized_share_per_min = if dt_secs > 0 { + total_observed / (dt_secs as f64 / 60.0) + } else { + 0.0 + }; + + // Posterior standard deviation: sqrt(alpha / beta^2) + let ratio_std = if beta > 0.0 { + (alpha / (beta * beta)).sqrt() + } else { + 1.0 + }; + let effective_n = beta; // beta ≈ total discounted exposure + + EstimatorSnapshot { + h_estimate, + realized_share_per_min, + n_shares: self.shares_since_reset, + dt_secs, + uncertainty: Some(Uncertainty { + ratio_std, + effective_n, + }), + } + } +} + +/// Kalman filter estimator for hashrate tracking. +/// +/// Models the hashrate ratio as a scalar state evolving with process noise: +/// +/// ```text +/// State model: ratio(t+1) = ratio(t) + w, w ~ N(0, Q) +/// Observation: shares(t) ~ Poisson(SPM * ratio(t) * tick/60) +/// ≈ N(SPM * ratio * tick/60, SPM * ratio * tick/60) [Gaussian approx] +/// ``` +/// +/// The Kalman filter produces both a point estimate (state mean) and +/// uncertainty (state covariance P) at each tick — exactly what the +/// pipeline's `Uncertainty` handoff requires. +/// +/// ## Process noise Q +/// +/// Q controls how much the filter expects hashrate to change between ticks: +/// - Small Q (e.g., 0.0001): assumes hashrate is nearly constant — smooth +/// estimate, slow to react to real changes +/// - Large Q (e.g., 0.01): assumes hashrate can change rapidly — responsive +/// but noisy +/// +/// Analogous to EWMA's τ: `Q ≈ 1/τ²` roughly (larger Q = shorter memory). +/// +/// ## Gaussian approximation +/// +/// Valid for SPM ≥ 12 (expected shares ≥ 12 per tick). At SPM=6 the Poisson +/// is skewed; the filter still works but uncertainty estimates are less +/// accurate. The approximation `Var[shares] ≈ E[shares]` is used for the +/// measurement noise R. +/// +/// ## on_fire behavior +/// +/// Rescales the state estimate and covariance by the retarget ratio. Unlike +/// EWMA (which rescales its rate), the Kalman rescales the ratio state +/// itself: `new_ratio = old_ratio / retarget_factor` and P is preserved. +/// This means the filter retains confidence across fires. +#[derive(Debug, Clone)] +pub struct KalmanEstimator { + /// State estimate: ratio = true_h / target_h. + ratio_state: f64, + /// State covariance (uncertainty squared). + p: f64, + /// Process noise variance per tick. Controls responsiveness. + pub q: f64, + /// Tick interval in seconds. + pub tick_secs: u64, + /// Shares accumulated since last fire (for reporting). + shares_since_fire: u32, + /// Ticks since last fire. + n_ticks: u32, +} + +impl KalmanEstimator { + /// Constructs a Kalman estimator with the given process noise. + /// + /// `q` is process noise variance per tick. Good values: + /// - 0.001: moderate responsiveness (similar to EWMA τ=120s) + /// - 0.005: fast response (similar to EWMA τ=60s) + /// - 0.0002: very smooth (similar to EWMA τ=300s) + pub fn new(q: f64) -> Self { + Self { + ratio_state: 1.0, + p: 1.0, // Start uncertain + q: q.max(1.0e-12), + tick_secs: 60, + shares_since_fire: 0, + n_ticks: 0, + } + } +} + +impl Estimator for KalmanEstimator { + fn observe(&mut self, n_shares: u32) { + self.shares_since_fire = self.shares_since_fire.saturating_add(n_shares); + self.n_ticks = self.n_ticks.saturating_add(1); + } + + fn on_fire(&mut self, new_hashrate: f32, old_hashrate: f32) { + if old_hashrate > 0.0 && new_hashrate > 0.0 { + let retarget_ratio = new_hashrate as f64 / old_hashrate as f64; + // After retarget, the new ratio relative to new target should be + // old_ratio / retarget_ratio (since new_target = old_target * retarget_ratio) + self.ratio_state /= retarget_ratio; + // Covariance P is preserved — our confidence about the ratio + // doesn't change just because the reference point shifted. + } else { + self.ratio_state = 1.0; + self.p = 1.0; + } + self.shares_since_fire = 0; + self.n_ticks = 0; + } + + fn shares_count(&self) -> u32 { + self.shares_since_fire + } + + fn code(&self) -> String { + format!("Kalman-q{}", self.q) + } + + fn snapshot(&self, dt_secs: u64, ctx: &EstimatorContext) -> EstimatorSnapshot { + // Run the Kalman predict+update for all accumulated ticks. + // We do this at snapshot time (like Bayesian) because observe() + // doesn't have SPM context. + let mut ratio = self.ratio_state; + let mut p = self.p; + + if self.n_ticks > 0 && dt_secs > 0 { + let expected_shares_per_tick = + (ctx.shares_per_minute as f64) * (self.tick_secs as f64 / 60.0); + + // Per-tick Kalman update (batch: apply n_ticks of predict+update) + // For efficiency, we do the batch as if all shares arrived uniformly + let shares_per_tick = self.shares_since_fire as f64 / self.n_ticks as f64; + + for _ in 0..self.n_ticks { + // Predict step: state unchanged, covariance grows + p += self.q; + + // Update step (Gaussian-approximated Poisson observation) + // Measurement: z = shares_this_tick + // Expected measurement: H = expected_shares_per_tick * ratio + // Measurement noise: R = expected_shares_per_tick * ratio (Poisson variance) + let h_matrix = expected_shares_per_tick; // dz/d_ratio + let predicted_shares = expected_shares_per_tick * ratio; + let r = predicted_shares.max(1.0); // measurement noise (Poisson variance) + + // Innovation + let innovation = shares_per_tick - predicted_shares; + + // Innovation covariance: S = H*P*H' + R + let s = h_matrix * p * h_matrix + r; + + if s > 0.0 { + // Kalman gain: K = P*H' / S + let k = (p * h_matrix) / s; + + // State update + ratio += k * innovation; + + // Covariance update: P = (1 - K*H) * P + p = (1.0 - k * h_matrix) * p; + } + + // Clamp ratio to reasonable bounds + ratio = ratio.clamp(1.0e-6, 1.0e6); + p = p.max(1.0e-12); + } + } + + let h_estimate = (ctx.current_hashrate as f64 * ratio) as f32; + let ratio_std = p.sqrt(); + let effective_n = if p > 0.0 { 1.0 / p } else { 1.0 }; + + let realized_share_per_min = if dt_secs > 0 { + self.shares_since_fire as f64 / (dt_secs as f64 / 60.0) + } else { + 0.0 + }; + + EstimatorSnapshot { + h_estimate, + realized_share_per_min, + n_shares: self.shares_since_fire, + dt_secs, + uncertainty: Some(Uncertainty { + ratio_std, + effective_n, + }), + } + } +} + +/// Dual-window EWMA estimator inspired by ckpool's `decay_time` function. +/// +/// ckpool updates its EMA on every share submission using `decay_time()`: +/// ```text +/// fprop = 1 - e^(-elapsed / interval) +/// f += (share_diff / elapsed) * fprop +/// f /= (1 + fprop) +/// ``` +/// +/// In the tick-based framework, we simulate this by running ckpool's +/// exact `decay_time()` formula once per share within `snapshot()`, +/// distributing shares uniformly across the tick interval. With N shares +/// in a 60s tick, each gets `elapsed = 60/N` seconds — faithfully +/// reproducing ckpool's per-share EMA accumulation. +/// +/// This avoids the time-bias correction problem: the EMA warms up +/// organically through simulated per-share updates rather than needing +/// a post-hoc `1/bias` amplification. +/// +/// Two EMAs are maintained in parallel (short=60s, long=300s). The short +/// window is selected when total shares since last fire exceed the "fast" +/// threshold (72), matching ckpool's adaptive window switching for rapid +/// ramp-up of high-hashrate miners. +#[derive(Debug)] +pub struct CkpoolEstimator { + /// Short-window time constant (seconds). ckpool uses 60. + pub tau_short: u64, + /// Long-window time constant (seconds). ckpool uses 300. + pub tau_long: u64, + /// Tick interval in seconds (must match trial driver). + pub tick_secs: u64, + /// Override for the fast-threshold. When `Some(n)`, the short window + /// activates after `n` shares since last fire. When `None`, the + /// threshold is derived as `tau_long * 0.8 / target_period_secs`. + fast_threshold_override: Option, + /// Target share period in seconds (ckpool uses 3.33). + pub target_period_secs: f64, + /// Short-window EMA: difficulty-weighted shares per second. + dsps_short_bits: std::sync::atomic::AtomicU64, + /// Long-window EMA: difficulty-weighted shares per second. + dsps_long_bits: std::sync::atomic::AtomicU64, + /// Shares accumulated since last snapshot (pending). + pending_shares: std::sync::atomic::AtomicU32, + /// Total shares since last fire (for adaptive window switching). + shares_since_fire: std::sync::atomic::AtomicU32, +} + +impl CkpoolEstimator { + /// Construct with ckpool's default parameters: τ_short=60s, τ_long=300s, + /// target period=3.33s (one share every 3.33 seconds → drr target 0.3). + pub fn new(tau_short: u64, tau_long: u64) -> Self { + use std::sync::atomic::{AtomicU32, AtomicU64}; + Self { + tau_short, + tau_long, + tick_secs: 60, + fast_threshold_override: None, + target_period_secs: 3.33, + dsps_short_bits: AtomicU64::new(0.0f64.to_bits()), + dsps_long_bits: AtomicU64::new(0.0f64.to_bits()), + pending_shares: AtomicU32::new(0), + shares_since_fire: AtomicU32::new(0), + } + } + + /// Construct with a custom fast-threshold override. When shares since + /// last fire reach this count, the estimator switches to the short + /// window for faster responsiveness. + pub fn with_fast_threshold(tau_short: u64, tau_long: u64, fast_threshold: u32) -> Self { + let mut e = Self::new(tau_short, tau_long); + e.fast_threshold_override = Some(fast_threshold); + e + } + + /// ckpool defaults: 60s short, 300s long, 3.33s target period. + pub fn ckpool_defaults() -> Self { + Self::new(60, 300) + } + + /// The "fast" threshold: number of shares since last fire required to + /// switch to the short-window EMA. ckpool uses 72 (= 240s / 3.33s). + pub fn fast_threshold(&self) -> u32 { + self.fast_threshold_override.unwrap_or_else(|| { + ((self.tau_long as f64 * 0.8) / self.target_period_secs).round() as u32 + }) + } + + fn get_dsps_short(&self) -> f64 { + f64::from_bits( + self.dsps_short_bits + .load(std::sync::atomic::Ordering::Relaxed), + ) + } + + fn set_dsps_short(&self, v: f64) { + self.dsps_short_bits + .store(v.to_bits(), std::sync::atomic::Ordering::Relaxed); + } + + fn get_dsps_long(&self) -> f64 { + f64::from_bits( + self.dsps_long_bits + .load(std::sync::atomic::Ordering::Relaxed), + ) + } + + fn set_dsps_long(&self, v: f64) { + self.dsps_long_bits + .store(v.to_bits(), std::sync::atomic::Ordering::Relaxed); + } + + /// ckpool's `decay_time()` — the core EMA update per share. + /// + /// ```text + /// fprop = 1 - e^(-elapsed / interval) + /// f += (fadd / elapsed) * fprop + /// f /= (1 + fprop) + /// ``` + /// + /// `f` is the running dsps (difficulty-shares per second). + /// `fadd` is the difficulty of the submitted share (1.0 in our model). + /// `elapsed` is seconds since the last share. + /// `interval` is the time constant (tau). + fn decay_time(f: f64, fadd: f64, elapsed: f64, interval: f64) -> f64 { + if elapsed <= 0.0 { + return f; + } + let dexp = (elapsed / interval).min(36.0); + let fprop = 1.0 - (-dexp).exp(); + let ftotal = 1.0 + fprop; + (f + (fadd / elapsed) * fprop) / ftotal + } +} + +impl Estimator for CkpoolEstimator { + fn observe(&mut self, n_shares: u32) { + *self.pending_shares.get_mut() = self.pending_shares.get_mut().saturating_add(n_shares); + *self.shares_since_fire.get_mut() = + self.shares_since_fire.get_mut().saturating_add(n_shares); + } + + fn on_fire(&mut self, new_hashrate: f32, old_hashrate: f32) { + if old_hashrate <= 0.0 || new_hashrate <= 0.0 { + self.set_dsps_short(0.0); + self.set_dsps_long(0.0); + *self.shares_since_fire.get_mut() = 0; + return; + } + + // Rescale dsps: under new difficulty, same true hashrate produces + // shares at rate = old_rate × (old_h / new_h). + let ratio = new_hashrate as f64 / old_hashrate as f64; + if ratio > 0.0 && ratio.is_finite() { + self.set_dsps_short(self.get_dsps_short() / ratio); + self.set_dsps_long(self.get_dsps_long() / ratio); + } else { + self.set_dsps_short(0.0); + self.set_dsps_long(0.0); + } + *self.shares_since_fire.get_mut() = 0; + } + + fn shares_count(&self) -> u32 { + self.pending_shares + .load(std::sync::atomic::Ordering::Relaxed) + } + + fn code(&self) -> String { + format!("Ckpool{}-{}s", self.tau_short, self.tau_long) + } + + fn snapshot(&self, dt_secs: u64, ctx: &EstimatorContext) -> EstimatorSnapshot { + let pending = self + .pending_shares + .load(std::sync::atomic::Ordering::Relaxed); + let shares_since_fire = self + .shares_since_fire + .load(std::sync::atomic::Ordering::Relaxed); + + // Simulate per-share decay_time() calls. Each share is treated + // as arriving at uniform intervals within the tick: elapsed = + // tick_secs / n_shares per share submission. + let mut dsps_s = self.get_dsps_short(); + let mut dsps_l = self.get_dsps_long(); + + if pending > 0 { + let inter_share_secs = self.tick_secs as f64 / pending as f64; + for _ in 0..pending { + dsps_s = Self::decay_time(dsps_s, 1.0, inter_share_secs, self.tau_short as f64); + dsps_l = Self::decay_time(dsps_l, 1.0, inter_share_secs, self.tau_long as f64); + } + } else { + // No shares this tick: decay with full tick interval, fadd=0. + // decay_time with fadd=0 simplifies to: f / (1 + fprop) + let dexp_s = (self.tick_secs as f64 / self.tau_short as f64).min(36.0); + let fprop_s = 1.0 - (-dexp_s).exp(); + dsps_s /= 1.0 + fprop_s; + + let dexp_l = (self.tick_secs as f64 / self.tau_long as f64).min(36.0); + let fprop_l = 1.0 - (-dexp_l).exp(); + dsps_l /= 1.0 + fprop_l; + } + + // Advance state. + self.set_dsps_short(dsps_s); + self.set_dsps_long(dsps_l); + self.pending_shares + .store(0, std::sync::atomic::Ordering::Relaxed); + + // Select which EMA to use based on share flood detection. + let total_shares = shares_since_fire.saturating_add(pending); + let dsps = if total_shares >= self.fast_threshold() { + dsps_s + } else { + dsps_l + }; + + // Convert dsps (shares/sec) to shares/min, then to hashrate. + let realized_share_per_min = dsps * 60.0; + + let h_estimate = match hash_rate_from_target( + ctx.current_target.to_le_bytes().into(), + realized_share_per_min, + ) { + Ok(h) => h as f32, + Err(_) => ctx.current_hashrate * realized_share_per_min as f32 / ctx.shares_per_minute, + }; + + EstimatorSnapshot { + h_estimate, + realized_share_per_min, + n_shares: total_shares, + dt_secs, + uncertainty: None, + } + } +} + +/// EWMA estimator with ckpool's time-bias warmup correction. +/// +/// Identical to [`EwmaEstimator`] except `snapshot()` divides the raw +/// EWMA rate by `1 - e^(-dt_secs/tau_secs)` before converting to +/// hashrate. This compensates for the EMA being naturally suppressed +/// when the counter is young (few ticks since last fire), making the +/// estimator more accurate immediately after retarget events. +/// +/// The time-bias idea comes from ckpool's `time_bias()` function in +/// `stratifier.c`. Empirically, ckpool's counter-age ratio advantage +/// (reacting faster with a mature counter) traces to this correction. +/// +/// Use in place of `EwmaEstimator` to test whether time-bias correction +/// improves counter-age sensitivity and post-fire accuracy without +/// sacrificing steady-state performance. +#[derive(Debug)] +pub struct TimeBiasEwmaEstimator { + /// Time constant in seconds. + pub tau_secs: u64, + /// Tick interval in seconds. + pub tick_secs: u64, + /// Current rate estimate (shares per tick), stored as bits. + rate_bits: std::sync::atomic::AtomicU64, + /// Pending shares since last snapshot. + pending_shares: std::sync::atomic::AtomicU32, + /// Ticks since last fire/reset. + n_ticks: std::sync::atomic::AtomicU32, +} + +impl TimeBiasEwmaEstimator { + pub fn new(tau_secs: u64) -> Self { + use std::sync::atomic::{AtomicU32, AtomicU64}; + Self { + tau_secs, + tick_secs: 60, + rate_bits: AtomicU64::new(0.0f64.to_bits()), + pending_shares: AtomicU32::new(0), + n_ticks: AtomicU32::new(0), + } + } + + fn alpha(&self) -> f64 { + (-(self.tick_secs as f64) / (self.tau_secs as f64)).exp() + } + + fn get_rate(&self) -> f64 { + f64::from_bits(self.rate_bits.load(std::sync::atomic::Ordering::Relaxed)) + } + + fn set_rate(&self, rate: f64) { + self.rate_bits + .store(rate.to_bits(), std::sync::atomic::Ordering::Relaxed); + } + + /// ckpool's time_bias: `1 - e^(-elapsed/tau)`. + fn time_bias(&self, dt_secs: u64) -> f64 { + let dexp = (dt_secs as f64 / self.tau_secs as f64).min(36.0); + 1.0 - (-dexp).exp() + } +} + +impl Estimator for TimeBiasEwmaEstimator { + fn observe(&mut self, n_shares: u32) { + *self.pending_shares.get_mut() = self.pending_shares.get_mut().saturating_add(n_shares); + } + + fn on_fire(&mut self, new_hashrate: f32, old_hashrate: f32) { + let pending = *self.pending_shares.get_mut(); + let n_ticks = *self.n_ticks.get_mut(); + + if pending > 0 { + let n = pending as f64; + let rate = if n_ticks == 0 { + n + } else { + let alpha = self.alpha(); + alpha * self.get_rate() + (1.0 - alpha) * n + }; + self.set_rate(rate); + *self.n_ticks.get_mut() = n_ticks + 1; + *self.pending_shares.get_mut() = 0; + } + + if old_hashrate <= 0.0 || new_hashrate <= 0.0 { + self.set_rate(0.0); + *self.n_ticks.get_mut() = 0; + return; + } + + let ratio = new_hashrate as f64 / old_hashrate as f64; + if ratio > 0.0 && ratio.is_finite() { + self.set_rate(self.get_rate() / ratio); + } else { + self.set_rate(0.0); + *self.n_ticks.get_mut() = 0; + } + } + + fn shares_count(&self) -> u32 { + self.pending_shares + .load(std::sync::atomic::Ordering::Relaxed) + } + + fn code(&self) -> String { + format!("TimeBiasEwma{}s", self.tau_secs) + } + + fn snapshot(&self, dt_secs: u64, ctx: &EstimatorContext) -> EstimatorSnapshot { + let pending = self + .pending_shares + .load(std::sync::atomic::Ordering::Relaxed); + let n_ticks = self.n_ticks.load(std::sync::atomic::Ordering::Relaxed); + let n = pending as f64; + + let rate = if n_ticks == 0 { + n + } else { + let alpha = self.alpha(); + alpha * self.get_rate() + (1.0 - alpha) * n + }; + + // Advance state. + self.set_rate(rate); + self.n_ticks + .store(n_ticks + 1, std::sync::atomic::Ordering::Relaxed); + self.pending_shares + .store(0, std::sync::atomic::Ordering::Relaxed); + + // Apply time-bias correction: divide by `1 - e^(-dt/tau)` to + // compensate for EMA warmup suppression when counter is young. + let bias = self.time_bias(dt_secs); + let corrected_rate = if bias > 0.01 { rate / bias } else { rate }; + + let realized_share_per_min = corrected_rate * (60.0 / self.tick_secs as f64); + let h_estimate = match hash_rate_from_target( + ctx.current_target.to_le_bytes().into(), + realized_share_per_min, + ) { + Ok(h) => h as f32, + Err(_) => ctx.current_hashrate * realized_share_per_min as f32 / ctx.shares_per_minute, + }; + + EstimatorSnapshot { + h_estimate, + realized_share_per_min, + n_shares: pending, + dt_secs, + uncertainty: None, + } + } +} + +/// Steady-state debias wrapper for any inner estimator `E`. +/// +/// Multiplies the inner estimator's hashrate belief (`h_estimate`) by a +/// fixed `bias` factor, leaving the raw `realized_share_per_min` +/// observation untouched. The motivation: an asymmetric, tighten-reluctant +/// boundary (the SignPersist champion) equilibrates at a point where the +/// under-difficulty deviation just fails to cross the elevated tighten +/// threshold — a persistent negative `regret_under` offset (≈ −7% in the +/// trajectory plot). A `bias > 1` lifts the belief so that equilibrium +/// sits closer to truth. +/// +/// **Caveat (see `docs/THEORY.md` §5/§9):** the same scaled belief is what +/// the update rule retargets toward, so raising `bias` trades +/// `regret_under` down for `regret_over` up. Under the §10 cost +/// (`w_over:w_under = 3:1`) that trade is priced against you, so this is +/// expected to *reduce the settle gap but raise the cost* — it exists to +/// quantify that tradeoff curve and confirm whether the −7% offset is a +/// defect or the deliberate cost optimum, not as an obvious win. +#[derive(Debug)] +pub struct DebiasEstimator { + /// The wrapped estimator. + pub inner: E, + /// Multiplicative bias on `h_estimate` (1.0 = no change; >1 lifts the + /// belief, pushing the steady-state equilibrium toward truth). + pub bias: f32, +} + +impl DebiasEstimator { + pub fn new(inner: E, bias: f32) -> Self { + Self { + inner, + bias: bias.max(0.0), + } + } +} + +impl Estimator for DebiasEstimator { + fn observe(&mut self, n_shares: u32) { + self.inner.observe(n_shares); + } + + fn on_fire(&mut self, new_hashrate: f32, old_hashrate: f32) { + self.inner.on_fire(new_hashrate, old_hashrate); + } + + fn snapshot(&self, dt_secs: u64, ctx: &EstimatorContext) -> EstimatorSnapshot { + let mut snap = self.inner.snapshot(dt_secs, ctx); + snap.h_estimate *= self.bias; + snap + } + + fn shares_count(&self) -> u32 { + self.inner.shares_count() + } + + fn code(&self) -> String { + format!("{}+bias{}", self.inner.code(), self.bias) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn observe_increments_share_count() { + let mut e = CumulativeCounter::new(); + e.observe(10); + e.observe(5); + assert_eq!(e.shares_count(), 15); + } + + #[test] + fn reset_zeroes_share_count() { + let mut e = CumulativeCounter::new(); + e.observe(10); + e.on_fire(0.0, 0.0); + assert_eq!(e.shares_count(), 0); + } + + #[test] + fn observe_saturates_at_u32_max() { + let mut e = CumulativeCounter::new(); + e.observe(u32::MAX); + e.observe(1); + assert_eq!(e.shares_count(), u32::MAX); + } + + #[test] + fn snapshot_realized_rate_is_shares_per_minute() { + let mut e = CumulativeCounter::new(); + e.observe(12); // 12 shares over 60s = 12 spm + let target = Target::MAX; + let ctx = EstimatorContext { + current_hashrate: 1.0e15, + current_target: &target, + shares_per_minute: 12.0, + }; + let snap = e.snapshot(60, &ctx); + assert!((snap.realized_share_per_min - 12.0).abs() < 1e-9); + assert_eq!(snap.n_shares, 12); + assert_eq!(snap.dt_secs, 60); + } + + #[test] + fn debias_scales_h_estimate_only() { + // The debias wrapper must multiply h_estimate by `bias` while + // leaving the raw realized rate and share count untouched. + let target = Target::MAX; + let ctx = EstimatorContext { + current_hashrate: 1.0e15, + current_target: &target, + shares_per_minute: 12.0, + }; + + let mut base = CumulativeCounter::new(); + base.observe(12); + let base_snap = base.snapshot(60, &ctx); + + let mut wrapped = DebiasEstimator::new(CumulativeCounter::new(), 1.1); + wrapped.observe(12); + let snap = wrapped.snapshot(60, &ctx); + + assert!( + (snap.h_estimate - base_snap.h_estimate * 1.1).abs() <= base_snap.h_estimate * 1e-6, + "h_estimate must be scaled by bias: got {}, want {}", + snap.h_estimate, + base_snap.h_estimate * 1.1 + ); + // Raw observation and count pass through unchanged. + assert!((snap.realized_share_per_min - base_snap.realized_share_per_min).abs() < 1e-9); + assert_eq!(snap.n_shares, base_snap.n_shares); + } + + #[test] + fn snapshot_zero_dt_yields_zero_rate() { + let e = CumulativeCounter::new(); + let target = Target::MAX; + let ctx = EstimatorContext { + current_hashrate: 1.0e15, + current_target: &target, + shares_per_minute: 12.0, + }; + let snap = e.snapshot(0, &ctx); + assert_eq!(snap.realized_share_per_min, 0.0); + } + + // ---- EwmaEstimator ---- + + /// Simulate one tick: add shares, then call snapshot to flush the + /// EWMA state (mirroring how `Composed` drives the estimator). + fn ewma_tick(e: &mut EwmaEstimator, n_shares: u32) { + e.observe(n_shares); + let target = Target::MAX; + let ctx = EstimatorContext { + current_hashrate: 1.0e15, + current_target: &target, + shares_per_minute: 12.0, + }; + e.snapshot(60, &ctx); + } + + #[test] + fn ewma_first_observation_sets_rate_directly() { + let mut e = EwmaEstimator::new(60); + ewma_tick(&mut e, 12); + assert!((e.rate_per_tick() - 12.0).abs() < 1e-9); + } + + #[test] + fn ewma_converges_to_steady_input() { + let mut e = EwmaEstimator::new(120); + for _ in 0..200 { + ewma_tick(&mut e, 12); + } + assert!((e.rate_per_tick() - 12.0).abs() < 1e-6); + } + + #[test] + fn ewma_with_long_tau_responds_slowly_to_change() { + let mut e = EwmaEstimator::new(600); + for _ in 0..10 { + ewma_tick(&mut e, 10); + } + assert!((e.rate_per_tick() - 10.0).abs() < 1.0); + // Now switch to 0; one tick later the rate should still be + // mostly 10 (long memory). + ewma_tick(&mut e, 0); + // alpha = exp(-60/600) ≈ 0.905. new rate ≈ 0.905 × 10 + 0.095 × 0 = 9.05 + assert!( + e.rate_per_tick() > 8.5, + "rate fell too fast: {}", + e.rate_per_tick() + ); + assert!(e.rate_per_tick() < 9.5); + } + + #[test] + fn ewma_with_short_tau_responds_fast_to_change() { + let mut e = EwmaEstimator::new(30); + for _ in 0..10 { + ewma_tick(&mut e, 10); + } + // Switch to 0. + ewma_tick(&mut e, 0); + // alpha = exp(-60/30) = exp(-2) ≈ 0.135. new ≈ 0.135 × 10 + 0.865 × 0 = 1.35 + assert!( + e.rate_per_tick() < 2.0, + "rate fell too slow: {}", + e.rate_per_tick() + ); + } + + #[test] + fn ewma_reset_clears_state() { + let mut e = EwmaEstimator::new(60); + for _ in 0..5 { + ewma_tick(&mut e, 10); + } + e.on_fire(0.0, 0.0); + assert_eq!(e.shares_count(), 0); + // After reset, first observation again initializes directly. + ewma_tick(&mut e, 42); + assert!((e.rate_per_tick() - 42.0).abs() < 1e-9); + } + + #[test] + fn ewma_observe_accumulates_without_decay() { + // Multiple observe(1) calls within a tick should produce the + // same result as one observe(12) call. + let mut e1 = EwmaEstimator::new(120); + let mut e2 = EwmaEstimator::new(120); + // First tick: seed both + ewma_tick(&mut e1, 10); + ewma_tick(&mut e2, 10); + // Second tick: e1 gets bulk, e2 gets per-share + e1.observe(12); + for _ in 0..12 { + e2.observe(1); + } + let target = Target::MAX; + let ctx = EstimatorContext { + current_hashrate: 1.0e15, + current_target: &target, + shares_per_minute: 12.0, + }; + let snap1 = e1.snapshot(60, &ctx); + let snap2 = e2.snapshot(60, &ctx); + assert!( + (snap1.realized_share_per_min - snap2.realized_share_per_min).abs() < 1e-9, + "bulk observe and per-share observe must produce identical results: {} vs {}", + snap1.realized_share_per_min, + snap2.realized_share_per_min, + ); + } + + // ---- U256 round-trip precision regression check ---- + // + // The `hash_rate_to_target` / `hash_rate_from_target` round-trip + // should be approximately linear: `recovered ≈ hashrate × + // realized_spm / configured_spm`. A pre-fix bug at + // `target.rs:184` truncated the scale factor too aggressively + // (×100 instead of ×100_000), producing up to 49% inflation at + // realized_spm ∈ (30, 60). See FINDINGS.md §3 for the analysis. + // + // The fix (`× 100_000` scaling on both sides of the U256 + // arithmetic) brings round-trip precision below 1% for all + // realistic inputs. This test pins that precision so a regression + // (someone reverting to `× 100`) gets caught immediately. + + #[test] + fn hash_rate_round_trip_is_precise_after_u256_fix() { + use crate::target::{hash_rate_from_target, hash_rate_to_target}; + + // (hashrate, configured_spm, realized_spm) — points that hit + // the worst pre-fix inflation. Each is from the SPM=30 + // cold-start trace at the corresponding tick. Post-fix all + // should round-trip within 1% of the linear prediction. + let cases: &[(f64, f64, f64)] = &[ + // Pre-fix inflation: 1.49×. Post-fix: ~1×. + (7.29e12, 30.0, 4031.0), + // Pre-fix inflation: 1.09×. Post-fix: ~1×. + (2.19e13, 30.0, 1375.0), + // Pre-fix inflation: 1.08×. Post-fix: ~1×. + (6.56e13, 30.0, 464.0), + // Pre-fix inflation: 1.01×. Post-fix: ~1×. + (1.97e14, 30.0, 169.0), + // Always-precise cases (realized matches configured). + (1.0e15, 30.0, 30.0), + (1.0e15, 12.0, 60.0), + // Additional coverage at production-typical share rates. + (1.0e15, 6.0, 6.0), + (1.0e15, 120.0, 120.0), + ]; + + for &(hashrate, configured, realized) in cases { + let target = hash_rate_to_target(hashrate, configured) + .expect("target conversion should succeed"); + let recovered = hash_rate_from_target(target.to_le_bytes().into(), realized) + .expect("hashrate recovery should succeed"); + let linear_prediction = hashrate * realized / configured; + let inflation = recovered / linear_prediction; + // 2% tolerance after the U256 fix. Includes the small + // target+1 ≈ target and 2^256 − target ≈ 2^256 + // approximations (both relative error < 1e-13) plus the + // residual truncation in `60/realized × 100_000 as u128`. + assert!( + (inflation - 1.0).abs() < 0.02, + "round-trip inflation at hashrate={}, cfg={}, realized={}: \ + expected ~1.0, got {} (recovered={}, linear_prediction={}). \ + This likely means the `× 100_000` U256 scale factor in \ + target.rs was reverted to `× 100` — see FINDINGS.md §3.", + hashrate, + configured, + realized, + inflation, + recovered, + linear_prediction, + ); + } + } + + // ---- SlidingWindowEstimator ---- + + #[test] + fn sliding_window_buffer_grows_then_evicts_oldest() { + let mut e = SlidingWindowEstimator::new(3); + e.observe(10); + e.observe(20); + e.observe(30); + // Buffer is full; next observe evicts the oldest. + e.observe(40); + assert_eq!(e.shares_count(), 20 + 30 + 40); + e.observe(50); + assert_eq!(e.shares_count(), 30 + 40 + 50); + } + + #[test] + fn sliding_window_reset_clears_buffer() { + let mut e = SlidingWindowEstimator::new(5); + for _ in 0..5 { + e.observe(10); + } + assert_eq!(e.shares_count(), 50); + e.on_fire(0.0, 0.0); + assert_eq!(e.shares_count(), 0); + // Buffer is empty; first observe after reset starts fresh. + e.observe(7); + assert_eq!(e.shares_count(), 7); + } + + #[test] + fn sliding_window_short_buffer_uses_actual_length() { + // Window n_ticks=10 but only 3 observations. realized rate + // should be (sum / 3 ticks), not (sum / 10 ticks). + let mut e = SlidingWindowEstimator::new(10); + e.observe(30); + e.observe(30); + e.observe(30); + let target = Target::MAX; + let ctx = EstimatorContext { + current_hashrate: 1.0e15, + current_target: &target, + shares_per_minute: 30.0, + }; + let snap = e.snapshot(180, &ctx); + // 3 ticks × 60s = 180s window. 90 shares total. realized = 90/3 = 30 spm. + assert!((snap.realized_share_per_min - 30.0).abs() < 1e-6); + } + + #[test] + fn sliding_window_full_buffer_averages_correctly() { + // Constant 30 shares per tick across 10 ticks. realized_per_min + // = 30. Exact. + let mut e = SlidingWindowEstimator::new(10); + for _ in 0..10 { + e.observe(30); + } + let target = Target::MAX; + let ctx = EstimatorContext { + current_hashrate: 1.0e15, + current_target: &target, + shares_per_minute: 30.0, + }; + let snap = e.snapshot(600, &ctx); + assert!((snap.realized_share_per_min - 30.0).abs() < 1e-6); + } + + #[test] + fn sliding_window_oldest_drops_out() { + // Fill with 60-per-tick (high rate), then add ticks at 0 + // (truth has dropped). Once the buffer fully turns over, the + // estimate should reflect the new rate. + let mut e = SlidingWindowEstimator::new(5); + for _ in 0..5 { + e.observe(60); + } + // Buffer = [60, 60, 60, 60, 60]; total = 300; realized = 60 spm. + // Now feed 5 ticks of 0: + for _ in 0..5 { + e.observe(0); + } + // Buffer = [0, 0, 0, 0, 0]; realized = 0 spm. + assert_eq!(e.shares_count(), 0); + let target = Target::MAX; + let ctx = EstimatorContext { + current_hashrate: 1.0e15, + current_target: &target, + shares_per_minute: 60.0, + }; + let snap = e.snapshot(300, &ctx); + assert_eq!(snap.realized_share_per_min, 0.0); + } + + #[test] + fn sliding_window_empty_buffer_yields_zero_rate() { + let e = SlidingWindowEstimator::new(10); + let target = Target::MAX; + let ctx = EstimatorContext { + current_hashrate: 1.0e15, + current_target: &target, + shares_per_minute: 30.0, + }; + let snap = e.snapshot(60, &ctx); + assert_eq!(snap.realized_share_per_min, 0.0); + } + + #[test] + fn ewma_snapshot_returns_rate_in_shares_per_minute() { + let mut e = EwmaEstimator::new(60); + // Feed 12 shares per tick for many ticks. + for _ in 0..50 { + ewma_tick(&mut e, 12); + } + // rate_per_tick ≈ 12, tick_secs = 60. + // shares_per_min = 12 * (60/60) = 12. + // Add one more tick's worth and snapshot to check. + e.observe(12); + let target = Target::MAX; + let ctx = EstimatorContext { + current_hashrate: 1.0e15, + current_target: &target, + shares_per_minute: 12.0, + }; + let snap = e.snapshot(60, &ctx); + assert!((snap.realized_share_per_min - 12.0).abs() < 1e-3); + } + + // ---- SpmRatioEstimator ---- + + #[test] + fn spm_ratio_converges_to_steady_input() { + // Feed a constant stream of 12 shares per tick; the EWMA should + // converge to 12 regardless of tau. + let mut e = SpmRatioEstimator::new(120); + for _ in 0..200 { + e.observe(12); + } + assert!( + (e.rate_per_tick() - 12.0).abs() < 1e-6, + "rate_per_tick should converge to 12.0, got {}", + e.rate_per_tick() + ); + } + + #[test] + fn spm_ratio_snapshot_returns_correct_estimate() { + // At steady state with realized_spm == shares_per_minute, + // h_estimate should equal current_hashrate. + let mut e = SpmRatioEstimator::new(60); + for _ in 0..100 { + e.observe(30); + } + // rate_per_tick ≈ 30, tick_secs = 60, realized_spm = 30. + let target = Target::MAX; + let ctx = EstimatorContext { + current_hashrate: 1.0e15, + current_target: &target, + shares_per_minute: 30.0, + }; + let snap = e.snapshot(60, &ctx); + // h_estimate = 1e15 * (30 / 30) = 1e15 + let relative_error = ((snap.h_estimate as f64) - 1.0e15).abs() / 1.0e15; + assert!( + relative_error < 1e-6, + "h_estimate should be ~1e15, got {} (relative err {})", + snap.h_estimate, + relative_error + ); + assert!((snap.realized_share_per_min - 30.0).abs() < 1e-6); + + // Now test with realized_spm != shares_per_minute (miner is 2x faster). + let mut e2 = SpmRatioEstimator::new(60); + for _ in 0..100 { + e2.observe(60); // 60 shares per tick → 60 spm + } + let ctx2 = EstimatorContext { + current_hashrate: 1.0e15, + current_target: &target, + shares_per_minute: 30.0, + }; + let snap2 = e2.snapshot(60, &ctx2); + // h_estimate = 1e15 * (60 / 30) = 2e15 + let relative_error2 = ((snap2.h_estimate as f64) - 2.0e15).abs() / 2.0e15; + assert!( + relative_error2 < 1e-6, + "h_estimate should be ~2e15, got {} (relative err {})", + snap2.h_estimate, + relative_error2 + ); + } + + #[test] + fn spm_ratio_on_fire_rescales_correctly() { + let mut e = SpmRatioEstimator::new(60); + for _ in 0..50 { + e.observe(30); + } + // rate_per_tick ≈ 30.0 + let rate_before = e.rate_per_tick(); + + // Fire: new target is 2x harder (hashrate doubled). + // Expected: rate_per_tick /= 2.0 (miner finds shares half as often). + e.on_fire(2.0e15, 1.0e15); + let expected = rate_before / 2.0; + assert!( + (e.rate_per_tick() - expected).abs() < 1e-9, + "rate_per_tick should be {} after on_fire, got {}", + expected, + e.rate_per_tick() + ); + // n_observations preserved (not reset). + assert!(e.n_observations > 0); + } + + #[test] + fn spm_ratio_on_fire_with_zero_hashrate_resets() { + let mut e = SpmRatioEstimator::new(60); + for _ in 0..10 { + e.observe(10); + } + // Zero old_hashrate → full reset. + e.on_fire(1.0e15, 0.0); + assert_eq!(e.rate_per_tick(), 0.0); + assert_eq!(e.n_observations, 0); + } +} diff --git a/sv2/channels-sv2/src/vardiff/composed/mod.rs b/sv2/channels-sv2/src/vardiff/composed/mod.rs new file mode 100644 index 0000000000..82548cd3d6 --- /dev/null +++ b/sv2/channels-sv2/src/vardiff/composed/mod.rs @@ -0,0 +1,56 @@ +//! The three-stage vardiff pipeline. +//! +//! Three sequential stages plus a composing adapter that let any +//! (Estimator, Boundary, UpdateRule) triple be automatically a valid +//! [`Vardiff`] implementation. The classic algorithm is one specific +//! composition (see [`classic_composed`]) and is asserted fire-for-fire +//! equivalent to [`crate::vardiff::classic::VardiffState`] by the +//! `vardiff_sim` crate's equivalence-test suite. +//! +//! The recommended production composition (FullRemedy): +//! +//! ```rust,ignore +//! use channels_sv2::vardiff::composed::{ +//! Composed, EwmaEstimator, PoissonCI, PartialRetarget, +//! }; +//! use channels_sv2::vardiff::SystemClock; +//! use std::sync::Arc; +//! +//! let v = Composed::new( +//! EwmaEstimator::new(120), +//! PoissonCI::default_parametric(), +//! PartialRetarget::new(0.2), +//! /* min_hashrate */ 1.0, +//! Arc::new(SystemClock), +//! ); +//! ``` +//! +//! See `sim/docs/DESIGN.md` and `sim/docs/FINDINGS.md` for the +//! architectural rationale and the empirical case for `FullRemedy`. +//! +//! [`Vardiff`]: crate::vardiff::Vardiff + +pub mod boundary; +pub mod composed; +pub mod decision; +pub mod estimator; +pub mod update; + +pub use boundary::{ + AdaptiveBoundary, AdaptiveCusumBoundary, AdaptivePoissonCusum, AdaptiveSignPersist, + AsymmetricCusumBoundary, AsymmetricPoissonCI, Boundary, CredibleIntervalBoundary, CusumBoundary, + HysteresisGate, PoissonCI, SignPersistenceCusumBoundary, StepFunction, VolatilityAdaptiveBoundary, + WarmupBoundary, +}; +pub use composed::{classic_composed, ClassicComposed, Composed}; +pub use decision::DecisionRecord; +pub use estimator::Uncertainty; +pub use estimator::{ + BayesianEstimator, CkpoolEstimator, CumulativeCounter, DebiasEstimator, Estimator, + EstimatorContext, EstimatorSnapshot, EwmaEstimator, KalmanEstimator, SlidingWindowEstimator, + SpmRatioEstimator, TimeBiasEwmaEstimator, +}; +pub use update::{ + AcceleratingPartialRetarget, AdaptivePartialRetarget, CkpoolRetarget, FullRetargetNoClamp, + FullRetargetWithClamp, GuardedAccelRetarget, PartialRetarget, UpdateRule, +}; diff --git a/sv2/channels-sv2/src/vardiff/composed/update.rs b/sv2/channels-sv2/src/vardiff/composed/update.rs new file mode 100644 index 0000000000..c391a681de --- /dev/null +++ b/sv2/channels-sv2/src/vardiff/composed/update.rs @@ -0,0 +1,797 @@ +//! UpdateRule — Stage 3 of the three-stage vardiff pipeline. +//! +//! The UpdateRule decides, when the algorithm has chosen to fire, by how +//! much it moves the target. It is the piece of the algorithm that lives +//! in control theory: design pressure is convergence speed (large updates, +//! faster adjustment) vs stability of the steady state (small updates, +//! less jitter). + +use super::estimator::EstimatorSnapshot; +use std::fmt::Debug; +use std::sync::atomic::{AtomicI8, AtomicU32, Ordering}; + +/// Axis 4: when the algorithm decides to fire, by how much does it move +/// the target? +/// +/// **Theory**: control theory (actuator design, stability). +/// +/// **Design pressure**: speed of convergence vs stability of the steady +/// state. +/// +/// Implementations: [`FullRetargetWithClamp`] (classic), +/// [`PartialRetarget`] (EWMA / FullRemedy / ClassicPartialRetarget), +/// [`FullRetargetNoClamp`] (Sliding-Window). +pub trait UpdateRule: Debug + Send + Sync { + /// Compute the new target hashrate after the Boundary decided to fire. + /// + /// `threshold` is the boundary's threshold that delta exceeded. The + /// margin `(delta - threshold)` indicates how decisive the fire was. + /// Update rules can use this to modulate aggressiveness: move more + /// when the evidence is overwhelming, less when marginal. + fn next_hashrate( + &self, + snap: &EstimatorSnapshot, + current_hashrate: f32, + delta: f64, + threshold: f64, + shares_per_minute: f32, + ) -> f32; + + /// A short, drift-proof code derived from the update rule's actual + /// parameters. See [`super::Estimator::code`] for the rationale. + fn code(&self) -> String; +} + +/// Full retarget toward the Estimator's belief `h_estimate`, with two +/// safety clamps that mirror `VardiffState::try_vardiff`: +/// +/// 1. **Zero-shares branch**: if the window observed no shares the +/// estimator's `h_estimate` is unreliable (typically near zero from +/// the underlying conversion). Divide the current hashrate by a +/// `dt_secs`-dependent factor instead. +/// 2. **Phase 1 clamp**: when δ exceeds `clamp_above_delta` (in +/// percentage points) the estimator's belief is far from the current +/// target — apply a `dt_secs`-dependent multiplicative ceiling rather +/// than trusting the noisy single-window estimate. Prevents target +/// explosions during cold-start ramp. +/// +/// The [`FullRetargetWithClamp::classic`] constructor reproduces +/// `VardiffState`'s constants exactly: down clamps `(1.5, 2.0, 3.0)`, +/// up clamps `(10.0, 5.0, 3.0)`, up-clamp trigger at δ > 1000%. +#[derive(Debug, Clone, Copy)] +pub struct FullRetargetWithClamp { + /// Up-clamp multiplier for `dt_secs <= 30`. + pub up_short: f32, + /// Up-clamp multiplier for `30 < dt_secs < 60`. + pub up_med: f32, + /// Up-clamp multiplier for `dt_secs >= 60`. + pub up_long: f32, + /// Down-clamp divisor for `dt_secs <= 30` (when `realized == 0`). + pub down_short: f32, + /// Down-clamp divisor for `30 < dt_secs < 60`. + pub down_med: f32, + /// Down-clamp divisor for `dt_secs >= 60`. + pub down_long: f32, + /// δ threshold (percentage points) above which the up-clamp engages. + /// Classic value: 1000.0 (hashrate has changed by more than 10×). + pub clamp_above_delta: f64, +} + +impl FullRetargetWithClamp { + /// The classic constants from `VardiffState::try_vardiff`. + pub fn classic() -> Self { + Self { + up_short: 10.0, + up_med: 5.0, + up_long: 3.0, + down_short: 1.5, + down_med: 2.0, + down_long: 3.0, + clamp_above_delta: 1000.0, + } + } +} + +impl UpdateRule for FullRetargetWithClamp { + fn next_hashrate( + &self, + snap: &EstimatorSnapshot, + current_hashrate: f32, + delta: f64, + _threshold: f64, + _shares_per_minute: f32, + ) -> f32 { + // Branch 1: zero shares → down-clamp. Mirrors the + // `realized_share_per_min == 0.0` arm of VardiffState. The + // f64 == 0.0 comparison is safe here because realized is computed + // as integer_shares / float_dt, so it's exactly 0.0 iff shares == 0. + if snap.realized_share_per_min == 0.0 { + return match snap.dt_secs { + d if d <= 30 => current_hashrate / self.down_short, + d if d < 60 => current_hashrate / self.down_med, + _ => current_hashrate / self.down_long, + }; + } + // Branch 2: very large δ → up-clamp (Phase 1 ramp safety). + if delta > self.clamp_above_delta { + return match snap.dt_secs { + d if d <= 30 => current_hashrate * self.up_short, + d if d < 60 => current_hashrate * self.up_med, + _ => current_hashrate * self.up_long, + }; + } + // Branch 3: trust the estimator. + snap.h_estimate + } + + fn code(&self) -> String { + "FullClamp".to_string() + } +} + +/// Partial retarget: `new_target = current + η × (h_estimate − current)`. +/// +/// `η = 1.0` reproduces full retarget without clamping. `η = 0.5` +/// (the EWMA default) moves halfway toward the estimator's belief +/// each fire — a damped controller useful when the estimator is noisy +/// and overshoots would be expensive. Compared to +/// [`FullRetargetWithClamp`], this update has no per-`dt_secs` +/// branching and no zero-shares special case: the estimator's +/// `h_estimate` is trusted directly, scaled by η. +/// +/// For algorithms that pair this with an EWMA estimator, the +/// estimator's smoothing already filters out single-window noise — so +/// the Phase 1 clamp is redundant and would only slow convergence. +#[derive(Debug, Clone, Copy)] +pub struct PartialRetarget { + /// Damping factor in `(0, 1]`. Smaller = slower convergence, + /// more stable. Default for EWMA: `0.5`. + pub eta: f32, +} + +impl PartialRetarget { + pub fn new(eta: f32) -> Self { + Self { eta } + } + + /// The default damping for the `EWMA-60s` algorithm: `η = 0.5`. + /// `FullRemedy` uses a tighter `η = 0.2` instead, chosen via the + /// `sweep-eta` and joint `sweep-eta-z` Pareto sweeps as the + /// convergence-vs-overshoot balance point — see the algorithm + /// registry in `DESIGN.md`. + pub fn default_ewma() -> Self { + Self { eta: 0.5 } + } +} + +impl UpdateRule for PartialRetarget { + fn next_hashrate( + &self, + snap: &EstimatorSnapshot, + current_hashrate: f32, + _delta: f64, + _threshold: f64, + _shares_per_minute: f32, + ) -> f32 { + current_hashrate + self.eta * (snap.h_estimate - current_hashrate) + } + + fn code(&self) -> String { + format!("Partial-e{}", self.eta) + } +} + +/// Full retarget without clamping: `new_hashrate = h_estimate`. The +/// estimator's belief is trusted directly, no branches for zero-shares +/// or extreme deltas. +/// +/// Pairs naturally with a smoothing estimator (`EwmaEstimator`, +/// `SlidingWindowEstimator`) where the smoothing already filters +/// single-window noise — a Phase 1 clamp would only slow convergence +/// for no benefit, since the estimator never produces wild values. +/// +/// For a `CumulativeCounter` estimator paired with `FullRetargetNoClamp`, +/// cold-start retargeting can swing wildly because the estimator's +/// h_estimate at the first tick (when `current_h ≪ true_h`) is +/// computed from `realized × current_h / configured_spm`, which (after +/// the U256 fix) is approximately true_h. So the algorithm would jump +/// to true_h in one fire. That's *fast* convergence but may be +/// undesirable for production reliability — hence Classic's preference +/// for `FullRetargetWithClamp` with the conservative 3× ramp. +#[derive(Debug, Clone, Copy, Default)] +pub struct FullRetargetNoClamp; + +impl UpdateRule for FullRetargetNoClamp { + fn next_hashrate( + &self, + snap: &EstimatorSnapshot, + _current_hashrate: f32, + _delta: f64, + _threshold: f64, + _shares_per_minute: f32, + ) -> f32 { + // Trust the estimator's belief. The min_allowed_hashrate floor + // is applied at the Composed-adapter level, so we don't clamp + // here even when h_estimate is below it. + snap.h_estimate.max(0.0) + } + + fn code(&self) -> String { + "FullNoClamp".to_string() + } +} + +/// Margin-aware partial retarget: scales η by how decisive the fire was. +/// +/// ```text +/// margin = delta - threshold +/// scale = clamp(margin / reference_margin, min_scale, max_scale) +/// η_effective = η_base × scale +/// new_hashrate = current + η_effective × (h_estimate - current) +/// ``` +/// +/// When the fire is overwhelmingly decisive (cold start: delta=10000%, +/// threshold=118%), the scale maxes out and the algorithm moves +/// aggressively toward the estimate. When the fire is marginal (stable +/// load noise: delta barely crosses threshold), the scale is small and +/// the algorithm makes a conservative adjustment. +/// +/// This unifies fast cold-start convergence with stable-load damping +/// in a single update rule — no separate "Phase 1" logic needed. +#[derive(Debug, Clone, Copy)] +pub struct AdaptivePartialRetarget { + /// Base damping factor. The floor when margin = reference_margin. + pub eta_base: f32, + /// The margin value at which η_effective = η_base (the "normal" case). + pub reference_margin: f64, + /// Minimum scale factor (caps how conservative marginal fires are). + pub min_scale: f32, + /// Maximum scale factor (caps how aggressive decisive fires are). + pub max_scale: f32, +} + +impl AdaptivePartialRetarget { + pub fn new(eta_base: f32, reference_margin: f64) -> Self { + Self { + eta_base, + reference_margin, + min_scale: 1.0, + max_scale: 3.0, + } + } + + pub fn with_scales( + eta_base: f32, + reference_margin: f64, + min_scale: f32, + max_scale: f32, + ) -> Self { + Self { + eta_base, + reference_margin, + min_scale, + max_scale, + } + } +} + +impl UpdateRule for AdaptivePartialRetarget { + fn next_hashrate( + &self, + snap: &EstimatorSnapshot, + current_hashrate: f32, + delta: f64, + threshold: f64, + _shares_per_minute: f32, + ) -> f32 { + let margin = (delta - threshold).max(0.0); + let scale = if self.reference_margin > 0.0 { + (margin / self.reference_margin) as f32 + } else { + 1.0 + }; + let scale = scale.clamp(self.min_scale, self.max_scale); + let eta = (self.eta_base * scale).min(1.0); + current_hashrate + eta * (snap.h_estimate - current_hashrate) + } + + fn code(&self) -> String { + format!("AdaptPartial-e{}-m{}", self.eta_base, self.reference_margin) + } +} + +/// Accelerating partial retarget: tracks consecutive same-direction fires +/// and accelerates η accordingly. +/// +/// ```text +/// direction = sign(h_estimate - current_hashrate) +/// if direction == last_direction: +/// consecutive_same_direction += 1 +/// else: +/// consecutive_same_direction = 1 +/// last_direction = direction +/// η_effective = min(eta_base + acceleration × (consecutive - 1), eta_max) +/// new_hashrate = current + η_effective × (h_estimate - current) +/// ``` +/// +/// The intuition is that a single fire near the boundary is uncertain — +/// use the conservative `eta_base`. But when the estimator keeps pulling +/// in the same direction across multiple fires, confidence grows and the +/// controller should converge faster. The acceleration ramps η up to +/// `eta_max` over consecutive same-direction fires. +/// +/// This variant is a drop-in replacement for [`PartialRetarget`] in +/// scenarios where slow convergence at `η = 0.2` is acceptable for +/// stability but cold-start or step-change convergence needs a boost +/// without switching to [`AdaptivePartialRetarget`]'s margin-based +/// scaling. +pub struct AcceleratingPartialRetarget { + /// Starting damping factor (e.g., 0.2). + pub eta_base: f32, + /// Maximum damping factor cap (e.g., 0.6). + pub eta_max: f32, + /// η increase per consecutive same-direction fire (e.g., 0.1). + pub acceleration: f32, + /// Number of consecutive fires in the same direction. + consecutive_same_direction: AtomicU32, + /// Last observed direction: +1 (tighten), -1 (loosen), 0 (initial). + last_direction: AtomicI8, +} + +impl Debug for AcceleratingPartialRetarget { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("AcceleratingPartialRetarget") + .field("eta_base", &self.eta_base) + .field("eta_max", &self.eta_max) + .field("acceleration", &self.acceleration) + .field( + "consecutive_same_direction", + &self.consecutive_same_direction.load(Ordering::Relaxed), + ) + .field( + "last_direction", + &self.last_direction.load(Ordering::Relaxed), + ) + .finish() + } +} + +impl AcceleratingPartialRetarget { + pub fn new(eta_base: f32, eta_max: f32, acceleration: f32) -> Self { + Self { + eta_base, + eta_max, + acceleration, + consecutive_same_direction: AtomicU32::new(0), + last_direction: AtomicI8::new(0), + } + } +} + +impl UpdateRule for AcceleratingPartialRetarget { + fn next_hashrate( + &self, + snap: &EstimatorSnapshot, + current_hashrate: f32, + _delta: f64, + _threshold: f64, + _shares_per_minute: f32, + ) -> f32 { + // Determine direction: +1 if estimate pulls up (tighten), -1 if down. + let direction: i8 = if snap.h_estimate > current_hashrate { + 1 + } else { + -1 + }; + + let last = self.last_direction.load(Ordering::Relaxed); + let consecutive = if direction == last { + let c = self + .consecutive_same_direction + .fetch_add(1, Ordering::Relaxed) + + 1; + c + } else { + self.last_direction.store(direction, Ordering::Relaxed); + self.consecutive_same_direction.store(1, Ordering::Relaxed); + 1 + }; + + let eta_effective = + (self.eta_base + self.acceleration * (consecutive - 1) as f32).min(self.eta_max); + + current_hashrate + eta_effective * (snap.h_estimate - current_hashrate) + } + + fn code(&self) -> String { + format!( + "Accel-{}-{}-{}", + self.eta_base, self.eta_max, self.acceleration + ) + } +} + +/// Like [`AcceleratingPartialRetarget`] but only accelerates after the +/// first direction reversal. During cold-start ramp (all fires in one +/// direction, no reversal yet), η stays at `eta_base`. Once the algorithm +/// has reversed direction at least once (proving it has crossed the target +/// and is now tracking), acceleration kicks in normally. +/// +/// This prevents cold-start overshoot: the initial ramp uses conservative +/// η=0.2 even on consecutive same-direction fires, then after the first +/// overshoot/reversal, subsequent step-changes get the acceleration benefit. +pub struct GuardedAccelRetarget { + pub eta_base: f32, + pub eta_max: f32, + pub acceleration: f32, + consecutive_same_direction: AtomicU32, + last_direction: AtomicI8, + /// Set to true after the first direction reversal. + has_reversed: std::sync::atomic::AtomicBool, +} + +impl Debug for GuardedAccelRetarget { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("GuardedAccelRetarget") + .field("eta_base", &self.eta_base) + .field("eta_max", &self.eta_max) + .field("acceleration", &self.acceleration) + .field( + "consecutive_same_direction", + &self.consecutive_same_direction.load(Ordering::Relaxed), + ) + .field( + "has_reversed", + &self.has_reversed.load(Ordering::Relaxed), + ) + .finish() + } +} + +impl GuardedAccelRetarget { + pub fn new(eta_base: f32, eta_max: f32, acceleration: f32) -> Self { + Self { + eta_base, + eta_max, + acceleration, + consecutive_same_direction: AtomicU32::new(0), + last_direction: AtomicI8::new(0), + has_reversed: std::sync::atomic::AtomicBool::new(false), + } + } +} + +impl UpdateRule for GuardedAccelRetarget { + fn next_hashrate( + &self, + snap: &EstimatorSnapshot, + current_hashrate: f32, + _delta: f64, + _threshold: f64, + _shares_per_minute: f32, + ) -> f32 { + let direction: i8 = if snap.h_estimate > current_hashrate { + 1 + } else { + -1 + }; + + let last = self.last_direction.load(Ordering::Relaxed); + let consecutive = if direction == last { + self.consecutive_same_direction.fetch_add(1, Ordering::Relaxed) + 1 + } else { + if last != 0 { + self.has_reversed.store(true, Ordering::Relaxed); + } + self.last_direction.store(direction, Ordering::Relaxed); + self.consecutive_same_direction.store(1, Ordering::Relaxed); + 1 + }; + + let eta_effective = if self.has_reversed.load(Ordering::Relaxed) { + (self.eta_base + self.acceleration * (consecutive - 1) as f32).min(self.eta_max) + } else { + self.eta_base + }; + + current_hashrate + eta_effective * (snap.h_estimate - current_hashrate) + } + + fn code(&self) -> String { + format!( + "GuardAccel-{}-{}-{}", + self.eta_base, self.eta_max, self.acceleration + ) + } +} + +/// ckpool-style full retarget: `optimal = dsps × target_period`. +/// +/// ckpool computes the optimal difficulty as `dsps × 3.33` (shares per +/// second × target period in seconds), then clamps to [mindiff, maxdiff]. +/// The result is a hashrate that would produce exactly one share per +/// `target_period` seconds at the observed rate. +/// +/// Additionally implements ckpool's **oscillation guard**: if the +/// algorithm wants to *decrease* difficulty but this is the very first +/// evaluation after a previous fire (shares_since_fire ≤ threshold), +/// suppress the decrease. This prevents a scenario where a miner returns +/// from idle, submits one batch of shares at the old rate, and +/// immediately gets difficulty reduced. +/// +/// In the three-stage framework, the oscillation guard is approximated +/// by checking `snap.n_shares` against a threshold. When few shares have +/// been observed and the direction is down, the update rule returns the +/// current hashrate unchanged (the Composed adapter interprets `Some(current)` +/// as a no-op since it equals the existing target). +/// +/// ## Difference from FullRetargetNoClamp +/// +/// `FullRetargetNoClamp` trusts `h_estimate` directly. `CkpoolRetarget` +/// also trusts the estimator but adds the oscillation guard — a +/// directional asymmetry where decreases require more evidence than +/// increases. +#[derive(Debug, Clone, Copy)] +pub struct CkpoolRetarget { + /// Minimum shares required before allowing a difficulty decrease. + /// ckpool uses 1 (suppresses decrease on the very first share after + /// a change). In the tick-based framework, this is scaled to the + /// minimum tick's worth of data. + pub min_shares_for_decrease: u32, +} + +impl CkpoolRetarget { + /// Construct with ckpool's default: suppress decrease when only 1 + /// share (or tick's worth) has been observed since last fire. + pub fn ckpool_defaults() -> Self { + Self { + min_shares_for_decrease: 1, + } + } + + /// Construct with custom minimum shares threshold. + pub fn new(min_shares_for_decrease: u32) -> Self { + Self { + min_shares_for_decrease, + } + } +} + +impl UpdateRule for CkpoolRetarget { + fn next_hashrate( + &self, + snap: &EstimatorSnapshot, + current_hashrate: f32, + _delta: f64, + _threshold: f64, + _shares_per_minute: f32, + ) -> f32 { + let target = snap.h_estimate; + + // Oscillation guard: suppress difficulty decrease when insufficient + // evidence has accumulated (ckpool's `if (optimal < client->diff && + // client->ssdc == 1) return` logic). + if target < current_hashrate && snap.n_shares <= self.min_shares_for_decrease { + return current_hashrate; + } + + target + } + + fn code(&self) -> String { + format!("CkpoolRetgt-m{}", self.min_shares_for_decrease) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn snap(h: f32, realized: f64, dt: u64) -> EstimatorSnapshot { + EstimatorSnapshot { + h_estimate: h, + realized_share_per_min: realized, + n_shares: 0, + dt_secs: dt, + uncertainty: None, + } + } + + #[test] + fn zero_shares_short_dt_divides_by_one_point_five() { + let u = FullRetargetWithClamp::classic(); + let h = u.next_hashrate(&snap(0.0, 0.0, 20), 1.0e15, 100.0, 50.0, 12.0); + assert!((h / (1.0e15 / 1.5) - 1.0).abs() < 1e-5); + } + + #[test] + fn zero_shares_medium_dt_divides_by_two() { + let u = FullRetargetWithClamp::classic(); + let h = u.next_hashrate(&snap(0.0, 0.0, 45), 1.0e15, 100.0, 50.0, 12.0); + assert!((h / (1.0e15 / 2.0) - 1.0).abs() < 1e-5); + } + + #[test] + fn zero_shares_long_dt_divides_by_three() { + let u = FullRetargetWithClamp::classic(); + let h = u.next_hashrate(&snap(0.0, 0.0, 120), 1.0e15, 100.0, 50.0, 12.0); + assert!((h / (1.0e15 / 3.0) - 1.0).abs() < 1e-5); + } + + #[test] + fn large_delta_long_dt_multiplies_by_three() { + let u = FullRetargetWithClamp::classic(); + // δ = 1500% > 1000% triggers the clamp; dt = 60 → ×3. + let h = u.next_hashrate(&snap(1.0e20, 1200.0, 60), 1.0e10, 1500.0, 50.0, 12.0); + assert!((h / 3.0e10 - 1.0).abs() < 1e-5); + } + + #[test] + fn large_delta_short_dt_multiplies_by_ten() { + let u = FullRetargetWithClamp::classic(); + let h = u.next_hashrate(&snap(1.0e20, 1200.0, 30), 1.0e10, 1500.0, 50.0, 12.0); + assert!((h / 1.0e11 - 1.0).abs() < 1e-5); + } + + #[test] + fn normal_delta_returns_h_estimate() { + let u = FullRetargetWithClamp::classic(); + let h = u.next_hashrate(&snap(2.0e15, 24.0, 60), 1.0e15, 100.0, 50.0, 12.0); + assert_eq!(h, 2.0e15); + } + + #[test] + fn exactly_one_thousand_delta_does_not_clamp() { + // The classic code uses `> 1000.0`, not `>=`. Verify the boundary. + let u = FullRetargetWithClamp::classic(); + let h = u.next_hashrate(&snap(1.1e16, 24.0, 60), 1.0e15, 1000.0, 50.0, 12.0); + assert_eq!(h, 1.1e16); // h_estimate, not clamped + } + + // ---- PartialRetarget ---- + + #[test] + fn partial_retarget_eta_half_moves_halfway() { + let u = PartialRetarget::default_ewma(); + // current = 1e15, h_estimate = 2e15. η = 0.5. + // new = 1e15 + 0.5 × (2e15 − 1e15) = 1.5e15. + let h = u.next_hashrate(&snap(2.0e15, 12.0, 60), 1.0e15, 100.0, 50.0, 12.0); + assert!((h - 1.5e15).abs() / h < 1e-5, "got {}", h); + } + + #[test] + fn partial_retarget_eta_one_is_full_retarget() { + let u = PartialRetarget::new(1.0); + let h = u.next_hashrate(&snap(2.0e15, 12.0, 60), 1.0e15, 100.0, 50.0, 12.0); + assert!((h - 2.0e15).abs() / h < 1e-5); + } + + #[test] + fn partial_retarget_eta_zero_keeps_current() { + let u = PartialRetarget::new(0.0); + let h = u.next_hashrate(&snap(2.0e15, 12.0, 60), 1.0e15, 100.0, 50.0, 12.0); + assert_eq!(h, 1.0e15); + } + + #[test] + fn partial_retarget_no_zero_shares_branch() { + // Unlike FullRetargetWithClamp, PartialRetarget doesn't special- + // case `realized == 0`. h_estimate is trusted directly. + let u = PartialRetarget::default_ewma(); + let h = u.next_hashrate(&snap(0.5e15, 0.0, 60), 1.0e15, 50.0, 50.0, 12.0); + // η × (0.5e15 − 1e15) + 1e15 = 0.5 × -0.5e15 + 1e15 = 0.75e15. + assert!((h - 0.75e15).abs() / 0.75e15 < 1e-5); + } + + // ---- FullRetargetNoClamp ---- + + #[test] + fn full_retarget_no_clamp_returns_h_estimate_directly() { + let u = FullRetargetNoClamp; + // Any h_estimate value flows through unchanged. + for &(estimate, _expected) in &[ + (1.0e10f32, 1.0e10f32), + (1.5e15, 1.5e15), + (3.0e20, 3.0e20), // Extreme — no clamp. + ] { + let h = u.next_hashrate(&snap(estimate, 100.0, 60), 1.0e15, 50.0, 50.0, 12.0); + assert_eq!(h, estimate, "h_estimate={} should pass through", estimate); + } + } + + #[test] + fn full_retarget_no_clamp_ignores_zero_shares_and_large_delta() { + // Distinct from FullRetargetWithClamp: zero-shares doesn't + // trigger down-clamp; large delta doesn't trigger up-clamp. + let u = FullRetargetNoClamp; + let h_zero = u.next_hashrate(&snap(0.5e15, 0.0, 60), 1.0e15, 50.0, 50.0, 12.0); + assert_eq!(h_zero, 0.5e15); + let h_large = u.next_hashrate(&snap(1.5e20, 1e7, 60), 1.0e10, 9999.0, 50.0, 12.0); + assert_eq!(h_large, 1.5e20); + } + + #[test] + fn full_retarget_no_clamp_floors_negative_h_estimate_at_zero() { + // A pathological estimator producing a negative h_estimate is + // floored at 0.0. The min_allowed_hashrate floor in the + // Composed adapter handles the production lower bound. + let u = FullRetargetNoClamp; + let h = u.next_hashrate(&snap(-1.0e10, 100.0, 60), 1.0e15, 50.0, 50.0, 12.0); + assert_eq!(h, 0.0); + } + + // ---- AcceleratingPartialRetarget ---- + + #[test] + fn accelerating_first_fire_uses_eta_base() { + let u = AcceleratingPartialRetarget::new(0.2, 0.6, 0.1); + // current = 1e15, h_estimate = 2e15, direction = +1 (first fire). + // η_effective = 0.2 + 0.1 × (1 - 1) = 0.2. + // new = 1e15 + 0.2 × (2e15 − 1e15) = 1.2e15. + let h = u.next_hashrate(&snap(2.0e15, 12.0, 60), 1.0e15, 100.0, 50.0, 12.0); + assert!( + (h - 1.2e15).abs() / 1.2e15 < 1e-5, + "first fire: expected 1.2e15, got {}", + h + ); + } + + #[test] + fn accelerating_second_same_direction_uses_eta_base_plus_acceleration() { + let u = AcceleratingPartialRetarget::new(0.2, 0.6, 0.1); + // First fire: direction = +1. + let h1 = u.next_hashrate(&snap(2.0e15, 12.0, 60), 1.0e15, 100.0, 50.0, 12.0); + // Second fire: same direction (+1). consecutive = 2. + // η_effective = 0.2 + 0.1 × (2 - 1) = 0.3. + // new = h1 + 0.3 × (2.0e15 − h1). + let h2 = u.next_hashrate(&snap(2.0e15, 12.0, 60), h1, 100.0, 50.0, 12.0); + let expected = h1 + 0.3 * (2.0e15 - h1); + assert!( + (h2 - expected).abs() / expected < 1e-5, + "second same-dir fire: expected {}, got {}", + expected, + h2 + ); + } + + #[test] + fn accelerating_direction_reversal_resets_to_eta_base() { + let u = AcceleratingPartialRetarget::new(0.2, 0.6, 0.1); + // Fire twice in +1 direction to build up consecutive count. + let h1 = u.next_hashrate(&snap(2.0e15, 12.0, 60), 1.0e15, 100.0, 50.0, 12.0); + let _h2 = u.next_hashrate(&snap(2.0e15, 12.0, 60), h1, 100.0, 50.0, 12.0); + // Now fire in -1 direction (h_estimate < current). Resets to 1. + // η_effective = 0.2 + 0.1 × (1 - 1) = 0.2. + let current = 2.0e15; + let estimate = 1.0e15; + let h3 = u.next_hashrate(&snap(estimate, 12.0, 60), current, 100.0, 50.0, 12.0); + let expected = current + 0.2 * (estimate - current); + assert!( + (h3 - expected).abs() / expected < 1e-5, + "direction reversal: expected {}, got {}", + expected, + h3 + ); + } + + #[test] + fn accelerating_caps_at_eta_max() { + let u = AcceleratingPartialRetarget::new(0.2, 0.6, 0.1); + // Fire 10 times in the same direction to exceed eta_max. + let mut current = 1.0e15; + for _ in 0..10 { + current = u.next_hashrate(&snap(2.0e15, 12.0, 60), current, 100.0, 50.0, 12.0); + } + // By the 10th fire: consecutive = 10, η = 0.2 + 0.1 × 9 = 1.1 → capped at 0.6. + // Verify the 11th fire uses η_max = 0.6. + let h_before = current; + let h_after = u.next_hashrate(&snap(2.0e15, 12.0, 60), h_before, 100.0, 50.0, 12.0); + let expected = h_before + 0.6 * (2.0e15 - h_before); + assert!( + (h_after - expected).abs() / expected < 1e-5, + "eta_max cap: expected {}, got {}", + expected, + h_after + ); + } +} diff --git a/sv2/channels-sv2/src/vardiff/error.rs b/sv2/channels-sv2/src/vardiff/error.rs index 94d8550ef8..780f79e86e 100644 --- a/sv2/channels-sv2/src/vardiff/error.rs +++ b/sv2/channels-sv2/src/vardiff/error.rs @@ -5,10 +5,22 @@ pub enum VardiffError { HashrateToTargetError(String), /// Failed to convert target to a hashrate. TargetToHashrateError(String), - /// System time error occurred. + /// **Unreachable after the Clock-injection refactor.** + /// + /// The algorithm previously called `SystemTime::now().duration_since(...)` + /// which could fail if the system clock was before the UNIX epoch — this + /// variant carried that error. Time access now goes through + /// [`crate::vardiff::Clock::now_secs`], which is infallible, so no path in + /// the algorithm constructs this variant anymore. + /// + /// Retained for backward compatibility (removing an enum variant would + /// break downstream exhaustive matches). Scheduled for removal at the + /// next major version bump. TimeError(std::time::SystemTimeError), } +/// Conversion preserved alongside [`VardiffError::TimeError`] for the same +/// backward-compatibility reason. No code path in this crate exercises it. impl From for VardiffError { fn from(value: std::time::SystemTimeError) -> Self { VardiffError::TimeError(value) diff --git a/sv2/channels-sv2/src/vardiff/mod.rs b/sv2/channels-sv2/src/vardiff/mod.rs index 0993496b52..71d86321c2 100644 --- a/sv2/channels-sv2/src/vardiff/mod.rs +++ b/sv2/channels-sv2/src/vardiff/mod.rs @@ -1,12 +1,23 @@ use bitcoin::Target; use error::VardiffError; use std::fmt::Debug; +use std::sync::Arc; pub mod classic; +pub mod clock; +pub mod composed; pub mod error; +pub mod pid_tuned; +pub mod pow2_pid; #[cfg(test)] pub mod test; +pub use clock::{Clock, MockClock, SystemClock}; + +/// Default minimum hashrate (H/s) used by [`default`] when no value is +/// supplied. +pub const DEFAULT_MIN_HASHRATE: f32 = 1.0; + /// Trait defining the interface for a Vardiff implementation. pub trait Vardiff: Debug + Send + Sync { /// Gets the timestamp of the last update. @@ -21,6 +32,21 @@ pub trait Vardiff: Debug + Send + Sync { /// Increments the share count. fn increment_shares_since_last_update(&mut self); + /// Adds `n` shares to the counter in a single operation. + /// + /// Default implementation calls [`Self::increment_shares_since_last_update`] + /// `n` times, which is correct but `O(n)`. Implementors may override with + /// a saturating bulk add for `O(1)` performance at large `n`. The + /// simulation framework uses this method to bulk-add the Poisson-sampled + /// share count per tick, which can reach the millions during cold-start + /// scenarios — calling `increment` that many times would dominate + /// simulation runtime. + fn add_shares(&mut self, n: u32) { + for _ in 0..n { + self.increment_shares_since_last_update(); + } + } + /// Resets share count and timestamp for a new cycle. fn reset_counter(&mut self) -> Result<(), VardiffError>; @@ -36,3 +62,47 @@ pub trait Vardiff: Debug + Send + Sync { /// Gets the minimum allowed hashrate (H/s). fn min_allowed_hashrate(&self) -> f32; } + +/// Constructs the recommended production vardiff. +/// +/// Returns a [`Box`] wrapping: +/// `EwmaEstimator(120s) + AdaptivePoissonCusum(spm_threshold=10) + +/// AcceleratingPartialRetarget(base=0.2, max=0.4, acc=0.2)`. +/// Uses [`DEFAULT_MIN_HASHRATE`] as the minimum hashrate floor and a +/// [`SystemClock`] for time. +/// +/// The adaptive boundary uses PoissonCI for miners below SPM 10 (preventing +/// overshoot on sparse data) and AsymmetricCUSUM for miners at SPM 10+ +/// (enabling fast reaction with abundant evidence). The update rule caps +/// η at 0.4 to balance convergence speed against cold-start overshoot. +/// +/// This is the recommended entry point for new production code. For +/// custom min-hashrate floors, use [`default_with_min`]. For a custom +/// [`Clock`] implementation (typically [`MockClock`] in tests), use +/// [`default_with_clock`]. +pub fn default() -> Box { + default_with_min(DEFAULT_MIN_HASHRATE) +} + +/// Constructs the recommended production vardiff with a specific minimum +/// hashrate floor. +/// +/// Equivalent to [`default`] but lets callers set the +/// `min_allowed_hashrate` floor. See [`default`] for the underlying +/// composition. +pub fn default_with_min(min_allowed_hashrate: f32) -> Box { + default_with_clock(min_allowed_hashrate, Arc::new(SystemClock)) +} + +/// Constructs the recommended production vardiff with a specific minimum +/// hashrate floor and a custom [`Clock`] implementation. +/// +/// Primarily intended for simulation and testing, where a +/// [`MockClock`] lets the algorithm run against controlled time. See +/// [`default`] for the underlying composition. +pub fn default_with_clock(min_allowed_hashrate: f32, clock: Arc) -> Box { + Box::new( + classic::VardiffState::new_with_clock(min_allowed_hashrate, clock) + .expect("VardiffState construction should not fail"), + ) +} diff --git a/sv2/channels-sv2/src/vardiff/pid_tuned.rs b/sv2/channels-sv2/src/vardiff/pid_tuned.rs new file mode 100644 index 0000000000..95d3b4ac69 --- /dev/null +++ b/sv2/channels-sv2/src/vardiff/pid_tuned.rs @@ -0,0 +1,521 @@ +//! A well-tuned PID controller for variable difficulty adjustment. +//! +//! Takes the concept from the Pow2-PID approach (direct error minimization in +//! SPM-space) and fixes the implementation flaws: +//! +//! - All three PID terms active (P for immediate response, I for +//! persistent-error elimination, D for oscillation damping) +//! - Anti-windup on the integral term (exponential decay + clamp) +//! - Rate-aware gain scheduling (√(SPM) noise scaling) +//! - Dead zone replacing the Boundary concept (prevents acting on noise) +//! - No power-of-2 quantization +//! - Proper gain magnitudes +//! +//! ## Why PID for vardiff? +//! +//! The vardiff problem is a classic setpoint-tracking control problem: +//! drive realized_spm → target_spm by adjusting difficulty. PID is the +//! canonical solution for such problems. The three terms handle three +//! distinct failure modes: +//! +//! - **P**: immediate proportional correction to current error +//! - **I**: eliminates steady-state offset that P alone can't close +//! (e.g., when the estimator is consistently biased in one direction) +//! - **D**: dampens oscillation by opposing rapid error changes +//! (prevents overshoot when the P term overcorrects) +//! +//! ## Comparison to the three-stage pipeline +//! +//! The Composed framework decomposes the problem differently: +//! - Estimator ≈ measurement filter (analogous to PID's D-term filter) +//! - Boundary ≈ dead zone (prevents acting on noise) +//! - UpdateRule ≈ P-term (proportional move toward estimate) +//! +//! What Composed lacks is the **integral term**: persistent same-direction +//! errors don't accelerate correction. PartialRetarget(η=0.2) always +//! moves exactly 20% of the gap, whether it's the first fire or the +//! tenth consecutive fire in the same direction. +//! +//! ## Operating in difficulty-space +//! +//! The PID operates on the error signal `e = target_spm - realized_spm` +//! and produces a difficulty adjustment directly. This avoids the +//! hashrate estimation step and its associated noise (U256 arithmetic, +//! target↔hashrate conversion precision). The final hashrate for the +//! `Vardiff` trait is derived from the new difficulty at the end. + +use std::sync::Arc; + +use bitcoin::Target; + +use super::error::VardiffError; +use super::{Clock, Vardiff}; + +/// A well-tuned PID vardiff controller. +/// +/// Operates in difficulty-space with SPM error as the process variable. +/// Configurable via [`PidConfig`]. +#[derive(Debug)] +pub struct PidTunedVardiff { + config: PidConfig, + current_difficulty: f64, + shares_since_update: u32, + timestamp_of_last_update: u64, + // PID state + error_integral: f64, + prev_error: f64, + prev_realized_spm: f64, + consecutive_fires: u32, + last_fire_direction: f64, + clock: Arc, + // Observability + pub last_error: Option, + pub last_output: Option, + pub last_p: Option, + pub last_i: Option, + pub last_d: Option, +} + +/// Configuration for the tuned PID vardiff. +#[derive(Debug, Clone, Copy)] +pub struct PidConfig { + /// Target shares per minute. + pub spm_target: f32, + /// Proportional gain. Units: difficulty-fraction per SPM-error. + /// At Kp=0.05, a 10-SPM error produces a 50% difficulty change. + pub kp: f64, + /// Integral gain. Units: difficulty-fraction per (SPM-error × tick). + /// Eliminates persistent steady-state offset. + pub ki: f64, + /// Derivative gain. Units: difficulty-fraction per (SPM-error/sec). + /// Dampens oscillation by opposing rapid error changes. + pub kd: f64, + /// Exponential decay factor applied to the integral per tick. + /// Range (0, 1]. Prevents unbounded integral growth. + /// 0.95 = effective memory ~20 ticks. 0.99 = ~100 ticks. + pub integral_decay: f64, + /// Maximum |integral| in SPM-error×ticks units. Hard clamp. + pub integral_clamp: f64, + /// Dead zone: minimum |error| in SPM before acting. Errors below + /// this threshold still accumulate in the integral (so persistent + /// small errors eventually break through) but don't trigger + /// immediate correction. + pub dead_zone_spm: f64, + /// Minimum observation window before acting (seconds). + pub min_window_secs: u64, + /// Maximum single-fire adjustment as fraction of current difficulty. + /// Prevents wild swings during cold start. 0.5 = max 50% change per fire. + pub max_adjustment_fraction: f64, + /// Minimum hashrate floor. + pub min_allowed_hashrate: f32, +} + +impl PidConfig { + /// Balanced tuning: responsive to real changes, stable under noise. + /// + /// Designed for SPM=10-30 operational range. Gains are normalized + /// by spm_target so behavior is consistent across share rates. + pub fn balanced(spm_target: f32) -> Self { + Self { + spm_target, + kp: 0.04, + ki: 0.008, + kd: 0.01, + integral_decay: 0.92, + integral_clamp: 30.0, + dead_zone_spm: 0.5, + min_window_secs: 20, + max_adjustment_fraction: 0.5, + min_allowed_hashrate: 1.0, + } + } + + /// Aggressive tuning: faster response, more jitter. + pub fn aggressive(spm_target: f32) -> Self { + Self { + spm_target, + kp: 0.08, + ki: 0.015, + kd: 0.005, + integral_decay: 0.95, + integral_clamp: 50.0, + dead_zone_spm: 0.3, + min_window_secs: 20, + max_adjustment_fraction: 0.7, + min_allowed_hashrate: 1.0, + } + } + + /// Conservative tuning: minimal jitter, slower response. + pub fn conservative(spm_target: f32) -> Self { + Self { + spm_target, + kp: 0.02, + ki: 0.004, + kd: 0.015, + integral_decay: 0.88, + integral_clamp: 20.0, + dead_zone_spm: 1.0, + min_window_secs: 30, + max_adjustment_fraction: 0.3, + min_allowed_hashrate: 1.0, + } + } +} + +impl PidTunedVardiff { + pub fn new(config: PidConfig, initial_hashrate: f32, clock: Arc) -> Self { + let initial_difficulty = + Self::difficulty_from_hashrate(initial_hashrate, config.spm_target); + Self { + config, + current_difficulty: initial_difficulty, + shares_since_update: 0, + timestamp_of_last_update: clock.now_secs(), + error_integral: 0.0, + prev_error: 0.0, + prev_realized_spm: config.spm_target as f64, + consecutive_fires: 0, + last_fire_direction: 0.0, + clock, + last_error: None, + last_output: None, + last_p: None, + last_i: None, + last_d: None, + } + } + + pub fn balanced(initial_hashrate: f32, spm_target: f32, clock: Arc) -> Self { + Self::new(PidConfig::balanced(spm_target), initial_hashrate, clock) + } + + fn difficulty_from_hashrate(hashrate: f32, spm: f32) -> f64 { + let shares_per_second = spm as f64 / 60.0; + hashrate as f64 / (shares_per_second * 2f64.powi(32)) + } + + fn hashrate_from_difficulty(difficulty: f64, spm: f32) -> f32 { + let shares_per_second = spm as f64 / 60.0; + (shares_per_second * difficulty * 2f64.powi(32)) as f32 + } + + pub fn current_difficulty(&self) -> f64 { + self.current_difficulty + } +} + +impl Vardiff for PidTunedVardiff { + fn last_update_timestamp(&self) -> u64 { + self.timestamp_of_last_update + } + + fn shares_since_last_update(&self) -> u32 { + self.shares_since_update + } + + fn set_timestamp_of_last_update(&mut self, ts: u64) { + self.timestamp_of_last_update = ts; + } + + fn increment_shares_since_last_update(&mut self) { + self.shares_since_update = self.shares_since_update.saturating_add(1); + } + + fn add_shares(&mut self, n: u32) { + self.shares_since_update = self.shares_since_update.saturating_add(n); + } + + fn min_allowed_hashrate(&self) -> f32 { + self.config.min_allowed_hashrate + } + + fn reset_counter(&mut self) -> Result<(), VardiffError> { + self.shares_since_update = 0; + self.timestamp_of_last_update = self.clock.now_secs(); + self.error_integral = 0.0; + self.prev_error = 0.0; + self.consecutive_fires = 0; + Ok(()) + } + + fn try_vardiff( + &mut self, + _hashrate: f32, + _target: &Target, + _shares_per_minute: f32, + ) -> Result, VardiffError> { + self.last_error = None; + self.last_output = None; + self.last_p = None; + self.last_i = None; + self.last_d = None; + + let now = self.clock.now_secs(); + let dt = now.saturating_sub(self.timestamp_of_last_update); + + if dt < self.config.min_window_secs { + return Ok(None); + } + + let dt_secs = dt as f64; + let dt_minutes = dt_secs / 60.0; + + // Compute realized SPM + let realized_spm = if dt_minutes > 0.0 { + self.shares_since_update as f64 / dt_minutes + } else { + return Ok(None); + }; + + // Error signal: positive error means we're getting fewer shares + // than target (difficulty too high), negative means too many + // (difficulty too low). + let error = self.config.spm_target as f64 - realized_spm; + self.last_error = Some(error); + + // Normalize error by spm_target for scale-invariant gains. + // This means Kp=0.04 produces 4% difficulty change per 100% SPM error, + // regardless of the absolute SPM target. + let normalized_error = error / self.config.spm_target as f64; + + // --- Integral term --- + // Decay existing integral (anti-windup via exponential forgetting) + self.error_integral *= self.config.integral_decay; + // Accumulate (always, even in dead zone — persistent small errors + // eventually break through via the integral) + self.error_integral += normalized_error; + // Hard clamp (anti-windup ceiling) + self.error_integral = self + .error_integral + .clamp(-self.config.integral_clamp, self.config.integral_clamp); + + // --- Derivative term --- + // Rate of change of the error, using the previous realized_spm + // for smoothing (derivative-on-measurement, not derivative-on-error, + // to avoid derivative kick on setpoint changes). + let d_realized = (realized_spm - self.prev_realized_spm) / dt_secs; + // Negative because increasing realized_spm means error is decreasing + let derivative = -d_realized / self.config.spm_target as f64; + + // --- PID output --- + let p_term = self.config.kp * normalized_error; + let i_term = self.config.ki * self.error_integral; + let d_term = self.config.kd * derivative; + + self.last_p = Some(p_term); + self.last_i = Some(i_term); + self.last_d = Some(d_term); + + // Total output: fractional difficulty adjustment + let raw_output = p_term + i_term + d_term; + + // Update derivative state + self.prev_error = normalized_error; + self.prev_realized_spm = realized_spm; + + // Dead zone: don't act unless the output exceeds the noise floor. + // The dead zone is in normalized error units. + let dead_zone_normalized = self.config.dead_zone_spm / self.config.spm_target as f64; + if raw_output.abs() < dead_zone_normalized * self.config.kp { + return Ok(None); + } + + // Clamp output to max adjustment fraction + let output = raw_output.clamp( + -self.config.max_adjustment_fraction, + self.config.max_adjustment_fraction, + ); + self.last_output = Some(output); + + // Apply to difficulty. Positive error (under-performing) → positive + // output → increase difficulty? No — if we're getting too few shares, + // difficulty is too HIGH, so we need to DECREASE it. + // The sign convention: output > 0 when error > 0 (too few shares), + // which means difficulty should DECREASE. + let new_difficulty = self.current_difficulty * (1.0 - output); + + if new_difficulty <= 0.0 { + return Ok(None); + } + + // Check if the change is meaningful (> 1% relative change) + let relative_change = + ((new_difficulty - self.current_difficulty) / self.current_difficulty).abs(); + if relative_change < 0.01 { + return Ok(None); + } + + // Track fire direction for consecutive-fire boosting + let direction = if new_difficulty > self.current_difficulty { + 1.0 + } else { + -1.0 + }; + if direction == self.last_fire_direction { + self.consecutive_fires += 1; + } else { + self.consecutive_fires = 1; + self.last_fire_direction = direction; + } + + // Apply + self.current_difficulty = new_difficulty; + self.shares_since_update = 0; + self.timestamp_of_last_update = now; + + let new_hashrate = Self::hashrate_from_difficulty(new_difficulty, self.config.spm_target); + let floored = new_hashrate.max(self.config.min_allowed_hashrate); + + Ok(Some(floored)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::vardiff::MockClock; + + #[test] + fn stable_load_does_not_fire() { + let clock = Arc::new(MockClock::new(0)); + let mut v = PidTunedVardiff::balanced(1.0e15, 10.0, clock.clone()); + let target = Target::MAX; + + // On-target: 10 shares in 60s = 10 SPM + v.add_shares(10); + clock.set(60); + assert_eq!(v.try_vardiff(1.0e15, &target, 10.0).unwrap(), None); + } + + #[test] + fn detects_50_percent_hashrate_drop() { + let clock = Arc::new(MockClock::new(0)); + let mut v = PidTunedVardiff::balanced(1.0e15, 10.0, clock.clone()); + let target = Target::MAX; + + // 50% drop: only 5 shares in 60s = 5 SPM (error = +5) + v.add_shares(5); + clock.set(60); + let result = v.try_vardiff(1.0e15, &target, 10.0).unwrap(); + assert!(result.is_some(), "should detect 50% drop"); + // New hashrate should be lower (difficulty decreased) + assert!(result.unwrap() < 1.0e15); + } + + #[test] + fn detects_50_percent_hashrate_increase() { + let clock = Arc::new(MockClock::new(0)); + let mut v = PidTunedVardiff::balanced(1.0e15, 10.0, clock.clone()); + let target = Target::MAX; + + // 50% increase: 15 shares in 60s = 15 SPM (error = -5) + v.add_shares(15); + clock.set(60); + let result = v.try_vardiff(1.0e15, &target, 10.0).unwrap(); + assert!(result.is_some(), "should detect 50% increase"); + // New hashrate should be higher (difficulty increased) + assert!(result.unwrap() > 1.0e15); + } + + #[test] + fn integral_accelerates_persistent_error() { + let clock = Arc::new(MockClock::new(0)); + let mut v = PidTunedVardiff::balanced(1.0e15, 10.0, clock.clone()); + let target = Target::MAX; + + // Feed persistent under-performance (5 SPM vs 10 target) + let mut adjustments = Vec::new(); + for tick in 1..=5 { + v.add_shares(5); + clock.set(tick * 60); + if let Some(new_h) = v.try_vardiff(1.0e15, &target, 10.0).unwrap() { + let adj = (new_h as f64 - 1.0e15) / 1.0e15; + adjustments.push(adj); + } + } + + // With integral term, later fires should be more aggressive + // (integral accumulates same-direction error) + assert!( + adjustments.len() >= 2, + "should fire multiple times, got {}", + adjustments.len() + ); + } + + #[test] + fn dead_zone_absorbs_small_noise() { + let clock = Arc::new(MockClock::new(0)); + let config = PidConfig { + dead_zone_spm: 2.0, // Wide dead zone + ..PidConfig::balanced(10.0) + }; + let mut v = PidTunedVardiff::new(config, 1.0e15, clock.clone()); + let target = Target::MAX; + + // Small deviation: 9 shares = 9 SPM (error = 1, within dead zone of 2) + v.add_shares(9); + clock.set(60); + let result = v.try_vardiff(1.0e15, &target, 10.0).unwrap(); + assert_eq!(result, None, "small error within dead zone should not fire"); + } + + #[test] + fn max_adjustment_prevents_wild_swings() { + let clock = Arc::new(MockClock::new(0)); + let config = PidConfig { + max_adjustment_fraction: 0.3, // Max 30% per fire + ..PidConfig::aggressive(10.0) + }; + let mut v = PidTunedVardiff::new(config, 1.0e15, clock.clone()); + let target = Target::MAX; + + // Extreme error: 0 shares in 60s + v.add_shares(0); + clock.set(60); + let result = v.try_vardiff(1.0e15, &target, 10.0).unwrap(); + assert!(result.is_some()); + let change = (result.unwrap() as f64 - 1.0e15) / 1.0e15; + assert!( + change.abs() <= 0.31, + "change {} exceeds max_adjustment_fraction", + change + ); + } + + #[test] + fn respects_min_window() { + let clock = Arc::new(MockClock::new(0)); + let mut v = PidTunedVardiff::balanced(1.0e15, 10.0, clock.clone()); + let target = Target::MAX; + + v.add_shares(0); + clock.set(15); // Below min_window_secs=20 + assert_eq!(v.try_vardiff(1.0e15, &target, 10.0).unwrap(), None); + } + + #[test] + fn integral_decays_over_time() { + let clock = Arc::new(MockClock::new(0)); + let mut v = PidTunedVardiff::balanced(1.0e15, 10.0, clock.clone()); + let target = Target::MAX; + + // Build up integral with under-performance + v.add_shares(5); + clock.set(60); + let _ = v.try_vardiff(1.0e15, &target, 10.0); + + let integral_after_error = v.error_integral; + + // Now feed on-target data — integral should decay + v.add_shares(10); + clock.set(120); + let _ = v.try_vardiff(1.0e15, &target, 10.0); + + assert!( + v.error_integral.abs() < integral_after_error.abs(), + "integral should decay when error returns to zero" + ); + } +} diff --git a/sv2/channels-sv2/src/vardiff/pow2_pid.rs b/sv2/channels-sv2/src/vardiff/pow2_pid.rs new file mode 100644 index 0000000000..d83366acc4 --- /dev/null +++ b/sv2/channels-sv2/src/vardiff/pow2_pid.rs @@ -0,0 +1,269 @@ +//! Power-of-2 quantized PID variable difficulty algorithm. +//! +//! Reproduces a common open-source pool vardiff pattern that uses +//! the `pid` crate with power-of-2 difficulty quantization. The algorithm: +//! +//! 1. Measures realized shares/min over a sliding window +//! 2. Feeds realized SPM into a P-only controller (Ki=Kd=0) +//! with `Kp = -difficulty × 0.01` +//! 3. Applies: `new_diff = quantize_pow2((diff + pid_output).max(diff × 0.1))` +//! 4. Re-tunes PID gains proportionally to new difficulty on retarget +//! +//! The power-of-2 quantization creates a massive dead zone (~41% of +//! current difficulty) that makes the algorithm nearly inert for normal +//! operational variance. + +use std::sync::Arc; + +use bitcoin::Target; + +use super::error::VardiffError; +use super::{Clock, Vardiff}; + +/// Power-of-2 quantized PID vardiff algorithm. +/// +/// Operates in difficulty-space with power-of-2 quantization. +/// The PID is effectively P-only (Ki=Kd=0). +#[derive(Debug)] +pub struct Pow2PidVardiff { + shares_since_update: u32, + timestamp_of_last_update: u64, + current_difficulty: f32, + initial_difficulty: f32, + spm_target: f32, + kp_fraction: f32, + min_allowed_hashrate: f32, + clock: Arc, + /// Minimum observation window (seconds) before acting. + min_window_secs: u64, + /// Internal: last computed delta and threshold for observability. + pub last_realized_spm: Option, + pub last_pid_output: Option, +} + +impl Pow2PidVardiff { + /// Constructs with the given parameters. + /// + /// - `spm_target`: shares per minute target (typical: 10.0) + /// - `kp_fraction`: proportional gain as fraction of difficulty (typical: 0.01) + /// - `initial_hashrate`: used to compute initial difficulty + /// - `min_allowed_hashrate`: floor + pub fn new( + spm_target: f32, + kp_fraction: f32, + initial_hashrate: f32, + min_allowed_hashrate: f32, + clock: Arc, + ) -> Self { + let initial_difficulty = Self::difficulty_from_hashrate(initial_hashrate, spm_target); + let quantized = nearest_power_of_2(initial_difficulty); + Self { + shares_since_update: 0, + timestamp_of_last_update: clock.now_secs(), + current_difficulty: quantized, + initial_difficulty: quantized, + spm_target, + kp_fraction, + min_allowed_hashrate, + clock, + min_window_secs: 20, + last_realized_spm: None, + last_pid_output: None, + } + } + + /// Typical defaults: SPM=10, Kp=0.01×diff. + pub fn default_params(initial_hashrate: f32, clock: Arc) -> Self { + Self::new(10.0, 0.01, initial_hashrate, 1.0, clock) + } + + fn difficulty_from_hashrate(hashrate: f32, spm: f32) -> f32 { + let shares_per_second = spm / 60.0; + hashrate / (shares_per_second * 2f32.powi(32)) + } + + fn hashrate_from_difficulty(difficulty: f32, spm: f32) -> f32 { + let shares_per_second = spm / 60.0; + shares_per_second * difficulty * 2f32.powi(32) + } + + pub fn current_difficulty(&self) -> f32 { + self.current_difficulty + } +} + +impl Vardiff for Pow2PidVardiff { + fn last_update_timestamp(&self) -> u64 { + self.timestamp_of_last_update + } + + fn shares_since_last_update(&self) -> u32 { + self.shares_since_update + } + + fn set_timestamp_of_last_update(&mut self, ts: u64) { + self.timestamp_of_last_update = ts; + } + + fn increment_shares_since_last_update(&mut self) { + self.shares_since_update = self.shares_since_update.saturating_add(1); + } + + fn add_shares(&mut self, n: u32) { + self.shares_since_update = self.shares_since_update.saturating_add(n); + } + + fn min_allowed_hashrate(&self) -> f32 { + self.min_allowed_hashrate + } + + fn reset_counter(&mut self) -> Result<(), VardiffError> { + self.shares_since_update = 0; + self.timestamp_of_last_update = self.clock.now_secs(); + self.last_realized_spm = None; + self.last_pid_output = None; + Ok(()) + } + + fn try_vardiff( + &mut self, + _hashrate: f32, + _target: &Target, + _shares_per_minute: f32, + ) -> Result, VardiffError> { + self.last_realized_spm = None; + self.last_pid_output = None; + + let now = self.clock.now_secs(); + let dt = now.saturating_sub(self.timestamp_of_last_update); + + // Requires at least 20s of data before acting + if dt < self.min_window_secs { + return Ok(None); + } + + // Compute realized shares per minute over the window + let realized_spm = self.shares_since_update as f32 / (dt as f32 / 60.0); + self.last_realized_spm = Some(realized_spm); + + // PID computation (P-only: Kp × error, where error = setpoint - measured) + // pid crate convention: output = Kp × (setpoint - measurement) + // With Kp negative: output = (-diff × kp_fraction) × (spm_target - realized) + let kp = -(self.current_difficulty * self.kp_fraction); + let error = self.spm_target - realized_spm; + let pid_output = kp * error; + + // Clamp output to ±10× current difficulty + let output_limit = self.current_difficulty * 10.0; + let pid_output = pid_output.clamp(-output_limit, output_limit); + self.last_pid_output = Some(pid_output); + + // Apply: new_diff = quantize((current + output).max(initial × 0.1)) + let raw_diff = (self.current_difficulty + pid_output).max(self.initial_difficulty * 0.1); + let new_difficulty = nearest_power_of_2(raw_diff); + + if new_difficulty == self.current_difficulty { + return Ok(None); + } + + // Retarget: update state and re-tune PID (gains scale with new difficulty) + self.current_difficulty = new_difficulty; + self.initial_difficulty = new_difficulty; + self.shares_since_update = 0; + self.timestamp_of_last_update = now; + + let new_hashrate = Self::hashrate_from_difficulty(new_difficulty, self.spm_target); + let floored = new_hashrate.max(self.min_allowed_hashrate); + + Ok(Some(floored)) + } +} + +/// Rounds to nearest power of 2. +fn nearest_power_of_2(x: f32) -> f32 { + if x <= 0.0 { + return 0.000_976_562_5; + } + let exponent = x.log2().round() as i32; + 2f32.powi(exponent) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::vardiff::MockClock; + + #[test] + fn nearest_power_of_2_rounds_correctly() { + assert_eq!(nearest_power_of_2(1.0), 1.0); + assert_eq!(nearest_power_of_2(3.0), 4.0); + assert_eq!(nearest_power_of_2(12.0), 16.0); + assert_eq!(nearest_power_of_2(0.2), 0.25); + assert_eq!(nearest_power_of_2(1024.0), 1024.0); + assert_eq!(nearest_power_of_2(1500.0), 2048.0); + } + + #[test] + fn no_retarget_when_within_dead_zone() { + let clock = Arc::new(MockClock::new(0)); + let mut v = Pow2PidVardiff::default_params(1.0e15, clock.clone()); + let target = Target::MAX; + + // Feed exactly on-target shares (SPM=10 over 60s = 10 shares) + v.add_shares(10); + clock.set(60); + let result = v.try_vardiff(1.0e15, &target, 10.0).unwrap(); + assert_eq!(result, None, "on-target should not retarget"); + } + + #[test] + fn no_retarget_at_2x_hashrate() { + let clock = Arc::new(MockClock::new(0)); + let mut v = Pow2PidVardiff::default_params(1.0e15, clock.clone()); + let target = Target::MAX; + + // 2× hashrate → 20 SPM realized + v.add_shares(20); + clock.set(60); + let result = v.try_vardiff(1.0e15, &target, 10.0).unwrap(); + assert_eq!(result, None, "2x hashrate should still be in dead zone"); + } + + #[test] + fn retargets_at_extreme_hashrate_change() { + let clock = Arc::new(MockClock::new(0)); + let mut v = Pow2PidVardiff::default_params(1.0e15, clock.clone()); + let target = Target::MAX; + + // 10× hashrate → 100 SPM realized + v.add_shares(100); + clock.set(60); + let result = v.try_vardiff(1.0e15, &target, 10.0).unwrap(); + assert!(result.is_some(), "10x hashrate should trigger retarget"); + } + + #[test] + fn respects_minimum_window() { + let clock = Arc::new(MockClock::new(0)); + let mut v = Pow2PidVardiff::default_params(1.0e15, clock.clone()); + let target = Target::MAX; + + v.add_shares(1000); + clock.set(15); // Only 15s elapsed, below 20s minimum + let result = v.try_vardiff(1.0e15, &target, 10.0).unwrap(); + assert_eq!(result, None, "should not act before min_window_secs"); + } + + #[test] + fn quantization_is_power_of_2() { + let clock = Arc::new(MockClock::new(0)); + let v = Pow2PidVardiff::default_params(1.0e15, clock); + let diff = v.current_difficulty(); + // Must be a power of 2 + assert!( + (diff.log2().fract()).abs() < 1e-5, + "difficulty {} is not a power of 2", + diff + ); + } +} diff --git a/sv2/channels-sv2/src/vardiff/test/classic.rs b/sv2/channels-sv2/src/vardiff/test/classic.rs deleted file mode 100644 index 8aa7689c32..0000000000 --- a/sv2/channels-sv2/src/vardiff/test/classic.rs +++ /dev/null @@ -1,117 +0,0 @@ -/// Classic implementation test suite -use crate::vardiff::test::{ - simulate_shares_and_wait, TEST_MIN_ALLOWED_HASHRATE, TEST_SHARES_PER_MINUTE, -}; -use crate::{target::hash_rate_to_target, vardiff::VardiffError, VardiffState}; - -use super::{ - test_increment_and_reset_shares, test_try_vardiff_low_hashrate_decrease_target, - test_try_vardiff_no_shares_30_to_60s_decrease, - test_try_vardiff_no_shares_less_than_30s_decrease, - test_try_vardiff_no_shares_more_than_60s_decrease, - test_try_vardiff_stable_hashrate_minimal_change_or_no_change, - test_try_vardiff_with_less_spm_than_expected, test_try_vardiff_with_shares_30_to_60s, - test_try_vardiff_with_shares_less_than_30, test_try_vardiff_with_shares_more_than_60s, Vardiff, -}; - -fn new_test_vardiff_state() -> Result { - VardiffState::new_with_min(TEST_MIN_ALLOWED_HASHRATE) -} - -#[test] -fn test_initialization_and_getters() { - let vardiff = new_test_vardiff_state().expect("Failed to create VardiffState"); - - assert_eq!(vardiff.min_allowed_hashrate(), TEST_MIN_ALLOWED_HASHRATE); - assert_eq!(vardiff.shares_since_last_update(), 0); -} - -#[test] -fn test_increment_and_reset_shares_classic() { - let mut vardiff = new_test_vardiff_state().expect("Failed to create VardiffState"); - test_increment_and_reset_shares(&mut vardiff) -} - -#[test] -fn test_try_vardiff_stable_hashrate_minimal_change_or_no_change_classic() { - let mut vardiff = new_test_vardiff_state().expect("Failed to create VardiffState"); - test_try_vardiff_stable_hashrate_minimal_change_or_no_change(&mut vardiff); -} - -#[test] -pub fn test_try_vardiff_low_hashrate_decrease_target_classic() { - let mut vardiff = new_test_vardiff_state().expect("Failed to create VardiffState"); - test_try_vardiff_low_hashrate_decrease_target(&mut vardiff); -} - -#[test] -pub fn test_try_vardiff_with_shares_less_than_30_classic() { - let mut vardiff = new_test_vardiff_state().expect("Failed to create VardiffState"); - test_try_vardiff_with_shares_less_than_30(&mut vardiff); -} - -#[test] -pub fn test_try_vardiff_with_shares_30_to_60s_classic() { - let mut vardiff = new_test_vardiff_state().expect("Failed to create VardiffState"); - test_try_vardiff_with_shares_30_to_60s(&mut vardiff); -} - -#[test] -pub fn test_try_vardiff_with_shares_more_than_60s_classic() { - let mut vardiff = new_test_vardiff_state().expect("Failed to create VardiffState"); - test_try_vardiff_with_shares_more_than_60s(&mut vardiff); -} - -#[test] -pub fn test_try_vardiff_no_shares_30_to_60s_decrease_classic() { - let mut vardiff = new_test_vardiff_state().expect("Failed to create VardiffState"); - test_try_vardiff_no_shares_30_to_60s_decrease(&mut vardiff); -} - -#[test] -pub fn test_try_vardiff_no_shares_more_than_60s_decrease_classic() { - let mut vardiff = new_test_vardiff_state().expect("Failed to create VardiffState"); - test_try_vardiff_no_shares_more_than_60s_decrease(&mut vardiff); -} - -#[test] -pub fn test_try_vardiff_no_shares_less_than_30s_decrease_classic() { - let mut vardiff = new_test_vardiff_state().expect("Failed to create VardiffState"); - test_try_vardiff_no_shares_less_than_30s_decrease(&mut vardiff); -} - -#[test] -fn test_try_vardiff_with_less_spm_than_expected_classic() { - let mut vardiff = new_test_vardiff_state().expect("Failed to create VardiffState"); - test_try_vardiff_with_less_spm_than_expected(&mut vardiff); -} - -#[test] -fn test_try_vardiff_hashrate_clamps_to_minimum() { - let hashrate = TEST_MIN_ALLOWED_HASHRATE * 1.5; - let target = hash_rate_to_target(hashrate.into(), TEST_SHARES_PER_MINUTE.into()) - .unwrap() - .into(); - - let mut vardiff = VardiffState::new_with_min(TEST_MIN_ALLOWED_HASHRATE) - .expect("Failed to create VardiffState"); - - let simulation_duration_secs = 16; - simulate_shares_and_wait(&mut vardiff, 0, simulation_duration_secs); - - let result = vardiff - .try_vardiff(hashrate, &target, TEST_SHARES_PER_MINUTE) - .expect("try_vardiff failed"); - assert!(result.is_some(), "Hashrate should update"); - let new_hashrate = result.unwrap(); - - assert_eq!( - new_hashrate, TEST_MIN_ALLOWED_HASHRATE, - "Hashrate should be clamped to minimum" - ); - assert_eq!( - new_hashrate, TEST_MIN_ALLOWED_HASHRATE, - "Stored hashrate should be clamped" - ); - assert_eq!(vardiff.shares_since_last_update(), 0); -} diff --git a/sv2/channels-sv2/src/vardiff/test/mod.rs b/sv2/channels-sv2/src/vardiff/test/mod.rs index de2c536731..4412d7b961 100644 --- a/sv2/channels-sv2/src/vardiff/test/mod.rs +++ b/sv2/channels-sv2/src/vardiff/test/mod.rs @@ -2,8 +2,6 @@ /// providing methods to verify the correctness of any specific implementation. use std::{thread, time::Duration}; -mod classic; - use super::Vardiff; use crate::target::hash_rate_to_target; use bitcoin::Target; @@ -384,7 +382,13 @@ fn test_try_vardiff_with_less_spm_than_expected(vardiff: &mut V) { .unwrap() .into(); - assert_eq!(hashrate_after_240s, 74.2); + // Was 74.2 on upstream, but that came from the `try_vardiff` fallback at + // `classic.rs:250` (`hashrate * realized_spm / shares_per_minute = 106*7/10 = 74.2`) + // which only triggers when `hash_rate_from_target` errors. Upstream's *100 + // scaling overflowed U256 at this high-target test point. With the U512 + // widening (target.rs) that overflow is gone, so the main path runs and + // returns the integer-truncated 74 from `low_u128()`. + assert_eq!(hashrate_after_240s, 74.0); let simulation_duration = 300; // testing case when realized_shares_per_minute / shares_per_minute = 0.85 @@ -399,5 +403,7 @@ fn test_try_vardiff_with_less_spm_than_expected(vardiff: &mut V) { .expect("try_vardiff failed") .unwrap(); - assert_eq!(hashrate_after_300s, 62.327995); + // Was 62.327995 on upstream via the same overflow-fallback path as the + // 74.2 value above. Now exercises the main path; integer-truncated to 62. + assert_eq!(hashrate_after_300s, 62.0); }