phanerozoic commited on
Commit
79ed4eb
·
1 Parent(s): 4a3e194

Rerun every result on the constant-depth host, add the amplified host with its fault-tolerance theorem and runs, the orbit certificate and the literature on growth, and cut the paper to 35 pages

Browse files
Files changed (46) hide show
  1. README.md +34 -13
  2. paper/README.md +13 -6
  3. paper/runs/paper_c_evaluator.json +17 -2
  4. paper/runs/paper_environment.json +6 -6
  5. paper/runs/paper_fanin2.json +27 -0
  6. paper/runs/paper_host_family.json +10 -10
  7. paper/runs/paper_interp.json +2 -2
  8. paper/runs/paper_neuromorphic.json +12 -31
  9. paper/runs/paper_noise_certify.json +224 -0
  10. paper/runs/paper_noise_curve.json +822 -822
  11. paper/runs/paper_noise_leak.json +41 -41
  12. paper/runs/paper_noise_margin.json +2 -2
  13. paper/runs/paper_noise_omega.json +21 -21
  14. paper/runs/paper_noise_profile.json +83 -77
  15. paper/runs/paper_redundant_curve_r3.json +2718 -0
  16. paper/runs/paper_redundant_layers_r3.json +245 -0
  17. paper/runs/paper_redundant_omega_r3.json +47 -0
  18. paper/runs/paper_redundant_r3.json +35 -0
  19. paper/runs/paper_redundant_restore_r3.json +66 -0
  20. paper/runs/paper_redundant_selfrep_r3.json +35 -0
  21. paper/runs/paper_runs_family.json +8 -7
  22. paper/runs/paper_runs_family_gate.json +9 -9
  23. paper/runs/paper_runs_lev_sparse.json +20 -20
  24. paper/runs/paper_runs_lockstep.json +8 -8
  25. paper/runs/paper_runs_net.json +30 -30
  26. paper/runs/paper_settle.json +1 -1
  27. paper/runs/paper_throughput.json +26 -21
  28. paper/runs/paper_verify.json +12 -11
  29. paper/runs/paper_verify_times.json +31 -39
  30. paper/universal_construction_ternary.pdf +2 -2
  31. paper/universal_construction_ternary.tex +0 -0
  32. src/check_c.py +3 -2
  33. src/check_family.py +35 -18
  34. src/check_framing.py +1 -1
  35. src/check_host.py +1 -1
  36. src/check_host_family.py +1 -1
  37. src/fanin2.py +127 -28
  38. src/hosted_constructor.py +3 -3
  39. src/netlist_eval.c +103 -31
  40. src/neuromorphic.py +56 -41
  41. src/noise.py +101 -9
  42. src/paper_verify.py +1 -1
  43. src/redundant.py +745 -0
  44. src/selfrep.py +1 -1
  45. src/throughput.py +25 -1
  46. src/verify.py +30 -16
README.md CHANGED
@@ -561,9 +561,14 @@ weights and checked to the byte.
561
 
562
  `paper/` states and proves what this machine does, for a host serialized one
563
  unit at a time: `variants/neural_subleq8io_netlist.safetensors` stores the bias
564
- of every unit and every edge of the wiring, 17,873 units and 50,250 edges in
565
- 159,279 bytes, so the network the file denotes is the network the paper
566
- analyses, and parsing the file rebuilds it. Separating construction from copying
 
 
 
 
 
567
  as von Neumann did, a 27-instruction program emits the serialization of the
568
  host, its initial memory and its own description tape; each generation is
569
  instantiated from the bytes the last one emitted, by parsing that output,
@@ -574,17 +579,26 @@ image from its description, copies the description and hands over, so that with
574
  its own description it reproduces generation after generation by the
575
  interpreter's dynamics, that a larger interpreter runs a netlist realizing a
576
  smaller one, and that the constructor itself runs as a netlist stored in the
577
- interpreter's state.
 
 
 
 
 
 
578
 
579
  `python src/verify.py` audits every statement of the paper, and `--tier 2` adds
580
  every construction end to end; the checks of a tier run concurrently. `--tier 3` runs
581
- the self-reproducing instance on the threshold evaluators, whose cost belongs to
582
- the object: one generation is 1,647,743 steps of a map of 87,080 units. The
583
- scripts that produce every figure are `src/selfrep.py`, `src/netlist_io.py`,
 
 
584
  `src/paper_stats.py`, `src/paper_verify.py`, `src/paper_runs.py`,
585
  `src/organism.py`, `src/check_c.py`, `src/hierarchy.py`, `src/hosted_constructor.py`,
586
- `src/throughput.py`, `src/noise.py`, `src/neuromorphic.py` and the
587
- `src/check_*.py` set, and their records are in `paper/runs/`.
 
588
 
589
  ---
590
 
@@ -981,20 +995,27 @@ src/ the library (run scripts as `python src/<nam
981
  ├── paper_runs.py self-description, three generations, lockstep
982
  ├── organism.py the organism: decodes a description into the idle bank,
983
  │ copies it and hands over, generation after generation
984
- ├── netlist_eval.c an evaluator of the host and the interpreter in C
 
 
 
985
  ├── check_c.py the host and the organism on the evaluator in C
 
 
 
986
  ├── fanin2.py rewrites a netlist to effective fan-in two
987
  ├── hierarchy.py a larger interpreter interpreting a netlist realizing a
988
  │ smaller one
989
  ├── hosted_constructor.py the universal constructor as a netlist stored in the
990
  │ interpreter, with tape, output word and device in signals
991
  ├── noise.py read noise on the self-reproducing run, the deviation curve
992
- │ against the union bound, weight error with zero-entry leakage
 
993
  ├── neuromorphic.py the datapath on the Loihi and Akida neuron models
994
  └── check_*.py codec boundaries and optimality, step counts, tapes that are
995
  not recipes, ternary depth, environment cost, device, host,
996
- levelization, framing, settling, dependence, serialization,
997
- all 29 machines
998
  paper/ the manuscript, and the record of every run it reports
999
  tools/ build_all.py (build + quantize + verify every profile),
1000
  cpu_programs.py (assembler + CPU program suite), test_cpu.py
 
561
 
562
  `paper/` states and proves what this machine does, for a host serialized one
563
  unit at a time: `variants/neural_subleq8io_netlist.safetensors` stores the bias
564
+ of every unit and every edge of the wiring, 17,598 units and 51,132 edges in
565
+ 160,240 bytes, in the order `src/host_family.py` builds them, so the network the
566
+ file denotes is the network the paper analyses, and parsing the file rebuilds
567
+ it. That host is the member with eight-bit words of a family whose step has
568
+ depth 13 for every word width, with a carry-lookahead subtractor and the
569
+ operands fetched through the decode lines of the counter; `src/host_family.py`
570
+ builds any member and `src/check_host_family.py` checks each against SUBLEQ
571
+ on the evaluator in C. Separating construction from copying
572
  as von Neumann did, a 27-instruction program emits the serialization of the
573
  host, its initial memory and its own description tape; each generation is
574
  instantiated from the bytes the last one emitted, by parsing that output,
 
579
  its own description it reproduces generation after generation by the
580
  interpreter's dynamics, that a larger interpreter runs a netlist realizing a
581
  smaller one, and that the constructor itself runs as a netlist stored in the
582
+ interpreter's state. Its robustness section gives the margin every orbit has
583
+ against perturbation, a certificate of the leakage an orbit tolerates from the
584
+ inputs active along it, and the amplified host of `src/redundant.py`: every row
585
+ of the levelized host replaced by r rows reading all r copies of its inputs,
586
+ which multiplies every margin by r, reproduces itself exactly, and completes the
587
+ self-reproducing run under read noise at levels where the host fails within its
588
+ first bytes.
589
 
590
  `python src/verify.py` audits every statement of the paper, and `--tier 2` adds
591
  every construction end to end; the checks of a tier run concurrently. `--tier 3` runs
592
+ the self-reproducing instance on the threshold evaluators, the perturbation
593
+ experiments and the amplified host, whose cost belongs to the object: one
594
+ generation is 1,664,939 steps of a map of 41,967 units, and the amplified host
595
+ reproduces itself in 33,796,449 steps of 125,901 units. The scripts that produce
596
+ every figure are `src/selfrep.py`, `src/netlist_io.py`, `src/host_family.py`,
597
  `src/paper_stats.py`, `src/paper_verify.py`, `src/paper_runs.py`,
598
  `src/organism.py`, `src/check_c.py`, `src/hierarchy.py`, `src/hosted_constructor.py`,
599
+ `src/throughput.py`, `src/noise.py`, `src/redundant.py`, `src/fanin2.py`,
600
+ `src/neuromorphic.py` and the `src/check_*.py` set, and their records are in
601
+ `paper/runs/`.
602
 
603
  ---
604
 
 
995
  ├── paper_runs.py self-description, three generations, lockstep
996
  ├── organism.py the organism: decodes a description into the idle bank,
997
  │ copies it and hands over, generation after generation
998
+ ├── host_family.py the host family H_A: a constant-depth SUBLEQ step for
999
+ │ every word width, and its serialization in build order
1000
+ ├── netlist_eval.c an evaluator of the host family, the amplified host and the
1001
+ │ interpreter in C, the levels of a large netlist in parallel
1002
  ├── check_c.py the host and the organism on the evaluator in C
1003
+ ├── redundant.py the amplified host N_r: r-fold redundancy with the restoring
1004
+ │ organ inside every unit, its self-reproduction, its runs
1005
+ │ under read noise
1006
  ├── fanin2.py rewrites a netlist to effective fan-in two
1007
  ├── hierarchy.py a larger interpreter interpreting a netlist realizing a
1008
  │ smaller one
1009
  ├── hosted_constructor.py the universal constructor as a netlist stored in the
1010
  │ interpreter, with tape, output word and device in signals
1011
  ├── noise.py read noise on the self-reproducing run, the deviation curve
1012
+ │ against the bounds, weight error with zero-entry leakage, the
1013
+ │ active-input counts that certify an orbit
1014
  ├── neuromorphic.py the datapath on the Loihi and Akida neuron models
1015
  └── check_*.py codec boundaries and optimality, step counts, tapes that are
1016
  not recipes, ternary depth, environment cost, device, host,
1017
+ host family, levelization, framing, settling, dependence,
1018
+ serialization, all 29 machines
1019
  paper/ the manuscript, and the record of every run it reports
1020
  tools/ build_all.py (build + quantize + verify every profile),
1021
  cpu_programs.py (assembler + CPU program suite), test_cpu.py
paper/README.md CHANGED
@@ -28,16 +28,21 @@ and cover every claim the paper makes.
28
 
29
  Tier three runs the self-reproducing instance itself on the threshold
30
  evaluators, runs the constructor on all twenty-nine machines of the artifact,
31
- and carries out the perturbation experiments. Its cost belongs to the object and
32
- not to the implementation: one generation is 1,647,743 steps of a map of 87,080
33
- units, that is 1.43e11 unit evaluations. `runs/paper_throughput.json` holds the
34
- rate of each evaluator, so the cost of any one run is a multiplication.
 
 
 
 
35
 
36
  ## What each script establishes
37
 
38
  | Script | Record | Establishes |
39
  |---|---|---|
40
- | `src/host_netlist.py` | — | the step netlist of the host, unit by unit |
 
41
  | `src/netlist_io.py` | — | the serialization sigma and its inverse |
42
  | `src/noise.py margin` | `paper_noise_margin.json` | the margin along the trajectory |
43
  | `src/noise.py profile` | `paper_noise_profile.json` | the pre-activation profile and its bound on the failure rate |
@@ -56,6 +61,7 @@ rate of each evaluator, so the cost of any one run is a multiplication.
56
  | `src/check_environment.py` | `paper_environment.json` | the cost of the environment against the cost of the network |
57
  | `src/check_sigma.py` | — | sigma is a function, injective, and inverted by the parser |
58
  | `src/check_settle.py` | `paper_settle.json` | order-independent settling, the full adder under all 9! record orders |
 
59
  | `src/check_dependence.py` | — | the dependence hypothesis of the size proposition |
60
  | `src/check_family.py` | `paper_runs_family.json` | the constructor emits all 29 machines |
61
  | `src/check_family_gate.py` | `paper_runs_family_gate.json` | four of them on the netlist of sigma |
@@ -65,7 +71,8 @@ rate of each evaluator, so the cost of any one run is a multiplication.
65
  | `src/hierarchy.py` | `paper_hierarchy.json` | a larger interpreter runs a smaller one transition by transition |
66
  | `src/hosted_constructor.py` | `paper_hosted.json` | the constructor as a netlist stored in the interpreter |
67
  | `src/throughput.py` | `paper_throughput.json` | the rate of each evaluator |
68
- | `src/noise.py` | `paper_noise_*.json` | read noise, the deviation curve, weight error with leakage |
 
69
  | `src/neuromorphic.py` | `paper_neuromorphic.json` | the datapath on the Loihi and Akida neuron models |
70
 
71
  `src/neuromorphic.py run` needs Lava, which requires Python 3.10; everything
 
28
 
29
  Tier three runs the self-reproducing instance itself on the threshold
30
  evaluators, runs the constructor on all twenty-nine machines of the artifact,
31
+ carries out the perturbation experiments and the orbit certificate, and runs
32
+ the amplified host: its exact self-reproduction on the evaluator in C, the
33
+ self-reproducing instance of the host on it under read noise, its deviation
34
+ curve, and the correction of single wrong copies. Its cost belongs to the object and not to the implementation: one
35
+ generation is 1,664,939 steps of a map of 41,967 units, that is 6.99e10 unit
36
+ evaluations, and the amplified host reproduces itself in 33,796,449 steps of
37
+ 125,901 units. `runs/paper_throughput.json` holds the rate of each evaluator, so
38
+ the cost of any one run is a multiplication.
39
 
40
  ## What each script establishes
41
 
42
  | Script | Record | Establishes |
43
  |---|---|---|
44
+ | `src/host_netlist.py`, `src/host_family.py` | — | the step netlist of the host, a member of the constant-depth family H_A |
45
+ | `src/check_host_family.py` | `paper_host_family.json` | one step of H_A against SUBLEQ_A for A = 3 to 12, on the evaluator in C |
46
  | `src/netlist_io.py` | — | the serialization sigma and its inverse |
47
  | `src/noise.py margin` | `paper_noise_margin.json` | the margin along the trajectory |
48
  | `src/noise.py profile` | `paper_noise_profile.json` | the pre-activation profile and its bound on the failure rate |
 
61
  | `src/check_environment.py` | `paper_environment.json` | the cost of the environment against the cost of the network |
62
  | `src/check_sigma.py` | — | sigma is a function, injective, and inverted by the parser |
63
  | `src/check_settle.py` | `paper_settle.json` | order-independent settling, the full adder under all 9! record orders |
64
+ | `src/fanin2.py` | `paper_fanin2.json` | the fan-in-two rewriting, on the host, the interpreter and every small ternary unit |
65
  | `src/check_dependence.py` | — | the dependence hypothesis of the size proposition |
66
  | `src/check_family.py` | `paper_runs_family.json` | the constructor emits all 29 machines |
67
  | `src/check_family_gate.py` | `paper_runs_family_gate.json` | four of them on the netlist of sigma |
 
71
  | `src/hierarchy.py` | `paper_hierarchy.json` | a larger interpreter runs a smaller one transition by transition |
72
  | `src/hosted_constructor.py` | `paper_hosted.json` | the constructor as a netlist stored in the interpreter |
73
  | `src/throughput.py` | `paper_throughput.json` | the rate of each evaluator |
74
+ | `src/noise.py` | `paper_noise_*.json` | read noise, the deviation curve, weight error with leakage, the active-input counts of the orbit certificate |
75
+ | `src/redundant.py` | `paper_redundant_*.json` | the amplified host N_3: one step against SUBLEQ on replicated states, the margin 3/2, exact self-reproduction in C, the run under noise, the deviation curve and its bound by layer, wrong copies and the state read by majority |
76
  | `src/neuromorphic.py` | `paper_neuromorphic.json` | the datapath on the Loihi and Akida neuron models |
77
 
78
  `src/neuromorphic.py run` needs Lava, which requires Python 3.10; everything
paper/runs/paper_c_evaluator.json CHANGED
@@ -3,7 +3,22 @@
3
  "depth": 13,
4
  "rows": 41967,
5
  "identity_rows": 24369,
6
- "max_width": 8210
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  },
8
  "netlist_random": "random states: 1048576 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
9
  "lev_random": "random states: 1048576 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
@@ -48,5 +63,5 @@
48
  },
49
  "self_describing_equals_sigma": true,
50
  "ok": true,
51
- "seconds": 223.99809079198167
52
  }
 
3
  "depth": 13,
4
  "rows": 41967,
5
  "identity_rows": 24369,
6
+ "max_width": 8210,
7
+ "layer_sizes": [
8
+ 2313,
9
+ 8210,
10
+ 2090,
11
+ 2587,
12
+ 6427,
13
+ 2347,
14
+ 2379,
15
+ 2389,
16
+ 2609,
17
+ 2353,
18
+ 2339,
19
+ 3867,
20
+ 2057
21
+ ]
22
  },
23
  "netlist_random": "random states: 1048576 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
24
  "lev_random": "random states: 1048576 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
 
63
  },
64
  "self_describing_equals_sigma": true,
65
  "ok": true,
66
+ "seconds": 1077.7651741330046
67
  }
paper/runs/paper_environment.json CHANGED
@@ -1,20 +1,20 @@
1
  {
2
  "sigma_entries": 88385,
3
  "sigma_bytes": 160240,
4
- "sigma_seconds": 0.12680757397902198,
5
- "build_seconds": 0.09095647497451864,
6
  "inst_bytes": 305508,
7
- "inst_seconds": 1.8462460138835014e-05,
8
- "sigma_inverse_seconds": 0.08101599519723095,
9
  "lev_units_in": 17598,
10
  "lev_units_out": 41967,
11
  "lev_nonzero": 75501,
12
  "lev_layers": 13,
13
- "lev_seconds": 0.7176295069803018,
14
  "lev_entries": 124165940,
15
  "steps": 1664939,
16
  "emitted_bytes": 305508,
17
- "reference_seconds": 0.40840222500264645,
18
  "environment_ops": 2248155,
19
  "network_ops": 69872495013,
20
  "ratio": 3.217510695133648e-05
 
1
  {
2
  "sigma_entries": 88385,
3
  "sigma_bytes": 160240,
4
+ "sigma_seconds": 0.1279831129941158,
5
+ "build_seconds": 0.09118957800092176,
6
  "inst_bytes": 305508,
7
+ "inst_seconds": 1.931125996634364e-05,
8
+ "sigma_inverse_seconds": 0.08041474440251477,
9
  "lev_units_in": 17598,
10
  "lev_units_out": 41967,
11
  "lev_nonzero": 75501,
12
  "lev_layers": 13,
13
+ "lev_seconds": 2.1859134749975055,
14
  "lev_entries": 124165940,
15
  "steps": 1664939,
16
  "emitted_bytes": 305508,
17
+ "reference_seconds": 0.39680202698218636,
18
  "environment_ops": 2248155,
19
  "network_ops": 69872495013,
20
  "ratio": 3.217510695133648e-05
paper/runs/paper_fanin2.json ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "small_units": 664,
3
+ "small_unit_failures": 0,
4
+ "netlists": {
5
+ "N_host": {
6
+ "units": 17598,
7
+ "units_fanin2": 33568,
8
+ "shapes_above_two": {
9
+ "and": 821,
10
+ "or": 70,
11
+ "threshold": 15
12
+ },
13
+ "agrees_on_random_inputs": true
14
+ },
15
+ "N_U": {
16
+ "units": 13034,
17
+ "units_fanin2": 40081,
18
+ "shapes_above_two": {
19
+ "and": 3091,
20
+ "or": 43
21
+ },
22
+ "agrees_on_random_inputs": true
23
+ }
24
+ },
25
+ "seconds": 2.961936319974484,
26
+ "ok": true
27
+ }
paper/runs/paper_host_family.json CHANGED
@@ -8,7 +8,7 @@
8
  "states": 65536,
9
  "result": "random states: 65536 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
10
  "ok": true,
11
- "seconds": 0.014426040987018496
12
  },
13
  {
14
  "A": 4,
@@ -18,7 +18,7 @@
18
  "states": 65536,
19
  "result": "random states: 65536 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
20
  "ok": true,
21
- "seconds": 0.025986755994381383
22
  },
23
  {
24
  "A": 5,
@@ -28,7 +28,7 @@
28
  "states": 65536,
29
  "result": "random states: 65536 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
30
  "ok": true,
31
- "seconds": 0.04753158800303936
32
  },
33
  {
34
  "A": 6,
@@ -38,7 +38,7 @@
38
  "states": 65536,
39
  "result": "random states: 65536 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
40
  "ok": true,
41
- "seconds": 0.08725168902310543
42
  },
43
  {
44
  "A": 7,
@@ -48,7 +48,7 @@
48
  "states": 65536,
49
  "result": "random states: 65536 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
50
  "ok": true,
51
- "seconds": 0.21353051002370194
52
  },
53
  {
54
  "A": 8,
@@ -58,7 +58,7 @@
58
  "states": 65536,
59
  "result": "random states: 65536 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
60
  "ok": true,
61
- "seconds": 0.37463173500145786
62
  },
63
  {
64
  "A": 9,
@@ -68,7 +68,7 @@
68
  "states": 65536,
69
  "result": "random states: 65536 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
70
  "ok": true,
71
- "seconds": 0.8620287890080363
72
  },
73
  {
74
  "A": 10,
@@ -78,7 +78,7 @@
78
  "states": 65536,
79
  "result": "random states: 65536 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
80
  "ok": true,
81
- "seconds": 1.670569111010991
82
  },
83
  {
84
  "A": 11,
@@ -88,7 +88,7 @@
88
  "states": 32768,
89
  "result": "random states: 32768 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
90
  "ok": true,
91
- "seconds": 3.3843332859978545
92
  },
93
  {
94
  "A": 12,
@@ -98,7 +98,7 @@
98
  "states": 16384,
99
  "result": "random states: 16384 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
100
  "ok": true,
101
- "seconds": 2.971391171013238
102
  }
103
  ],
104
  "ok": true
 
8
  "states": 65536,
9
  "result": "random states: 65536 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
10
  "ok": true,
11
+ "seconds": 0.01500199901056476
12
  },
13
  {
14
  "A": 4,
 
18
  "states": 65536,
19
  "result": "random states: 65536 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
20
  "ok": true,
21
+ "seconds": 0.03776371100684628
22
  },
23
  {
24
  "A": 5,
 
28
  "states": 65536,
29
  "result": "random states: 65536 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
30
  "ok": true,
31
+ "seconds": 0.06280311100999825
32
  },
33
  {
34
  "A": 6,
 
38
  "states": 65536,
39
  "result": "random states: 65536 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
40
  "ok": true,
41
+ "seconds": 0.12102672000764869
42
  },
43
  {
44
  "A": 7,
 
48
  "states": 65536,
49
  "result": "random states: 65536 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
50
  "ok": true,
51
+ "seconds": 0.3255250339861959
52
  },
53
  {
54
  "A": 8,
 
58
  "states": 65536,
59
  "result": "random states: 65536 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
60
  "ok": true,
61
+ "seconds": 0.30383163699298166
62
  },
63
  {
64
  "A": 9,
 
68
  "states": 65536,
69
  "result": "random states: 65536 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
70
  "ok": true,
71
+ "seconds": 0.9685272219940089
72
  },
73
  {
74
  "A": 10,
 
78
  "states": 65536,
79
  "result": "random states: 65536 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
80
  "ok": true,
81
+ "seconds": 1.8736297989962623
82
  },
83
  {
84
  "A": 11,
 
88
  "states": 32768,
89
  "result": "random states: 32768 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
90
  "ok": true,
91
+ "seconds": 1.9215046949975658
92
  },
93
  {
94
  "A": 12,
 
98
  "states": 16384,
99
  "result": "random states: 16384 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
100
  "ok": true,
101
+ "seconds": 2.6124302610114682
102
  }
103
  ],
104
  "ok": true
paper/runs/paper_interp.json CHANGED
@@ -13,7 +13,7 @@
13
  "halted_not_fixed": 0,
14
  "counter_wrong": 0,
15
  "ok": true,
16
- "seconds": 4.457714715012116
17
  },
18
  {
19
  "A": 13,
@@ -28,7 +28,7 @@
28
  "halted_not_fixed": 0,
29
  "counter_wrong": 0,
30
  "ok": true,
31
- "seconds": 11.988531054987106
32
  }
33
  ],
34
  "ok": true
 
13
  "halted_not_fixed": 0,
14
  "counter_wrong": 0,
15
  "ok": true,
16
+ "seconds": 2.7823171920026653
17
  },
18
  {
19
  "A": 13,
 
28
  "halted_not_fixed": 0,
29
  "counter_wrong": 0,
30
  "ok": true,
31
+ "seconds": 9.55269223099458
32
  }
33
  ],
34
  "ok": true
paper/runs/paper_neuromorphic.json CHANGED
@@ -1,36 +1,17 @@
1
  {
2
  "backend": "Lava 0.10.0, fixed_pt tag (Loihi neuron model)",
3
- "units": 156,
4
- "layers": 25,
5
  "widths": [
6
- 34,
7
- 42,
8
- 32,
9
- 33,
10
- 34,
11
- 32,
12
- 34,
13
- 32,
14
- 32,
15
- 29,
16
- 30,
17
- 28,
18
- 29,
19
- 27,
20
- 28,
21
- 26,
22
- 26,
23
- 25,
24
- 25,
25
- 25,
26
- 25,
27
- 33,
28
- 25,
29
- 17,
30
- 17
31
  ],
32
- "worst_accumulation": 10,
33
- "patterns": 512,
34
  "failures": 0,
35
  "margin_membrane_units": 64,
36
  "weight_scale": 2,
@@ -39,8 +20,8 @@
39
  "ok": true,
40
  "akida": {
41
  "backend": "akida 2.19.3, software backend",
42
- "layers": 25,
43
- "patterns": 4096,
44
  "failures": 0,
45
  "weights_bits": 2,
46
  "act_bits": 1,
 
1
  {
2
  "backend": "Lava 0.10.0, fixed_pt tag (Loihi neuron model)",
3
+ "units": 106,
4
+ "layers": 6,
5
  "widths": [
6
+ 48,
7
+ 58,
8
+ 23,
9
+ 23,
10
+ 9,
11
+ 9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  ],
13
+ "worst_accumulation": 16,
14
+ "patterns": 4096,
15
  "failures": 0,
16
  "margin_membrane_units": 64,
17
  "weight_scale": 2,
 
20
  "ok": true,
21
  "akida": {
22
  "backend": "akida 2.19.3, software backend",
23
+ "layers": 6,
24
+ "patterns": 65536,
25
  "failures": 0,
26
  "weights_bits": 2,
27
  "act_bits": 1,
paper/runs/paper_noise_certify.json ADDED
@@ -0,0 +1,224 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "M": 41967,
3
+ "widest_layer": 8210,
4
+ "selfdesc_10000": {
5
+ "steps": 10000,
6
+ "A_star": 349,
7
+ "K_star": 8,
8
+ "per_layer_active_zero_max": [
9
+ 312,
10
+ 310,
11
+ 326,
12
+ 326,
13
+ 317,
14
+ 324,
15
+ 324,
16
+ 333,
17
+ 349,
18
+ 324,
19
+ 330,
20
+ 317,
21
+ 312
22
+ ],
23
+ "per_layer_active_programmed_max": [
24
+ 4,
25
+ 2,
26
+ 1,
27
+ 7,
28
+ 2,
29
+ 2,
30
+ 2,
31
+ 8,
32
+ 8,
33
+ 3,
34
+ 3,
35
+ 2,
36
+ 1
37
+ ],
38
+ "per_layer_popcount_max": [
39
+ 312,
40
+ 310,
41
+ 326,
42
+ 326,
43
+ 317,
44
+ 324,
45
+ 324,
46
+ 333,
47
+ 349,
48
+ 324,
49
+ 330,
50
+ 317,
51
+ 312
52
+ ],
53
+ "gamma_certified": 0.0014326647564469914,
54
+ "epsilon_certified": 0.0625,
55
+ "seconds": 76.52389068101184
56
+ },
57
+ "leak_rows": [
58
+ {
59
+ "epsilon": 0.0,
60
+ "gamma": 0.0,
61
+ "worst_bound": 0.0,
62
+ "orbit_bound": 0.0,
63
+ "certified_by_orbit": true,
64
+ "first_deviation": null
65
+ },
66
+ {
67
+ "epsilon": 0.0,
68
+ "gamma": 3.0454379339749056e-05,
69
+ "worst_bound": 0.25,
70
+ "orbit_bound": 0.01062857838957242,
71
+ "certified_by_orbit": true,
72
+ "first_deviation": null
73
+ },
74
+ {
75
+ "epsilon": 0.0,
76
+ "gamma": 5.4817882811548304e-05,
77
+ "worst_bound": 0.45000001788139343,
78
+ "orbit_bound": 0.019131441101230356,
79
+ "certified_by_orbit": true,
80
+ "first_deviation": null
81
+ },
82
+ {
83
+ "epsilon": 0.0,
84
+ "gamma": 9.136313801924717e-05,
85
+ "worst_bound": 0.75,
86
+ "orbit_bound": 0.03188573516871726,
87
+ "certified_by_orbit": true,
88
+ "first_deviation": null
89
+ },
90
+ {
91
+ "epsilon": 0.0,
92
+ "gamma": 0.00024363503471799245,
93
+ "worst_bound": 2.0,
94
+ "orbit_bound": 0.08502862711657937,
95
+ "certified_by_orbit": true,
96
+ "first_deviation": null
97
+ },
98
+ {
99
+ "epsilon": 0.0,
100
+ "gamma": 0.0009745401388719698,
101
+ "worst_bound": 8.0,
102
+ "orbit_bound": 0.34011450846631747,
103
+ "certified_by_orbit": true,
104
+ "first_deviation": null
105
+ },
106
+ {
107
+ "epsilon": 0.0,
108
+ "gamma": 0.003898160555487879,
109
+ "worst_bound": 32.0,
110
+ "orbit_bound": 1.3604580338652699,
111
+ "certified_by_orbit": false,
112
+ "first_deviation": null
113
+ },
114
+ {
115
+ "epsilon": 0.0,
116
+ "gamma": 0.015592642221951517,
117
+ "worst_bound": 128.0,
118
+ "orbit_bound": 5.4418321354610795,
119
+ "certified_by_orbit": false,
120
+ "first_deviation": 1
121
+ },
122
+ {
123
+ "epsilon": 0.0009765625,
124
+ "gamma": 1.5227189669874528e-05,
125
+ "worst_bound": 0.3711170554161072,
126
+ "orbit_bound": 0.013126789194786211,
127
+ "certified_by_orbit": true,
128
+ "first_deviation": null
129
+ },
130
+ {
131
+ "epsilon": 0.001953125,
132
+ "gamma": 0.0,
133
+ "worst_bound": 0.5,
134
+ "orbit_bound": 0.015625,
135
+ "certified_by_orbit": true,
136
+ "first_deviation": null
137
+ },
138
+ {
139
+ "epsilon": 0.00390625,
140
+ "gamma": 0.0,
141
+ "worst_bound": 1.0,
142
+ "orbit_bound": 0.03125,
143
+ "certified_by_orbit": true,
144
+ "first_deviation": null
145
+ },
146
+ {
147
+ "epsilon": 0.015625,
148
+ "gamma": 0.0,
149
+ "worst_bound": 4.0,
150
+ "orbit_bound": 0.125,
151
+ "certified_by_orbit": true,
152
+ "first_deviation": null
153
+ },
154
+ {
155
+ "epsilon": 0.0625,
156
+ "gamma": 0.0,
157
+ "worst_bound": 16.0,
158
+ "orbit_bound": 0.5,
159
+ "certified_by_orbit": false,
160
+ "first_deviation": null
161
+ },
162
+ {
163
+ "epsilon": 0.25,
164
+ "gamma": 0.0,
165
+ "worst_bound": 64.0,
166
+ "orbit_bound": 2.0,
167
+ "certified_by_orbit": false,
168
+ "first_deviation": 3
169
+ }
170
+ ],
171
+ "omega_star": {
172
+ "steps": 1664939,
173
+ "A_star": 441,
174
+ "K_star": 8,
175
+ "per_layer_active_zero_max": [
176
+ 405,
177
+ 404,
178
+ 420,
179
+ 420,
180
+ 411,
181
+ 418,
182
+ 418,
183
+ 426,
184
+ 441,
185
+ 418,
186
+ 424,
187
+ 411,
188
+ 406
189
+ ],
190
+ "per_layer_active_programmed_max": [
191
+ 6,
192
+ 2,
193
+ 1,
194
+ 8,
195
+ 2,
196
+ 2,
197
+ 2,
198
+ 8,
199
+ 8,
200
+ 3,
201
+ 3,
202
+ 2,
203
+ 1
204
+ ],
205
+ "per_layer_popcount_max": [
206
+ 405,
207
+ 404,
208
+ 420,
209
+ 420,
210
+ 411,
211
+ 418,
212
+ 418,
213
+ 426,
214
+ 441,
215
+ 418,
216
+ 424,
217
+ 411,
218
+ 406
219
+ ],
220
+ "gamma_certified": 0.0011337868480725624,
221
+ "epsilon_certified": 0.0625,
222
+ "seconds": 5459.065824607009
223
+ }
224
+ }
paper/runs/paper_noise_curve.json CHANGED
@@ -1,5 +1,5 @@
1
  {
2
- "M": 87080,
3
  "grid": [
4
  0.02,
5
  0.04,
@@ -21,7 +21,7 @@
21
  "median_first_deviation": null,
22
  "step_exposure": 768000,
23
  "empirical_rate_per_step": 0.0,
24
- "bound_rate_per_step": 5.323542983836414e-133,
25
  "looseness": null,
26
  "first_deviation": [
27
  null,
@@ -281,7 +281,7 @@
281
  null,
282
  null
283
  ],
284
- "seconds": 65.65325542801293
285
  },
286
  {
287
  "sigma": 0.04,
@@ -291,7 +291,7 @@
291
  "median_first_deviation": null,
292
  "step_exposure": 768000,
293
  "empirical_rate_per_step": 0.0,
294
- "bound_rate_per_step": 6.5006339829255935e-31,
295
  "looseness": null,
296
  "first_deviation": [
297
  null,
@@ -551,7 +551,7 @@
551
  null,
552
  null
553
  ],
554
- "seconds": 66.58585271798074
555
  },
556
  {
557
  "sigma": 0.06,
@@ -561,7 +561,7 @@
561
  "median_first_deviation": null,
562
  "step_exposure": 768000,
563
  "empirical_rate_per_step": 0.0,
564
- "bound_rate_per_step": 6.844267574136667e-12,
565
  "looseness": null,
566
  "first_deviation": [
567
  null,
@@ -821,18 +821,18 @@
821
  null,
822
  null
823
  ],
824
- "seconds": 66.86032408801839
825
  },
826
  {
827
  "sigma": 0.08,
828
  "copies": 256,
829
  "steps": 4000,
830
- "deviated": 19,
831
- "median_first_deviation": 2370,
832
- "step_exposure": 987289,
833
- "empirical_rate_per_step": 1.9244618343767632e-05,
834
- "bound_rate_per_step": 3.574221981361327e-05,
835
- "looseness": 1.8572579188190754,
836
  "first_deviation": [
837
  null,
838
  null,
@@ -842,6 +842,7 @@
842
  null,
843
  null,
844
  null,
 
845
  null,
846
  null,
847
  null,
@@ -856,7 +857,6 @@
856
  null,
857
  null,
858
  null,
859
- 2370,
860
  null,
861
  null,
862
  null,
@@ -875,7 +875,6 @@
875
  null,
876
  null,
877
  null,
878
- 742,
879
  null,
880
  null,
881
  null,
@@ -904,11 +903,11 @@
904
  null,
905
  null,
906
  null,
 
907
  null,
908
  null,
909
  null,
910
  null,
911
- 3121,
912
  null,
913
  null,
914
  null,
@@ -921,7 +920,6 @@
921
  null,
922
  null,
923
  null,
924
- 474,
925
  null,
926
  null,
927
  null,
@@ -935,7 +933,14 @@
935
  null,
936
  null,
937
  null,
938
- 2964,
 
 
 
 
 
 
 
939
  null,
940
  null,
941
  null,
@@ -954,9 +959,7 @@
954
  null,
955
  null,
956
  null,
957
- 61,
958
  null,
959
- 3951,
960
  null,
961
  null,
962
  null,
@@ -974,7 +977,6 @@
974
  null,
975
  null,
976
  null,
977
- 2883,
978
  null,
979
  null,
980
  null,
@@ -993,11 +995,12 @@
993
  null,
994
  null,
995
  null,
996
- 2739,
997
  null,
998
  null,
999
  null,
 
1000
  null,
 
1001
  null,
1002
  null,
1003
  null,
@@ -1006,9 +1009,11 @@
1006
  null,
1007
  null,
1008
  null,
 
1009
  null,
1010
  null,
1011
  null,
 
1012
  null,
1013
  null,
1014
  null,
@@ -1031,19 +1036,14 @@
1031
  null,
1032
  null,
1033
  null,
1034
- 3303,
1035
  null,
1036
  null,
1037
  null,
1038
  null,
1039
- 1916,
1040
- 1090,
1041
  null,
1042
  null,
1043
  null,
1044
  null,
1045
- 2752,
1046
- 1611,
1047
  null,
1048
  null,
1049
  null,
@@ -1051,7 +1051,6 @@
1051
  null,
1052
  null,
1053
  null,
1054
- 2448,
1055
  null,
1056
  null,
1057
  null,
@@ -1066,7 +1065,6 @@
1066
  null,
1067
  null,
1068
  null,
1069
- 1604,
1070
  null,
1071
  null,
1072
  null,
@@ -1074,7 +1072,6 @@
1074
  null,
1075
  null,
1076
  null,
1077
- 399,
1078
  null,
1079
  null,
1080
  null,
@@ -1082,1096 +1079,1099 @@
1082
  null,
1083
  null,
1084
  null,
1085
- 972,
1086
  null,
1087
  null,
1088
  null,
1089
  null,
1090
  null,
1091
  null,
1092
- 3889
 
 
 
 
1093
  ],
1094
- "seconds": 89.31228423499851
1095
  },
1096
  {
1097
  "sigma": 0.09,
1098
  "copies": 256,
1099
  "steps": 4000,
1100
- "deviated": 249,
1101
- "median_first_deviation": 515,
1102
- "step_exposure": 237782,
1103
- "empirical_rate_per_step": 0.0010471776669386244,
1104
- "bound_rate_per_step": 0.002409766400085013,
1105
- "looseness": 2.3012011009839943,
1106
  "first_deviation": [
1107
- 364,
1108
- 9,
1109
- 192,
1110
- 2203,
1111
- 532,
1112
- 155,
1113
- 567,
1114
- 1209,
1115
- 335,
1116
- 2213,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1117
  1127,
1118
- 599,
1119
- 381,
1120
- 394,
1121
- 293,
1122
- 8,
 
 
1123
  307,
1124
- 3212,
1125
- 1680,
1126
- 324,
1127
- 490,
 
 
 
 
 
 
 
 
 
 
 
 
 
1128
  366,
1129
- 45,
1130
- 442,
1131
- 683,
1132
- 2628,
1133
- 560,
1134
  null,
1135
- 669,
1136
- 199,
1137
- 1027,
1138
- 1698,
1139
- 1596,
1140
- 1027,
1141
- 2059,
1142
- 89,
1143
- 44,
1144
- 159,
1145
- 1436,
1146
- 431,
1147
- 925,
1148
- 1896,
1149
- 217,
1150
  null,
1151
- 598,
1152
- 92,
1153
- 2931,
1154
- 1449,
1155
- 395,
1156
- 614,
1157
- 1580,
1158
- 305,
1159
- 1403,
1160
- 1037,
1161
- 380,
1162
- 2327,
1163
- 2742,
1164
- 458,
1165
- 1329,
1166
- 60,
1167
- 909,
1168
- 1000,
1169
- 209,
1170
- 1061,
1171
- 970,
1172
- null,
1173
- 1427,
1174
- 1294,
1175
- 465,
1176
- 694,
1177
- 2026,
1178
- 426,
1179
- 28,
1180
- 43,
1181
- 1088,
1182
- 1354,
1183
- 782,
1184
- 2188,
1185
- 2922,
1186
- 778,
1187
- 403,
1188
- 371,
1189
- 464,
1190
- 3041,
1191
- 109,
1192
  null,
1193
  522,
1194
- 2940,
1195
- 236,
1196
- 2469,
1197
- 506,
1198
- 752,
1199
- 1210,
1200
- 2028,
1201
- 744,
1202
- 552,
1203
- 142,
1204
- 155,
1205
- 2024,
1206
- 738,
1207
- null,
1208
- 1750,
1209
- 350,
1210
- 65,
1211
- 618,
1212
- 2449,
1213
- 6,
1214
- 2390,
1215
- 77,
1216
- 150,
1217
- 416,
1218
- 1901,
1219
- 172,
1220
- 75,
1221
- 1039,
1222
- 1776,
1223
- 1179,
1224
- 1804,
1225
- 379,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1226
  null,
1227
- 506,
1228
- 139,
1229
- 85,
1230
- 18,
1231
- 240,
1232
- 104,
1233
- 126,
1234
- 62,
1235
- 1198,
1236
- 93,
1237
- 229,
1238
- 972,
1239
- 331,
1240
- 924,
1241
- 1,
1242
- 731,
1243
- 497,
1244
- 245,
1245
- 123,
1246
- 417,
1247
- 1381,
1248
- 46,
1249
  null,
1250
- 515,
1251
- 294,
1252
- 483,
1253
- 3,
1254
- 1393,
1255
- 54,
1256
- 3117,
1257
- 6,
1258
- 436,
1259
- 2231,
1260
- 540,
1261
- 2069,
1262
- 860,
1263
- 3137,
1264
- 2244,
1265
- 675,
1266
- 822,
1267
- 246,
1268
- 2819,
1269
- 2127,
1270
- 742,
1271
- 288,
1272
- 1639,
1273
- 121,
1274
- 3089,
1275
- 471,
1276
- 438,
1277
- 442,
1278
- 1720,
1279
- 1012,
1280
- 126,
1281
- 69,
1282
- 165,
1283
- 258,
1284
- 118,
1285
- 607,
1286
- 3971,
1287
- 158,
1288
- 309,
1289
- 361,
1290
- 301,
1291
- 311,
1292
- 59,
1293
- 474,
1294
- 399,
1295
- 1012,
1296
- 407,
1297
- 1295,
1298
- 1393,
1299
- 784,
1300
- 609,
1301
  866,
1302
- 151,
1303
- 431,
1304
- 2144,
1305
- 607,
1306
- 482,
1307
- 1113,
1308
- 1,
1309
- 417,
1310
- 1083,
1311
- 690,
1312
- 1836,
1313
- 1323,
1314
- 869,
1315
- 429,
1316
- 930,
1317
- 491,
1318
- 120,
1319
- 133,
1320
- 282,
1321
- 1898,
1322
- 708,
1323
- 67,
1324
- 90,
1325
- 3046,
1326
- 628,
1327
- 498,
1328
- 39,
1329
- 549,
1330
- 1395,
1331
- 603,
1332
- 2537,
1333
- 775,
1334
- 1604,
1335
- 797,
1336
- 57,
1337
- 719,
1338
- 368,
1339
- 426,
1340
- 492,
1341
- 568,
1342
- 1279,
1343
  498,
1344
- 408,
1345
- 878,
1346
- 178,
1347
- 927,
1348
- 1991,
1349
- 475,
1350
- 56,
1351
- 2127,
1352
- 335,
1353
- 423,
1354
- 1696,
1355
- 168,
1356
- 152,
1357
- 1246,
1358
- 8,
1359
- 294,
1360
- 47,
1361
- 487,
1362
- 4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1363
  ],
1364
- "seconds": 89.46471349999774
1365
  },
1366
  {
1367
  "sigma": 0.1,
1368
  "copies": 256,
1369
- "steps": 361,
1370
  "deviated": 256,
1371
- "median_first_deviation": 36,
1372
- "step_exposure": 12888,
1373
- "empirical_rate_per_step": 0.019863438857852266,
1374
- "bound_rate_per_step": 0.04992323775848069,
1375
- "looseness": 2.513323000903512,
1376
  "first_deviation": [
1377
- 114,
1378
- 83,
1379
- 71,
1380
- 8,
1381
- 27,
1382
- 33,
1383
- 40,
1384
- 6,
1385
- 21,
1386
- 82,
1387
- 113,
1388
- 6,
1389
- 108,
1390
- 75,
1391
- 4,
1392
- 132,
1393
- 361,
1394
- 47,
1395
- 56,
1396
- 42,
1397
- 39,
1398
- 50,
1399
  32,
 
1400
  99,
1401
- 82,
1402
- 107,
1403
- 33,
1404
- 1,
1405
- 22,
1406
- 13,
1407
- 65,
1408
- 66,
1409
- 65,
1410
- 1,
1411
- 32,
1412
- 92,
1413
- 40,
1414
  13,
1415
- 35,
1416
- 22,
1417
- 10,
1418
- 10,
1419
- 22,
1420
- 9,
1421
- 40,
1422
- 26,
1423
- 3,
1424
- 3,
1425
- 47,
1426
- 41,
1427
  58,
1428
- 24,
1429
- 4,
1430
- 42,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1431
  12,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1432
  10,
1433
- 13,
1434
- 95,
1435
- 65,
1436
- 58,
1437
- 1,
1438
  4,
1439
- 29,
1440
- 18,
 
 
 
 
 
 
 
 
1441
  34,
1442
- 51,
1443
- 10,
1444
  3,
1445
- 9,
1446
- 43,
1447
- 112,
1448
- 56,
1449
- 25,
1450
- 8,
1451
- 20,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1452
  34,
1453
- 37,
1454
- 47,
1455
- 94,
1456
  8,
1457
- 30,
1458
- 120,
1459
- 131,
1460
- 55,
1461
- 97,
1462
- 2,
1463
- 54,
1464
- 38,
1465
- 11,
1466
- 27,
1467
- 35,
1468
- 72,
1469
- 4,
1470
- 2,
1471
- 73,
1472
- 53,
1473
- 98,
1474
- 17,
1475
- 25,
1476
- 10,
1477
- 26,
1478
- 137,
1479
- 46,
1480
- 33,
1481
  5,
1482
- 32,
1483
- 96,
1484
- 74,
1485
- 81,
1486
- 10,
1487
  3,
1488
- 28,
1489
- 15,
 
 
 
 
 
 
 
 
 
1490
  2,
1491
- 86,
1492
- 49,
1493
- 24,
1494
- 120,
1495
- 150,
1496
- 102,
1497
- 37,
1498
- 81,
1499
- 22,
1500
- 10,
1501
- 61,
1502
- 77,
1503
- 61,
1504
  11,
1505
- 80,
1506
- 22,
1507
- 12,
1508
- 4,
1509
- 1,
1510
  1,
1511
- 20,
1512
- 15,
1513
- 4,
1514
- 38,
1515
- 98,
1516
- 53,
 
 
 
 
 
 
 
 
 
 
1517
  3,
1518
- 43,
 
1519
  28,
1520
- 114,
 
 
 
 
 
 
 
 
 
 
 
1521
  64,
1522
- 22,
1523
- 34,
1524
  77,
1525
- 80,
1526
- 5,
1527
- 7,
1528
- 106,
1529
- 63,
1530
- 90,
1531
- 10,
1532
- 83,
1533
- 87,
1534
- 5,
1535
- 15,
1536
- 104,
1537
- 98,
1538
- 37,
1539
- 58,
1540
  25,
1541
- 68,
1542
- 4,
1543
- 32,
1544
- 154,
1545
- 23,
1546
- 55,
1547
- 24,
1548
- 93,
1549
- 33,
1550
- 35,
1551
- 39,
1552
- 132,
1553
- 31,
1554
  46,
1555
- 14,
1556
- 47,
1557
- 214,
1558
- 128,
1559
- 10,
1560
- 38,
 
 
 
 
 
 
 
1561
  28,
1562
- 18,
1563
- 309,
1564
- 3,
1565
- 2,
1566
- 4,
1567
  46,
 
 
1568
  72,
1569
- 20,
1570
- 23,
 
 
 
 
1571
  55,
1572
- 34,
1573
- 3,
1574
- 23,
1575
- 5,
1576
- 58,
1577
- 21,
1578
- 33,
1579
- 103,
1580
- 37,
1581
- 5,
1582
- 23,
1583
- 90,
1584
- 80,
1585
- 53,
1586
- 26,
1587
- 131,
1588
- 22,
1589
- 14,
1590
- 46,
1591
- 40,
1592
- 35,
1593
- 16,
1594
- 164,
1595
- 15,
1596
- 82,
1597
- 28,
1598
- 176,
1599
- 2,
1600
  20,
1601
- 48,
1602
- 36,
1603
- 64,
1604
- 226,
1605
- 87,
1606
- 61,
1607
- 51,
1608
- 1,
1609
- 104,
1610
- 34,
1611
- 7,
1612
- 62,
1613
- 205,
1614
  8,
1615
- 16,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1616
  41,
1617
- 57,
1618
- 274,
1619
- 42,
1620
- 27,
1621
- 99,
1622
- 16,
1623
- 31,
1624
- 34,
1625
- 59,
1626
- 22,
1627
- 215,
 
 
 
1628
  47,
1629
- 8,
1630
- 37,
1631
- 24,
1632
- 48
 
 
 
 
 
1633
  ],
1634
- "seconds": 8.075529068999458
1635
  },
1636
  {
1637
  "sigma": 0.11,
1638
  "copies": 256,
1639
- "steps": 22,
1640
  "deviated": 256,
1641
- "median_first_deviation": 4,
1642
- "step_exposure": 1299,
1643
- "empirical_rate_per_step": 0.19707467282525018,
1644
- "bound_rate_per_step": 0.4773449253962522,
1645
- "looseness": 2.4221525706630143,
1646
  "first_deviation": [
1647
- 2,
1648
- 20,
1649
- 3,
1650
  12,
 
 
 
 
 
 
1651
  1,
 
 
1652
  10,
1653
- 7,
 
 
 
 
 
 
 
 
 
 
 
1654
  12,
1655
- 6,
1656
- 1,
1657
  1,
1658
  3,
1659
- 5,
 
 
 
 
1660
  6,
1661
- 4,
 
 
 
1662
  2,
 
 
 
1663
  4,
1664
- 9,
1665
- 4,
1666
- 10,
1667
  2,
1668
- 7,
1669
  8,
1670
- 5,
1671
  9,
 
 
1672
  18,
1673
- 3,
1674
- 2,
1675
- 1,
1676
- 6,
1677
  4,
1678
- 1,
1679
- 2,
1680
- 10,
1681
- 5,
1682
- 5,
1683
- 2,
1684
- 2,
1685
- 1,
1686
- 2,
1687
- 14,
1688
- 1,
1689
  13,
1690
  1,
1691
- 5,
1692
- 12,
1693
- 1,
1694
- 8,
1695
- 2,
1696
- 4,
1697
  4,
 
1698
  11,
 
 
 
1699
  1,
 
 
1700
  2,
 
1701
  2,
1702
- 5,
 
1703
  4,
1704
- 3,
1705
- 1,
1706
- 2,
1707
- 8,
1708
- 7,
1709
- 1,
1710
- 1,
1711
- 8,
1712
  2,
1713
- 7,
1714
- 1,
1715
- 3,
1716
  9,
1717
- 1,
1718
  7,
1719
- 16,
1720
- 13,
1721
- 3,
1722
- 3,
1723
  6,
 
1724
  3,
1725
  2,
1726
- 1,
1727
- 6,
1728
- 2,
1729
- 2,
1730
  3,
1731
  6,
1732
- 6,
1733
- 1,
1734
- 8,
1735
- 2,
1736
- 4,
1737
- 2,
1738
  7,
1739
- 8,
1740
- 8,
1741
- 2,
1742
- 1,
1743
- 8,
1744
- 1,
1745
  2,
 
 
 
 
1746
  17,
1747
- 12,
 
 
 
 
 
1748
  8,
1749
- 1,
1750
- 4,
1751
- 1,
1752
  7,
1753
- 2,
1754
  1,
 
1755
  10,
 
 
1756
  3,
1757
- 2,
1758
- 4,
1759
- 5,
1760
- 2,
1761
- 6,
1762
  4,
 
1763
  3,
1764
- 5,
1765
- 22,
1766
- 2,
1767
- 9,
1768
- 5,
1769
- 12,
1770
- 11,
1771
- 3,
1772
- 2,
1773
- 1,
1774
  9,
1775
  2,
1776
- 5,
1777
  7,
1778
- 12,
1779
- 4,
1780
  3,
1781
- 2,
1782
- 10,
1783
- 1,
1784
- 1,
1785
- 5,
1786
- 8,
1787
- 6,
1788
- 4,
1789
  5,
1790
- 11,
1791
  1,
 
 
 
 
 
1792
  8,
1793
- 9,
1794
  8,
1795
- 2,
1796
  1,
1797
- 2,
1798
- 7,
1799
  1,
1800
  1,
1801
- 6,
1802
- 15,
1803
- 2,
1804
- 8,
1805
- 8,
1806
- 2,
1807
  4,
1808
- 1,
1809
  2,
1810
- 4,
1811
- 1,
1812
- 9,
1813
  5,
1814
- 17,
1815
- 7,
1816
- 1,
1817
- 18,
1818
- 1,
 
 
 
 
1819
  4,
1820
- 2,
 
1821
  2,
1822
  1,
 
 
 
1823
  3,
 
1824
  2,
1825
- 2,
1826
- 3,
1827
  3,
1828
- 4,
1829
- 1,
1830
  1,
 
1831
  13,
1832
- 6,
1833
  5,
1834
- 5,
1835
- 6,
1836
  6,
1837
  4,
1838
- 2,
1839
- 2,
1840
- 6,
1841
- 1,
1842
  4,
 
 
1843
  21,
 
 
 
1844
  1,
 
 
 
 
1845
  3,
1846
  1,
1847
- 19,
1848
- 1,
1849
- 1,
1850
- 8,
1851
- 8,
1852
- 6,
1853
- 1,
1854
- 4,
1855
  9,
1856
- 6,
1857
- 3,
1858
- 4,
1859
- 4,
1860
  4,
1861
- 6,
1862
  1,
1863
- 10,
1864
- 13,
1865
  2,
1866
- 4,
1867
- 4,
1868
- 7,
1869
- 9,
1870
  8,
1871
  8,
1872
- 3,
1873
  5,
1874
- 1,
1875
- 2,
1876
- 1,
1877
- 6,
1878
- 2,
1879
- 3,
1880
- 2,
1881
- 6,
1882
- 1,
1883
- 22,
1884
  7,
1885
- 3,
1886
  1,
 
 
 
 
 
1887
  4,
1888
- 9,
1889
  3,
1890
  2,
 
 
1891
  4,
1892
- 4,
1893
- 3,
 
 
1894
  3,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1895
  2,
 
 
1896
  8,
1897
  1,
 
 
1898
  2,
 
1899
  2,
1900
- 12,
1901
- 5,
1902
- 2
 
1903
  ],
1904
- "seconds": 0.48405650901258923
1905
  },
1906
  {
1907
  "sigma": 0.12,
1908
  "copies": 256,
1909
- "steps": 7,
1910
  "deviated": 256,
1911
- "median_first_deviation": 1,
1912
- "step_exposure": 379,
1913
- "empirical_rate_per_step": 0.6754617414248021,
1914
- "bound_rate_per_step": 2.6915203450206797,
1915
- "looseness": 3.9847117607923344,
1916
  "first_deviation": [
1917
  1,
1918
- 2,
1919
  3,
1920
- 1,
 
1921
  1,
1922
  3,
1923
- 1,
1924
  2,
1925
  2,
1926
- 1,
1927
- 1,
1928
  2,
1929
- 1,
1930
- 1,
1931
- 1,
1932
  2,
 
 
 
 
1933
  1,
1934
- 1,
1935
- 1,
1936
- 1,
1937
- 1,
 
 
 
1938
  2,
1939
  1,
1940
  3,
1941
- 1,
1942
- 1,
1943
  2,
1944
  2,
 
1945
  1,
1946
- 1,
1947
- 1,
 
1948
  2,
 
1949
  1,
 
 
1950
  1,
 
 
1951
  1,
1952
  1,
1953
- 1,
1954
- 5,
1955
- 1,
1956
- 3,
1957
  2,
1958
- 1,
1959
  3,
1960
- 1,
1961
  3,
1962
- 2,
1963
  3,
1964
  1,
1965
- 1,
1966
- 1,
1967
- 1,
1968
- 1,
1969
- 1,
1970
- 1,
1971
- 1,
1972
- 1,
1973
  2,
1974
- 1,
1975
- 1,
1976
  2,
1977
  1,
1978
  2,
1979
  1,
1980
- 1,
1981
- 1,
1982
- 1,
1983
- 1,
1984
- 1,
1985
- 1,
1986
- 1,
1987
- 1,
1988
- 1,
1989
- 1,
1990
- 1,
1991
- 1,
1992
- 1,
1993
- 1,
1994
- 1,
1995
- 1,
1996
- 1,
1997
- 1,
1998
  3,
1999
  1,
2000
  1,
 
 
 
 
 
 
 
 
 
 
2001
  1,
 
2002
  1,
 
2003
  1,
 
2004
  1,
2005
  1,
 
2006
  1,
 
 
 
 
 
2007
  1,
2008
  1,
 
2009
  1,
2010
  2,
 
2011
  2,
2012
  1,
 
 
 
 
2013
  1,
 
 
2014
  3,
2015
  1,
2016
  1,
 
2017
  2,
 
2018
  1,
2019
- 2,
2020
  1,
2021
  1,
2022
- 2,
2023
  1,
2024
  2,
 
 
 
 
 
2025
  1,
2026
  1,
2027
  1,
 
2028
  1,
2029
  2,
 
2030
  1,
 
2031
  1,
 
2032
  1,
2033
  3,
 
 
2034
  7,
2035
- 1,
2036
- 1,
2037
- 1,
2038
- 1,
2039
- 1,
2040
  2,
2041
  1,
2042
  1,
 
 
 
2043
  1,
 
2044
  1,
 
2045
  1,
2046
  1,
2047
  1,
2048
  1,
2049
  1,
2050
- 1,
 
2051
  1,
2052
  2,
2053
- 1,
2054
- 1,
2055
  3,
2056
  1,
2057
  2,
2058
  1,
2059
  3,
2060
- 3,
2061
- 3,
2062
- 1,
2063
  1,
2064
  2,
2065
- 1,
2066
  2,
2067
- 4,
2068
- 1,
2069
- 1,
2070
  1,
 
2071
  1,
2072
  2,
2073
- 5,
2074
  1,
2075
- 1,
2076
- 1,
2077
- 1,
2078
- 2,
2079
  2,
2080
  1,
 
2081
  1,
2082
  1,
 
2083
  2,
2084
- 1,
2085
- 1,
2086
  2,
 
 
2087
  2,
 
 
2088
  2,
2089
  1,
2090
  1,
 
2091
  1,
2092
- 1,
2093
- 1,
2094
- 2,
2095
- 4,
2096
  2,
2097
- 1,
 
2098
  1,
2099
  4,
2100
- 2,
2101
- 2,
2102
  1,
2103
  2,
 
 
 
 
2104
  1,
2105
  1,
2106
- 1,
2107
  3,
2108
  1,
 
 
 
 
 
2109
  1,
2110
- 1,
 
 
2111
  2,
2112
- 1,
2113
- 1,
2114
- 1,
2115
  2,
2116
  1,
 
2117
  1,
 
 
2118
  2,
2119
- 1,
2120
  2,
2121
- 1,
2122
- 1,
2123
- 1,
2124
- 1,
2125
  3,
2126
- 1,
2127
  2,
2128
  1,
2129
  3,
2130
  1,
2131
  1,
2132
- 4,
2133
  1,
2134
  3,
2135
- 1,
2136
- 1,
2137
- 1,
2138
- 1,
2139
- 1,
2140
- 1,
2141
- 1,
2142
  2,
2143
- 1,
 
2144
  3,
2145
- 1,
2146
- 1,
2147
- 1,
2148
- 1,
2149
  4,
2150
  1,
2151
- 1,
 
2152
  3,
2153
  1,
2154
  1,
2155
- 1,
2156
  2,
 
2157
  1,
2158
  2,
2159
- 1,
2160
  2,
 
 
 
2161
  2,
2162
- 1,
2163
- 4,
2164
- 1,
2165
- 1,
2166
  3,
2167
- 1,
2168
  2,
2169
- 1,
2170
- 1,
2171
- 1,
2172
  1
2173
  ],
2174
- "seconds": 0.15031320802518167
2175
  },
2176
  {
2177
  "sigma": 0.15,
@@ -2181,8 +2181,8 @@
2181
  "median_first_deviation": 1,
2182
  "step_exposure": 256,
2183
  "empirical_rate_per_step": 1.0,
2184
- "bound_rate_per_step": 74.72514762956119,
2185
- "looseness": 74.72514762956119,
2186
  "first_deviation": [
2187
  1,
2188
  1,
@@ -2441,7 +2441,7 @@
2441
  1,
2442
  1
2443
  ],
2444
- "seconds": 0.019951948983361945
2445
  },
2446
  {
2447
  "sigma": 0.2,
@@ -2451,8 +2451,8 @@
2451
  "median_first_deviation": 1,
2452
  "step_exposure": 256,
2453
  "empirical_rate_per_step": 1.0,
2454
- "bound_rate_per_step": 1081.475313137173,
2455
- "looseness": 1081.475313137173,
2456
  "first_deviation": [
2457
  1,
2458
  1,
@@ -2711,7 +2711,7 @@
2711
  1,
2712
  1
2713
  ],
2714
- "seconds": 0.017474645981565118
2715
  }
2716
  ]
2717
  }
 
1
  {
2
+ "M": 41967,
3
  "grid": [
4
  0.02,
5
  0.04,
 
21
  "median_first_deviation": null,
22
  "step_exposure": 768000,
23
  "empirical_rate_per_step": 0.0,
24
+ "bound_rate_per_step": 2.5656078135354018e-133,
25
  "looseness": null,
26
  "first_deviation": [
27
  null,
 
281
  null,
282
  null
283
  ],
284
+ "seconds": 46.02053378999699
285
  },
286
  {
287
  "sigma": 0.04,
 
291
  "median_first_deviation": null,
292
  "step_exposure": 768000,
293
  "empirical_rate_per_step": 0.0,
294
+ "bound_rate_per_step": 3.132890518620101e-31,
295
  "looseness": null,
296
  "first_deviation": [
297
  null,
 
551
  null,
552
  null
553
  ],
554
+ "seconds": 46.60683405501186
555
  },
556
  {
557
  "sigma": 0.06,
 
561
  "median_first_deviation": null,
562
  "step_exposure": 768000,
563
  "empirical_rate_per_step": 0.0,
564
+ "bound_rate_per_step": 3.298499968807918e-12,
565
  "looseness": null,
566
  "first_deviation": [
567
  null,
 
821
  null,
822
  null
823
  ],
824
+ "seconds": 46.58634748199256
825
  },
826
  {
827
  "sigma": 0.08,
828
  "copies": 256,
829
  "steps": 4000,
830
+ "deviated": 7,
831
+ "median_first_deviation": 2070,
832
+ "step_exposure": 1008916,
833
+ "empirical_rate_per_step": 6.938139547791888e-06,
834
+ "bound_rate_per_step": 1.7225467833232754e-05,
835
+ "looseness": 2.4827214434905507,
836
  "first_deviation": [
837
  null,
838
  null,
 
842
  null,
843
  null,
844
  null,
845
+ 2070,
846
  null,
847
  null,
848
  null,
 
857
  null,
858
  null,
859
  null,
 
860
  null,
861
  null,
862
  null,
 
875
  null,
876
  null,
877
  null,
 
878
  null,
879
  null,
880
  null,
 
903
  null,
904
  null,
905
  null,
906
+ 1008,
907
  null,
908
  null,
909
  null,
910
  null,
 
911
  null,
912
  null,
913
  null,
 
920
  null,
921
  null,
922
  null,
 
923
  null,
924
  null,
925
  null,
 
933
  null,
934
  null,
935
  null,
936
+ null,
937
+ null,
938
+ null,
939
+ null,
940
+ null,
941
+ 2321,
942
+ null,
943
+ null,
944
  null,
945
  null,
946
  null,
 
959
  null,
960
  null,
961
  null,
 
962
  null,
 
963
  null,
964
  null,
965
  null,
 
977
  null,
978
  null,
979
  null,
 
980
  null,
981
  null,
982
  null,
 
995
  null,
996
  null,
997
  null,
 
998
  null,
999
  null,
1000
  null,
1001
+ 1086,
1002
  null,
1003
+ 3407,
1004
  null,
1005
  null,
1006
  null,
 
1009
  null,
1010
  null,
1011
  null,
1012
+ 2894,
1013
  null,
1014
  null,
1015
  null,
1016
+ 130,
1017
  null,
1018
  null,
1019
  null,
 
1036
  null,
1037
  null,
1038
  null,
 
1039
  null,
1040
  null,
1041
  null,
1042
  null,
 
 
1043
  null,
1044
  null,
1045
  null,
1046
  null,
 
 
1047
  null,
1048
  null,
1049
  null,
 
1051
  null,
1052
  null,
1053
  null,
 
1054
  null,
1055
  null,
1056
  null,
 
1065
  null,
1066
  null,
1067
  null,
 
1068
  null,
1069
  null,
1070
  null,
 
1072
  null,
1073
  null,
1074
  null,
 
1075
  null,
1076
  null,
1077
  null,
 
1079
  null,
1080
  null,
1081
  null,
 
1082
  null,
1083
  null,
1084
  null,
1085
  null,
1086
  null,
1087
  null,
1088
+ null,
1089
+ null,
1090
+ null,
1091
+ null,
1092
+ null
1093
  ],
1094
+ "seconds": 61.79399620901677
1095
  },
1096
  {
1097
  "sigma": 0.09,
1098
  "copies": 256,
1099
  "steps": 4000,
1100
+ "deviated": 202,
1101
+ "median_first_deviation": 1059,
1102
+ "step_exposure": 496131,
1103
+ "empirical_rate_per_step": 0.0004071505308073876,
1104
+ "bound_rate_per_step": 0.001161353542861366,
1105
+ "looseness": 2.8523935374918437,
1106
  "first_deviation": [
1107
+ 1318,
1108
+ null,
1109
+ null,
1110
+ null,
1111
+ 510,
1112
+ 1019,
1113
+ 1011,
1114
+ 797,
1115
+ 1576,
1116
+ null,
1117
+ 704,
1118
+ 625,
1119
+ 2943,
1120
+ 1383,
1121
+ 2067,
1122
+ 883,
1123
+ 1978,
1124
+ 1059,
1125
+ null,
1126
+ 1581,
1127
+ null,
1128
+ null,
1129
+ 5,
1130
+ 603,
1131
+ 3812,
1132
+ 1796,
1133
+ 3578,
1134
+ null,
1135
+ 3244,
1136
+ 981,
1137
+ 2472,
1138
+ null,
1139
+ 147,
1140
+ 338,
1141
+ 437,
1142
+ 295,
1143
+ 1028,
1144
+ null,
1145
+ 1865,
1146
+ 256,
1147
+ 2546,
1148
+ null,
1149
+ 856,
1150
+ 1968,
1151
+ 3278,
1152
+ 2974,
1153
+ 2156,
1154
+ 3087,
1155
+ 3887,
1156
+ 1195,
1157
+ null,
1158
+ 78,
1159
+ 922,
1160
+ 2150,
1161
+ 243,
1162
+ 3366,
1163
+ 549,
1164
+ 966,
1165
+ null,
1166
+ null,
1167
+ 2931,
1168
+ 3157,
1169
+ null,
1170
+ 3015,
1171
+ 301,
1172
+ 3475,
1173
+ 1047,
1174
+ 933,
1175
+ 1504,
1176
+ null,
1177
+ null,
1178
+ null,
1179
+ 1338,
1180
+ 1297,
1181
+ 728,
1182
+ 83,
1183
+ 1420,
1184
  1127,
1185
+ 1881,
1186
+ 2,
1187
+ 1714,
1188
+ 1531,
1189
+ 1539,
1190
+ 1586,
1191
+ null,
1192
  307,
1193
+ 568,
1194
+ 1458,
1195
+ 850,
1196
+ 143,
1197
+ 3843,
1198
+ 2938,
1199
+ 2759,
1200
+ 3339,
1201
+ null,
1202
+ 16,
1203
+ 823,
1204
+ 1851,
1205
+ 325,
1206
+ null,
1207
+ 144,
1208
+ 2245,
1209
+ null,
1210
  366,
 
 
 
 
 
1211
  null,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1212
  null,
1213
+ 274,
1214
+ 571,
1215
+ 3241,
1216
+ 19,
1217
+ 1047,
1218
+ 3304,
1219
+ 94,
1220
+ 227,
1221
+ null,
1222
+ 2426,
1223
+ 1655,
1224
+ 1469,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1225
  null,
1226
  522,
1227
+ 662,
1228
+ 3318,
1229
+ 967,
1230
+ null,
1231
+ 2997,
1232
+ null,
1233
+ 884,
1234
+ 3268,
1235
+ 486,
1236
+ 231,
1237
+ 198,
1238
+ null,
1239
+ 937,
1240
+ 3667,
1241
+ 1474,
1242
+ 377,
1243
+ 2,
1244
+ 124,
1245
+ null,
1246
+ 3694,
1247
+ null,
1248
+ 296,
1249
+ 1297,
1250
+ 2716,
1251
+ 1077,
1252
+ 466,
1253
+ 2020,
1254
+ 101,
1255
+ 2288,
1256
+ null,
1257
+ 1383,
1258
+ 2439,
1259
+ null,
1260
+ 2549,
1261
+ 934,
1262
+ 652,
1263
+ 358,
1264
+ 189,
1265
+ null,
1266
+ 780,
1267
+ 24,
1268
+ 1309,
1269
+ 8,
1270
+ 2445,
1271
+ 1409,
1272
+ 640,
1273
+ 3229,
1274
  null,
1275
+ 1038,
1276
+ 115,
1277
+ 710,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1278
  null,
1279
+ 617,
1280
+ 818,
1281
+ null,
1282
+ 1361,
1283
+ 1075,
1284
+ 2229,
1285
+ null,
1286
+ 1965,
1287
+ 2051,
1288
+ 289,
1289
+ null,
1290
+ 490,
1291
+ null,
1292
+ 1847,
1293
+ null,
1294
+ null,
1295
+ 1605,
1296
+ 3561,
1297
+ 3531,
1298
+ null,
1299
+ 111,
1300
+ 799,
1301
+ 1137,
1302
+ null,
1303
+ null,
1304
+ 191,
1305
+ 887,
1306
+ 3672,
1307
+ 1039,
1308
+ 3086,
1309
+ 2318,
1310
+ 1080,
1311
+ 917,
1312
+ 2676,
1313
+ 1205,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1314
  866,
1315
+ 1332,
1316
+ 1042,
1317
+ 13,
1318
+ 283,
1319
+ 1197,
1320
+ 1,
1321
+ 2382,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1322
  498,
1323
+ 1542,
1324
+ 141,
1325
+ 2289,
1326
+ 3387,
1327
+ null,
1328
+ 287,
1329
+ null,
1330
+ 533,
1331
+ null,
1332
+ 414,
1333
+ 319,
1334
+ 3201,
1335
+ 941,
1336
+ 623,
1337
+ null,
1338
+ null,
1339
+ null,
1340
+ null,
1341
+ 678,
1342
+ 1970,
1343
+ 18,
1344
+ 1947,
1345
+ 3102,
1346
+ 869,
1347
+ 379,
1348
+ null,
1349
+ 1489,
1350
+ 1004,
1351
+ null,
1352
+ 2866,
1353
+ 1774,
1354
+ 901,
1355
+ 873,
1356
+ 331,
1357
+ 1600,
1358
+ 1613,
1359
+ 1590,
1360
+ 841,
1361
+ 2102,
1362
+ 613
1363
  ],
1364
+ "seconds": 61.69014779900317
1365
  },
1366
  {
1367
  "sigma": 0.1,
1368
  "copies": 256,
1369
+ "steps": 568,
1370
  "deviated": 256,
1371
+ "median_first_deviation": 78,
1372
+ "step_exposure": 29384,
1373
+ "empirical_rate_per_step": 0.00871222433977675,
1374
+ "bound_rate_per_step": 0.024059813034108396,
1375
+ "looseness": 2.761615414821254,
1376
  "first_deviation": [
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1377
  32,
1378
+ 181,
1379
  99,
 
 
 
 
 
 
 
 
 
 
 
 
 
1380
  13,
1381
+ 137,
1382
+ 209,
1383
+ 72,
1384
+ 121,
1385
+ 44,
 
 
 
 
 
 
 
1386
  58,
1387
+ 104,
1388
+ 174,
1389
+ 376,
1390
+ 405,
1391
+ 8,
1392
+ 231,
1393
+ 121,
1394
+ 560,
1395
+ 28,
1396
+ 191,
1397
+ 83,
1398
+ 7,
1399
+ 127,
1400
+ 31,
1401
+ 184,
1402
+ 153,
1403
+ 137,
1404
+ 1,
1405
+ 46,
1406
+ 81,
1407
+ 121,
1408
+ 20,
1409
+ 397,
1410
+ 31,
1411
+ 93,
1412
+ 65,
1413
+ 8,
1414
+ 51,
1415
  12,
1416
+ 144,
1417
+ 42,
1418
+ 20,
1419
+ 154,
1420
+ 39,
1421
+ 166,
1422
+ 55,
1423
+ 263,
1424
+ 284,
1425
+ 266,
1426
+ 41,
1427
+ 59,
1428
+ 28,
1429
+ 79,
1430
+ 53,
1431
+ 102,
1432
+ 45,
1433
+ 88,
1434
+ 361,
1435
+ 89,
1436
  10,
 
 
 
 
 
1437
  4,
1438
+ 120,
1439
+ 24,
1440
+ 64,
1441
+ 173,
1442
+ 126,
1443
+ 8,
1444
+ 1,
1445
+ 512,
1446
+ 200,
1447
+ 281,
1448
  34,
1449
+ 68,
 
1450
  3,
1451
+ 50,
1452
+ 100,
1453
+ 49,
1454
+ 412,
1455
+ 404,
1456
+ 351,
1457
+ 122,
1458
+ 186,
1459
+ 333,
1460
+ 72,
1461
+ 78,
1462
+ 88,
1463
+ 242,
1464
+ 28,
1465
+ 62,
1466
+ 12,
1467
+ 133,
1468
+ 119,
1469
+ 61,
1470
+ 65,
1471
+ 26,
1472
+ 270,
1473
+ 23,
1474
+ 5,
1475
+ 152,
1476
+ 141,
1477
+ 55,
1478
+ 169,
1479
+ 278,
1480
+ 10,
1481
+ 183,
1482
+ 33,
1483
+ 42,
1484
+ 174,
1485
+ 130,
1486
  34,
1487
+ 109,
 
 
1488
  8,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1489
  5,
1490
+ 126,
 
 
 
 
1491
  3,
1492
+ 193,
1493
+ 11,
1494
+ 293,
1495
+ 45,
1496
+ 391,
1497
+ 44,
1498
+ 74,
1499
+ 341,
1500
+ 31,
1501
+ 427,
1502
+ 147,
1503
  2,
1504
+ 244,
 
 
 
 
 
 
 
 
 
 
 
 
1505
  11,
1506
+ 28,
 
 
 
 
1507
  1,
1508
+ 16,
1509
+ 49,
1510
+ 2,
1511
+ 106,
1512
+ 51,
1513
+ 216,
1514
+ 568,
1515
+ 39,
1516
+ 215,
1517
+ 106,
1518
+ 90,
1519
+ 74,
1520
+ 90,
1521
+ 46,
1522
+ 92,
1523
+ 207,
1524
  3,
1525
+ 29,
1526
+ 15,
1527
  28,
1528
+ 151,
1529
+ 47,
1530
+ 137,
1531
+ 118,
1532
+ 25,
1533
+ 190,
1534
+ 158,
1535
+ 329,
1536
+ 21,
1537
+ 118,
1538
+ 196,
1539
+ 10,
1540
  64,
 
 
1541
  77,
1542
+ 156,
1543
+ 13,
 
 
 
 
 
 
 
 
 
 
 
 
 
1544
  25,
1545
+ 19,
1546
+ 50,
1547
+ 247,
1548
+ 41,
1549
+ 90,
1550
+ 6,
1551
+ 171,
1552
+ 72,
 
 
 
 
 
1553
  46,
1554
+ 81,
1555
+ 67,
1556
+ 191,
1557
+ 51,
1558
+ 221,
1559
+ 69,
1560
+ 209,
1561
+ 85,
1562
+ 137,
1563
+ 77,
1564
+ 235,
1565
+ 119,
1566
+ 280,
1567
  28,
1568
+ 151,
 
 
 
 
1569
  46,
1570
+ 85,
1571
+ 33,
1572
  72,
1573
+ 254,
1574
+ 96,
1575
+ 140,
1576
+ 202,
1577
+ 154,
1578
+ 101,
1579
  55,
1580
+ 196,
1581
+ 56,
1582
+ 178,
1583
+ 138,
1584
+ 119,
1585
+ 130,
1586
+ 65,
1587
+ 54,
1588
+ 24,
1589
+ 8,
1590
+ 385,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1591
  20,
 
 
 
 
 
 
 
 
 
 
 
 
 
1592
  8,
1593
+ 97,
1594
+ 65,
1595
+ 217,
1596
+ 288,
1597
+ 184,
1598
+ 69,
1599
+ 25,
1600
+ 24,
1601
+ 4,
1602
+ 421,
1603
+ 5,
1604
+ 160,
1605
+ 262,
1606
+ 115,
1607
+ 185,
1608
  41,
1609
+ 54,
1610
+ 159,
1611
+ 51,
1612
+ 66,
1613
+ 40,
1614
+ 163,
1615
+ 318,
1616
+ 63,
1617
+ 69,
1618
+ 30,
1619
+ 89,
1620
+ 248,
1621
+ 11,
1622
+ 5,
1623
  47,
1624
+ 53,
1625
+ 23,
1626
+ 118,
1627
+ 69,
1628
+ 14,
1629
+ 39,
1630
+ 75,
1631
+ 49,
1632
+ 86
1633
  ],
1634
+ "seconds": 8.738715572981164
1635
  },
1636
  {
1637
  "sigma": 0.11,
1638
  "copies": 256,
1639
+ "steps": 71,
1640
  "deviated": 256,
1641
+ "median_first_deviation": 9,
1642
+ "step_exposure": 3325,
1643
+ "empirical_rate_per_step": 0.07699248120300752,
1644
+ "bound_rate_per_step": 0.2300497758854446,
1645
+ "looseness": 2.987951190699622,
1646
  "first_deviation": [
1647
+ 13,
1648
+ 16,
1649
+ 35,
1650
  12,
1651
+ 4,
1652
+ 1,
1653
+ 20,
1654
+ 8,
1655
+ 18,
1656
+ 2,
1657
  1,
1658
+ 6,
1659
+ 5,
1660
  10,
1661
+ 22,
1662
+ 18,
1663
+ 17,
1664
+ 10,
1665
+ 5,
1666
+ 2,
1667
+ 16,
1668
+ 14,
1669
+ 52,
1670
+ 14,
1671
+ 29,
1672
+ 8,
1673
  12,
 
 
1674
  1,
1675
  3,
1676
+ 55,
1677
+ 15,
1678
+ 7,
1679
+ 35,
1680
+ 18,
1681
  6,
1682
+ 14,
1683
+ 8,
1684
+ 3,
1685
+ 10,
1686
  2,
1687
+ 19,
1688
+ 16,
1689
+ 17,
1690
  4,
1691
+ 49,
1692
+ 25,
1693
+ 15,
1694
  2,
 
1695
  8,
1696
+ 7,
1697
  9,
1698
+ 19,
1699
+ 8,
1700
  18,
 
 
 
 
1701
  4,
 
 
 
 
 
 
 
 
 
 
 
1702
  13,
1703
  1,
 
 
 
 
 
 
1704
  4,
1705
+ 3,
1706
  11,
1707
+ 6,
1708
+ 23,
1709
+ 9,
1710
  1,
1711
+ 17,
1712
+ 16,
1713
  2,
1714
+ 38,
1715
  2,
1716
+ 24,
1717
+ 21,
1718
  4,
1719
+ 18,
 
 
 
 
 
 
 
1720
  2,
1721
+ 24,
 
 
1722
  9,
1723
+ 4,
1724
  7,
1725
+ 17,
 
 
 
1726
  6,
1727
+ 15,
1728
  3,
1729
  2,
 
 
 
 
1730
  3,
1731
  6,
1732
+ 10,
 
 
 
 
 
1733
  7,
1734
+ 7,
1735
+ 3,
1736
+ 5,
1737
+ 27,
 
 
1738
  2,
1739
+ 16,
1740
+ 14,
1741
+ 13,
1742
+ 3,
1743
  17,
1744
+ 9,
1745
+ 19,
1746
+ 9,
1747
+ 17,
1748
+ 9,
1749
+ 3,
1750
  8,
1751
+ 13,
1752
+ 9,
 
1753
  7,
 
1754
  1,
1755
+ 7,
1756
  10,
1757
+ 40,
1758
+ 9,
1759
  3,
 
 
 
 
 
1760
  4,
1761
+ 17,
1762
  3,
 
 
 
 
 
 
 
 
 
 
1763
  9,
1764
  2,
1765
+ 14,
1766
  7,
1767
+ 11,
1768
+ 11,
1769
  3,
1770
+ 14,
 
 
 
 
 
 
 
1771
  5,
 
1772
  1,
1773
+ 21,
1774
+ 12,
1775
+ 23,
1776
+ 4,
1777
+ 19,
1778
  8,
1779
+ 21,
1780
  8,
 
1781
  1,
 
 
1782
  1,
1783
  1,
1784
+ 12,
1785
+ 47,
1786
+ 19,
1787
+ 7,
 
 
1788
  4,
 
1789
  2,
1790
+ 27,
1791
+ 15,
 
1792
  5,
1793
+ 19,
1794
+ 24,
1795
+ 26,
1796
+ 14,
1797
+ 3,
1798
+ 3,
1799
+ 5,
1800
+ 9,
1801
+ 6,
1802
  4,
1803
+ 3,
1804
+ 5,
1805
  2,
1806
  1,
1807
+ 9,
1808
+ 11,
1809
+ 9,
1810
  3,
1811
+ 31,
1812
  2,
1813
+ 15,
1814
+ 16,
1815
  3,
 
 
1816
  1,
1817
+ 17,
1818
  13,
 
1819
  5,
 
 
1820
  6,
1821
  4,
1822
+ 67,
1823
+ 40,
 
 
1824
  4,
1825
+ 12,
1826
+ 10,
1827
  21,
1828
+ 71,
1829
+ 8,
1830
+ 27,
1831
  1,
1832
+ 37,
1833
+ 3,
1834
+ 24,
1835
+ 11,
1836
  3,
1837
  1,
 
 
 
 
 
 
 
 
1838
  9,
1839
+ 7,
 
 
 
1840
  4,
 
1841
  1,
1842
+ 27,
1843
+ 25,
1844
  2,
1845
+ 44,
1846
+ 10,
 
 
1847
  8,
1848
  8,
1849
+ 11,
1850
  5,
 
 
 
 
 
 
 
 
 
 
1851
  7,
1852
+ 32,
1853
  1,
1854
+ 19,
1855
+ 10,
1856
+ 3,
1857
+ 36,
1858
+ 5,
1859
  4,
 
1860
  3,
1861
  2,
1862
+ 14,
1863
+ 30,
1864
  4,
1865
+ 22,
1866
+ 11,
1867
+ 52,
1868
+ 33,
1869
  3,
1870
+ 19,
1871
+ 1,
1872
+ 14,
1873
+ 28,
1874
+ 1,
1875
+ 6,
1876
+ 11,
1877
+ 32,
1878
+ 4,
1879
+ 22,
1880
+ 2,
1881
+ 57,
1882
+ 11,
1883
+ 38,
1884
+ 8,
1885
+ 17,
1886
+ 5,
1887
+ 10,
1888
+ 13,
1889
  2,
1890
+ 25,
1891
+ 24,
1892
  8,
1893
  1,
1894
+ 27,
1895
+ 11,
1896
  2,
1897
+ 21,
1898
  2,
1899
+ 11,
1900
+ 69,
1901
+ 1,
1902
+ 28
1903
  ],
1904
+ "seconds": 1.0889100350032095
1905
  },
1906
  {
1907
  "sigma": 0.12,
1908
  "copies": 256,
1909
+ "steps": 12,
1910
  "deviated": 256,
1911
+ "median_first_deviation": 2,
1912
+ "step_exposure": 714,
1913
+ "empirical_rate_per_step": 0.3585434173669468,
1914
+ "bound_rate_per_step": 1.2971409545186365,
1915
+ "looseness": 3.6178071934621348,
1916
  "first_deviation": [
1917
  1,
 
1918
  3,
1919
+ 2,
1920
+ 4,
1921
  1,
1922
  3,
 
1923
  2,
1924
  2,
1925
+ 7,
1926
+ 3,
1927
  2,
1928
+ 8,
1929
+ 4,
 
1930
  2,
1931
+ 2,
1932
+ 2,
1933
+ 2,
1934
+ 4,
1935
  1,
1936
+ 7,
1937
+ 4,
1938
+ 2,
1939
+ 4,
1940
+ 2,
1941
+ 4,
1942
+ 2,
1943
  2,
1944
  1,
1945
  3,
 
 
1946
  2,
1947
  2,
1948
+ 4,
1949
  1,
1950
+ 3,
1951
+ 9,
1952
+ 4,
1953
  2,
1954
+ 5,
1955
  1,
1956
+ 3,
1957
+ 8,
1958
  1,
1959
+ 4,
1960
+ 6,
1961
  1,
1962
  1,
1963
+ 4,
 
 
 
1964
  2,
 
1965
  3,
 
1966
  3,
 
1967
  3,
1968
  1,
 
 
 
 
 
 
 
 
1969
  2,
 
 
1970
  2,
1971
  1,
1972
  2,
1973
  1,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1974
  3,
1975
  1,
1976
  1,
1977
+ 2,
1978
+ 3,
1979
+ 4,
1980
+ 4,
1981
+ 2,
1982
+ 2,
1983
+ 3,
1984
+ 5,
1985
+ 2,
1986
+ 4,
1987
  1,
1988
+ 9,
1989
  1,
1990
+ 4,
1991
  1,
1992
+ 4,
1993
  1,
1994
  1,
1995
+ 3,
1996
  1,
1997
+ 4,
1998
+ 3,
1999
+ 4,
2000
+ 2,
2001
+ 6,
2002
  1,
2003
  1,
2004
+ 3,
2005
  1,
2006
  2,
2007
+ 3,
2008
  2,
2009
  1,
2010
+ 3,
2011
+ 2,
2012
+ 4,
2013
+ 2,
2014
  1,
2015
+ 2,
2016
+ 2,
2017
  3,
2018
  1,
2019
  1,
2020
+ 3,
2021
  2,
2022
+ 5,
2023
  1,
 
2024
  1,
2025
  1,
2026
+ 10,
2027
  1,
2028
  2,
2029
+ 3,
2030
+ 2,
2031
+ 2,
2032
+ 4,
2033
+ 3,
2034
  1,
2035
  1,
2036
  1,
2037
+ 2,
2038
  1,
2039
  2,
2040
+ 3,
2041
  1,
2042
+ 2,
2043
  1,
2044
+ 7,
2045
  1,
2046
  3,
2047
+ 5,
2048
+ 3,
2049
  7,
2050
+ 3,
 
 
 
 
2051
  2,
2052
  1,
2053
  1,
2054
+ 2,
2055
+ 3,
2056
+ 3,
2057
  1,
2058
+ 5,
2059
  1,
2060
+ 2,
2061
  1,
2062
  1,
2063
  1,
2064
  1,
2065
  1,
2066
+ 5,
2067
+ 6,
2068
  1,
2069
  2,
2070
+ 3,
2071
+ 3,
2072
  3,
2073
  1,
2074
  2,
2075
  1,
2076
  3,
 
 
 
2077
  1,
2078
  2,
2079
+ 3,
2080
  2,
2081
+ 7,
 
 
2082
  1,
2083
+ 4,
2084
  1,
2085
  2,
 
2086
  1,
 
 
 
 
2087
  2,
2088
  1,
2089
+ 3,
2090
  1,
2091
  1,
2092
+ 5,
2093
  2,
 
 
2094
  2,
2095
+ 6,
2096
+ 1,
2097
  2,
2098
+ 3,
2099
+ 4,
2100
  2,
2101
  1,
2102
  1,
2103
+ 5,
2104
  1,
 
 
 
 
2105
  2,
2106
+ 5,
2107
+ 12,
2108
  1,
2109
  4,
2110
+ 4,
 
2111
  1,
2112
  2,
2113
+ 3,
2114
+ 3,
2115
+ 11,
2116
+ 5,
2117
  1,
2118
  1,
2119
+ 7,
2120
  3,
2121
  1,
2122
+ 3,
2123
+ 6,
2124
+ 8,
2125
+ 4,
2126
+ 4,
2127
  1,
2128
+ 7,
2129
+ 5,
2130
+ 3,
2131
  2,
 
 
 
2132
  2,
2133
  1,
2134
+ 9,
2135
  1,
2136
+ 9,
2137
+ 8,
2138
  2,
 
2139
  2,
 
 
 
 
2140
  3,
2141
+ 2,
2142
  2,
2143
  1,
2144
  3,
2145
  1,
2146
  1,
 
2147
  1,
2148
  3,
 
 
 
 
 
 
 
2149
  2,
2150
+ 6,
2151
+ 3,
2152
  3,
 
 
 
 
2153
  4,
2154
  1,
2155
+ 2,
2156
+ 9,
2157
  3,
2158
  1,
2159
  1,
 
2160
  2,
2161
+ 3,
2162
  1,
2163
  2,
 
2164
  2,
2165
+ 3,
2166
+ 3,
2167
+ 3,
2168
  2,
 
 
 
 
2169
  3,
 
2170
  2,
2171
+ 2,
 
 
2172
  1
2173
  ],
2174
+ "seconds": 0.18059197199181654
2175
  },
2176
  {
2177
  "sigma": 0.15,
 
2181
  "median_first_deviation": 1,
2182
  "step_exposure": 256,
2183
  "empirical_rate_per_step": 1.0,
2184
+ "bound_rate_per_step": 36.01275000654335,
2185
+ "looseness": 36.01275000654335,
2186
  "first_deviation": [
2187
  1,
2188
  1,
 
2441
  1,
2442
  1
2443
  ],
2444
+ "seconds": 0.01255840400699526
2445
  },
2446
  {
2447
  "sigma": 0.2,
 
2451
  "median_first_deviation": 1,
2452
  "step_exposure": 256,
2453
  "empirical_rate_per_step": 1.0,
2454
+ "bound_rate_per_step": 521.2020494536948,
2455
+ "looseness": 521.2020494536948,
2456
  "first_deviation": [
2457
  1,
2458
  1,
 
2711
  1,
2712
  1
2713
  ],
2714
+ "seconds": 0.01062744899536483
2715
  }
2716
  ]
2717
  }
paper/runs/paper_noise_leak.json CHANGED
@@ -1,8 +1,8 @@
1
  {
2
- "M": 87080,
3
- "widest_layer": 8213,
4
  "largest_fanin": 256,
5
- "gamma_star": 6.088650754992694e-05,
6
  "steps": 10000,
7
  "rows": [
8
  {
@@ -12,88 +12,88 @@
12
  "certified_by_corollary": true,
13
  "first_deviation": null,
14
  "steps": 10000,
15
- "bytes": 1976,
16
- "seconds": 50.77686092900694
17
  },
18
  {
19
  "epsilon": 0.0,
20
- "gamma": 3.044325377496347e-05,
21
  "worst_bound": 0.25,
22
  "certified_by_corollary": true,
23
  "first_deviation": null,
24
  "steps": 10000,
25
- "bytes": 1976,
26
- "seconds": 51.80488167901058
27
  },
28
  {
29
  "epsilon": 0.0,
30
- "gamma": 5.479785679493425e-05,
31
- "worst_bound": 0.44999998807907104,
32
  "certified_by_corollary": true,
33
  "first_deviation": null,
34
  "steps": 10000,
35
- "bytes": 1976,
36
- "seconds": 51.506735645991284
37
  },
38
  {
39
  "epsilon": 0.0,
40
- "gamma": 9.132976132489041e-05,
41
  "worst_bound": 0.75,
42
  "certified_by_corollary": false,
43
  "first_deviation": null,
44
  "steps": 10000,
45
- "bytes": 1976,
46
- "seconds": 51.60916726299911
47
  },
48
  {
49
  "epsilon": 0.0,
50
- "gamma": 0.00024354603019970775,
51
  "worst_bound": 2.0,
52
  "certified_by_corollary": false,
53
  "first_deviation": null,
54
  "steps": 10000,
55
- "bytes": 1976,
56
- "seconds": 51.63666761197965
57
  },
58
  {
59
  "epsilon": 0.0,
60
- "gamma": 0.000974184120798831,
61
  "worst_bound": 8.0,
62
  "certified_by_corollary": false,
63
  "first_deviation": null,
64
  "steps": 10000,
65
- "bytes": 1976,
66
- "seconds": 51.644420611992246
67
  },
68
  {
69
  "epsilon": 0.0,
70
- "gamma": 0.003896736483195324,
71
  "worst_bound": 32.0,
72
  "certified_by_corollary": false,
73
  "first_deviation": null,
74
  "steps": 10000,
75
- "bytes": 1976,
76
- "seconds": 51.65069026101264
77
  },
78
  {
79
  "epsilon": 0.0,
80
- "gamma": 0.015586945932781296,
81
  "worst_bound": 128.0,
82
  "certified_by_corollary": false,
83
  "first_deviation": 1,
84
  "steps": 1,
85
  "bytes": 0,
86
- "seconds": 0.07025898600113578
87
  },
88
  {
89
  "epsilon": 0.0009765625,
90
- "gamma": 1.5221626887481735e-05,
91
- "worst_bound": 0.3711184859275818,
92
  "certified_by_corollary": true,
93
  "first_deviation": null,
94
  "steps": 10000,
95
- "bytes": 1976,
96
- "seconds": 51.64896143801161
97
  },
98
  {
99
  "epsilon": 0.001953125,
@@ -102,8 +102,8 @@
102
  "certified_by_corollary": false,
103
  "first_deviation": null,
104
  "steps": 10000,
105
- "bytes": 1976,
106
- "seconds": 50.9543320479861
107
  },
108
  {
109
  "epsilon": 0.00390625,
@@ -112,8 +112,8 @@
112
  "certified_by_corollary": false,
113
  "first_deviation": null,
114
  "steps": 10000,
115
- "bytes": 1976,
116
- "seconds": 50.92601372700301
117
  },
118
  {
119
  "epsilon": 0.015625,
@@ -122,8 +122,8 @@
122
  "certified_by_corollary": false,
123
  "first_deviation": null,
124
  "steps": 10000,
125
- "bytes": 1976,
126
- "seconds": 50.82796361998771
127
  },
128
  {
129
  "epsilon": 0.0625,
@@ -132,18 +132,18 @@
132
  "certified_by_corollary": false,
133
  "first_deviation": null,
134
  "steps": 10000,
135
- "bytes": 1976,
136
- "seconds": 50.988667670986615
137
  },
138
  {
139
  "epsilon": 0.25,
140
  "gamma": 0.0,
141
  "worst_bound": 64.0,
142
  "certified_by_corollary": false,
143
- "first_deviation": 4,
144
- "steps": 4,
145
  "bytes": 0,
146
- "seconds": 0.08496363298036158
147
  }
148
  ]
149
  }
 
1
  {
2
+ "M": 41967,
3
+ "widest_layer": 8210,
4
  "largest_fanin": 256,
5
+ "gamma_star": 6.090875867949811e-05,
6
  "steps": 10000,
7
  "rows": [
8
  {
 
12
  "certified_by_corollary": true,
13
  "first_deviation": null,
14
  "steps": 10000,
15
+ "bytes": 1971,
16
+ "seconds": 54.57657353000832
17
  },
18
  {
19
  "epsilon": 0.0,
20
+ "gamma": 3.0454379339749056e-05,
21
  "worst_bound": 0.25,
22
  "certified_by_corollary": true,
23
  "first_deviation": null,
24
  "steps": 10000,
25
+ "bytes": 1971,
26
+ "seconds": 55.0811748909764
27
  },
28
  {
29
  "epsilon": 0.0,
30
+ "gamma": 5.4817882811548304e-05,
31
+ "worst_bound": 0.45000001788139343,
32
  "certified_by_corollary": true,
33
  "first_deviation": null,
34
  "steps": 10000,
35
+ "bytes": 1971,
36
+ "seconds": 55.177396277023945
37
  },
38
  {
39
  "epsilon": 0.0,
40
+ "gamma": 9.136313801924717e-05,
41
  "worst_bound": 0.75,
42
  "certified_by_corollary": false,
43
  "first_deviation": null,
44
  "steps": 10000,
45
+ "bytes": 1971,
46
+ "seconds": 55.193315256008646
47
  },
48
  {
49
  "epsilon": 0.0,
50
+ "gamma": 0.00024363503471799245,
51
  "worst_bound": 2.0,
52
  "certified_by_corollary": false,
53
  "first_deviation": null,
54
  "steps": 10000,
55
+ "bytes": 1971,
56
+ "seconds": 55.23367518899613
57
  },
58
  {
59
  "epsilon": 0.0,
60
+ "gamma": 0.0009745401388719698,
61
  "worst_bound": 8.0,
62
  "certified_by_corollary": false,
63
  "first_deviation": null,
64
  "steps": 10000,
65
+ "bytes": 1971,
66
+ "seconds": 55.3521386559878
67
  },
68
  {
69
  "epsilon": 0.0,
70
+ "gamma": 0.003898160555487879,
71
  "worst_bound": 32.0,
72
  "certified_by_corollary": false,
73
  "first_deviation": null,
74
  "steps": 10000,
75
+ "bytes": 1971,
76
+ "seconds": 55.28627192400745
77
  },
78
  {
79
  "epsilon": 0.0,
80
+ "gamma": 0.015592642221951517,
81
  "worst_bound": 128.0,
82
  "certified_by_corollary": false,
83
  "first_deviation": 1,
84
  "steps": 1,
85
  "bytes": 0,
86
+ "seconds": 0.06148931500501931
87
  },
88
  {
89
  "epsilon": 0.0009765625,
90
+ "gamma": 1.5227189669874528e-05,
91
+ "worst_bound": 0.3711170554161072,
92
  "certified_by_corollary": true,
93
  "first_deviation": null,
94
  "steps": 10000,
95
+ "bytes": 1971,
96
+ "seconds": 55.26582065099501
97
  },
98
  {
99
  "epsilon": 0.001953125,
 
102
  "certified_by_corollary": false,
103
  "first_deviation": null,
104
  "steps": 10000,
105
+ "bytes": 1971,
106
+ "seconds": 54.63976289497805
107
  },
108
  {
109
  "epsilon": 0.00390625,
 
112
  "certified_by_corollary": false,
113
  "first_deviation": null,
114
  "steps": 10000,
115
+ "bytes": 1971,
116
+ "seconds": 54.65488711200305
117
  },
118
  {
119
  "epsilon": 0.015625,
 
122
  "certified_by_corollary": false,
123
  "first_deviation": null,
124
  "steps": 10000,
125
+ "bytes": 1971,
126
+ "seconds": 54.657152735977434
127
  },
128
  {
129
  "epsilon": 0.0625,
 
132
  "certified_by_corollary": false,
133
  "first_deviation": null,
134
  "steps": 10000,
135
+ "bytes": 1971,
136
+ "seconds": 54.68002699298086
137
  },
138
  {
139
  "epsilon": 0.25,
140
  "gamma": 0.0,
141
  "worst_bound": 64.0,
142
  "certified_by_corollary": false,
143
+ "first_deviation": 3,
144
+ "steps": 3,
145
  "bytes": 0,
146
+ "seconds": 0.07300862300326116
147
  }
148
  ]
149
  }
paper/runs/paper_noise_margin.json CHANGED
@@ -1,7 +1,7 @@
1
  {
2
  "states": 800,
3
- "steps": 1647743,
4
- "layers": 33,
5
  "min_margin": 0.5,
6
  "max_noninteger": 0.0
7
  }
 
1
  {
2
  "states": 800,
3
+ "steps": 1664939,
4
+ "layers": 13,
5
  "min_margin": 0.5,
6
  "max_noninteger": 0.0
7
  }
paper/runs/paper_noise_omega.json CHANGED
@@ -1,46 +1,46 @@
1
  {
2
- "M": 87080,
3
- "target_bytes": 302620,
4
  "rows": [
5
  {
6
  "sigma": 0.05,
7
- "steps": 1647743,
8
- "bytes": 302620,
9
  "complete": true,
10
  "first_wrong_byte": null,
11
  "halted": true,
12
- "seconds": 4167.061918550986,
13
- "bound": 2.1866762393136464e-12
14
  },
15
  {
16
  "sigma": 0.1,
17
- "steps": 150,
18
- "bytes": 25,
19
  "complete": false,
20
- "first_wrong_byte": 24,
21
- "halted": false,
22
- "seconds": 0.3421765539969783,
23
- "bound": 7.488485663772103
24
  },
25
  {
26
  "sigma": 0.15,
27
- "steps": 34,
28
  "bytes": 0,
29
  "complete": false,
30
  "first_wrong_byte": null,
31
  "halted": true,
32
- "seconds": 0.07603905501309782,
33
- "bound": 2540.6550194050806
34
  },
35
  {
36
  "sigma": 0.2,
37
- "steps": 7,
38
- "bytes": 1,
39
  "complete": false,
40
- "first_wrong_byte": 0,
41
- "halted": false,
42
- "seconds": 0.01561294897692278,
43
- "bound": 7570.327191960212
44
  }
45
  ]
46
  }
 
1
  {
2
+ "M": 41967,
3
+ "target_bytes": 305508,
4
  "rows": [
5
  {
6
  "sigma": 0.05,
7
+ "steps": 1664939,
8
+ "bytes": 305508,
9
  "complete": true,
10
  "first_wrong_byte": null,
11
  "halted": true,
12
+ "seconds": 7486.099872618011,
13
+ "bound": 1.0648362848609219e-12
14
  },
15
  {
16
  "sigma": 0.1,
17
+ "steps": 10517,
18
+ "bytes": 143,
19
  "complete": false,
20
+ "first_wrong_byte": null,
21
+ "halted": true,
22
+ "seconds": 29.52936617299565,
23
+ "bound": 253.03705367971799
24
  },
25
  {
26
  "sigma": 0.15,
27
+ "steps": 135,
28
  "bytes": 0,
29
  "complete": false,
30
  "first_wrong_byte": null,
31
  "halted": true,
32
+ "seconds": 0.379520524002146,
33
+ "bound": 4861.721250883352
34
  },
35
  {
36
  "sigma": 0.2,
37
+ "steps": 2,
38
+ "bytes": 0,
39
  "complete": false,
40
+ "first_wrong_byte": null,
41
+ "halted": true,
42
+ "seconds": 0.005625108984531835,
43
+ "bound": 1042.4040989073897
44
  }
45
  ]
46
  }
paper/runs/paper_noise_profile.json CHANGED
@@ -1,26 +1,32 @@
1
  {
2
  "steps": 4000,
3
- "M": 87080,
4
  "rows_per_step_at": {
5
- "-3": 168.10375,
6
- "-2": 10389.75425,
7
- "-1": 65463.14875,
8
- "0": 10553.89625,
9
- "1": 14.88025,
10
- "2": 0.0
11
  },
12
- "fraction_at_half": 0.872956419384474,
13
  "histogram_per_step": {
14
- "-8": 3.002,
15
- "-7": 24.00375,
16
- "-6": 84.43225,
17
- "-5": 168.068,
18
- "-4": 210.71075,
19
- "-3": 168.10375,
20
- "-2": 10389.75425,
21
- "-1": 65463.14875,
22
- "0": 10553.89625,
23
- "1": 14.88025
 
 
 
 
 
 
24
  },
25
  "rows": [
26
  {
@@ -28,10 +34,10 @@
28
  "measured": 0.0,
29
  "deviated": 0,
30
  "exposure": 768000,
31
- "bound_prop": 5.323542983836414e-133,
32
- "bound_profile_mean": 2.3236105108045873e-133,
33
- "bound_profile_exposure": 2.323653905708844e-133,
34
- "expected_deviations_bound": 1.7845661995843923e-127,
35
  "ratio_profile": null
36
  },
37
  {
@@ -39,10 +45,10 @@
39
  "measured": 0.0,
40
  "deviated": 0,
41
  "exposure": 768000,
42
- "bound_prop": 6.5006339829255935e-31,
43
- "bound_profile_mean": 2.8373850827318793e-31,
44
- "bound_profile_exposure": 2.8374380727030246e-31,
45
- "expected_deviations_bound": 2.179152439835923e-25,
46
  "ratio_profile": null
47
  },
48
  {
@@ -50,88 +56,88 @@
50
  "measured": 0.0,
51
  "deviated": 0,
52
  "exposure": 768000,
53
- "bound_prop": 6.844267574136667e-12,
54
- "bound_profile_mean": 2.9873736574137707e-12,
55
- "bound_profile_exposure": 2.987429448516965e-12,
56
- "expected_deviations_bound": 2.294345816461029e-06,
57
  "ratio_profile": null
58
  },
59
  {
60
  "sigma": 0.08,
61
- "measured": 1.9244618343767632e-05,
62
- "deviated": 19,
63
- "exposure": 987289,
64
- "bound_prop": 3.574221981361327e-05,
65
- "bound_profile_mean": 1.560070011467232e-05,
66
- "bound_profile_exposure": 1.5600704147529076e-05,
67
- "expected_deviations_bound": 15.402403597109833,
68
- "ratio_profile": 0.8106528209005175
69
  },
70
  {
71
  "sigma": 0.09,
72
- "measured": 0.0010471776669386244,
73
- "deviated": 249,
74
- "exposure": 237782,
75
- "bound_prop": 0.002409766400085013,
76
- "bound_profile_mean": 0.0010518105240856172,
77
- "bound_profile_exposure": 0.0010518147971911105,
78
- "expected_deviations_bound": 250.10262610569666,
79
- "ratio_profile": 1.0044282172919545
80
  },
81
  {
82
  "sigma": 0.1,
83
- "measured": 0.019863438857852266,
84
  "deviated": 256,
85
- "exposure": 12888,
86
- "bound_prop": 0.04992323775848069,
87
- "bound_profile_mean": 0.02179040543886147,
88
- "bound_profile_exposure": 0.02176146977849609,
89
- "expected_deviations_bound": 280.4618225052576,
90
- "ratio_profile": 1.0955539941611625
91
  },
92
  {
93
  "sigma": 0.11,
94
- "measured": 0.19707467282525018,
95
  "deviated": 256,
96
- "exposure": 1299,
97
- "bound_prop": 0.4773449253962522,
98
- "bound_profile_mean": 0.20835065844263062,
99
- "bound_profile_exposure": 0.20778213862872788,
100
- "expected_deviations_bound": 269.9089980787175,
101
- "ratio_profile": 1.0543320237449905
102
  },
103
  {
104
  "sigma": 0.12,
105
- "measured": 0.6754617414248021,
106
  "deviated": 256,
107
- "exposure": 379,
108
- "bound_prop": 2.6915203450206797,
109
- "bound_profile_mean": 1.174789981544855,
110
- "bound_profile_exposure": 1.167793260465363,
111
- "expected_deviations_bound": 442.5936457163726,
112
- "ratio_profile": 1.7288814285795804
113
  },
114
  {
115
  "sigma": 0.15,
116
  "measured": 1.0,
117
  "deviated": 256,
118
  "exposure": 256,
119
- "bound_prop": 74.72514762956119,
120
- "bound_profile_mean": 32.61589865633898,
121
- "bound_profile_exposure": 32.3936260960281,
122
- "expected_deviations_bound": 8292.768280583194,
123
- "ratio_profile": 32.3936260960281
124
  },
125
  {
126
  "sigma": 0.2,
127
  "measured": 1.0,
128
  "deviated": 256,
129
  "exposure": 256,
130
- "bound_prop": 1081.475313137173,
131
- "bound_profile_mean": 472.04040850479646,
132
- "bound_profile_exposure": 468.82352243112115,
133
- "expected_deviations_bound": 120018.82174236701,
134
- "ratio_profile": 468.82352243112115
135
  }
136
  ]
137
  }
 
1
  {
2
  "steps": 4000,
3
+ "M": 41967,
4
  "rows_per_step_at": {
5
+ "-3": 175.93775,
6
+ "-2": 10395.665,
7
+ "-1": 26825.1435,
8
+ "0": 4065.61925,
9
+ "1": 4.18475,
10
+ "2": 0.766
11
  },
12
+ "fraction_at_half": 0.736072694021493,
13
  "histogram_per_step": {
14
+ "-8": 3.79425,
15
+ "-7": 25.197,
16
+ "-6": 86.14875,
17
+ "-5": 170.611,
18
+ "-4": 213.70375,
19
+ "-3": 175.93775,
20
+ "-2": 10395.665,
21
+ "-1": 26825.1435,
22
+ "0": 4065.61925,
23
+ "1": 4.18475,
24
+ "2": 0.766,
25
+ "3": 0.146,
26
+ "4": 0.06075,
27
+ "5": 0.017,
28
+ "6": 0.0035,
29
+ "7": 0.00175
30
  },
31
  "rows": [
32
  {
 
34
  "measured": 0.0,
35
  "deviated": 0,
36
  "exposure": 768000,
37
+ "bound_prop": 2.5656078135354018e-133,
38
+ "bound_profile_mean": 9.442369275557977e-134,
39
+ "bound_profile_exposure": 9.442771918931676e-134,
40
+ "expected_deviations_bound": 7.252048833739527e-128,
41
  "ratio_profile": null
42
  },
43
  {
 
45
  "measured": 0.0,
46
  "deviated": 0,
47
  "exposure": 768000,
48
+ "bound_prop": 3.132890518620101e-31,
49
+ "bound_profile_mean": 1.1530175820575453e-31,
50
+ "bound_profile_exposure": 1.1530667492607755e-31,
51
+ "expected_deviations_bound": 8.855552634322756e-26,
52
  "ratio_profile": null
53
  },
54
  {
 
56
  "measured": 0.0,
57
  "deviated": 0,
58
  "exposure": 768000,
59
+ "bound_prop": 3.298499968807918e-12,
60
+ "bound_profile_mean": 1.2139678791351146e-12,
61
+ "bound_profile_exposure": 1.2140196453929234e-12,
62
+ "expected_deviations_bound": 9.323670876617651e-07,
63
  "ratio_profile": null
64
  },
65
  {
66
  "sigma": 0.08,
67
+ "measured": 6.938139547791888e-06,
68
+ "deviated": 7,
69
+ "exposure": 1008916,
70
+ "bound_prop": 1.7225467833232754e-05,
71
+ "bound_profile_mean": 6.3395982568941024e-06,
72
+ "bound_profile_exposure": 6.339601579706114e-06,
73
+ "expected_deviations_bound": 6.396125467390774,
74
+ "ratio_profile": 0.9137322096272533
75
  },
76
  {
77
  "sigma": 0.09,
78
+ "measured": 0.0004071505308073876,
79
+ "deviated": 202,
80
+ "exposure": 496131,
81
+ "bound_prop": 0.001161353542861366,
82
+ "bound_profile_mean": 0.0004274203155026871,
83
+ "bound_profile_exposure": 0.00042742506695134133,
84
+ "expected_deviations_bound": 212.05882589163593,
85
+ "ratio_profile": 1.0497961677803758
86
  },
87
  {
88
  "sigma": 0.1,
89
+ "measured": 0.00871222433977675,
90
  "deviated": 256,
91
+ "exposure": 29384,
92
+ "bound_prop": 0.024059813034108396,
93
+ "bound_profile_mean": 0.008854885698834775,
94
+ "bound_profile_exposure": 0.008846609711240041,
95
+ "expected_deviations_bound": 259.94877975507734,
96
+ "ratio_profile": 1.0154249209182709
97
  },
98
  {
99
  "sigma": 0.11,
100
+ "measured": 0.07699248120300752,
101
  "deviated": 256,
102
+ "exposure": 3325,
103
+ "bound_prop": 0.2300497758854446,
104
+ "bound_profile_mean": 0.08466667914751995,
105
+ "bound_profile_exposure": 0.08417590851485214,
106
+ "expected_deviations_bound": 279.8848958118834,
107
+ "ratio_profile": 1.0933003742651695
108
  },
109
  {
110
  "sigma": 0.12,
111
+ "measured": 0.3585434173669468,
112
  "deviated": 256,
113
+ "exposure": 714,
114
+ "bound_prop": 1.2971409545186365,
115
+ "bound_profile_mean": 0.47739501845907056,
116
+ "bound_profile_exposure": 0.473077066189727,
117
+ "expected_deviations_bound": 337.77702525946506,
118
+ "ratio_profile": 1.3194415049197854
119
  },
120
  {
121
  "sigma": 0.15,
122
  "measured": 1.0,
123
  "deviated": 256,
124
  "exposure": 256,
125
+ "bound_prop": 36.01275000654335,
126
+ "bound_profile_mean": 13.25400095821945,
127
+ "bound_profile_exposure": 13.037856344852248,
128
+ "expected_deviations_bound": 3337.6912242821754,
129
+ "ratio_profile": 13.037856344852248
130
  },
131
  {
132
  "sigma": 0.2,
133
  "measured": 1.0,
134
  "deviated": 256,
135
  "exposure": 256,
136
+ "bound_prop": 521.2020494536948,
137
+ "bound_profile_mean": 191.821298335784,
138
+ "bound_profile_exposure": 188.69310025470807,
139
+ "expected_deviations_bound": 48305.433665205266,
140
+ "ratio_profile": 188.69310025470807
141
  }
142
  ]
143
  }
paper/runs/paper_redundant_curve_r3.json ADDED
@@ -0,0 +1,2718 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "r": 3,
3
+ "M": 125901,
4
+ "grid": [
5
+ 0.06,
6
+ 0.12,
7
+ 0.18,
8
+ 0.24,
9
+ 0.27,
10
+ 0.3,
11
+ 0.33,
12
+ 0.36,
13
+ 0.45,
14
+ 0.6
15
+ ],
16
+ "rows": [
17
+ {
18
+ "sigma": 0.06,
19
+ "copies": 256,
20
+ "steps": 3000,
21
+ "deviated": 0,
22
+ "median_first_deviation": null,
23
+ "step_exposure": 768000,
24
+ "empirical_rate_per_step": 0.0,
25
+ "bound_tail_per_step": 7.696823440605238e-133,
26
+ "bound_profile_per_step": 2.832710782667393e-133,
27
+ "first_deviation": [
28
+ null,
29
+ null,
30
+ null,
31
+ null,
32
+ null,
33
+ null,
34
+ null,
35
+ null,
36
+ null,
37
+ null,
38
+ null,
39
+ null,
40
+ null,
41
+ null,
42
+ null,
43
+ null,
44
+ null,
45
+ null,
46
+ null,
47
+ null,
48
+ null,
49
+ null,
50
+ null,
51
+ null,
52
+ null,
53
+ null,
54
+ null,
55
+ null,
56
+ null,
57
+ null,
58
+ null,
59
+ null,
60
+ null,
61
+ null,
62
+ null,
63
+ null,
64
+ null,
65
+ null,
66
+ null,
67
+ null,
68
+ null,
69
+ null,
70
+ null,
71
+ null,
72
+ null,
73
+ null,
74
+ null,
75
+ null,
76
+ null,
77
+ null,
78
+ null,
79
+ null,
80
+ null,
81
+ null,
82
+ null,
83
+ null,
84
+ null,
85
+ null,
86
+ null,
87
+ null,
88
+ null,
89
+ null,
90
+ null,
91
+ null,
92
+ null,
93
+ null,
94
+ null,
95
+ null,
96
+ null,
97
+ null,
98
+ null,
99
+ null,
100
+ null,
101
+ null,
102
+ null,
103
+ null,
104
+ null,
105
+ null,
106
+ null,
107
+ null,
108
+ null,
109
+ null,
110
+ null,
111
+ null,
112
+ null,
113
+ null,
114
+ null,
115
+ null,
116
+ null,
117
+ null,
118
+ null,
119
+ null,
120
+ null,
121
+ null,
122
+ null,
123
+ null,
124
+ null,
125
+ null,
126
+ null,
127
+ null,
128
+ null,
129
+ null,
130
+ null,
131
+ null,
132
+ null,
133
+ null,
134
+ null,
135
+ null,
136
+ null,
137
+ null,
138
+ null,
139
+ null,
140
+ null,
141
+ null,
142
+ null,
143
+ null,
144
+ null,
145
+ null,
146
+ null,
147
+ null,
148
+ null,
149
+ null,
150
+ null,
151
+ null,
152
+ null,
153
+ null,
154
+ null,
155
+ null,
156
+ null,
157
+ null,
158
+ null,
159
+ null,
160
+ null,
161
+ null,
162
+ null,
163
+ null,
164
+ null,
165
+ null,
166
+ null,
167
+ null,
168
+ null,
169
+ null,
170
+ null,
171
+ null,
172
+ null,
173
+ null,
174
+ null,
175
+ null,
176
+ null,
177
+ null,
178
+ null,
179
+ null,
180
+ null,
181
+ null,
182
+ null,
183
+ null,
184
+ null,
185
+ null,
186
+ null,
187
+ null,
188
+ null,
189
+ null,
190
+ null,
191
+ null,
192
+ null,
193
+ null,
194
+ null,
195
+ null,
196
+ null,
197
+ null,
198
+ null,
199
+ null,
200
+ null,
201
+ null,
202
+ null,
203
+ null,
204
+ null,
205
+ null,
206
+ null,
207
+ null,
208
+ null,
209
+ null,
210
+ null,
211
+ null,
212
+ null,
213
+ null,
214
+ null,
215
+ null,
216
+ null,
217
+ null,
218
+ null,
219
+ null,
220
+ null,
221
+ null,
222
+ null,
223
+ null,
224
+ null,
225
+ null,
226
+ null,
227
+ null,
228
+ null,
229
+ null,
230
+ null,
231
+ null,
232
+ null,
233
+ null,
234
+ null,
235
+ null,
236
+ null,
237
+ null,
238
+ null,
239
+ null,
240
+ null,
241
+ null,
242
+ null,
243
+ null,
244
+ null,
245
+ null,
246
+ null,
247
+ null,
248
+ null,
249
+ null,
250
+ null,
251
+ null,
252
+ null,
253
+ null,
254
+ null,
255
+ null,
256
+ null,
257
+ null,
258
+ null,
259
+ null,
260
+ null,
261
+ null,
262
+ null,
263
+ null,
264
+ null,
265
+ null,
266
+ null,
267
+ null,
268
+ null,
269
+ null,
270
+ null,
271
+ null,
272
+ null,
273
+ null,
274
+ null,
275
+ null,
276
+ null,
277
+ null,
278
+ null,
279
+ null,
280
+ null,
281
+ null,
282
+ null,
283
+ null
284
+ ],
285
+ "seconds": 144.019176983973
286
+ },
287
+ {
288
+ "sigma": 0.12,
289
+ "copies": 256,
290
+ "steps": 3000,
291
+ "deviated": 0,
292
+ "median_first_deviation": null,
293
+ "step_exposure": 768000,
294
+ "empirical_rate_per_step": 0.0,
295
+ "bound_tail_per_step": 9.398671555860006e-31,
296
+ "bound_profile_per_step": 3.459052746172635e-31,
297
+ "first_deviation": [
298
+ null,
299
+ null,
300
+ null,
301
+ null,
302
+ null,
303
+ null,
304
+ null,
305
+ null,
306
+ null,
307
+ null,
308
+ null,
309
+ null,
310
+ null,
311
+ null,
312
+ null,
313
+ null,
314
+ null,
315
+ null,
316
+ null,
317
+ null,
318
+ null,
319
+ null,
320
+ null,
321
+ null,
322
+ null,
323
+ null,
324
+ null,
325
+ null,
326
+ null,
327
+ null,
328
+ null,
329
+ null,
330
+ null,
331
+ null,
332
+ null,
333
+ null,
334
+ null,
335
+ null,
336
+ null,
337
+ null,
338
+ null,
339
+ null,
340
+ null,
341
+ null,
342
+ null,
343
+ null,
344
+ null,
345
+ null,
346
+ null,
347
+ null,
348
+ null,
349
+ null,
350
+ null,
351
+ null,
352
+ null,
353
+ null,
354
+ null,
355
+ null,
356
+ null,
357
+ null,
358
+ null,
359
+ null,
360
+ null,
361
+ null,
362
+ null,
363
+ null,
364
+ null,
365
+ null,
366
+ null,
367
+ null,
368
+ null,
369
+ null,
370
+ null,
371
+ null,
372
+ null,
373
+ null,
374
+ null,
375
+ null,
376
+ null,
377
+ null,
378
+ null,
379
+ null,
380
+ null,
381
+ null,
382
+ null,
383
+ null,
384
+ null,
385
+ null,
386
+ null,
387
+ null,
388
+ null,
389
+ null,
390
+ null,
391
+ null,
392
+ null,
393
+ null,
394
+ null,
395
+ null,
396
+ null,
397
+ null,
398
+ null,
399
+ null,
400
+ null,
401
+ null,
402
+ null,
403
+ null,
404
+ null,
405
+ null,
406
+ null,
407
+ null,
408
+ null,
409
+ null,
410
+ null,
411
+ null,
412
+ null,
413
+ null,
414
+ null,
415
+ null,
416
+ null,
417
+ null,
418
+ null,
419
+ null,
420
+ null,
421
+ null,
422
+ null,
423
+ null,
424
+ null,
425
+ null,
426
+ null,
427
+ null,
428
+ null,
429
+ null,
430
+ null,
431
+ null,
432
+ null,
433
+ null,
434
+ null,
435
+ null,
436
+ null,
437
+ null,
438
+ null,
439
+ null,
440
+ null,
441
+ null,
442
+ null,
443
+ null,
444
+ null,
445
+ null,
446
+ null,
447
+ null,
448
+ null,
449
+ null,
450
+ null,
451
+ null,
452
+ null,
453
+ null,
454
+ null,
455
+ null,
456
+ null,
457
+ null,
458
+ null,
459
+ null,
460
+ null,
461
+ null,
462
+ null,
463
+ null,
464
+ null,
465
+ null,
466
+ null,
467
+ null,
468
+ null,
469
+ null,
470
+ null,
471
+ null,
472
+ null,
473
+ null,
474
+ null,
475
+ null,
476
+ null,
477
+ null,
478
+ null,
479
+ null,
480
+ null,
481
+ null,
482
+ null,
483
+ null,
484
+ null,
485
+ null,
486
+ null,
487
+ null,
488
+ null,
489
+ null,
490
+ null,
491
+ null,
492
+ null,
493
+ null,
494
+ null,
495
+ null,
496
+ null,
497
+ null,
498
+ null,
499
+ null,
500
+ null,
501
+ null,
502
+ null,
503
+ null,
504
+ null,
505
+ null,
506
+ null,
507
+ null,
508
+ null,
509
+ null,
510
+ null,
511
+ null,
512
+ null,
513
+ null,
514
+ null,
515
+ null,
516
+ null,
517
+ null,
518
+ null,
519
+ null,
520
+ null,
521
+ null,
522
+ null,
523
+ null,
524
+ null,
525
+ null,
526
+ null,
527
+ null,
528
+ null,
529
+ null,
530
+ null,
531
+ null,
532
+ null,
533
+ null,
534
+ null,
535
+ null,
536
+ null,
537
+ null,
538
+ null,
539
+ null,
540
+ null,
541
+ null,
542
+ null,
543
+ null,
544
+ null,
545
+ null,
546
+ null,
547
+ null,
548
+ null,
549
+ null,
550
+ null,
551
+ null,
552
+ null,
553
+ null
554
+ ],
555
+ "seconds": 155.27243064899812
556
+ },
557
+ {
558
+ "sigma": 0.18,
559
+ "copies": 256,
560
+ "steps": 3000,
561
+ "deviated": 0,
562
+ "median_first_deviation": null,
563
+ "step_exposure": 768000,
564
+ "empirical_rate_per_step": 0.0,
565
+ "bound_tail_per_step": 9.895499906423648e-12,
566
+ "bound_profile_per_step": 3.641903637405343e-12,
567
+ "first_deviation": [
568
+ null,
569
+ null,
570
+ null,
571
+ null,
572
+ null,
573
+ null,
574
+ null,
575
+ null,
576
+ null,
577
+ null,
578
+ null,
579
+ null,
580
+ null,
581
+ null,
582
+ null,
583
+ null,
584
+ null,
585
+ null,
586
+ null,
587
+ null,
588
+ null,
589
+ null,
590
+ null,
591
+ null,
592
+ null,
593
+ null,
594
+ null,
595
+ null,
596
+ null,
597
+ null,
598
+ null,
599
+ null,
600
+ null,
601
+ null,
602
+ null,
603
+ null,
604
+ null,
605
+ null,
606
+ null,
607
+ null,
608
+ null,
609
+ null,
610
+ null,
611
+ null,
612
+ null,
613
+ null,
614
+ null,
615
+ null,
616
+ null,
617
+ null,
618
+ null,
619
+ null,
620
+ null,
621
+ null,
622
+ null,
623
+ null,
624
+ null,
625
+ null,
626
+ null,
627
+ null,
628
+ null,
629
+ null,
630
+ null,
631
+ null,
632
+ null,
633
+ null,
634
+ null,
635
+ null,
636
+ null,
637
+ null,
638
+ null,
639
+ null,
640
+ null,
641
+ null,
642
+ null,
643
+ null,
644
+ null,
645
+ null,
646
+ null,
647
+ null,
648
+ null,
649
+ null,
650
+ null,
651
+ null,
652
+ null,
653
+ null,
654
+ null,
655
+ null,
656
+ null,
657
+ null,
658
+ null,
659
+ null,
660
+ null,
661
+ null,
662
+ null,
663
+ null,
664
+ null,
665
+ null,
666
+ null,
667
+ null,
668
+ null,
669
+ null,
670
+ null,
671
+ null,
672
+ null,
673
+ null,
674
+ null,
675
+ null,
676
+ null,
677
+ null,
678
+ null,
679
+ null,
680
+ null,
681
+ null,
682
+ null,
683
+ null,
684
+ null,
685
+ null,
686
+ null,
687
+ null,
688
+ null,
689
+ null,
690
+ null,
691
+ null,
692
+ null,
693
+ null,
694
+ null,
695
+ null,
696
+ null,
697
+ null,
698
+ null,
699
+ null,
700
+ null,
701
+ null,
702
+ null,
703
+ null,
704
+ null,
705
+ null,
706
+ null,
707
+ null,
708
+ null,
709
+ null,
710
+ null,
711
+ null,
712
+ null,
713
+ null,
714
+ null,
715
+ null,
716
+ null,
717
+ null,
718
+ null,
719
+ null,
720
+ null,
721
+ null,
722
+ null,
723
+ null,
724
+ null,
725
+ null,
726
+ null,
727
+ null,
728
+ null,
729
+ null,
730
+ null,
731
+ null,
732
+ null,
733
+ null,
734
+ null,
735
+ null,
736
+ null,
737
+ null,
738
+ null,
739
+ null,
740
+ null,
741
+ null,
742
+ null,
743
+ null,
744
+ null,
745
+ null,
746
+ null,
747
+ null,
748
+ null,
749
+ null,
750
+ null,
751
+ null,
752
+ null,
753
+ null,
754
+ null,
755
+ null,
756
+ null,
757
+ null,
758
+ null,
759
+ null,
760
+ null,
761
+ null,
762
+ null,
763
+ null,
764
+ null,
765
+ null,
766
+ null,
767
+ null,
768
+ null,
769
+ null,
770
+ null,
771
+ null,
772
+ null,
773
+ null,
774
+ null,
775
+ null,
776
+ null,
777
+ null,
778
+ null,
779
+ null,
780
+ null,
781
+ null,
782
+ null,
783
+ null,
784
+ null,
785
+ null,
786
+ null,
787
+ null,
788
+ null,
789
+ null,
790
+ null,
791
+ null,
792
+ null,
793
+ null,
794
+ null,
795
+ null,
796
+ null,
797
+ null,
798
+ null,
799
+ null,
800
+ null,
801
+ null,
802
+ null,
803
+ null,
804
+ null,
805
+ null,
806
+ null,
807
+ null,
808
+ null,
809
+ null,
810
+ null,
811
+ null,
812
+ null,
813
+ null,
814
+ null,
815
+ null,
816
+ null,
817
+ null,
818
+ null,
819
+ null,
820
+ null,
821
+ null,
822
+ null,
823
+ null
824
+ ],
825
+ "seconds": 158.37904969102237
826
+ },
827
+ {
828
+ "sigma": 0.24,
829
+ "copies": 256,
830
+ "steps": 4000,
831
+ "deviated": 1,
832
+ "median_first_deviation": 1851,
833
+ "step_exposure": 1021851,
834
+ "empirical_rate_per_step": 9.78616256186078e-07,
835
+ "bound_tail_per_step": 5.167640349969784e-05,
836
+ "bound_profile_per_step": 1.9018794770682304e-05,
837
+ "first_deviation": [
838
+ null,
839
+ null,
840
+ null,
841
+ null,
842
+ null,
843
+ null,
844
+ null,
845
+ null,
846
+ null,
847
+ null,
848
+ null,
849
+ null,
850
+ null,
851
+ null,
852
+ null,
853
+ null,
854
+ null,
855
+ null,
856
+ null,
857
+ null,
858
+ null,
859
+ null,
860
+ null,
861
+ null,
862
+ null,
863
+ null,
864
+ null,
865
+ null,
866
+ null,
867
+ null,
868
+ null,
869
+ null,
870
+ null,
871
+ null,
872
+ null,
873
+ null,
874
+ null,
875
+ null,
876
+ null,
877
+ null,
878
+ null,
879
+ null,
880
+ null,
881
+ null,
882
+ null,
883
+ null,
884
+ null,
885
+ null,
886
+ null,
887
+ null,
888
+ null,
889
+ null,
890
+ null,
891
+ null,
892
+ null,
893
+ null,
894
+ null,
895
+ null,
896
+ null,
897
+ null,
898
+ null,
899
+ null,
900
+ null,
901
+ null,
902
+ null,
903
+ null,
904
+ null,
905
+ null,
906
+ null,
907
+ null,
908
+ null,
909
+ null,
910
+ null,
911
+ null,
912
+ null,
913
+ null,
914
+ null,
915
+ null,
916
+ null,
917
+ null,
918
+ null,
919
+ null,
920
+ null,
921
+ null,
922
+ null,
923
+ null,
924
+ null,
925
+ null,
926
+ null,
927
+ null,
928
+ null,
929
+ null,
930
+ null,
931
+ null,
932
+ null,
933
+ null,
934
+ null,
935
+ null,
936
+ null,
937
+ null,
938
+ null,
939
+ null,
940
+ null,
941
+ null,
942
+ null,
943
+ null,
944
+ null,
945
+ null,
946
+ null,
947
+ null,
948
+ null,
949
+ null,
950
+ null,
951
+ null,
952
+ null,
953
+ null,
954
+ null,
955
+ null,
956
+ null,
957
+ null,
958
+ null,
959
+ null,
960
+ null,
961
+ null,
962
+ null,
963
+ null,
964
+ null,
965
+ null,
966
+ null,
967
+ null,
968
+ null,
969
+ null,
970
+ null,
971
+ null,
972
+ null,
973
+ null,
974
+ null,
975
+ null,
976
+ null,
977
+ null,
978
+ null,
979
+ null,
980
+ null,
981
+ null,
982
+ null,
983
+ null,
984
+ null,
985
+ null,
986
+ null,
987
+ null,
988
+ null,
989
+ null,
990
+ null,
991
+ null,
992
+ null,
993
+ null,
994
+ null,
995
+ null,
996
+ null,
997
+ null,
998
+ null,
999
+ null,
1000
+ null,
1001
+ null,
1002
+ null,
1003
+ null,
1004
+ null,
1005
+ null,
1006
+ null,
1007
+ null,
1008
+ null,
1009
+ null,
1010
+ null,
1011
+ null,
1012
+ null,
1013
+ null,
1014
+ null,
1015
+ null,
1016
+ null,
1017
+ null,
1018
+ null,
1019
+ null,
1020
+ null,
1021
+ null,
1022
+ null,
1023
+ null,
1024
+ null,
1025
+ null,
1026
+ null,
1027
+ null,
1028
+ null,
1029
+ null,
1030
+ null,
1031
+ null,
1032
+ null,
1033
+ null,
1034
+ null,
1035
+ null,
1036
+ null,
1037
+ null,
1038
+ null,
1039
+ null,
1040
+ null,
1041
+ null,
1042
+ null,
1043
+ null,
1044
+ null,
1045
+ null,
1046
+ null,
1047
+ null,
1048
+ null,
1049
+ null,
1050
+ null,
1051
+ null,
1052
+ null,
1053
+ null,
1054
+ null,
1055
+ null,
1056
+ null,
1057
+ null,
1058
+ null,
1059
+ null,
1060
+ null,
1061
+ null,
1062
+ null,
1063
+ null,
1064
+ null,
1065
+ null,
1066
+ null,
1067
+ null,
1068
+ null,
1069
+ null,
1070
+ null,
1071
+ null,
1072
+ null,
1073
+ null,
1074
+ null,
1075
+ null,
1076
+ null,
1077
+ null,
1078
+ null,
1079
+ null,
1080
+ null,
1081
+ null,
1082
+ null,
1083
+ null,
1084
+ null,
1085
+ null,
1086
+ null,
1087
+ null,
1088
+ null,
1089
+ null,
1090
+ null,
1091
+ null,
1092
+ 1851,
1093
+ null
1094
+ ],
1095
+ "seconds": 262.654028888006
1096
+ },
1097
+ {
1098
+ "sigma": 0.27,
1099
+ "copies": 256,
1100
+ "steps": 4000,
1101
+ "deviated": 74,
1102
+ "median_first_deviation": 1898,
1103
+ "step_exposure": 873260,
1104
+ "empirical_rate_per_step": 8.473993999496142e-05,
1105
+ "bound_tail_per_step": 0.00348406062858411,
1106
+ "bound_profile_per_step": 0.001282260946508061,
1107
+ "first_deviation": [
1108
+ 70,
1109
+ null,
1110
+ 1802,
1111
+ null,
1112
+ null,
1113
+ 3441,
1114
+ null,
1115
+ 289,
1116
+ null,
1117
+ null,
1118
+ null,
1119
+ 1889,
1120
+ 2319,
1121
+ null,
1122
+ null,
1123
+ 1105,
1124
+ null,
1125
+ null,
1126
+ 1878,
1127
+ null,
1128
+ null,
1129
+ 2517,
1130
+ null,
1131
+ null,
1132
+ 759,
1133
+ null,
1134
+ 3686,
1135
+ null,
1136
+ null,
1137
+ 182,
1138
+ null,
1139
+ 3679,
1140
+ 1821,
1141
+ null,
1142
+ 377,
1143
+ null,
1144
+ null,
1145
+ null,
1146
+ null,
1147
+ null,
1148
+ null,
1149
+ null,
1150
+ null,
1151
+ null,
1152
+ null,
1153
+ null,
1154
+ null,
1155
+ null,
1156
+ 497,
1157
+ null,
1158
+ 1863,
1159
+ null,
1160
+ 284,
1161
+ 3923,
1162
+ null,
1163
+ null,
1164
+ null,
1165
+ 3319,
1166
+ null,
1167
+ 3018,
1168
+ 2373,
1169
+ null,
1170
+ null,
1171
+ null,
1172
+ null,
1173
+ null,
1174
+ null,
1175
+ null,
1176
+ null,
1177
+ 3153,
1178
+ null,
1179
+ null,
1180
+ null,
1181
+ null,
1182
+ null,
1183
+ 3363,
1184
+ 3659,
1185
+ null,
1186
+ null,
1187
+ null,
1188
+ 212,
1189
+ null,
1190
+ 1898,
1191
+ null,
1192
+ 2629,
1193
+ 779,
1194
+ null,
1195
+ null,
1196
+ null,
1197
+ null,
1198
+ null,
1199
+ 3865,
1200
+ null,
1201
+ null,
1202
+ null,
1203
+ null,
1204
+ 1339,
1205
+ null,
1206
+ null,
1207
+ null,
1208
+ null,
1209
+ null,
1210
+ null,
1211
+ 391,
1212
+ null,
1213
+ null,
1214
+ null,
1215
+ null,
1216
+ null,
1217
+ 3229,
1218
+ null,
1219
+ null,
1220
+ null,
1221
+ null,
1222
+ 3506,
1223
+ null,
1224
+ null,
1225
+ null,
1226
+ null,
1227
+ 1705,
1228
+ null,
1229
+ null,
1230
+ 932,
1231
+ null,
1232
+ 2863,
1233
+ null,
1234
+ null,
1235
+ null,
1236
+ 875,
1237
+ 3474,
1238
+ 2794,
1239
+ null,
1240
+ null,
1241
+ null,
1242
+ null,
1243
+ null,
1244
+ null,
1245
+ null,
1246
+ null,
1247
+ null,
1248
+ null,
1249
+ null,
1250
+ null,
1251
+ null,
1252
+ null,
1253
+ null,
1254
+ null,
1255
+ null,
1256
+ null,
1257
+ null,
1258
+ null,
1259
+ null,
1260
+ null,
1261
+ null,
1262
+ null,
1263
+ 1074,
1264
+ null,
1265
+ 3106,
1266
+ null,
1267
+ null,
1268
+ null,
1269
+ 1970,
1270
+ null,
1271
+ 2405,
1272
+ null,
1273
+ null,
1274
+ 94,
1275
+ null,
1276
+ null,
1277
+ 717,
1278
+ 1474,
1279
+ 2855,
1280
+ null,
1281
+ null,
1282
+ null,
1283
+ null,
1284
+ 347,
1285
+ null,
1286
+ null,
1287
+ 3925,
1288
+ 609,
1289
+ 2345,
1290
+ null,
1291
+ null,
1292
+ 2188,
1293
+ null,
1294
+ null,
1295
+ null,
1296
+ null,
1297
+ null,
1298
+ 235,
1299
+ null,
1300
+ null,
1301
+ null,
1302
+ 499,
1303
+ null,
1304
+ 2692,
1305
+ null,
1306
+ null,
1307
+ null,
1308
+ 2130,
1309
+ null,
1310
+ null,
1311
+ 3458,
1312
+ null,
1313
+ null,
1314
+ 663,
1315
+ null,
1316
+ null,
1317
+ null,
1318
+ 1873,
1319
+ null,
1320
+ null,
1321
+ null,
1322
+ 2444,
1323
+ null,
1324
+ 1251,
1325
+ null,
1326
+ 2023,
1327
+ 2196,
1328
+ null,
1329
+ null,
1330
+ null,
1331
+ null,
1332
+ null,
1333
+ 468,
1334
+ null,
1335
+ 3835,
1336
+ null,
1337
+ null,
1338
+ null,
1339
+ null,
1340
+ null,
1341
+ 1096,
1342
+ 1318,
1343
+ null,
1344
+ 3281,
1345
+ null,
1346
+ null,
1347
+ 971,
1348
+ null,
1349
+ null,
1350
+ null,
1351
+ 3703,
1352
+ 1487,
1353
+ null,
1354
+ 1248,
1355
+ null,
1356
+ null,
1357
+ null,
1358
+ null,
1359
+ null,
1360
+ null,
1361
+ null,
1362
+ 3523,
1363
+ null
1364
+ ],
1365
+ "seconds": 229.52103876898764
1366
+ },
1367
+ {
1368
+ "sigma": 0.3,
1369
+ "copies": 256,
1370
+ "steps": 2154,
1371
+ "deviated": 256,
1372
+ "median_first_deviation": 271,
1373
+ "step_exposure": 103937,
1374
+ "empirical_rate_per_step": 0.002463030489623522,
1375
+ "bound_tail_per_step": 0.07217943910232472,
1376
+ "bound_profile_per_step": 0.026564657096504313,
1377
+ "first_deviation": [
1378
+ 693,
1379
+ 336,
1380
+ 407,
1381
+ 289,
1382
+ 91,
1383
+ 99,
1384
+ 147,
1385
+ 65,
1386
+ 38,
1387
+ 323,
1388
+ 205,
1389
+ 256,
1390
+ 255,
1391
+ 109,
1392
+ 901,
1393
+ 855,
1394
+ 1042,
1395
+ 145,
1396
+ 48,
1397
+ 426,
1398
+ 177,
1399
+ 577,
1400
+ 206,
1401
+ 713,
1402
+ 796,
1403
+ 153,
1404
+ 526,
1405
+ 256,
1406
+ 1840,
1407
+ 289,
1408
+ 145,
1409
+ 240,
1410
+ 1137,
1411
+ 205,
1412
+ 91,
1413
+ 580,
1414
+ 33,
1415
+ 419,
1416
+ 1063,
1417
+ 136,
1418
+ 763,
1419
+ 567,
1420
+ 43,
1421
+ 285,
1422
+ 37,
1423
+ 292,
1424
+ 103,
1425
+ 202,
1426
+ 221,
1427
+ 255,
1428
+ 335,
1429
+ 22,
1430
+ 502,
1431
+ 208,
1432
+ 399,
1433
+ 145,
1434
+ 165,
1435
+ 1168,
1436
+ 258,
1437
+ 735,
1438
+ 703,
1439
+ 402,
1440
+ 515,
1441
+ 298,
1442
+ 494,
1443
+ 77,
1444
+ 269,
1445
+ 533,
1446
+ 729,
1447
+ 86,
1448
+ 548,
1449
+ 432,
1450
+ 468,
1451
+ 2,
1452
+ 680,
1453
+ 920,
1454
+ 228,
1455
+ 13,
1456
+ 219,
1457
+ 1239,
1458
+ 357,
1459
+ 271,
1460
+ 320,
1461
+ 1149,
1462
+ 83,
1463
+ 56,
1464
+ 36,
1465
+ 70,
1466
+ 155,
1467
+ 387,
1468
+ 194,
1469
+ 252,
1470
+ 876,
1471
+ 43,
1472
+ 57,
1473
+ 468,
1474
+ 176,
1475
+ 131,
1476
+ 29,
1477
+ 297,
1478
+ 340,
1479
+ 25,
1480
+ 109,
1481
+ 251,
1482
+ 149,
1483
+ 264,
1484
+ 908,
1485
+ 317,
1486
+ 95,
1487
+ 245,
1488
+ 975,
1489
+ 32,
1490
+ 41,
1491
+ 80,
1492
+ 443,
1493
+ 1178,
1494
+ 159,
1495
+ 235,
1496
+ 1846,
1497
+ 812,
1498
+ 229,
1499
+ 1218,
1500
+ 288,
1501
+ 558,
1502
+ 47,
1503
+ 1662,
1504
+ 772,
1505
+ 242,
1506
+ 104,
1507
+ 191,
1508
+ 717,
1509
+ 220,
1510
+ 708,
1511
+ 891,
1512
+ 959,
1513
+ 256,
1514
+ 77,
1515
+ 1155,
1516
+ 52,
1517
+ 348,
1518
+ 402,
1519
+ 181,
1520
+ 316,
1521
+ 117,
1522
+ 169,
1523
+ 555,
1524
+ 232,
1525
+ 460,
1526
+ 91,
1527
+ 303,
1528
+ 16,
1529
+ 272,
1530
+ 479,
1531
+ 238,
1532
+ 1501,
1533
+ 237,
1534
+ 172,
1535
+ 181,
1536
+ 230,
1537
+ 232,
1538
+ 305,
1539
+ 609,
1540
+ 45,
1541
+ 1236,
1542
+ 315,
1543
+ 84,
1544
+ 10,
1545
+ 523,
1546
+ 52,
1547
+ 1311,
1548
+ 127,
1549
+ 123,
1550
+ 627,
1551
+ 99,
1552
+ 258,
1553
+ 681,
1554
+ 193,
1555
+ 241,
1556
+ 285,
1557
+ 480,
1558
+ 4,
1559
+ 7,
1560
+ 299,
1561
+ 41,
1562
+ 249,
1563
+ 406,
1564
+ 334,
1565
+ 22,
1566
+ 241,
1567
+ 318,
1568
+ 214,
1569
+ 397,
1570
+ 506,
1571
+ 195,
1572
+ 1027,
1573
+ 260,
1574
+ 281,
1575
+ 284,
1576
+ 24,
1577
+ 411,
1578
+ 493,
1579
+ 143,
1580
+ 633,
1581
+ 1463,
1582
+ 168,
1583
+ 678,
1584
+ 75,
1585
+ 63,
1586
+ 212,
1587
+ 7,
1588
+ 366,
1589
+ 227,
1590
+ 120,
1591
+ 109,
1592
+ 9,
1593
+ 145,
1594
+ 731,
1595
+ 255,
1596
+ 645,
1597
+ 445,
1598
+ 1058,
1599
+ 120,
1600
+ 792,
1601
+ 263,
1602
+ 880,
1603
+ 1,
1604
+ 716,
1605
+ 340,
1606
+ 97,
1607
+ 303,
1608
+ 58,
1609
+ 646,
1610
+ 963,
1611
+ 417,
1612
+ 616,
1613
+ 1871,
1614
+ 1223,
1615
+ 751,
1616
+ 2,
1617
+ 842,
1618
+ 386,
1619
+ 19,
1620
+ 761,
1621
+ 95,
1622
+ 538,
1623
+ 487,
1624
+ 1026,
1625
+ 192,
1626
+ 143,
1627
+ 193,
1628
+ 433,
1629
+ 1006,
1630
+ 62,
1631
+ 937,
1632
+ 574,
1633
+ 2154
1634
+ ],
1635
+ "seconds": 149.61235346001922
1636
+ },
1637
+ {
1638
+ "sigma": 0.33,
1639
+ "copies": 256,
1640
+ "steps": 156,
1641
+ "deviated": 256,
1642
+ "median_first_deviation": 30,
1643
+ "step_exposure": 9911,
1644
+ "empirical_rate_per_step": 0.025829885985268895,
1645
+ "bound_tail_per_step": 0.6901493276563357,
1646
+ "bound_profile_per_step": 0.2540000374425606,
1647
+ "first_deviation": [
1648
+ 35,
1649
+ 46,
1650
+ 71,
1651
+ 86,
1652
+ 38,
1653
+ 147,
1654
+ 103,
1655
+ 38,
1656
+ 16,
1657
+ 5,
1658
+ 112,
1659
+ 6,
1660
+ 71,
1661
+ 16,
1662
+ 4,
1663
+ 88,
1664
+ 68,
1665
+ 60,
1666
+ 20,
1667
+ 2,
1668
+ 8,
1669
+ 1,
1670
+ 71,
1671
+ 41,
1672
+ 36,
1673
+ 38,
1674
+ 20,
1675
+ 136,
1676
+ 32,
1677
+ 4,
1678
+ 29,
1679
+ 3,
1680
+ 27,
1681
+ 52,
1682
+ 63,
1683
+ 6,
1684
+ 2,
1685
+ 32,
1686
+ 8,
1687
+ 130,
1688
+ 38,
1689
+ 2,
1690
+ 23,
1691
+ 16,
1692
+ 10,
1693
+ 53,
1694
+ 12,
1695
+ 23,
1696
+ 56,
1697
+ 25,
1698
+ 33,
1699
+ 39,
1700
+ 12,
1701
+ 12,
1702
+ 7,
1703
+ 6,
1704
+ 54,
1705
+ 18,
1706
+ 18,
1707
+ 1,
1708
+ 48,
1709
+ 3,
1710
+ 80,
1711
+ 34,
1712
+ 6,
1713
+ 72,
1714
+ 69,
1715
+ 120,
1716
+ 2,
1717
+ 22,
1718
+ 1,
1719
+ 28,
1720
+ 37,
1721
+ 23,
1722
+ 18,
1723
+ 7,
1724
+ 64,
1725
+ 76,
1726
+ 86,
1727
+ 12,
1728
+ 107,
1729
+ 22,
1730
+ 3,
1731
+ 38,
1732
+ 5,
1733
+ 94,
1734
+ 5,
1735
+ 68,
1736
+ 4,
1737
+ 66,
1738
+ 40,
1739
+ 17,
1740
+ 10,
1741
+ 21,
1742
+ 128,
1743
+ 81,
1744
+ 22,
1745
+ 6,
1746
+ 16,
1747
+ 5,
1748
+ 13,
1749
+ 156,
1750
+ 73,
1751
+ 22,
1752
+ 35,
1753
+ 33,
1754
+ 22,
1755
+ 96,
1756
+ 2,
1757
+ 15,
1758
+ 8,
1759
+ 112,
1760
+ 43,
1761
+ 109,
1762
+ 103,
1763
+ 17,
1764
+ 3,
1765
+ 116,
1766
+ 19,
1767
+ 45,
1768
+ 84,
1769
+ 23,
1770
+ 67,
1771
+ 1,
1772
+ 43,
1773
+ 29,
1774
+ 6,
1775
+ 5,
1776
+ 12,
1777
+ 35,
1778
+ 20,
1779
+ 17,
1780
+ 92,
1781
+ 16,
1782
+ 40,
1783
+ 69,
1784
+ 100,
1785
+ 26,
1786
+ 5,
1787
+ 6,
1788
+ 28,
1789
+ 9,
1790
+ 102,
1791
+ 45,
1792
+ 60,
1793
+ 30,
1794
+ 78,
1795
+ 10,
1796
+ 26,
1797
+ 62,
1798
+ 52,
1799
+ 78,
1800
+ 12,
1801
+ 20,
1802
+ 6,
1803
+ 63,
1804
+ 15,
1805
+ 5,
1806
+ 60,
1807
+ 12,
1808
+ 40,
1809
+ 18,
1810
+ 25,
1811
+ 4,
1812
+ 83,
1813
+ 8,
1814
+ 48,
1815
+ 19,
1816
+ 109,
1817
+ 18,
1818
+ 53,
1819
+ 23,
1820
+ 16,
1821
+ 21,
1822
+ 7,
1823
+ 65,
1824
+ 21,
1825
+ 6,
1826
+ 4,
1827
+ 37,
1828
+ 97,
1829
+ 31,
1830
+ 43,
1831
+ 29,
1832
+ 67,
1833
+ 9,
1834
+ 11,
1835
+ 46,
1836
+ 12,
1837
+ 9,
1838
+ 58,
1839
+ 43,
1840
+ 55,
1841
+ 91,
1842
+ 12,
1843
+ 30,
1844
+ 76,
1845
+ 69,
1846
+ 45,
1847
+ 53,
1848
+ 33,
1849
+ 73,
1850
+ 43,
1851
+ 7,
1852
+ 25,
1853
+ 50,
1854
+ 18,
1855
+ 63,
1856
+ 66,
1857
+ 32,
1858
+ 30,
1859
+ 48,
1860
+ 32,
1861
+ 110,
1862
+ 67,
1863
+ 38,
1864
+ 31,
1865
+ 1,
1866
+ 14,
1867
+ 15,
1868
+ 4,
1869
+ 4,
1870
+ 84,
1871
+ 50,
1872
+ 81,
1873
+ 71,
1874
+ 19,
1875
+ 42,
1876
+ 70,
1877
+ 17,
1878
+ 42,
1879
+ 17,
1880
+ 7,
1881
+ 112,
1882
+ 54,
1883
+ 11,
1884
+ 3,
1885
+ 66,
1886
+ 44,
1887
+ 14,
1888
+ 76,
1889
+ 78,
1890
+ 2,
1891
+ 4,
1892
+ 1,
1893
+ 71,
1894
+ 1,
1895
+ 26,
1896
+ 3,
1897
+ 11,
1898
+ 26,
1899
+ 58,
1900
+ 70,
1901
+ 32,
1902
+ 18,
1903
+ 9
1904
+ ],
1905
+ "seconds": 10.62427800099249
1906
+ },
1907
+ {
1908
+ "sigma": 0.36,
1909
+ "copies": 256,
1910
+ "steps": 37,
1911
+ "deviated": 256,
1912
+ "median_first_deviation": 5,
1913
+ "step_exposure": 1731,
1914
+ "empirical_rate_per_step": 0.14789139225880993,
1915
+ "bound_tail_per_step": 3.8914228635558983,
1916
+ "bound_profile_per_step": 1.4321850553772115,
1917
+ "first_deviation": [
1918
+ 1,
1919
+ 2,
1920
+ 14,
1921
+ 4,
1922
+ 3,
1923
+ 1,
1924
+ 3,
1925
+ 4,
1926
+ 10,
1927
+ 3,
1928
+ 2,
1929
+ 4,
1930
+ 4,
1931
+ 4,
1932
+ 2,
1933
+ 5,
1934
+ 1,
1935
+ 4,
1936
+ 1,
1937
+ 9,
1938
+ 17,
1939
+ 3,
1940
+ 2,
1941
+ 9,
1942
+ 16,
1943
+ 5,
1944
+ 10,
1945
+ 1,
1946
+ 5,
1947
+ 5,
1948
+ 25,
1949
+ 2,
1950
+ 17,
1951
+ 5,
1952
+ 3,
1953
+ 7,
1954
+ 8,
1955
+ 1,
1956
+ 9,
1957
+ 13,
1958
+ 10,
1959
+ 8,
1960
+ 2,
1961
+ 10,
1962
+ 7,
1963
+ 13,
1964
+ 2,
1965
+ 4,
1966
+ 8,
1967
+ 2,
1968
+ 16,
1969
+ 1,
1970
+ 3,
1971
+ 6,
1972
+ 8,
1973
+ 1,
1974
+ 7,
1975
+ 3,
1976
+ 4,
1977
+ 8,
1978
+ 15,
1979
+ 3,
1980
+ 2,
1981
+ 1,
1982
+ 28,
1983
+ 6,
1984
+ 9,
1985
+ 1,
1986
+ 1,
1987
+ 2,
1988
+ 2,
1989
+ 5,
1990
+ 3,
1991
+ 1,
1992
+ 4,
1993
+ 5,
1994
+ 6,
1995
+ 4,
1996
+ 11,
1997
+ 1,
1998
+ 8,
1999
+ 7,
2000
+ 5,
2001
+ 6,
2002
+ 3,
2003
+ 3,
2004
+ 3,
2005
+ 7,
2006
+ 7,
2007
+ 7,
2008
+ 2,
2009
+ 7,
2010
+ 3,
2011
+ 3,
2012
+ 9,
2013
+ 1,
2014
+ 9,
2015
+ 1,
2016
+ 1,
2017
+ 4,
2018
+ 6,
2019
+ 14,
2020
+ 21,
2021
+ 8,
2022
+ 15,
2023
+ 14,
2024
+ 4,
2025
+ 14,
2026
+ 5,
2027
+ 5,
2028
+ 2,
2029
+ 1,
2030
+ 1,
2031
+ 3,
2032
+ 5,
2033
+ 17,
2034
+ 6,
2035
+ 2,
2036
+ 5,
2037
+ 5,
2038
+ 16,
2039
+ 2,
2040
+ 4,
2041
+ 1,
2042
+ 1,
2043
+ 5,
2044
+ 3,
2045
+ 9,
2046
+ 4,
2047
+ 2,
2048
+ 5,
2049
+ 3,
2050
+ 2,
2051
+ 1,
2052
+ 4,
2053
+ 15,
2054
+ 37,
2055
+ 2,
2056
+ 2,
2057
+ 23,
2058
+ 6,
2059
+ 17,
2060
+ 14,
2061
+ 3,
2062
+ 1,
2063
+ 1,
2064
+ 11,
2065
+ 9,
2066
+ 9,
2067
+ 1,
2068
+ 35,
2069
+ 16,
2070
+ 4,
2071
+ 2,
2072
+ 4,
2073
+ 4,
2074
+ 22,
2075
+ 9,
2076
+ 7,
2077
+ 4,
2078
+ 4,
2079
+ 9,
2080
+ 4,
2081
+ 4,
2082
+ 1,
2083
+ 23,
2084
+ 6,
2085
+ 16,
2086
+ 7,
2087
+ 2,
2088
+ 7,
2089
+ 8,
2090
+ 1,
2091
+ 4,
2092
+ 8,
2093
+ 17,
2094
+ 10,
2095
+ 6,
2096
+ 11,
2097
+ 6,
2098
+ 2,
2099
+ 2,
2100
+ 6,
2101
+ 2,
2102
+ 4,
2103
+ 2,
2104
+ 10,
2105
+ 27,
2106
+ 6,
2107
+ 24,
2108
+ 4,
2109
+ 1,
2110
+ 4,
2111
+ 1,
2112
+ 7,
2113
+ 1,
2114
+ 6,
2115
+ 3,
2116
+ 17,
2117
+ 9,
2118
+ 2,
2119
+ 2,
2120
+ 6,
2121
+ 3,
2122
+ 8,
2123
+ 3,
2124
+ 1,
2125
+ 3,
2126
+ 20,
2127
+ 1,
2128
+ 12,
2129
+ 27,
2130
+ 7,
2131
+ 15,
2132
+ 3,
2133
+ 1,
2134
+ 16,
2135
+ 5,
2136
+ 14,
2137
+ 2,
2138
+ 1,
2139
+ 2,
2140
+ 10,
2141
+ 13,
2142
+ 4,
2143
+ 5,
2144
+ 9,
2145
+ 1,
2146
+ 2,
2147
+ 8,
2148
+ 12,
2149
+ 1,
2150
+ 7,
2151
+ 4,
2152
+ 2,
2153
+ 2,
2154
+ 9,
2155
+ 6,
2156
+ 2,
2157
+ 1,
2158
+ 11,
2159
+ 1,
2160
+ 16,
2161
+ 14,
2162
+ 5,
2163
+ 9,
2164
+ 24,
2165
+ 6,
2166
+ 2,
2167
+ 9,
2168
+ 7,
2169
+ 3,
2170
+ 18,
2171
+ 12,
2172
+ 2,
2173
+ 2
2174
+ ],
2175
+ "seconds": 2.4721250050060917
2176
+ },
2177
+ {
2178
+ "sigma": 0.45,
2179
+ "copies": 256,
2180
+ "steps": 2,
2181
+ "deviated": 256,
2182
+ "median_first_deviation": 1,
2183
+ "step_exposure": 257,
2184
+ "empirical_rate_per_step": 0.9961089494163424,
2185
+ "bound_tail_per_step": 108.03825001963028,
2186
+ "bound_profile_per_step": 39.76200287465845,
2187
+ "first_deviation": [
2188
+ 1,
2189
+ 1,
2190
+ 1,
2191
+ 1,
2192
+ 1,
2193
+ 1,
2194
+ 1,
2195
+ 1,
2196
+ 1,
2197
+ 1,
2198
+ 1,
2199
+ 1,
2200
+ 1,
2201
+ 1,
2202
+ 1,
2203
+ 1,
2204
+ 1,
2205
+ 1,
2206
+ 1,
2207
+ 1,
2208
+ 1,
2209
+ 1,
2210
+ 1,
2211
+ 1,
2212
+ 1,
2213
+ 1,
2214
+ 1,
2215
+ 1,
2216
+ 1,
2217
+ 1,
2218
+ 1,
2219
+ 1,
2220
+ 1,
2221
+ 1,
2222
+ 1,
2223
+ 1,
2224
+ 1,
2225
+ 1,
2226
+ 1,
2227
+ 1,
2228
+ 1,
2229
+ 1,
2230
+ 1,
2231
+ 1,
2232
+ 1,
2233
+ 1,
2234
+ 1,
2235
+ 1,
2236
+ 1,
2237
+ 1,
2238
+ 1,
2239
+ 1,
2240
+ 1,
2241
+ 1,
2242
+ 1,
2243
+ 1,
2244
+ 1,
2245
+ 1,
2246
+ 1,
2247
+ 1,
2248
+ 1,
2249
+ 1,
2250
+ 1,
2251
+ 1,
2252
+ 1,
2253
+ 1,
2254
+ 1,
2255
+ 1,
2256
+ 1,
2257
+ 1,
2258
+ 1,
2259
+ 1,
2260
+ 1,
2261
+ 1,
2262
+ 1,
2263
+ 1,
2264
+ 1,
2265
+ 1,
2266
+ 1,
2267
+ 1,
2268
+ 1,
2269
+ 1,
2270
+ 1,
2271
+ 1,
2272
+ 1,
2273
+ 1,
2274
+ 1,
2275
+ 1,
2276
+ 1,
2277
+ 1,
2278
+ 1,
2279
+ 1,
2280
+ 1,
2281
+ 1,
2282
+ 1,
2283
+ 1,
2284
+ 1,
2285
+ 1,
2286
+ 1,
2287
+ 1,
2288
+ 1,
2289
+ 1,
2290
+ 1,
2291
+ 1,
2292
+ 1,
2293
+ 1,
2294
+ 1,
2295
+ 1,
2296
+ 1,
2297
+ 2,
2298
+ 1,
2299
+ 1,
2300
+ 1,
2301
+ 1,
2302
+ 1,
2303
+ 1,
2304
+ 1,
2305
+ 1,
2306
+ 1,
2307
+ 1,
2308
+ 1,
2309
+ 1,
2310
+ 1,
2311
+ 1,
2312
+ 1,
2313
+ 1,
2314
+ 1,
2315
+ 1,
2316
+ 1,
2317
+ 1,
2318
+ 1,
2319
+ 1,
2320
+ 1,
2321
+ 1,
2322
+ 1,
2323
+ 1,
2324
+ 1,
2325
+ 1,
2326
+ 1,
2327
+ 1,
2328
+ 1,
2329
+ 1,
2330
+ 1,
2331
+ 1,
2332
+ 1,
2333
+ 1,
2334
+ 1,
2335
+ 1,
2336
+ 1,
2337
+ 1,
2338
+ 1,
2339
+ 1,
2340
+ 1,
2341
+ 1,
2342
+ 1,
2343
+ 1,
2344
+ 1,
2345
+ 1,
2346
+ 1,
2347
+ 1,
2348
+ 1,
2349
+ 1,
2350
+ 1,
2351
+ 1,
2352
+ 1,
2353
+ 1,
2354
+ 1,
2355
+ 1,
2356
+ 1,
2357
+ 1,
2358
+ 1,
2359
+ 1,
2360
+ 1,
2361
+ 1,
2362
+ 1,
2363
+ 1,
2364
+ 1,
2365
+ 1,
2366
+ 1,
2367
+ 1,
2368
+ 1,
2369
+ 1,
2370
+ 1,
2371
+ 1,
2372
+ 1,
2373
+ 1,
2374
+ 1,
2375
+ 1,
2376
+ 1,
2377
+ 1,
2378
+ 1,
2379
+ 1,
2380
+ 1,
2381
+ 1,
2382
+ 1,
2383
+ 1,
2384
+ 1,
2385
+ 1,
2386
+ 1,
2387
+ 1,
2388
+ 1,
2389
+ 1,
2390
+ 1,
2391
+ 1,
2392
+ 1,
2393
+ 1,
2394
+ 1,
2395
+ 1,
2396
+ 1,
2397
+ 1,
2398
+ 1,
2399
+ 1,
2400
+ 1,
2401
+ 1,
2402
+ 1,
2403
+ 1,
2404
+ 1,
2405
+ 1,
2406
+ 1,
2407
+ 1,
2408
+ 1,
2409
+ 1,
2410
+ 1,
2411
+ 1,
2412
+ 1,
2413
+ 1,
2414
+ 1,
2415
+ 1,
2416
+ 1,
2417
+ 1,
2418
+ 1,
2419
+ 1,
2420
+ 1,
2421
+ 1,
2422
+ 1,
2423
+ 1,
2424
+ 1,
2425
+ 1,
2426
+ 1,
2427
+ 1,
2428
+ 1,
2429
+ 1,
2430
+ 1,
2431
+ 1,
2432
+ 1,
2433
+ 1,
2434
+ 1,
2435
+ 1,
2436
+ 1,
2437
+ 1,
2438
+ 1,
2439
+ 1,
2440
+ 1,
2441
+ 1,
2442
+ 1,
2443
+ 1
2444
+ ],
2445
+ "seconds": 0.09544085199013352
2446
+ },
2447
+ {
2448
+ "sigma": 0.6,
2449
+ "copies": 256,
2450
+ "steps": 1,
2451
+ "deviated": 256,
2452
+ "median_first_deviation": 1,
2453
+ "step_exposure": 256,
2454
+ "empirical_rate_per_step": 1.0,
2455
+ "bound_tail_per_step": 1563.606148361082,
2456
+ "bound_profile_per_step": 575.463895007352,
2457
+ "first_deviation": [
2458
+ 1,
2459
+ 1,
2460
+ 1,
2461
+ 1,
2462
+ 1,
2463
+ 1,
2464
+ 1,
2465
+ 1,
2466
+ 1,
2467
+ 1,
2468
+ 1,
2469
+ 1,
2470
+ 1,
2471
+ 1,
2472
+ 1,
2473
+ 1,
2474
+ 1,
2475
+ 1,
2476
+ 1,
2477
+ 1,
2478
+ 1,
2479
+ 1,
2480
+ 1,
2481
+ 1,
2482
+ 1,
2483
+ 1,
2484
+ 1,
2485
+ 1,
2486
+ 1,
2487
+ 1,
2488
+ 1,
2489
+ 1,
2490
+ 1,
2491
+ 1,
2492
+ 1,
2493
+ 1,
2494
+ 1,
2495
+ 1,
2496
+ 1,
2497
+ 1,
2498
+ 1,
2499
+ 1,
2500
+ 1,
2501
+ 1,
2502
+ 1,
2503
+ 1,
2504
+ 1,
2505
+ 1,
2506
+ 1,
2507
+ 1,
2508
+ 1,
2509
+ 1,
2510
+ 1,
2511
+ 1,
2512
+ 1,
2513
+ 1,
2514
+ 1,
2515
+ 1,
2516
+ 1,
2517
+ 1,
2518
+ 1,
2519
+ 1,
2520
+ 1,
2521
+ 1,
2522
+ 1,
2523
+ 1,
2524
+ 1,
2525
+ 1,
2526
+ 1,
2527
+ 1,
2528
+ 1,
2529
+ 1,
2530
+ 1,
2531
+ 1,
2532
+ 1,
2533
+ 1,
2534
+ 1,
2535
+ 1,
2536
+ 1,
2537
+ 1,
2538
+ 1,
2539
+ 1,
2540
+ 1,
2541
+ 1,
2542
+ 1,
2543
+ 1,
2544
+ 1,
2545
+ 1,
2546
+ 1,
2547
+ 1,
2548
+ 1,
2549
+ 1,
2550
+ 1,
2551
+ 1,
2552
+ 1,
2553
+ 1,
2554
+ 1,
2555
+ 1,
2556
+ 1,
2557
+ 1,
2558
+ 1,
2559
+ 1,
2560
+ 1,
2561
+ 1,
2562
+ 1,
2563
+ 1,
2564
+ 1,
2565
+ 1,
2566
+ 1,
2567
+ 1,
2568
+ 1,
2569
+ 1,
2570
+ 1,
2571
+ 1,
2572
+ 1,
2573
+ 1,
2574
+ 1,
2575
+ 1,
2576
+ 1,
2577
+ 1,
2578
+ 1,
2579
+ 1,
2580
+ 1,
2581
+ 1,
2582
+ 1,
2583
+ 1,
2584
+ 1,
2585
+ 1,
2586
+ 1,
2587
+ 1,
2588
+ 1,
2589
+ 1,
2590
+ 1,
2591
+ 1,
2592
+ 1,
2593
+ 1,
2594
+ 1,
2595
+ 1,
2596
+ 1,
2597
+ 1,
2598
+ 1,
2599
+ 1,
2600
+ 1,
2601
+ 1,
2602
+ 1,
2603
+ 1,
2604
+ 1,
2605
+ 1,
2606
+ 1,
2607
+ 1,
2608
+ 1,
2609
+ 1,
2610
+ 1,
2611
+ 1,
2612
+ 1,
2613
+ 1,
2614
+ 1,
2615
+ 1,
2616
+ 1,
2617
+ 1,
2618
+ 1,
2619
+ 1,
2620
+ 1,
2621
+ 1,
2622
+ 1,
2623
+ 1,
2624
+ 1,
2625
+ 1,
2626
+ 1,
2627
+ 1,
2628
+ 1,
2629
+ 1,
2630
+ 1,
2631
+ 1,
2632
+ 1,
2633
+ 1,
2634
+ 1,
2635
+ 1,
2636
+ 1,
2637
+ 1,
2638
+ 1,
2639
+ 1,
2640
+ 1,
2641
+ 1,
2642
+ 1,
2643
+ 1,
2644
+ 1,
2645
+ 1,
2646
+ 1,
2647
+ 1,
2648
+ 1,
2649
+ 1,
2650
+ 1,
2651
+ 1,
2652
+ 1,
2653
+ 1,
2654
+ 1,
2655
+ 1,
2656
+ 1,
2657
+ 1,
2658
+ 1,
2659
+ 1,
2660
+ 1,
2661
+ 1,
2662
+ 1,
2663
+ 1,
2664
+ 1,
2665
+ 1,
2666
+ 1,
2667
+ 1,
2668
+ 1,
2669
+ 1,
2670
+ 1,
2671
+ 1,
2672
+ 1,
2673
+ 1,
2674
+ 1,
2675
+ 1,
2676
+ 1,
2677
+ 1,
2678
+ 1,
2679
+ 1,
2680
+ 1,
2681
+ 1,
2682
+ 1,
2683
+ 1,
2684
+ 1,
2685
+ 1,
2686
+ 1,
2687
+ 1,
2688
+ 1,
2689
+ 1,
2690
+ 1,
2691
+ 1,
2692
+ 1,
2693
+ 1,
2694
+ 1,
2695
+ 1,
2696
+ 1,
2697
+ 1,
2698
+ 1,
2699
+ 1,
2700
+ 1,
2701
+ 1,
2702
+ 1,
2703
+ 1,
2704
+ 1,
2705
+ 1,
2706
+ 1,
2707
+ 1,
2708
+ 1,
2709
+ 1,
2710
+ 1,
2711
+ 1,
2712
+ 1,
2713
+ 1
2714
+ ],
2715
+ "seconds": 0.02609989297343418
2716
+ }
2717
+ ]
2718
+ }
paper/runs/paper_redundant_layers_r3.json ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "r": 3,
3
+ "steps": 4000,
4
+ "per_layer_rows_at_half": [
5
+ 2061.18125,
6
+ 2980.828,
7
+ 2090.0,
8
+ 2092.0,
9
+ 2945.254,
10
+ 2339.71825,
11
+ 2371.17475,
12
+ 2373.1155,
13
+ 2500.67575,
14
+ 2342.0515,
15
+ 2339.0,
16
+ 2398.76375,
17
+ 2057.0
18
+ ],
19
+ "last_layer_hist": {
20
+ "-1": 1751.085,
21
+ "0": 305.915
22
+ },
23
+ "rows": [
24
+ {
25
+ "sigma": 0.06,
26
+ "measured": 0.0,
27
+ "deviated": 0,
28
+ "full": 2.8327107826673933e-133,
29
+ "last_layer": 1.8862875375088718e-134,
30
+ "per_layer": [
31
+ 1.8901217814399408e-134,
32
+ 2.733446138968155e-134,
33
+ 1.9165488349020623e-134,
34
+ 1.9183828529258916e-134,
35
+ 2.7008244603782956e-134,
36
+ 2.1455427205916705e-134,
37
+ 2.1743886145749706e-134,
38
+ 2.1761682998148445e-134,
39
+ 2.2931421986269576e-134,
40
+ 2.1476823318687212e-134,
41
+ 2.1448840788688628e-134,
42
+ 2.1996879762046902e-134,
43
+ 1.8862875375088718e-134
44
+ ]
45
+ },
46
+ {
47
+ "sigma": 0.12,
48
+ "measured": 0.0,
49
+ "deviated": 0,
50
+ "full": 3.459052746172636e-31,
51
+ "last_layer": 2.3033654288374967e-32,
52
+ "per_layer": [
53
+ 2.308047464179901e-32,
54
+ 3.3378396521686036e-32,
55
+ 2.3403178153963871e-32,
56
+ 2.3425573539757138e-32,
57
+ 3.2980049794581197e-32,
58
+ 2.6199446428148595e-32,
59
+ 2.655168665475155e-32,
60
+ 2.657341857724069e-32,
61
+ 2.800179908255848e-32,
62
+ 2.6225573445099664e-32,
63
+ 2.619140368522559e-32,
64
+ 2.686061980407677e-32,
65
+ 2.3033654288374967e-32
66
+ ]
67
+ },
68
+ {
69
+ "sigma": 0.18,
70
+ "measured": 0.0,
71
+ "deviated": 0,
72
+ "full": 3.641903637405344e-12,
73
+ "last_layer": 2.4251248966465847e-13,
74
+ "per_layer": [
75
+ 2.4300544316364263e-13,
76
+ 3.5142830313180584e-13,
77
+ 2.4640306436516106e-13,
78
+ 2.4663885677125207e-13,
79
+ 3.4723426360466413e-13,
80
+ 2.7584389787133586e-13,
81
+ 2.795524997824376e-13,
82
+ 2.797813068384982e-13,
83
+ 2.94820175973037e-13,
84
+ 2.7611897918709183e-13,
85
+ 2.757592189234984e-13,
86
+ 2.828051381282608e-13,
87
+ 2.4251248966465847e-13
88
+ ]
89
+ },
90
+ {
91
+ "sigma": 0.24,
92
+ "measured": 9.78616256186078e-07,
93
+ "deviated": 1,
94
+ "full": 1.9018794770682307e-05,
95
+ "last_layer": 1.2664517597026156e-06,
96
+ "per_layer": [
97
+ 1.2690260676366245e-06,
98
+ 1.8352332843805677e-06,
99
+ 1.286769167612283e-06,
100
+ 1.2880005256674144e-06,
101
+ 1.8133311186539462e-06,
102
+ 1.4405154569376879e-06,
103
+ 1.459882564268308e-06,
104
+ 1.461077443341056e-06,
105
+ 1.539613614017092e-06,
106
+ 1.4419519900287555e-06,
107
+ 1.4400732454761386e-06,
108
+ 1.4768685329598175e-06,
109
+ 1.2664517597026156e-06
110
+ ]
111
+ },
112
+ {
113
+ "sigma": 0.27,
114
+ "measured": 8.473993999496142e-05,
115
+ "deviated": 74,
116
+ "full": 0.0012822609465080613,
117
+ "last_layer": 8.538509677839153e-05,
118
+ "per_layer": [
119
+ 8.555865848763054e-05,
120
+ 0.00012373275997070455,
121
+ 8.675491116521064e-05,
122
+ 8.683793021895725e-05,
123
+ 0.00012225610006171356,
124
+ 9.712059757434072e-05,
125
+ 9.842634200643089e-05,
126
+ 9.850690162071024e-05,
127
+ 0.00010380186724605095,
128
+ 9.721744967791787e-05,
129
+ 9.709078335666397e-05,
130
+ 9.957154834333855e-05,
131
+ 8.538509677839153e-05
132
+ ]
133
+ },
134
+ {
135
+ "sigma": 0.3,
136
+ "measured": 0.002463030489623522,
137
+ "deviated": 256,
138
+ "full": 0.026564657096504317,
139
+ "last_layer": 0.00176892685006651,
140
+ "per_layer": [
141
+ 0.0017725225357212693,
142
+ 0.002563377095104548,
143
+ 0.0017973053556825504,
144
+ 0.0017990252651138255,
145
+ 0.0025327850660504564,
146
+ 0.0020120517423508153,
147
+ 0.002039102907863269,
148
+ 0.0020407718649776427,
149
+ 0.0021504679034930517,
150
+ 0.0020140582316910765,
151
+ 0.002011434079876308,
152
+ 0.0020628281985129943,
153
+ 0.00176892685006651
154
+ ]
155
+ },
156
+ {
157
+ "sigma": 0.33,
158
+ "measured": 0.025829885985268895,
159
+ "deviated": 256,
160
+ "full": 0.2540000374425606,
161
+ "last_layer": 0.01691373182487529,
162
+ "per_layer": [
163
+ 0.016948112253262634,
164
+ 0.02450992970737937,
165
+ 0.017185075116183453,
166
+ 0.01720152016414152,
167
+ 0.024217421639349177,
168
+ 0.019238389414811145,
169
+ 0.019497041240357664,
170
+ 0.019512999103769975,
171
+ 0.020561866318166696,
172
+ 0.019257574618885227,
173
+ 0.019232483586963202,
174
+ 0.019723892454415262,
175
+ 0.01691373182487529
176
+ ]
177
+ },
178
+ {
179
+ "sigma": 0.36,
180
+ "measured": 0.14789139225880993,
181
+ "deviated": 256,
182
+ "full": 1.4321850553772115,
183
+ "last_layer": 0.09536846606064864,
184
+ "per_layer": [
185
+ 0.09556232089716594,
186
+ 0.1381998026011819,
187
+ 0.09689844145199596,
188
+ 0.09699116723328972,
189
+ 0.1365504891293095,
190
+ 0.10847610136927818,
191
+ 0.10993451563891202,
192
+ 0.11002449441893497,
193
+ 0.11593855634057465,
194
+ 0.10858427758388005,
195
+ 0.10844280122307104,
196
+ 0.11121362142896901,
197
+ 0.09536846606064864
198
+ ]
199
+ },
200
+ {
201
+ "sigma": 0.45,
202
+ "measured": 0.9961089494163424,
203
+ "deviated": 256,
204
+ "full": 39.76200287465844,
205
+ "last_layer": 2.647731316157689,
206
+ "per_layer": [
207
+ 2.6531133417122272,
208
+ 3.8368651646473957,
209
+ 2.6902082891441763,
210
+ 2.6927826511433572,
211
+ 3.7910749877679626,
212
+ 3.01164087579517,
213
+ 3.05213108490879,
214
+ 3.0546291814337447,
215
+ 3.2188223115367607,
216
+ 3.014644190862465,
217
+ 3.010716358042214,
218
+ 3.087643121506493,
219
+ 2.647731316157689
220
+ ]
221
+ },
222
+ {
223
+ "sigma": 0.6,
224
+ "measured": 1.0,
225
+ "deviated": 256,
226
+ "full": 575.4638950073521,
227
+ "last_layer": 38.31984472536456,
228
+ "per_layer": [
229
+ 38.39773721479791,
230
+ 55.52983282160848,
231
+ 38.934601592616396,
232
+ 38.97185958457641,
233
+ 54.86712491854374,
234
+ 43.58660186733258,
235
+ 44.172604879293466,
236
+ 44.20875910323598,
237
+ 46.58507848736298,
238
+ 43.630067972196656,
239
+ 43.57322159097117,
240
+ 44.68656024945178,
241
+ 38.31984472536456
242
+ ]
243
+ }
244
+ ]
245
+ }
paper/runs/paper_redundant_omega_r3.json ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "r": 3,
3
+ "M": 125901,
4
+ "target_bytes": 305508,
5
+ "rows": [
6
+ {
7
+ "sigma": 0.1,
8
+ "steps": 1664939,
9
+ "bytes": 305508,
10
+ "complete": true,
11
+ "first_wrong_byte": null,
12
+ "halted": true,
13
+ "seconds": 4920.186348318995,
14
+ "bound": 1.538997404726276e-39
15
+ },
16
+ {
17
+ "sigma": 0.15,
18
+ "steps": 1664939,
19
+ "bytes": 305508,
20
+ "complete": true,
21
+ "first_wrong_byte": null,
22
+ "halted": true,
23
+ "seconds": 2972.5451199779927,
24
+ "bound": 3.194508854582684e-12
25
+ },
26
+ {
27
+ "sigma": 0.2,
28
+ "steps": 1664939,
29
+ "bytes": 305508,
30
+ "complete": true,
31
+ "first_wrong_byte": null,
32
+ "halted": true,
33
+ "seconds": 3348.026227567985,
34
+ "bound": 0.013377333750149488
35
+ },
36
+ {
37
+ "sigma": 0.25,
38
+ "steps": 1664939,
39
+ "bytes": 305508,
40
+ "complete": true,
41
+ "first_wrong_byte": null,
42
+ "halted": true,
43
+ "seconds": 5683.312528293987,
44
+ "bound": 413.61204184670515
45
+ }
46
+ ]
47
+ }
paper/runs/paper_redundant_r3.json ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "r": 3,
3
+ "state_bits": 6171,
4
+ "units": 125901,
5
+ "edges": 679509,
6
+ "depth": 13,
7
+ "lev_rows": 41967,
8
+ "layer_widths": [
9
+ 6939,
10
+ 24630,
11
+ 6270,
12
+ 7761,
13
+ 19281,
14
+ 7041,
15
+ 7137,
16
+ 7167,
17
+ 7827,
18
+ 7059,
19
+ 7017,
20
+ 11601,
21
+ 6171
22
+ ],
23
+ "sigma_bytes": 3121539,
24
+ "sigma_sha256": "111bb202e6f2728449c6b0761f57a059bc0fb38e3e5ba8447bac6613ec7ce313",
25
+ "bias_min": -23,
26
+ "bias_max": 4,
27
+ "max_fanin": 768,
28
+ "build_seconds": 0.6454255809949245,
29
+ "sigma_roundtrip": true,
30
+ "c_random": "random states: 65536 tested, 0 disagree with SUBLEQ, 0 halt-latch mismatches, 0 halted batches not fixed",
31
+ "c_random_ok": true,
32
+ "min_margin_random_states": 1.5,
33
+ "accelerator_prefix_ok": true,
34
+ "ok": true
35
+ }
paper/runs/paper_redundant_restore_r3.json ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "r": 3,
3
+ "steps": 20000,
4
+ "rows": [
5
+ {
6
+ "sigma": 0.24,
7
+ "steps": 20000,
8
+ "copy_errors": 0,
9
+ "steps_with_copy_errors": 0,
10
+ "max_copy_errors_in_a_step": 0,
11
+ "copy_errors_carried_to_next_step": 0,
12
+ "decoded_first_deviation": null,
13
+ "bytes": 3950,
14
+ "bytes_equal": true,
15
+ "seconds": 54.976982238003984
16
+ },
17
+ {
18
+ "sigma": 0.27,
19
+ "steps": 20000,
20
+ "copy_errors": 2,
21
+ "steps_with_copy_errors": 2,
22
+ "max_copy_errors_in_a_step": 1,
23
+ "copy_errors_carried_to_next_step": 0,
24
+ "decoded_first_deviation": null,
25
+ "bytes": 3950,
26
+ "bytes_equal": true,
27
+ "seconds": 80.73841675600852
28
+ },
29
+ {
30
+ "sigma": 0.3,
31
+ "steps": 288,
32
+ "copy_errors": 6,
33
+ "steps_with_copy_errors": 4,
34
+ "max_copy_errors_in_a_step": 3,
35
+ "copy_errors_carried_to_next_step": 1,
36
+ "decoded_first_deviation": 288,
37
+ "bytes": 54,
38
+ "bytes_equal": true,
39
+ "seconds": 1.0162241850048304
40
+ },
41
+ {
42
+ "sigma": 0.33,
43
+ "steps": 110,
44
+ "copy_errors": 5,
45
+ "steps_with_copy_errors": 3,
46
+ "max_copy_errors_in_a_step": 3,
47
+ "copy_errors_carried_to_next_step": 0,
48
+ "decoded_first_deviation": 110,
49
+ "bytes": 18,
50
+ "bytes_equal": true,
51
+ "seconds": 0.3773938849917613
52
+ },
53
+ {
54
+ "sigma": 0.36,
55
+ "steps": 38,
56
+ "copy_errors": 5,
57
+ "steps_with_copy_errors": 3,
58
+ "max_copy_errors_in_a_step": 3,
59
+ "copy_errors_carried_to_next_step": 0,
60
+ "decoded_first_deviation": 38,
61
+ "bytes": 5,
62
+ "bytes_equal": true,
63
+ "seconds": 0.13369095901725814
64
+ }
65
+ ]
66
+ }
paper/runs/paper_redundant_selfrep_r3.json ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "r": 3,
3
+ "sigma_bytes": 3121539,
4
+ "sigma_sha256": "111bb202e6f2728449c6b0761f57a059bc0fb38e3e5ba8447bac6613ec7ce313",
5
+ "tau_bytes": 3022111,
6
+ "ser_bytes": 6143922,
7
+ "ser_sha256": "05005d59c373fb4998576ac098093de6df046355348e00370dbdccb1d458e3de",
8
+ "census": {
9
+ "L": 23892,
10
+ "R": 1581,
11
+ "f_lit": 2995056,
12
+ "f_rep": 126755
13
+ },
14
+ "closed_form": {
15
+ "A": 15663780,
16
+ "R": 1,
17
+ "B": 18132668,
18
+ "total": 33796449
19
+ },
20
+ "mode": "lock",
21
+ "c_result": "mode lock: halted after 33796449 steps, head 3022111 of 3022111, 6143922 bytes emitted",
22
+ "steps": 33796449,
23
+ "seconds": 6208.497068050987,
24
+ "steps_per_second": 5443.579763275882,
25
+ "out_bytes": 6143922,
26
+ "out_sha256": "05005d59c373fb4998576ac098093de6df046355348e00370dbdccb1d458e3de",
27
+ "equals_ser": true,
28
+ "closed_form_agrees": true,
29
+ "inst_recovers_instance": true,
30
+ "units": 125901,
31
+ "edges": 679509,
32
+ "state_bits": 6171,
33
+ "ok": true,
34
+ "total_seconds": 6209.988521510997
35
+ }
paper/runs/paper_runs_family.json CHANGED
@@ -218,11 +218,11 @@
218
  },
219
  {
220
  "file": "neural_subleq8io_netlist.safetensors",
221
- "bytes": 159279,
222
- "recipe": 142966,
223
- "steps": 788083,
224
  "exact": true,
225
- "sha256": "28d63d969218e388251f3bd636866d5b135087f8b0eae76a50d1ec3127eee3f6"
226
  },
227
  {
228
  "file": "neural_tile.safetensors",
@@ -233,8 +233,9 @@
233
  "sha256": "ba6e721eef8359d84ec58c46c1436c1298ac8191539adf9cc2c03ff9123583a8"
234
  }
235
  ],
236
- "bytes": 971265194,
237
- "steps": 4714587326,
 
238
  "failures": 0,
239
- "seconds": 1480.8925936110027
240
  }
 
218
  },
219
  {
220
  "file": "neural_subleq8io_netlist.safetensors",
221
+ "bytes": 160240,
222
+ "recipe": 144891,
223
+ "steps": 793709,
224
  "exact": true,
225
+ "sha256": "55c555bd64302190d5bde57ee0cd41b36dac5cf65066d0ed3468567a57e85fa3"
226
  },
227
  {
228
  "file": "neural_tile.safetensors",
 
233
  "sha256": "ba6e721eef8359d84ec58c46c1436c1298ac8191539adf9cc2c03ff9123583a8"
234
  }
235
  ],
236
+ "bytes": 971266155,
237
+ "steps": 4714592952,
238
+ "recipe_bytes": 774247834,
239
  "failures": 0,
240
+ "seconds": 317.137809242995
241
  }
paper/runs/paper_runs_family_gate.json CHANGED
@@ -7,8 +7,8 @@
7
  "steps": 4977,
8
  "reference_steps": 4977,
9
  "exact": true,
10
- "seconds": 3.7476833969994914,
11
- "steps_per_second": 1328.0203989442482,
12
  "sha256": "ba6e721eef8359d84ec58c46c1436c1298ac8191539adf9cc2c03ff9123583a8"
13
  },
14
  {
@@ -18,8 +18,8 @@
18
  "steps": 6977,
19
  "reference_steps": 6977,
20
  "exact": true,
21
- "seconds": 70.36866373001249,
22
- "steps_per_second": 99.14924669834656,
23
  "sha256": "d10be4d24d91d2d1100022369d8809c7be9fad154c1347f38ae74c7d59a25ee4"
24
  },
25
  {
@@ -29,8 +29,8 @@
29
  "steps": 12477,
30
  "reference_steps": 12477,
31
  "exact": true,
32
- "seconds": 92.43280537700048,
33
- "steps_per_second": 134.98454308630753,
34
  "sha256": "b77a985dea3104679d73cfaf20b9c3efc72646cd177412dbec41475a7a37d5c0"
35
  },
36
  {
@@ -40,13 +40,13 @@
40
  "steps": 577241,
41
  "reference_steps": 577241,
42
  "exact": true,
43
- "seconds": 625.1826185339887,
44
- "steps_per_second": 923.3158166706417,
45
  "sha256": "447c649f73bf3e1ad310a541954e942f70778c591c8fb61018c24973203c13d8"
46
  }
47
  ],
48
  "bytes": 100553,
49
  "steps": 601672,
50
  "failures": 0,
51
- "seconds": 791.9851667140028
52
  }
 
7
  "steps": 4977,
8
  "reference_steps": 4977,
9
  "exact": true,
10
+ "seconds": 6.1430282479850575,
11
+ "steps_per_second": 810.1867351224504,
12
  "sha256": "ba6e721eef8359d84ec58c46c1436c1298ac8191539adf9cc2c03ff9123583a8"
13
  },
14
  {
 
18
  "steps": 6977,
19
  "reference_steps": 6977,
20
  "exact": true,
21
+ "seconds": 8.177679147018353,
22
+ "steps_per_second": 853.1760508779402,
23
  "sha256": "d10be4d24d91d2d1100022369d8809c7be9fad154c1347f38ae74c7d59a25ee4"
24
  },
25
  {
 
29
  "steps": 12477,
30
  "reference_steps": 12477,
31
  "exact": true,
32
+ "seconds": 14.676250340009574,
33
+ "steps_per_second": 850.149030640742,
34
  "sha256": "b77a985dea3104679d73cfaf20b9c3efc72646cd177412dbec41475a7a37d5c0"
35
  },
36
  {
 
40
  "steps": 577241,
41
  "reference_steps": 577241,
42
  "exact": true,
43
+ "seconds": 685.9047773669881,
44
+ "steps_per_second": 841.5760015783526,
45
  "sha256": "447c649f73bf3e1ad310a541954e942f70778c591c8fb61018c24973203c13d8"
46
  }
47
  ],
48
  "bytes": 100553,
49
  "steps": 601672,
50
  "failures": 0,
51
+ "seconds": 715.2594515930105
52
  }
paper/runs/paper_runs_lev_sparse.json CHANGED
@@ -1,36 +1,36 @@
1
  {
2
- "sigma_bytes": 159279,
3
- "sigma_sha256": "28d63d969218e388251f3bd636866d5b135087f8b0eae76a50d1ec3127eee3f6",
4
- "r_H_bytes": 142966,
5
- "tau_star_bytes": 143069,
6
- "ser_bytes": 302620,
7
- "ser_sha256": "8e29814069246da9b10aac417cf093357201c9270cdb6a9fd782f0017145a6fc",
8
  "P_instructions": 21,
9
  "P_star_instructions": 27,
10
  "lev_info": {
11
- "layers": 33,
12
- "gates": 17869,
13
- "netlist_gates": 17873,
14
- "max_width": 8213,
15
- "total_weights": 227855459,
16
- "size": 87080,
17
- "nonzero": 119453
18
  },
19
  "lev_form": "nonzero entries, CUDA graph",
20
  "selfrep": {
21
  "generations": [
22
  {
23
  "generation": 1,
24
- "bytes": 302620,
25
- "steps": 1647743,
26
- "sha256": "8e29814069246da9b10aac417cf093357201c9270cdb6a9fd782f0017145a6fc",
27
- "seconds": 1131.3564532969904,
28
- "instantiate_seconds": 6.411356387019623,
29
  "equals_ser": true
30
  }
31
  ],
32
  "digests_coincide": true,
33
- "target_sha256": "8e29814069246da9b10aac417cf093357201c9270cdb6a9fd782f0017145a6fc",
34
- "target_bytes": 302620
35
  }
36
  }
 
1
  {
2
+ "sigma_bytes": 160240,
3
+ "sigma_sha256": "55c555bd64302190d5bde57ee0cd41b36dac5cf65066d0ed3468567a57e85fa3",
4
+ "r_H_bytes": 144891,
5
+ "tau_star_bytes": 144996,
6
+ "ser_bytes": 305508,
7
+ "ser_sha256": "c5950d3fec6bcf70e8111586a030d21b2dfa55bd69a1c7fe5f016cb06e7fb523",
8
  "P_instructions": 21,
9
  "P_star_instructions": 27,
10
  "lev_info": {
11
+ "layers": 13,
12
+ "gates": 17598,
13
+ "netlist_gates": 17598,
14
+ "max_width": 8210,
15
+ "total_weights": 124165940,
16
+ "size": 41967,
17
+ "nonzero": 75501
18
  },
19
  "lev_form": "nonzero entries, CUDA graph",
20
  "selfrep": {
21
  "generations": [
22
  {
23
  "generation": 1,
24
+ "bytes": 305508,
25
+ "steps": 1664939,
26
+ "sha256": "c5950d3fec6bcf70e8111586a030d21b2dfa55bd69a1c7fe5f016cb06e7fb523",
27
+ "seconds": 2716.608349938004,
28
+ "instantiate_seconds": 2.543904036981985,
29
  "equals_ser": true
30
  }
31
  ],
32
  "digests_coincide": true,
33
+ "target_sha256": "c5950d3fec6bcf70e8111586a030d21b2dfa55bd69a1c7fe5f016cb06e7fb523",
34
+ "target_bytes": 305508
35
  }
36
  }
paper/runs/paper_runs_lockstep.json CHANGED
@@ -1,16 +1,16 @@
1
  {
2
- "sigma_bytes": 159279,
3
- "sigma_sha256": "28d63d969218e388251f3bd636866d5b135087f8b0eae76a50d1ec3127eee3f6",
4
- "r_H_bytes": 142966,
5
- "tau_star_bytes": 143069,
6
- "ser_bytes": 302620,
7
- "ser_sha256": "8e29814069246da9b10aac417cf093357201c9270cdb6a9fd782f0017145a6fc",
8
  "P_instructions": 21,
9
  "P_star_instructions": 27,
10
  "lockstep": {
11
  "steps": 20000,
12
  "divergences": 0,
13
- "bytes": 3953,
14
- "seconds": 283.62539357400965
15
  }
16
  }
 
1
  {
2
+ "sigma_bytes": 160240,
3
+ "sigma_sha256": "55c555bd64302190d5bde57ee0cd41b36dac5cf65066d0ed3468567a57e85fa3",
4
+ "r_H_bytes": 144891,
5
+ "tau_star_bytes": 144996,
6
+ "ser_bytes": 305508,
7
+ "ser_sha256": "c5950d3fec6bcf70e8111586a030d21b2dfa55bd69a1c7fe5f016cb06e7fb523",
8
  "P_instructions": 21,
9
  "P_star_instructions": 27,
10
  "lockstep": {
11
  "steps": 20000,
12
  "divergences": 0,
13
+ "bytes": 3948,
14
+ "seconds": 1007.2267207720142
15
  }
16
  }
paper/runs/paper_runs_net.json CHANGED
@@ -1,57 +1,57 @@
1
  {
2
- "sigma_bytes": 159279,
3
- "sigma_sha256": "28d63d969218e388251f3bd636866d5b135087f8b0eae76a50d1ec3127eee3f6",
4
- "r_H_bytes": 142966,
5
- "tau_star_bytes": 143069,
6
- "ser_bytes": 302620,
7
- "ser_sha256": "8e29814069246da9b10aac417cf093357201c9270cdb6a9fd782f0017145a6fc",
8
  "P_instructions": 21,
9
  "P_star_instructions": 27,
10
  "evaluator": "the netlist of sigma, unit by unit",
11
  "net_info": {
12
- "levels": 33,
13
- "units": 17873,
14
- "entries": 50250
15
  },
16
  "selfdesc": {
17
- "bytes": 159279,
18
- "steps": 788083,
19
- "seconds": 376.54243313797633,
20
  "exact": true,
21
- "sha256": "28d63d969218e388251f3bd636866d5b135087f8b0eae76a50d1ec3127eee3f6"
22
  },
23
  "selfrep": {
24
  "generations": [
25
  {
26
  "generation": 1,
27
- "bytes": 302620,
28
- "steps": 1647743,
29
- "sha256": "8e29814069246da9b10aac417cf093357201c9270cdb6a9fd782f0017145a6fc",
30
- "seconds": 801.3725558290025,
31
- "instantiate_seconds": 0.37731249001808465,
32
  "equals_ser": true
33
  },
34
  {
35
  "generation": 2,
36
- "bytes": 302620,
37
- "steps": 1647743,
38
- "sha256": "8e29814069246da9b10aac417cf093357201c9270cdb6a9fd782f0017145a6fc",
39
- "seconds": 799.4168316709984,
40
- "instantiate_seconds": 0.8638195600069594,
41
  "equals_ser": true
42
  },
43
  {
44
  "generation": 3,
45
- "bytes": 302620,
46
- "steps": 1647743,
47
- "sha256": "8e29814069246da9b10aac417cf093357201c9270cdb6a9fd782f0017145a6fc",
48
- "seconds": 806.1291366500081,
49
- "instantiate_seconds": 1.7904530380037613,
50
  "equals_ser": true
51
  }
52
  ],
53
  "digests_coincide": true,
54
- "target_sha256": "8e29814069246da9b10aac417cf093357201c9270cdb6a9fd782f0017145a6fc",
55
- "target_bytes": 302620
56
  }
57
  }
 
1
  {
2
+ "sigma_bytes": 160240,
3
+ "sigma_sha256": "55c555bd64302190d5bde57ee0cd41b36dac5cf65066d0ed3468567a57e85fa3",
4
+ "r_H_bytes": 144891,
5
+ "tau_star_bytes": 144996,
6
+ "ser_bytes": 305508,
7
+ "ser_sha256": "c5950d3fec6bcf70e8111586a030d21b2dfa55bd69a1c7fe5f016cb06e7fb523",
8
  "P_instructions": 21,
9
  "P_star_instructions": 27,
10
  "evaluator": "the netlist of sigma, unit by unit",
11
  "net_info": {
12
+ "levels": 13,
13
+ "units": 17598,
14
+ "entries": 51132
15
  },
16
  "selfdesc": {
17
+ "bytes": 160240,
18
+ "steps": 793709,
19
+ "seconds": 1469.131092681986,
20
  "exact": true,
21
+ "sha256": "55c555bd64302190d5bde57ee0cd41b36dac5cf65066d0ed3468567a57e85fa3"
22
  },
23
  "selfrep": {
24
  "generations": [
25
  {
26
  "generation": 1,
27
+ "bytes": 305508,
28
+ "steps": 1664939,
29
+ "sha256": "c5950d3fec6bcf70e8111586a030d21b2dfa55bd69a1c7fe5f016cb06e7fb523",
30
+ "seconds": 1844.9217869749991,
31
+ "instantiate_seconds": 0.3955936379788909,
32
  "equals_ser": true
33
  },
34
  {
35
  "generation": 2,
36
+ "bytes": 305508,
37
+ "steps": 1664939,
38
+ "sha256": "c5950d3fec6bcf70e8111586a030d21b2dfa55bd69a1c7fe5f016cb06e7fb523",
39
+ "seconds": 1969.834054453997,
40
+ "instantiate_seconds": 1.5824393009825144,
41
  "equals_ser": true
42
  },
43
  {
44
  "generation": 3,
45
+ "bytes": 305508,
46
+ "steps": 1664939,
47
+ "sha256": "c5950d3fec6bcf70e8111586a030d21b2dfa55bd69a1c7fe5f016cb06e7fb523",
48
+ "seconds": 2924.216153805988,
49
+ "instantiate_seconds": 1.7982538790092804,
50
  "equals_ser": true
51
  }
52
  ],
53
  "digests_coincide": true,
54
+ "target_sha256": "c5950d3fec6bcf70e8111586a030d21b2dfa55bd69a1c7fe5f016cb06e7fb523",
55
+ "target_bytes": 305508
56
  }
57
  }
paper/runs/paper_settle.json CHANGED
@@ -8,5 +8,5 @@
8
  "wrong_after_d": 0,
9
  "wrong_after_d_minus_1": 134784,
10
  "ok": true,
11
- "seconds": 215.40857814598712
12
  }
 
8
  "wrong_after_d": 0,
9
  "wrong_after_d_minus_1": 134784,
10
  "ok": true,
11
+ "seconds": 215.41703450400382
12
  }
paper/runs/paper_throughput.json CHANGED
@@ -1,40 +1,45 @@
1
  {
2
  "reference": {
3
- "steps": 788083,
4
- "seconds": 0.21074292401317507,
5
- "steps_per_second": 3739546.6713308543
6
  },
7
  "net_cpu": {
8
  "steps": 20000,
9
- "seconds": 65.6433472300123,
10
- "steps_per_second": 304.67672420665275,
11
- "units": 17873,
12
- "entries": 50250
13
  },
14
  "net_gpu": {
15
  "steps": 20000,
16
- "seconds": 9.708932929002913,
17
- "steps_per_second": 2059.9586119557175,
18
- "units": 17873,
19
- "entries": 50250
20
  },
21
  "dense_gpu": {
22
  "steps": 20000,
23
- "seconds": 51.42633556900546,
24
- "steps_per_second": 388.9057965867192,
25
- "entries": 227855459,
26
- "nonzero": 119453,
27
- "bytes_per_step": 911421836,
28
- "bandwidth_gbs": 354.4572351561102
29
  },
30
  "graph_gpu": {
31
  "steps": 20000,
32
- "seconds": 13.181241254991619,
33
- "steps_per_second": 1517.3077871119442
34
  },
35
  "sparse_cpu": {
36
  "steps": 20000,
37
- "seconds": 89.78276209600153,
38
- "steps_per_second": 222.75990995481635
 
 
 
 
 
39
  }
40
  }
 
1
  {
2
  "reference": {
3
+ "steps": 793709,
4
+ "seconds": 0.15002341801300645,
5
+ "steps_per_second": 5290567.369496864
6
  },
7
  "net_cpu": {
8
  "steps": 20000,
9
+ "seconds": 87.65466391999507,
10
+ "steps_per_second": 228.16812141627256,
11
+ "units": 17598,
12
+ "entries": 51132
13
  },
14
  "net_gpu": {
15
  "steps": 20000,
16
+ "seconds": 6.447767465986544,
17
+ "steps_per_second": 3101.8488345779524,
18
+ "units": 17598,
19
+ "entries": 51132
20
  },
21
  "dense_gpu": {
22
  "steps": 20000,
23
+ "seconds": 27.240335542999674,
24
+ "steps_per_second": 734.2053466422765,
25
+ "entries": 124165940,
26
+ "nonzero": 75501,
27
+ "bytes_per_step": 496663760,
28
+ "bandwidth_gbs": 364.6531880754564
29
  },
30
  "graph_gpu": {
31
  "steps": 20000,
32
+ "seconds": 7.7349659229803365,
33
+ "steps_per_second": 2585.6610357623736
34
  },
35
  "sparse_cpu": {
36
  "steps": 20000,
37
+ "seconds": 20.480020295013674,
38
+ "steps_per_second": 976.5615322592944
39
+ },
40
+ "c_evaluator": {
41
+ "steps": 793709,
42
+ "seconds": 21.544317610998405,
43
+ "steps_per_second": 36840.758400015904
44
  }
45
  }
paper/runs/paper_verify.json CHANGED
@@ -1,8 +1,8 @@
1
  {
2
  "codec": {
3
  "files": 29,
4
- "bytes": 971265194,
5
- "recipe_bytes": 774245909,
6
  "roundtrip_failures": 0,
7
  "bound_failures": 0
8
  },
@@ -14,12 +14,13 @@
14
  "byte_identical": true,
15
  "deterministic": true,
16
  "round_trip": true,
17
- "bytes": 159279,
18
- "sha256": "28d63d969218e388251f3bd636866d5b135087f8b0eae76a50d1ec3127eee3f6",
19
- "header_bytes": 1024,
20
  "tensors": 11,
21
  "dtypes": [
22
  "I16",
 
23
  "I8"
24
  ],
25
  "metadata_keys": [
@@ -29,8 +30,8 @@
29
  "weight_quantization"
30
  ],
31
  "ordered_by_dtype_then_name": true,
32
- "data_offset": 1032,
33
- "header_padding": 0
34
  },
35
  "datapath": {
36
  "operand_pairs": 65536,
@@ -54,9 +55,9 @@
54
  },
55
  "lev": {
56
  "sparse_dense_agree": true,
57
- "layers": 33,
58
- "max_width": 8213,
59
- "total_weights": 227855459
60
  },
61
- "seconds": 455.25231027801055
62
  }
 
1
  {
2
  "codec": {
3
  "files": 29,
4
+ "bytes": 971266155,
5
+ "recipe_bytes": 774247834,
6
  "roundtrip_failures": 0,
7
  "bound_failures": 0
8
  },
 
14
  "byte_identical": true,
15
  "deterministic": true,
16
  "round_trip": true,
17
+ "bytes": 160240,
18
+ "sha256": "55c555bd64302190d5bde57ee0cd41b36dac5cf65066d0ed3468567a57e85fa3",
19
+ "header_bytes": 1032,
20
  "tensors": 11,
21
  "dtypes": [
22
  "I16",
23
+ "I32",
24
  "I8"
25
  ],
26
  "metadata_keys": [
 
30
  "weight_quantization"
31
  ],
32
  "ordered_by_dtype_then_name": true,
33
+ "data_offset": 1040,
34
+ "header_padding": 6
35
  },
36
  "datapath": {
37
  "operand_pairs": 65536,
 
55
  },
56
  "lev": {
57
  "sparse_dense_agree": true,
58
+ "layers": 13,
59
+ "max_width": 8210,
60
+ "total_weights": 124165940
61
  },
62
+ "seconds": 282.2581712300016
63
  }
paper/runs/paper_verify_times.json CHANGED
@@ -1,83 +1,75 @@
1
  {
2
- "tier": 2,
3
- "total_seconds": 1010.3442714390112,
4
  "failures": 0,
5
  "checks": {
6
  "check_device.py": {
7
  "ok": true,
8
- "seconds": 0.10434826600248925
9
  },
10
  "check_framing.py": {
11
  "ok": true,
12
- "seconds": 0.21229737100657076
13
  },
14
- "check_optimal.py": {
15
  "ok": true,
16
- "seconds": 2.595225027995184
17
  },
18
- "check_steps.py": {
19
  "ok": true,
20
- "seconds": 2.821015962981619
21
  },
22
  "check_codec.py": {
23
  "ok": true,
24
- "seconds": 3.9655103610130027
25
  },
26
- "check_environment.py": {
27
  "ok": true,
28
- "seconds": 4.191813389974413
29
  },
30
  "check_sigma.py": {
31
  "ok": true,
32
- "seconds": 4.792667137022363
33
  },
34
- "check_ternarity.py": {
35
  "ok": true,
36
- "seconds": 5.005751873017289
37
  },
38
  "check_host.py": {
39
  "ok": true,
40
- "seconds": 11.468662321014563
41
- },
42
- "check_interp.py": {
43
- "ok": true,
44
- "seconds": 17.97328525298508
45
- },
46
- "check_lev.py": {
47
- "ok": true,
48
- "seconds": 23.672813724988373
49
  },
50
- "check_total.py": {
51
  "ok": true,
52
- "seconds": 86.6947071730101
53
  },
54
- "check_dependence.py": {
55
  "ok": true,
56
- "seconds": 194.25723008302157
57
  },
58
- "check_settle.py": {
59
  "ok": true,
60
- "seconds": 216.06774028399377
61
  },
62
- "paper_runs.py reference": {
63
  "ok": true,
64
- "seconds": 2.4215686210081913
65
  },
66
- "hierarchy.py": {
67
  "ok": true,
68
- "seconds": 71.13275085098576
69
  },
70
- "hosted_constructor.py": {
71
  "ok": true,
72
- "seconds": 202.79081128098187
73
  },
74
- "organism.py --net-generations 1": {
75
  "ok": true,
76
- "seconds": 649.4290165620041
77
  },
78
- "check_family_gate.py": {
79
  "ok": true,
80
- "seconds": 794.268618948001
81
  }
82
  }
83
  }
 
1
  {
2
+ "tier": 1,
3
+ "total_seconds": 216.7869739710004,
4
  "failures": 0,
5
  "checks": {
6
  "check_device.py": {
7
  "ok": true,
8
+ "seconds": 0.09231512798578478
9
  },
10
  "check_framing.py": {
11
  "ok": true,
12
+ "seconds": 0.17911755401291884
13
  },
14
+ "check_steps.py": {
15
  "ok": true,
16
+ "seconds": 2.2958479310036637
17
  },
18
+ "check_optimal.py": {
19
  "ok": true,
20
+ "seconds": 3.6308434630045667
21
  },
22
  "check_codec.py": {
23
  "ok": true,
24
+ "seconds": 3.947353489988018
25
  },
26
+ "fanin2.py": {
27
  "ok": true,
28
+ "seconds": 4.518770915979985
29
  },
30
  "check_sigma.py": {
31
  "ok": true,
32
+ "seconds": 5.175890774000436
33
  },
34
+ "check_environment.py": {
35
  "ok": true,
36
+ "seconds": 5.701369293004973
37
  },
38
  "check_host.py": {
39
  "ok": true,
40
+ "seconds": 6.32508270299877
 
 
 
 
 
 
 
 
41
  },
42
+ "check_ternarity.py": {
43
  "ok": true,
44
+ "seconds": 8.431314966001082
45
  },
46
+ "check_host_family.py": {
47
  "ok": true,
48
+ "seconds": 10.549088745989138
49
  },
50
+ "check_interp.py": {
51
  "ok": true,
52
+ "seconds": 14.438120546983555
53
  },
54
+ "check_lev.py": {
55
  "ok": true,
56
+ "seconds": 15.03564253100194
57
  },
58
+ "check_total.py": {
59
  "ok": true,
60
+ "seconds": 96.9719200199761
61
  },
62
+ "redundant.py build": {
63
  "ok": true,
64
+ "seconds": 129.28355920300237
65
  },
66
+ "check_dependence.py": {
67
  "ok": true,
68
+ "seconds": 194.36693952101632
69
  },
70
+ "check_settle.py": {
71
  "ok": true,
72
+ "seconds": 216.78103429600014
73
  }
74
  }
75
  }
paper/universal_construction_ternary.pdf CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:f2f30e05325609d023c93cfdcb5fa83fa5182984e4e361c0b6b123d6c1271bdf
3
- size 320044
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b7d5d0db83aea194995f36ddcbb899845b6a449a4fee151b585480f5d3a9b154
3
+ size 342177
paper/universal_construction_ternary.tex CHANGED
The diff for this file is too large to render. See raw diff
 
src/check_c.py CHANGED
@@ -116,7 +116,8 @@ def levelize(n, units, nxt):
116
  return (n, out_units, [base[d] + i for i in range(n)],
117
  {"depth": d, "rows": sum(len(L) for L in layers[1:]),
118
  "identity_rows": sum(1 for L in layers[1:] for kind, _ in L if kind == "copy"),
119
- "max_width": max(len(L) for L in layers[1:])})
 
120
 
121
 
122
  def framed_parts(s: bytes):
@@ -133,7 +134,7 @@ def main() -> int:
133
  from selfrep import M_P, M_STAR, describe, field, ser, read_host
134
  work = tempfile.mkdtemp(prefix="netlist_eval_")
135
  exe = os.path.join(work, "netlist_eval")
136
- subprocess.run([args.cc, "-O3", "-march=native", "-o", exe,
137
  os.path.join(SRC, "netlist_eval.c")], check=True)
138
  J = lambda *p: os.path.join(work, *p)
139
 
 
116
  return (n, out_units, [base[d] + i for i in range(n)],
117
  {"depth": d, "rows": sum(len(L) for L in layers[1:]),
118
  "identity_rows": sum(1 for L in layers[1:] for kind, _ in L if kind == "copy"),
119
+ "max_width": max(len(L) for L in layers[1:]),
120
+ "layer_sizes": [len(L) for L in layers[1:]]})
121
 
122
 
123
  def framed_parts(s: bytes):
 
134
  from selfrep import M_P, M_STAR, describe, field, ser, read_host
135
  work = tempfile.mkdtemp(prefix="netlist_eval_")
136
  exe = os.path.join(work, "netlist_eval")
137
+ subprocess.run([args.cc, "-O3", "-march=native", "-fopenmp", "-o", exe,
138
  os.path.join(SRC, "netlist_eval.c")], check=True)
139
  J = lambda *p: os.path.join(work, *p)
140
 
src/check_family.py CHANGED
@@ -1,5 +1,10 @@
1
- """The universal constructor emits every machine of the artifact, byte for byte."""
2
- import hashlib, json, os, sys, time
 
 
 
 
 
3
  sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
4
  from selfrep import describe, run_reference, M_P
5
 
@@ -19,26 +24,38 @@ def files():
19
  return out
20
 
21
 
 
 
 
 
 
 
 
 
 
22
  def main() -> int:
23
- rec, bad, tot_b, tot_s = [], 0, 0, 0
 
 
24
  t0 = time.perf_counter()
25
- for p in files():
26
- data = open(p, "rb").read()
27
- r = describe(data)
28
- out, steps = run_reference(M_P, r, expect=data)
29
- ok = out == data
30
- bad += not ok
31
- tot_b += len(out); tot_s += steps
32
- rec.append({"file": os.path.basename(p), "bytes": len(out), "recipe": len(r),
33
- "steps": steps, "exact": ok,
34
- "sha256": hashlib.sha256(out).hexdigest()})
35
- print(f" {'OK ' if ok else 'FAIL'} {os.path.basename(p):<44} "
36
- f"{len(out):>10,} B {steps:>12,} steps", flush=True)
 
37
  dt = time.perf_counter() - t0
38
  print(f"{len(rec)} machines, {tot_b:,} bytes emitted in {tot_s:,} steps "
39
- f"({dt/60:.1f} min); failures: {bad}")
40
- json.dump({"machines": rec, "bytes": tot_b, "steps": tot_s, "failures": bad,
41
- "seconds": dt},
42
  open(runs_path("paper_runs_family.json"), "w"), indent=1)
43
  return 0 if bad == 0 else 1
44
 
 
1
+ """The universal constructor emits every machine of the artifact, byte for byte.
2
+
3
+ The machines are run on the integer reference, one process per machine.
4
+
5
+ python src/check_family.py [--jobs N]
6
+ """
7
+ import argparse, concurrent.futures as cf, hashlib, json, os, sys, time
8
  sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
9
  from selfrep import describe, run_reference, M_P
10
 
 
24
  return out
25
 
26
 
27
+ def one(p):
28
+ data = open(p, "rb").read()
29
+ r = describe(data)
30
+ out, steps = run_reference(M_P, r, expect=data)
31
+ return {"file": os.path.basename(p), "bytes": len(out), "recipe": len(r),
32
+ "steps": steps, "exact": out == data,
33
+ "sha256": hashlib.sha256(out).hexdigest()}
34
+
35
+
36
  def main() -> int:
37
+ ap = argparse.ArgumentParser()
38
+ ap.add_argument("--jobs", type=int, default=os.cpu_count() or 1)
39
+ args = ap.parse_args()
40
  t0 = time.perf_counter()
41
+ paths = files()
42
+ # the largest machines first, so the pool is not left waiting on one of them
43
+ order = sorted(paths, key=os.path.getsize, reverse=True)
44
+ with cf.ProcessPoolExecutor(max_workers=args.jobs) as ex:
45
+ got = dict(zip(order, ex.map(one, order)))
46
+ rec = [got[p] for p in paths]
47
+ for r in rec:
48
+ print(f" {'OK ' if r['exact'] else 'FAIL'} {r['file']:<44} "
49
+ f"{r['bytes']:>10,} B {r['steps']:>12,} steps", flush=True)
50
+ bad = sum(not r["exact"] for r in rec)
51
+ tot_b = sum(r["bytes"] for r in rec)
52
+ tot_s = sum(r["steps"] for r in rec)
53
+ tot_r = sum(r["recipe"] for r in rec)
54
  dt = time.perf_counter() - t0
55
  print(f"{len(rec)} machines, {tot_b:,} bytes emitted in {tot_s:,} steps "
56
+ f"from {tot_r:,} bytes of recipe ({dt/60:.1f} min); failures: {bad}")
57
+ json.dump({"machines": rec, "bytes": tot_b, "steps": tot_s,
58
+ "recipe_bytes": tot_r, "failures": bad, "seconds": dt},
59
  open(runs_path("paper_runs_family.json"), "w"), indent=1)
60
  return 0 if bad == 0 else 1
61
 
src/check_framing.py CHANGED
@@ -1,6 +1,6 @@
1
  """The framing maps ser and inst: round trip, injectivity, and rejection.
2
 
3
- Lemma 2.16 of the paper turns on two properties of Definition 2.14: that the
4
  length fields make the decomposition of ser(Omega) unique, so that ser is
5
  injective and inst inverts it, and that inst is partial, rejecting a string that
6
  is not a framed instance, in place of returning some other triple. Both are
 
1
  """The framing maps ser and inst: round trip, injectivity, and rejection.
2
 
3
+ Lemma 2.14 of the paper turns on two properties of Definition 2.12: that the
4
  length fields make the decomposition of ser(Omega) unique, so that ser is
5
  injective and inst inverts it, and that inst is partial, rejecting a string that
6
  is not a framed instance, in place of returning some other triple. Both are
src/check_host.py CHANGED
@@ -7,7 +7,7 @@ a halt at p = 255. The clauses are transcribed here independently of
7
  selfrep.run_reference and the two are compared, with the program counter swept
8
  over every value so the wrapped fetches at the top of memory are covered.
9
 
10
- Proposition 3.8 asserts in addition that a halted state is a fixed point of the
11
  transition, because every architectural write is gated by the negation of the
12
  halt bit. That is checked on the levelized map itself, not on the reference.
13
  """
 
7
  selfrep.run_reference and the two are compared, with the program counter swept
8
  over every value so the wrapped fetches at the top of memory are covered.
9
 
10
+ Proposition 3.10 asserts in addition that a halted state is a fixed point of the
11
  transition, because every architectural write is gated by the negation of the
12
  halt bit. That is checked on the levelized map itself, not on the reference.
13
  """
src/check_host_family.py CHANGED
@@ -37,7 +37,7 @@ def main() -> int:
37
  from check_c import parse_sigma, write_flat
38
  work = tempfile.mkdtemp(prefix="host_family_")
39
  exe = os.path.join(work, "netlist_eval")
40
- subprocess.run([args.cc, "-O3", "-march=native", "-o", exe,
41
  os.path.join(REPO, "src", "netlist_eval.c")], check=True)
42
  rows, ok = [], True
43
  for A in range(lo, hi + 1):
 
37
  from check_c import parse_sigma, write_flat
38
  work = tempfile.mkdtemp(prefix="host_family_")
39
  exe = os.path.join(work, "netlist_eval")
40
+ subprocess.run([args.cc, "-O3", "-march=native", "-fopenmp", "-o", exe,
41
  os.path.join(REPO, "src", "netlist_eval.c")], check=True)
42
  rows, ok = [], True
43
  for A in range(lo, hi + 1):
src/fanin2.py CHANGED
@@ -1,14 +1,18 @@
1
  """Bringing a ternary threshold netlist to effective fan-in at most two.
2
 
3
  The interpreter evaluates records with two input slots, so a netlist it is to
4
- interpret must have units of fan-in at most two. Every unit built by the
5
- constructions of this artifact is a disjunction, a conjunction of literals, or
6
- a joint denial, and a unit of each shape on k > 2 inputs becomes a balanced
7
- binary tree of k - 1 two-input units: a literal is carried by the sign of its
8
- weight, never by a unit of its own, so a leaf unit is a conjunction of two
9
- literals and every inner unit a conjunction or disjunction of two signals. The
10
- rewriting preserves the computed function exactly, which is checked against
11
- the original netlist on random inputs.
 
 
 
 
12
  """
13
  from __future__ import annotations
14
 
@@ -21,50 +25,86 @@ from matrix8 import Net
21
 
22
 
23
  def classify(ins: List[Tuple[str, int]], bias: int) -> str:
24
- """Which of the three shapes a unit has, by its weights and bias."""
 
25
  pos = [s for s, w in ins if w == 1]
26
  neg = [s for s, w in ins if w == -1]
27
  if len(pos) + len(neg) != len(ins):
28
  return "other"
29
- if bias == -1 and not neg:
 
30
  return "or"
31
- if bias == -len(pos):
32
  return "and" # conjunction of literals
33
- if bias == 0 and not pos:
34
- return "nor"
35
- return "other"
36
 
37
 
38
- def _tree(net: Net, tag: str, kind: str, items: List[Tuple[str, int]]) -> str:
 
 
 
 
 
 
39
  """A balanced binary tree of k - 1 two-input units over k literals.
40
 
41
  `items` are (signal, weight) pairs; weight -1 marks a negated literal,
42
- which a unit reads with weight -1, so negation costs no unit. An OR tree
43
- takes positive literals only. Every unit of the tree outputs a positive
44
- signal, so the levels above the leaves combine signals.
 
45
  """
46
  level = list(items)
47
- k = 0
48
  while len(level) > 1:
49
  nxt = []
50
  for i in range(0, len(level) - 1, 2):
51
  (a, wa), (b, wb) = level[i], level[i + 1]
52
- name = f"{tag}#{kind}{k}"
53
- k += 1
 
54
  if kind == "or":
55
- assert wa == 1 and wb == 1
56
- nxt.append((net.g(name, [(a, 1), (b, 1)], -1), 1))
57
  else:
58
- pos = (wa == 1) + (wb == 1)
59
  nxt.append((net.g(name, [(a, wa), (b, wb)], -pos), 1))
60
  if len(level) % 2:
61
  nxt.append(level[-1])
62
  level = nxt
63
  s, w = level[0]
64
- assert w == 1, "a tree over k > 2 literals ends in a unit"
 
 
 
65
  return s
66
 
67
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
  def expand(net: Net, inputs: List[str], outputs: List[str]
69
  ) -> Tuple[Net, List[str], List[str]]:
70
  """An equivalent netlist whose units have effective fan-in at most two."""
@@ -99,10 +139,13 @@ def expand(net: Net, inputs: List[str], outputs: List[str]
99
  continue
100
  if kind in ("or", "and"):
101
  sub[g] = _tree(out, g, kind, src)
102
- elif kind == "nor": # a conjunction of negated literals
103
- sub[g] = _tree(out, g, "and", [(s, -1) for s, _ in src])
 
 
 
104
  else:
105
- raise ValueError(f"unit {g} is none of the three shapes: "
106
  f"{src[:4]} bias {bias}")
107
  return out, list(inputs), [sub[s] for s in outputs]
108
 
@@ -119,3 +162,59 @@ def check(net, inputs, outputs, trials: int = 64, seed: int = 5) -> bool:
119
  a = gate_by_gate(net, inputs, outputs, V)
120
  b = gate_by_gate(two, tin, tout, V)
121
  return bool((a == b).all())
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  """Bringing a ternary threshold netlist to effective fan-in at most two.
2
 
3
  The interpreter evaluates records with two input slots, so a netlist it is to
4
+ interpret must have units of fan-in at most two. Every ternary unit is a
5
+ threshold over its literals: H(sum_P x - sum_N x + b) is 1 exactly when at
6
+ least t = |N| - b of the literals x_i (i in P) and not x_i (i in N) are true.
7
+ A disjunction (t = 1) or a conjunction (t = k) of k > 2 literals becomes a
8
+ balanced binary tree of k - 1 two-input units, a literal carried by the sign
9
+ of its weight and never by a unit of its own, so a leaf unit is a conjunction
10
+ or disjunction of two literals and every inner unit one of two signals. Any
11
+ other threshold, which in the host is a majority of three literals or two of
12
+ four, follows the recursion T(t, x_1..x_k) = T(t, x_2..x_k) or (x_1 and
13
+ T(t-1, x_2..x_k)), four units for a majority of three and eight for two of
14
+ four. The rewriting preserves the computed function exactly, which is checked
15
+ against the original netlist on random inputs.
16
  """
17
  from __future__ import annotations
18
 
 
25
 
26
 
27
  def classify(ins: List[Tuple[str, int]], bias: int) -> str:
28
+ """Which shape a unit has, by its weights and bias: a disjunction of
29
+ literals, a conjunction of literals, or a threshold of t of its k literals."""
30
  pos = [s for s, w in ins if w == 1]
31
  neg = [s for s, w in ins if w == -1]
32
  if len(pos) + len(neg) != len(ins):
33
  return "other"
34
+ t = len(neg) - bias
35
+ if t == 1:
36
  return "or"
37
+ if t == len(ins):
38
  return "and" # conjunction of literals
39
+ return "threshold"
 
 
40
 
41
 
42
+ def threshold_of(ins: List[Tuple[str, int]], bias: int) -> int:
43
+ """The number t of true literals the unit requires."""
44
+ return sum(1 for _, w in ins if w == -1) - bias
45
+
46
+
47
+ def _tree(net: Net, tag: str, kind: str, items: List[Tuple[str, int]],
48
+ counter: List[int] = None) -> str:
49
  """A balanced binary tree of k - 1 two-input units over k literals.
50
 
51
  `items` are (signal, weight) pairs; weight -1 marks a negated literal,
52
+ which a unit reads with weight -1, so negation costs no unit: a
53
+ disjunction of two literals is H(+-a +-b + |N| - 1) and a conjunction
54
+ H(+-a +-b - |P|). Every unit of the tree outputs a positive signal, so
55
+ the levels above the leaves combine signals.
56
  """
57
  level = list(items)
58
+ counter = counter if counter is not None else [0]
59
  while len(level) > 1:
60
  nxt = []
61
  for i in range(0, len(level) - 1, 2):
62
  (a, wa), (b, wb) = level[i], level[i + 1]
63
+ name = f"{tag}#{kind}{counter[0]}"
64
+ counter[0] += 1
65
+ pos = (wa == 1) + (wb == 1)
66
  if kind == "or":
67
+ nxt.append((net.g(name, [(a, wa), (b, wb)], (2 - pos) - 1), 1))
 
68
  else:
 
69
  nxt.append((net.g(name, [(a, wa), (b, wb)], -pos), 1))
70
  if len(level) % 2:
71
  nxt.append(level[-1])
72
  level = nxt
73
  s, w = level[0]
74
+ if w != 1: # a single negated literal: one unit
75
+ name = f"{tag}#{kind}{counter[0]}"
76
+ counter[0] += 1
77
+ return net.g(name, [(s, -1)], 0)
78
  return s
79
 
80
 
81
+ def _thresh(net: Net, tag: str, t: int, items: List[Tuple[str, int]],
82
+ counter: List[int]) -> Tuple[str, int]:
83
+ """t of the k literals, by T(t, x_1..x_k) = T(t, rest) or (x_1 and T(t-1, rest)).
84
+
85
+ Returns a (signal, weight) pair: a positive signal, or a constant."""
86
+ k = len(items)
87
+ if t <= 0:
88
+ return ("#1", 1)
89
+ if t > k:
90
+ return ("#0", 1)
91
+ if k == 1:
92
+ return items[0]
93
+ if t == 1:
94
+ return (_tree(net, tag, "or", items, counter), 1)
95
+ if t == k:
96
+ return (_tree(net, tag, "and", items, counter), 1)
97
+ x, rest = items[0], items[1:]
98
+ a = _thresh(net, tag, t, rest, counter)
99
+ b = _thresh(net, tag, t - 1, rest, counter)
100
+ name = f"{tag}#and{counter[0]}"
101
+ counter[0] += 1
102
+ c = (net.g(name, [x, b], -((x[1] == 1) + 1)), 1)
103
+ name = f"{tag}#or{counter[0]}"
104
+ counter[0] += 1
105
+ return (net.g(name, [a, c], -1), 1)
106
+
107
+
108
  def expand(net: Net, inputs: List[str], outputs: List[str]
109
  ) -> Tuple[Net, List[str], List[str]]:
110
  """An equivalent netlist whose units have effective fan-in at most two."""
 
139
  continue
140
  if kind in ("or", "and"):
141
  sub[g] = _tree(out, g, kind, src)
142
+ elif kind == "threshold":
143
+ assert len(src) <= 6, f"unit {g}: a threshold of {len(src)} literals"
144
+ sig, w = _thresh(out, g, threshold_of(ins, bias), src, [0])
145
+ assert w == 1
146
+ sub[g] = sig
147
  else:
148
+ raise ValueError(f"unit {g} carries a weight outside {{-1, 0, 1}}: "
149
  f"{src[:4]} bias {bias}")
150
  return out, list(inputs), [sub[s] for s in outputs]
151
 
 
162
  a = gate_by_gate(net, inputs, outputs, V)
163
  b = gate_by_gate(two, tin, tout, V)
164
  return bool((a == b).all())
165
+
166
+
167
+ def main() -> int:
168
+ """The rewriting on the host and the interpreter, and on every ternary unit
169
+ of three to five inputs with every bias, against the truth tables."""
170
+ import itertools
171
+ import json
172
+ import time
173
+ import torch
174
+ from check_lev import gate_by_gate
175
+ from host_family import build
176
+ from reflect import Cfg, build_net
177
+ REPO = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
178
+ t0 = time.perf_counter()
179
+ tot = bad = 0
180
+ for k in (3, 4, 5):
181
+ names = [f"i{j}" for j in range(k)]
182
+ V = torch.tensor(list(itertools.product((0.0, 1.0), repeat=k)))
183
+ for signs in itertools.product((1, -1), repeat=k):
184
+ for bias in range(-k - 1, k + 2):
185
+ n1 = Net()
186
+ n1.g("u", [(names[j], signs[j]) for j in range(k)], bias)
187
+ e, _, o = expand(n1, names, ["u"])
188
+ a = gate_by_gate(n1, names, ["u"], V)
189
+ if o[0] in ("#0", "#1"):
190
+ b = torch.full_like(a, 1.0 if o[0] == "#1" else 0.0)
191
+ else:
192
+ b = gate_by_gate(e, names, o, V)
193
+ tot += 1
194
+ bad += not bool((a == b).all())
195
+ print(f" every ternary unit of 3 to 5 inputs with every bias, {tot} units, against "
196
+ f"its truth table: {'all exact' if bad == 0 else f'{bad} FAILED'}")
197
+ rec = {"small_units": tot, "small_unit_failures": bad, "netlists": {}}
198
+ for label, (net, inp, out) in (("N_host", build(8)), ("N_U", build_net(Cfg()))):
199
+ two, _, _ = expand(net, inp, out)
200
+ ok = check(net, inp, out, trials=32)
201
+ shapes = {}
202
+ for ins, b in net.gates.values():
203
+ if len(ins) > 2:
204
+ shapes[classify(ins, b)] = shapes.get(classify(ins, b), 0) + 1
205
+ rec["netlists"][label] = {"units": len(net.gates), "units_fanin2": len(two.gates),
206
+ "shapes_above_two": shapes, "agrees_on_random_inputs": ok}
207
+ bad += not ok
208
+ print(f" {label}: {len(net.gates):,} units become {len(two.gates):,}; shapes above "
209
+ f"fan-in two {shapes}; agrees with the original on 32 random states: {ok}")
210
+ rec["seconds"] = time.perf_counter() - t0
211
+ rec["ok"] = bad == 0
212
+ d = os.path.join(REPO, "paper", "runs")
213
+ os.makedirs(d, exist_ok=True)
214
+ json.dump(rec, open(os.path.join(d, "paper_fanin2.json"), "w"), indent=1)
215
+ print("FAN-IN TWO:", "PASS" if bad == 0 else "FAIL")
216
+ return 0 if bad == 0 else 1
217
+
218
+
219
+ if __name__ == "__main__":
220
+ sys.exit(main())
src/hosted_constructor.py CHANGED
@@ -2,7 +2,7 @@
2
 
3
  Section 7 of the paper interprets stored netlists; this module stores the
4
  paper's own construction. A microprogram of records implements the SUBLEQ
5
- transducer of Definitions 2.9 and 3.1 over a 128-byte memory, with the tape,
6
  the output word, the head and the write pointer all held in signals of the
7
  interpreter, and runs the constructor P on a recipe. One pass of the record
8
  region is one SUBLEQ step: fetch, subtract, write back, apply the device,
@@ -60,7 +60,7 @@ def image128() -> List[int]:
60
 
61
 
62
  def reference128(mem0: List[int], tape: bytes, max_steps: int = 1 << 22):
63
- """The transducer of Definitions 2.9 and 3.1 on a 128-byte memory."""
64
  mem = list(mem0)
65
  out = bytearray()
66
  h = 0
@@ -365,7 +365,7 @@ def build_microprogram(cfg, mem_base, tape_base, out_base, tape_len,
365
 
366
 
367
  def step128(mem, pc, tape, h, out, wp):
368
- """One step of the transducer of Definitions 2.9 and 3.1 on a 128-byte
369
  memory whose tape is the whole tape region: the SUBLEQ instruction, then
370
  the write, read, rewind and clear clauses of the device."""
371
  A = mem[pc % MEM_BYTES]
 
2
 
3
  Section 7 of the paper interprets stored netlists; this module stores the
4
  paper's own construction. A microprogram of records implements the SUBLEQ
5
+ transducer of Definitions 2.8 and 3.1 over a 128-byte memory, with the tape,
6
  the output word, the head and the write pointer all held in signals of the
7
  interpreter, and runs the constructor P on a recipe. One pass of the record
8
  region is one SUBLEQ step: fetch, subtract, write back, apply the device,
 
60
 
61
 
62
  def reference128(mem0: List[int], tape: bytes, max_steps: int = 1 << 22):
63
+ """The transducer of Definitions 2.8 and 3.1 on a 128-byte memory."""
64
  mem = list(mem0)
65
  out = bytearray()
66
  h = 0
 
365
 
366
 
367
  def step128(mem, pc, tape, h, out, wp):
368
+ """One step of the transducer of Definitions 2.8 and 3.1 on a 128-byte
369
  memory whose tape is the whole tape region: the SUBLEQ instruction, then
370
  the write, read, rewind and clear clauses of the device."""
371
  A = mem[pc % MEM_BYTES]
src/netlist_eval.c CHANGED
@@ -21,22 +21,34 @@
21
  * E, then v biases, v fan-ins, E (index, weight) pairs and n next-state
22
  * indices, all little-endian int32. For the host family the state is the A
23
  * counter bits, the halt bit and 2^A words of A bits, most significant bit
24
- * first, and A is recovered from n = A + 1 + A 2^A. MEM holds 2^A words of
25
- * ceil(A/8) little-endian bytes. The device cells are the top seven words, a
26
- * request fires on the value 1, and an emission writes the low byte of R_out.
 
 
 
 
 
27
  */
28
  #include <stdint.h>
29
  #include <stdio.h>
30
  #include <stdlib.h>
31
  #include <string.h>
 
 
 
32
 
33
  static int n, v, E;
34
  static int *bias, *fanin, *pairs, *nxt, *start, *kind;
 
 
 
 
35
  static uint64_t *tt;
36
  static uint8_t *sig;
37
  static uint64_t *sig64;
38
 
39
- static int A = 8;
40
  static uint32_t SZ = 256, MASK = 255, SIGN = 128;
41
  static uint32_t C_WR, C_EOT, C_RW, C_RD, R_IN, R_OUT, HALT_PC;
42
 
@@ -92,20 +104,57 @@ static void load_net(const char *path)
92
  else if (bias[j] == neg - 1) kind[j] = K_OR;
93
  else { kind[j] = K_GEN; gen++; }
94
  }
95
- for (int a = 3; a < 31; a++)
96
- if ((long)a + 1 + (long)a * (1L << a) == n) { set_width(a); break; }
97
- fprintf(stderr, "net: %d state bits, %d units, %d edges, %d generic units, A = %d\n",
98
- n, v, E, gen, A);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
99
  }
100
 
101
  static void net_step(const uint8_t *s, uint8_t *o)
102
  {
103
  memcpy(sig, s, (size_t)n);
104
- for (int j = 0; j < v; j++) {
105
- int acc = bias[j];
106
- const int *p = pairs + 2 * start[j];
107
- for (int e = 0, k = fanin[j]; e < k; e++) acc += p[2 * e + 1] * sig[p[2 * e]];
108
- sig[n + j] = acc >= 0;
 
 
 
109
  }
110
  for (int i = 0; i < n; i++) {
111
  int k = nxt[i];
@@ -187,22 +236,37 @@ static void dev_apply(Dev *d, uint32_t *M)
187
  M[C_WR] = 0; M[C_RD] = 0; M[C_RW] = 0;
188
  }
189
 
190
- static uint32_t get_word(const uint8_t *s, uint32_t j)
 
 
191
  {
192
  uint32_t x = 0;
193
- const uint8_t *b = s + A + 1 + (size_t)A * j;
194
  for (int k = 0; k < A; k++) x = (x << 1) | b[k];
195
  return x;
196
  }
 
 
 
 
 
 
 
 
 
 
 
197
  static void set_word(uint8_t *s, uint32_t j, uint32_t val)
198
  {
199
- uint8_t *b = s + A + 1 + (size_t)A * j;
200
- for (int k = 0; k < A; k++) b[k] = (uint8_t)((val >> (A - 1 - k)) & 1);
 
 
201
  }
202
- static uint32_t get_pc(const uint8_t *s)
203
  {
204
  uint32_t x = 0;
205
- for (int k = 0; k < A; k++) x = (x << 1) | s[k];
206
  return x;
207
  }
208
 
@@ -255,8 +319,9 @@ static int cmd_rand(long N)
255
  uint32_t *M = calloc(SZ, 4);
256
  long bad = 0, tested = 0, fixed_bad = 0, latch_bad = 0;
257
  for (long b = 0; b * 64 < N; b++) {
258
- for (int i = 0; i < n; i++) s[i] = xr();
259
  s[A] = 0;
 
260
  net_step64(s, o);
261
  for (int l = 0; l < 64; l++) {
262
  uint32_t pc = 0;
@@ -267,21 +332,25 @@ static int cmd_rand(long N)
267
  M[j] = x;
268
  }
269
  ref_step(M, &pc);
270
- uint32_t npc = 0;
271
  int ok = 1;
272
- for (int k = 0; k < A; k++) npc = (npc << 1) | (uint32_t)(o[k] >> l & 1);
273
- if (npc != pc) ok = 0;
274
- for (uint32_t j = 0; j < SZ && ok; j++) {
275
- uint32_t x = 0;
276
- for (int k = 0; k < A; k++) x = (x << 1) | (uint32_t)(o[A + 1 + (size_t)A * j + k] >> l & 1);
277
- if (x != M[j]) ok = 0;
 
 
 
 
 
278
  }
279
- if ((int)(o[A] >> l & 1) != (pc == HALT_PC)) latch_bad++;
280
  bad += !ok;
281
  tested++;
282
  }
283
- for (int i = 0; i < n; i++) s[i] = xr();
284
  s[A] = ~0ull;
 
285
  net_step64(s, o);
286
  for (int i = 0; i < n; i++) if (s[i] != o[i]) { fixed_bad++; break; }
287
  }
@@ -311,9 +380,12 @@ static int cmd_run(const char *memp, const char *tapep, const char *outp, const
311
  if (use_net) { net_step(s, y); halt_n = y[A]; net_dev_apply(&dn, y); uint8_t *t = s; s = y; y = t; }
312
  steps++;
313
  if (use_ref && use_net) {
314
- int ok = get_pc(s) == pc && halt_n == halt_r && dr.h == dn.h && dr.olen == dn.olen &&
315
  (dr.olen == 0 || dr.out[dr.olen - 1] == dn.out[dn.olen - 1]);
316
- for (uint32_t j = 0; j < SZ && ok; j++) ok = get_word(s, j) == M[j];
 
 
 
317
  if (!ok) { printf("lockstep divergence at step %ld\n", steps); return 1; }
318
  }
319
  if ((use_ref && halt_r) || (!use_ref && halt_n)) { halted = 1; break; }
 
21
  * E, then v biases, v fan-ins, E (index, weight) pairs and n next-state
22
  * indices, all little-endian int32. For the host family the state is the A
23
  * counter bits, the halt bit and 2^A words of A bits, most significant bit
24
+ * first, and A is recovered from n = A + 1 + A 2^A. For the amplified host of
25
+ * Section 6.3 the state is R copies of that, copy c occupying the block
26
+ * c n0 .. (c+1) n0 - 1, and (R, A) is recovered from n = R (A + 1 + A 2^A) with
27
+ * the smallest R; the device reads each bit of a cell as the majority of its
28
+ * copies and writes every copy, and rand replicates each random state and
29
+ * checks every copy of the result. MEM holds 2^A words of ceil(A/8)
30
+ * little-endian bytes. The device cells are the top seven words, a request
31
+ * fires on the value 1, and an emission writes the low byte of R_out.
32
  */
33
  #include <stdint.h>
34
  #include <stdio.h>
35
  #include <stdlib.h>
36
  #include <string.h>
37
+ #ifdef _OPENMP
38
+ #include <omp.h>
39
+ #endif
40
 
41
  static int n, v, E;
42
  static int *bias, *fanin, *pairs, *nxt, *start, *kind;
43
+ /* units grouped by depth: level l holds order[lstart[l] .. lstart[l+1]); units of
44
+ * one level read no unit of the same level, so a level is evaluated in parallel
45
+ * when the netlist is large enough for the threads to pay */
46
+ static int *order, *lstart, nlev, parallel;
47
  static uint64_t *tt;
48
  static uint8_t *sig;
49
  static uint64_t *sig64;
50
 
51
+ static int A = 8, rep = 1, n0;
52
  static uint32_t SZ = 256, MASK = 255, SIGN = 128;
53
  static uint32_t C_WR, C_EOT, C_RW, C_RD, R_IN, R_OUT, HALT_PC;
54
 
 
104
  else if (bias[j] == neg - 1) kind[j] = K_OR;
105
  else { kind[j] = K_GEN; gen++; }
106
  }
107
+ {
108
+ int *depth = calloc((size_t)(n + v), 4);
109
+ int dmax = 0;
110
+ for (int j = 0; j < v; j++) {
111
+ const int *p = pairs + 2 * start[j];
112
+ int d = 0;
113
+ for (int e = 0, k = fanin[j]; e < k; e++) if (depth[p[2 * e]] > d) d = depth[p[2 * e]];
114
+ depth[n + j] = d + 1;
115
+ if (d + 1 > dmax) dmax = d + 1;
116
+ }
117
+ nlev = dmax;
118
+ lstart = calloc((size_t)nlev + 2, 4);
119
+ for (int j = 0; j < v; j++) lstart[depth[n + j]]++;
120
+ for (int l = 1, acc = 0; l <= nlev + 1; l++) { int c = lstart[l]; lstart[l] = acc; acc += c; }
121
+ order = malloc(4 * (size_t)(v > 0 ? v : 1));
122
+ int *fill = calloc((size_t)nlev + 2, 4);
123
+ for (int j = 0; j < v; j++) { int l = depth[n + j]; order[lstart[l] + fill[l]++] = j; }
124
+ free(fill);
125
+ free(depth);
126
+ parallel = E >= 200000;
127
+ #ifndef _OPENMP
128
+ parallel = 0;
129
+ #endif
130
+ }
131
+ n0 = n;
132
+ for (int r = 1; r < 64 && n0 == n; r++)
133
+ for (int a = 3; a < 31; a++)
134
+ if ((long)r * (a + 1 + (long)a * (1L << a)) == n) { set_width(a); rep = r; n0 = n / r; break; }
135
+ fprintf(stderr, "net: %d state bits, %d units, %d edges, %d generic units, depth %d, A = %d, %d cop%s%s\n",
136
+ n, v, E, gen, nlev, A, rep, rep == 1 ? "y" : "ies", parallel ? ", levels in parallel" : "");
137
+ }
138
+
139
+ static inline void unit_eval(int j)
140
+ {
141
+ int acc = bias[j];
142
+ const int *p = pairs + 2 * start[j];
143
+ for (int e = 0, k = fanin[j]; e < k; e++) acc += p[2 * e + 1] * sig[p[2 * e]];
144
+ sig[n + j] = acc >= 0;
145
  }
146
 
147
  static void net_step(const uint8_t *s, uint8_t *o)
148
  {
149
  memcpy(sig, s, (size_t)n);
150
+ if (!parallel) {
151
+ for (int j = 0; j < v; j++) unit_eval(j);
152
+ } else {
153
+ for (int l = 1; l <= nlev; l++) {
154
+ int lo = lstart[l], hi = lstart[l + 1];
155
+ #pragma omp parallel for schedule(static)
156
+ for (int q = lo; q < hi; q++) unit_eval(order[q]);
157
+ }
158
  }
159
  for (int i = 0; i < n; i++) {
160
  int k = nxt[i];
 
236
  M[C_WR] = 0; M[C_RD] = 0; M[C_RW] = 0;
237
  }
238
 
239
+ /* copy c of the state occupies s + c n0; a word is read from one copy or as the
240
+ * bitwise majority of all copies, and written to every copy */
241
+ static uint32_t get_word_c(const uint8_t *s, int c, uint32_t j)
242
  {
243
  uint32_t x = 0;
244
+ const uint8_t *b = s + (size_t)c * n0 + A + 1 + (size_t)A * j;
245
  for (int k = 0; k < A; k++) x = (x << 1) | b[k];
246
  return x;
247
  }
248
+ static uint32_t get_word(const uint8_t *s, uint32_t j)
249
+ {
250
+ if (rep == 1) return get_word_c(s, 0, j);
251
+ uint32_t x = 0;
252
+ for (int k = 0; k < A; k++) {
253
+ int ones = 0;
254
+ for (int c = 0; c < rep; c++) ones += s[(size_t)c * n0 + A + 1 + (size_t)A * j + k];
255
+ x = (x << 1) | (2 * ones > rep);
256
+ }
257
+ return x;
258
+ }
259
  static void set_word(uint8_t *s, uint32_t j, uint32_t val)
260
  {
261
+ for (int c = 0; c < rep; c++) {
262
+ uint8_t *b = s + (size_t)c * n0 + A + 1 + (size_t)A * j;
263
+ for (int k = 0; k < A; k++) b[k] = (uint8_t)((val >> (A - 1 - k)) & 1);
264
+ }
265
  }
266
+ static uint32_t get_pc_c(const uint8_t *s, int c)
267
  {
268
  uint32_t x = 0;
269
+ for (int k = 0; k < A; k++) x = (x << 1) | s[(size_t)c * n0 + k];
270
  return x;
271
  }
272
 
 
319
  uint32_t *M = calloc(SZ, 4);
320
  long bad = 0, tested = 0, fixed_bad = 0, latch_bad = 0;
321
  for (long b = 0; b * 64 < N; b++) {
322
+ for (int i = 0; i < n0; i++) s[i] = xr();
323
  s[A] = 0;
324
+ for (int c = 1; c < rep; c++) memcpy(s + (size_t)c * n0, s, 8 * (size_t)n0);
325
  net_step64(s, o);
326
  for (int l = 0; l < 64; l++) {
327
  uint32_t pc = 0;
 
332
  M[j] = x;
333
  }
334
  ref_step(M, &pc);
 
335
  int ok = 1;
336
+ for (int c = 0; c < rep && ok; c++) {
337
+ const uint64_t *oc = o + (size_t)c * n0;
338
+ uint32_t npc = 0;
339
+ for (int k = 0; k < A; k++) npc = (npc << 1) | (uint32_t)(oc[k] >> l & 1);
340
+ if (npc != pc) ok = 0;
341
+ for (uint32_t j = 0; j < SZ && ok; j++) {
342
+ uint32_t x = 0;
343
+ for (int k = 0; k < A; k++) x = (x << 1) | (uint32_t)(oc[A + 1 + (size_t)A * j + k] >> l & 1);
344
+ if (x != M[j]) ok = 0;
345
+ }
346
+ if ((int)(oc[A] >> l & 1) != (pc == HALT_PC)) latch_bad++;
347
  }
 
348
  bad += !ok;
349
  tested++;
350
  }
351
+ for (int i = 0; i < n0; i++) s[i] = xr();
352
  s[A] = ~0ull;
353
+ for (int c = 1; c < rep; c++) memcpy(s + (size_t)c * n0, s, 8 * (size_t)n0);
354
  net_step64(s, o);
355
  for (int i = 0; i < n; i++) if (s[i] != o[i]) { fixed_bad++; break; }
356
  }
 
380
  if (use_net) { net_step(s, y); halt_n = y[A]; net_dev_apply(&dn, y); uint8_t *t = s; s = y; y = t; }
381
  steps++;
382
  if (use_ref && use_net) {
383
+ int ok = halt_n == halt_r && dr.h == dn.h && dr.olen == dn.olen &&
384
  (dr.olen == 0 || dr.out[dr.olen - 1] == dn.out[dn.olen - 1]);
385
+ for (int c = 0; c < rep && ok; c++) {
386
+ ok = get_pc_c(s, c) == pc && s[(size_t)c * n0 + A] == halt_r;
387
+ for (uint32_t j = 0; j < SZ && ok; j++) ok = get_word_c(s, c, j) == M[j];
388
+ }
389
  if (!ok) { printf("lockstep divergence at step %ld\n", steps); return 1; }
390
  }
391
  if ((use_ref && halt_r) || (!use_ref && halt_n)) { halted = 1; break; }
src/neuromorphic.py CHANGED
@@ -4,9 +4,10 @@ Theorem 6.2 needs integer pre-activations and a comparator placed between them.
4
  A digital neuromorphic processor provides exactly that: integer synaptic
5
  weights, an integer bias and an integer threshold, with the membrane potential
6
  compared against the threshold once per time step. This script maps the host's
7
- arithmetic and control datapath onto the neuron model of Intel's Loihi as
8
- implemented bit-accurately by the Lava simulator, one layer per time step, and
9
- compares the result with the integer reference.
 
10
 
11
  Two features of the hardware model fix the encoding. A synapse carrying both
12
  signs stores its weight with the least significant bit truncated, so the
@@ -45,14 +46,39 @@ def runs_path(name: str) -> str:
45
  return os.path.join(d, name)
46
 
47
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  def export() -> int:
49
  """Levelize the datapath and write its integer weights and biases."""
50
  sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
51
  from matrix8 import compile_net
52
- from reflect import subleq_datapath_net
53
- net, a, b, pc, c, r, leq, pcm = subleq_datapath_net()
54
- inputs = a + b + pc + c
55
- outputs = r + [leq] + pcm
56
  layers, info = compile_net(net, inputs, outputs, final_ordered=False)
57
  d = {"n_layers": np.array([len(layers)]),
58
  "n_units": np.array([len(net.gates)]),
@@ -70,12 +96,11 @@ def export() -> int:
70
  return 0
71
 
72
 
73
- def reference(xa, xb, pcv, cv):
74
- """Definition 3.1 on the operands, as integers."""
75
  res = (xb - xa) & 0xFF
76
  leq = 1 if (res == 0 or res >= 128) else 0
77
- npc = cv if leq else (pcv + 3) & 0xFF
78
- return res, leq, npc
79
 
80
 
81
  def run() -> int:
@@ -106,21 +131,18 @@ def run() -> int:
106
  assert 128 * worst < 4096
107
 
108
  rng = np.random.default_rng(20260910)
109
- N = 512
110
  xa = rng.integers(0, 256, N)
111
  xb = rng.integers(0, 256, N)
112
- pcv = rng.integers(0, 256, N)
113
- cv = rng.integers(0, 256, N)
114
- xa[:8] = np.arange(8); xb[:8] = 0 # boundary cases at zero
115
- xa[8:16] = 0; xb[8:16] = np.arange(8)
116
 
117
  spikes = np.zeros((n_in, N))
118
  for t in range(N):
119
  for k in range(8):
120
- spikes[k, t] = (xa[t] >> k) & 1 # a0..a7
121
- spikes[8 + k, t] = (xb[t] >> k) & 1 # b0..b7
122
- spikes[16 + k, t] = (pcv[t] >> k) & 1 # pc0..pc7
123
- spikes[24 + k, t] = (cv[t] >> k) & 1 # c0..c7
124
 
125
  T = N + L + 2
126
  src = Source(data=np.pad(spikes, ((0, 0), (0, T - N))))
@@ -149,11 +171,10 @@ def run() -> int:
149
  col = out[:, t + L]
150
  res = sum(int(col[k]) << k for k in range(8))
151
  leq = int(col[8])
152
- npc = sum(int(col[9 + k]) << k for k in range(8))
153
- want = reference(int(xa[t]), int(xb[t]), int(pcv[t]), int(cv[t]))
154
- if (res, leq, npc) != want:
155
- bad.append((t, (res, leq, npc), want))
156
- print(f" {N} operand quadruples, pipelined one per time step: "
157
  f"{'all exact' if not bad else f'{len(bad)} FAILED {bad[:3]}'}",
158
  flush=True)
159
 
@@ -207,31 +228,25 @@ def akida() -> int:
207
  lay.variables["weights"] = wv
208
  lay.variables["threshold"] = (-b - 1).astype(np.int32)
209
 
210
- rng = np.random.default_rng(20260910)
211
- N = 4096
212
- xa = rng.integers(0, 256, N)
213
- xb = rng.integers(0, 256, N)
214
- pcv = rng.integers(0, 256, N)
215
- cv = rng.integers(0, 256, N)
216
- xa[:256] = np.arange(256); xb[:256] = 0
217
- xa[256:512] = 0; xb[256:512] = np.arange(256)
218
  X = np.zeros((N, 1, 1, n_in), dtype=np.uint8)
219
  for k in range(8):
220
  X[:, 0, 0, k] = (xa >> k) & 1
221
  X[:, 0, 0, 8 + k] = (xb >> k) & 1
222
- X[:, 0, 0, 16 + k] = (pcv >> k) & 1
223
- X[:, 0, 0, 24 + k] = (cv >> k) & 1
224
- out = m.forward(X).reshape(N, -1)
225
 
226
  bad = []
227
  for t in range(N):
228
  res = sum(int(out[t, k]) << k for k in range(8))
229
  leq = int(out[t, 8])
230
- npc = sum(int(out[t, 9 + k]) << k for k in range(8))
231
- want = reference(int(xa[t]), int(xb[t]), int(pcv[t]), int(cv[t]))
232
- if (res, leq, npc) != want:
233
- bad.append((t, (res, leq, npc), want))
234
- print(f" {N} operand quadruples forwarded through the layer stack: "
235
  f"{'all exact' if not bad else f'{len(bad)} FAILED {bad[:3]}'}",
236
  flush=True)
237
  print(f" weights are stored at two bits and thresholds as integers, so "
 
4
  A digital neuromorphic processor provides exactly that: integer synaptic
5
  weights, an integer bias and an integer threshold, with the membrane potential
6
  compared against the threshold once per time step. This script maps the host's
7
+ arithmetic datapath, the carry-lookahead subtractor, the equality test and the
8
+ branch unit of H_8 with the two operand bytes as free inputs, onto the neuron
9
+ model of Intel's Loihi as implemented bit-accurately by the Lava simulator, one
10
+ layer per time step, and compares the result with the integer reference.
11
 
12
  Two features of the hardware model fix the encoding. A synapse carrying both
13
  signs stores its weight with the least significant bit truncated, so the
 
46
  return os.path.join(d, name)
47
 
48
 
49
+ def datapath_net():
50
+ """The subtractor, the equality test and the branch of H_8, cut out of the
51
+ host netlist: inputs are the value bits of x = M[a] and y = M[b], least
52
+ significant first, outputs the value bits of r = y - x and [r <= 0]."""
53
+ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
54
+ from host_family import build
55
+ from matrix8 import Net
56
+ full, _, _ = build(8)
57
+ A = 8
58
+ xv = [f"X{A - 1 - i}" for i in range(A)]
59
+ yv = [f"Y{A - 1 - i}" for i in range(A)]
60
+ keep = set()
61
+ stack = [f"R{k}" for k in range(A)] + ["LEQ"]
62
+ while stack:
63
+ g = stack.pop()
64
+ if g in keep or g in xv or g in yv:
65
+ continue
66
+ keep.add(g)
67
+ stack.extend(s for s, _ in full.gates[g][0])
68
+ net = Net()
69
+ for gname, (ins, bias) in full.gates.items():
70
+ if gname in keep:
71
+ net.g(gname, list(ins), bias)
72
+ return net, xv, yv, [f"R{k}" for k in range(A)], "LEQ"
73
+
74
+
75
  def export() -> int:
76
  """Levelize the datapath and write its integer weights and biases."""
77
  sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
78
  from matrix8 import compile_net
79
+ net, xv, yv, r, leq = datapath_net()
80
+ inputs = xv + yv
81
+ outputs = r + [leq]
 
82
  layers, info = compile_net(net, inputs, outputs, final_ordered=False)
83
  d = {"n_layers": np.array([len(layers)]),
84
  "n_units": np.array([len(net.gates)]),
 
96
  return 0
97
 
98
 
99
+ def reference(xa, xb):
100
+ """The subtraction and the branch predicate of Definition 3.1, as integers."""
101
  res = (xb - xa) & 0xFF
102
  leq = 1 if (res == 0 or res >= 128) else 0
103
+ return res, leq
 
104
 
105
 
106
  def run() -> int:
 
131
  assert 128 * worst < 4096
132
 
133
  rng = np.random.default_rng(20260910)
134
+ N = 4096
135
  xa = rng.integers(0, 256, N)
136
  xb = rng.integers(0, 256, N)
137
+ xa[:256] = np.arange(256); xb[:256] = 0 # every difference through zero
138
+ xa[256:512] = 0; xb[256:512] = np.arange(256)
139
+ xa[512:768] = np.arange(256); xb[512:768] = np.arange(256) # x = y
 
140
 
141
  spikes = np.zeros((n_in, N))
142
  for t in range(N):
143
  for k in range(8):
144
+ spikes[k, t] = (xa[t] >> k) & 1 # x, value bits
145
+ spikes[8 + k, t] = (xb[t] >> k) & 1 # y
 
 
146
 
147
  T = N + L + 2
148
  src = Source(data=np.pad(spikes, ((0, 0), (0, T - N))))
 
171
  col = out[:, t + L]
172
  res = sum(int(col[k]) << k for k in range(8))
173
  leq = int(col[8])
174
+ want = reference(int(xa[t]), int(xb[t]))
175
+ if (res, leq) != want:
176
+ bad.append((t, (res, leq), want))
177
+ print(f" {N} operand pairs, pipelined one per time step: "
 
178
  f"{'all exact' if not bad else f'{len(bad)} FAILED {bad[:3]}'}",
179
  flush=True)
180
 
 
228
  lay.variables["weights"] = wv
229
  lay.variables["threshold"] = (-b - 1).astype(np.int32)
230
 
231
+ N = 65536 # every operand pair
232
+ xa = np.arange(N) % 256
233
+ xb = np.arange(N) // 256
 
 
 
 
 
234
  X = np.zeros((N, 1, 1, n_in), dtype=np.uint8)
235
  for k in range(8):
236
  X[:, 0, 0, k] = (xa >> k) & 1
237
  X[:, 0, 0, 8 + k] = (xb >> k) & 1
238
+ out = np.concatenate([m.forward(X[i:i + 8192]).reshape(-1, out_w)
239
+ for i in range(0, N, 8192)
240
+ for out_w in [int(layers[-1][0].shape[0])]])
241
 
242
  bad = []
243
  for t in range(N):
244
  res = sum(int(out[t, k]) << k for k in range(8))
245
  leq = int(out[t, 8])
246
+ want = reference(int(xa[t]), int(xb[t]))
247
+ if (res, leq) != want:
248
+ bad.append((t, (res, leq), want))
249
+ print(f" all {N} operand pairs forwarded through the layer stack: "
 
250
  f"{'all exact' if not bad else f'{len(bad)} FAILED {bad[:3]}'}",
251
  flush=True)
252
  print(f" weights are stored at two bits and thresholds as integers, so "
src/noise.py CHANGED
@@ -9,19 +9,24 @@ either; the long run uses the faster one.
9
  that the exactness claim and the robustness claim concern the same
10
  instance;
11
  curve the probability that a trajectory deviates, measured against the
12
- union bound of Proposition 6.6 over a grid of noise levels; the
13
  deviation is detected by running noise-free and noisy copies in one
14
  batch and comparing the full state after every step, which is the
15
  event the bound covers;
16
  leak static weight error with the zero entries leaking, which is the
17
- term of Corollary 6.4 that grows with the width of the layer and
18
  that the earlier mismatch model omitted;
19
  margin the margin of Theorem 6.2 along the trajectory of the instance,
20
  which is what the three experiments go outside;
21
  profile the pre-activations along the exact orbit the curve experiment
22
- starts from, and the one-sided bound they give on its rate.
23
-
24
- python src/noise.py omega|curve|leak|margin|profile [--device cuda]
 
 
 
 
 
25
  """
26
  from __future__ import annotations
27
 
@@ -242,7 +247,7 @@ def run_leak(args) -> int:
242
  kmax = max(int((W != 0).sum(dim=1).max()) for W in L.W)
243
  r_H = describe(sigma)
244
  print(f"[leak] M = {M:,}, widest layer {nmax}, largest fan-in {kmax}; "
245
- f"Corollary 6.4 permits eps*k + gamma*(n-k) < 1/2", flush=True)
246
 
247
  def worst_bound(eps, gam):
248
  w = 0.0
@@ -370,7 +375,7 @@ def run_profile(args) -> int:
370
  that step t deviates is at most the sum of Q(|z + 1/2| / s) over the rows
371
  at step t. The average of that sum over the steps is compared with the
372
  measured rate of the curve experiment and with the bound M p of
373
- Proposition 6.6.
374
  """
375
  import torch
376
  from selfrep import M_P, LevEvaluator, describe, read_host
@@ -446,9 +451,95 @@ def run_profile(args) -> int:
446
  return 0
447
 
448
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
449
  def main() -> int:
450
  ap = argparse.ArgumentParser()
451
- ap.add_argument("mode", choices=["omega", "curve", "leak", "margin", "profile"])
 
452
  ap.add_argument("--states", type=int, default=800)
453
  ap.add_argument("--device", default="cuda")
454
  ap.add_argument("--batch", type=int, default=256)
@@ -456,7 +547,8 @@ def main() -> int:
456
  ap.add_argument("--steps", type=int, default=4000)
457
  args = ap.parse_args()
458
  return {"omega": run_omega, "curve": run_curve, "leak": run_leak,
459
- "margin": run_margin, "profile": run_profile}[args.mode](args)
 
460
 
461
 
462
  if __name__ == "__main__":
 
9
  that the exactness claim and the robustness claim concern the same
10
  instance;
11
  curve the probability that a trajectory deviates, measured against the
12
+ union bound of Proposition 6.5 over a grid of noise levels; the
13
  deviation is detected by running noise-free and noisy copies in one
14
  batch and comparing the full state after every step, which is the
15
  event the bound covers;
16
  leak static weight error with the zero entries leaking, which is the
17
+ term of Corollary 6.3 that grows with the width of the layer and
18
  that the earlier mismatch model omitted;
19
  margin the margin of Theorem 6.2 along the trajectory of the instance,
20
  which is what the three experiments go outside;
21
  profile the pre-activations along the exact orbit the curve experiment
22
+ starts from, and the one-sided bound they give on its rate;
23
+ certify the active-input counts along an orbit, which certify the
24
+ leakage and weight tolerances of that orbit (Proposition 6.4):
25
+ a zero entry leaks into a pre-activation only through an input
26
+ that is 1, so the term gamma (n - k) of Corollary 6.3 becomes
27
+ gamma times the number of active zero-weight inputs of the row.
28
+
29
+ python src/noise.py omega|curve|leak|margin|profile|certify [--device cuda]
30
  """
31
  from __future__ import annotations
32
 
 
247
  kmax = max(int((W != 0).sum(dim=1).max()) for W in L.W)
248
  r_H = describe(sigma)
249
  print(f"[leak] M = {M:,}, widest layer {nmax}, largest fan-in {kmax}; "
250
+ f"Corollary 6.3 permits eps*k + gamma*(n-k) < 1/2", flush=True)
251
 
252
  def worst_bound(eps, gam):
253
  w = 0.0
 
375
  that step t deviates is at most the sum of Q(|z + 1/2| / s) over the rows
376
  at step t. The average of that sum over the steps is compared with the
377
  measured rate of the curve experiment and with the bound M p of
378
+ Proposition 6.5.
379
  """
380
  import torch
381
  from selfrep import M_P, LevEvaluator, describe, read_host
 
451
  return 0
452
 
453
 
454
+ def run_certify(args) -> int:
455
+ """Active-input counts along an orbit.
456
+
457
+ For every row of every layer at every step, the number k1 of inputs that
458
+ are 1 among the programmed entries and the number a of inputs that are 1
459
+ among the zero entries are formed; a is the popcount of the layer's input
460
+ less k1. The maxima A* of a and K* of k1 over the orbit give the
461
+ certificate: with errors bounded as in Corollary 6.3, the realized system
462
+ follows the orbit whenever eps K* + gamma A* + eta < 1/2. Two orbits are
463
+ certified: the first 10,000 steps of the self-describing instance, which
464
+ the leak experiment runs, and the complete self-reproducing run.
465
+ """
466
+ import torch
467
+ from selfrep import M_P, M_STAR, LevEvaluator, describe, read_host, tau_star
468
+ sigma = read_host()
469
+ L = LevEvaluator(sigma, device=args.device, dense=False)
470
+ M = L.info["size"]
471
+ print(f"[certify] M = {M:,} rows in {L.info['layers']} layers", flush=True)
472
+ leak = json.load(open(runs_path("paper_noise_leak.json"))) \
473
+ if os.path.exists(runs_path("paper_noise_leak.json")) else None
474
+
475
+ def walk(mem0, tape, cap, label):
476
+ v = L._vec(0, mem0).unsqueeze(0).to(args.device)
477
+ D = Devices(L, [tape], args.device)
478
+ nl = len(L.plan)
479
+ a_max = torch.zeros(nl, dtype=torch.long, device=args.device)
480
+ k_max = torch.zeros(nl, dtype=torch.long, device=args.device)
481
+ pop_max = torch.zeros(nl, dtype=torch.long, device=args.device)
482
+ t0 = time.perf_counter()
483
+ T = cap
484
+ for n in range(cap):
485
+ x = v
486
+ for li, (groups, width) in enumerate(zip(L.plan, L.widths)):
487
+ y = torch.empty(1, width, device=args.device)
488
+ pop = x.sum().long()
489
+ pop_max[li] = torch.maximum(pop_max[li], pop)
490
+ for rows, idx, w, b in groups:
491
+ g = x[:, idx]
492
+ k1 = (g * (w != 0)).sum(-1).long()
493
+ k_max[li] = torch.maximum(k_max[li], k1.max())
494
+ a_max[li] = torch.maximum(a_max[li], (pop - k1).max())
495
+ y[:, rows] = (((g * w).sum(-1) + b) >= 0).float()
496
+ x = y
497
+ v = x
498
+ if D.step(v)[0]:
499
+ T = n + 1
500
+ break
501
+ if (n + 1) % 100000 == 0:
502
+ print(f" {label}: {n + 1:,} steps ({(n + 1) / (time.perf_counter() - t0):.0f}/s)",
503
+ flush=True)
504
+ A_star, K_star = int(a_max.max()), int(k_max.max())
505
+ rec = {"steps": T, "A_star": A_star, "K_star": K_star,
506
+ "per_layer_active_zero_max": a_max.tolist(),
507
+ "per_layer_active_programmed_max": k_max.tolist(),
508
+ "per_layer_popcount_max": pop_max.tolist(),
509
+ "gamma_certified": 0.5 / A_star, "epsilon_certified": 0.5 / K_star,
510
+ "seconds": time.perf_counter() - t0}
511
+ print(f" {label}: {T:,} steps; at most {A_star} active zero-weight inputs and "
512
+ f"{K_star} active programmed inputs at any row: gamma < {0.5 / A_star:.3e}, "
513
+ f"eps < {0.5 / K_star:.3e} ({rec['seconds']:.0f} s)", flush=True)
514
+ return rec
515
+
516
+ out = {"M": M, "widest_layer": max(L.widths)}
517
+ out["selfdesc_10000"] = walk(M_P, describe(sigma), args.steps, "self-describing orbit")
518
+ if leak is not None:
519
+ A_star, K_star = out["selfdesc_10000"]["A_star"], out["selfdesc_10000"]["K_star"]
520
+ rows = []
521
+ for r in leak["rows"]:
522
+ cert = r["epsilon"] * K_star + r["gamma"] * A_star
523
+ rows.append({"epsilon": r["epsilon"], "gamma": r["gamma"], "worst_bound": r["worst_bound"],
524
+ "orbit_bound": cert, "certified_by_orbit": cert < 0.5,
525
+ "first_deviation": r["first_deviation"]})
526
+ out["leak_rows"] = rows
527
+ n_cert = sum(r["certified_by_orbit"] for r in rows)
528
+ n_exact = sum(r["first_deviation"] is None for r in rows)
529
+ print(f" of the {len(rows)} rows of the leak table, Corollary 6.3 certifies "
530
+ f"{sum(r['worst_bound'] < 0.5 for r in rows)}, the orbit certificate {n_cert}, "
531
+ f"and {n_exact} were exact")
532
+ if not args.short:
533
+ tau = tau_star(sigma, M_STAR)
534
+ out["omega_star"] = walk(M_STAR, tau, 1 << 21, "self-reproducing run")
535
+ json.dump(out, open(runs_path("paper_noise_certify.json"), "w"), indent=1)
536
+ return 0
537
+
538
+
539
  def main() -> int:
540
  ap = argparse.ArgumentParser()
541
+ ap.add_argument("mode", choices=["omega", "curve", "leak", "margin", "profile", "certify"])
542
+ ap.add_argument("--short", action="store_true", help="certify: the leak orbit only")
543
  ap.add_argument("--states", type=int, default=800)
544
  ap.add_argument("--device", default="cuda")
545
  ap.add_argument("--batch", type=int, default=256)
 
547
  ap.add_argument("--steps", type=int, default=4000)
548
  args = ap.parse_args()
549
  return {"omega": run_omega, "curve": run_curve, "leak": run_leak,
550
+ "margin": run_margin, "profile": run_profile,
551
+ "certify": run_certify}[args.mode](args)
552
 
553
 
554
  if __name__ == "__main__":
src/paper_verify.py CHANGED
@@ -192,7 +192,7 @@ def check_host_datapath():
192
  device = "cuda" if torch.cuda.is_available() else "cpu"
193
  E = NetEvaluator(read_host(), device=device)
194
 
195
- def sweep(mems, pcs, chunk=1024):
196
  bad = 0
197
  for i in range(0, len(pcs), chunk):
198
  m = mems[i:i + chunk].to(device)
 
192
  device = "cuda" if torch.cuda.is_available() else "cpu"
193
  E = NetEvaluator(read_host(), device=device)
194
 
195
+ def sweep(mems, pcs, chunk=256):
196
  bad = 0
197
  for i in range(0, len(pcs), chunk):
198
  m = mems[i:i + chunk].to(device)
src/redundant.py ADDED
@@ -0,0 +1,745 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """The amplified host: r-fold redundancy with the restoring organ inside every unit.
2
+
3
+ For an odd r, the amplification A_r of a layered map replaces every row by r
4
+ rows, each reading all r copies of each of the row's inputs with the row's own
5
+ weight and carrying the bias r b + (r - 1)/2. On replicated inputs every
6
+ pre-activation is r z + (r - 1)/2, z the pre-activation of the original row,
7
+ so the amplified map sends the replicated state to the replicated next state
8
+ and every pre-activation lies at distance at least r/2 from the comparator at
9
+ -1/2; a unit whose inputs carry f wrong copies keeps its margin down to
10
+ r/2 - f. The redundant host is N_r = A_r(Lev(N_host)), a clocked netlist on
11
+ r * 2057 state bits realizing the SUBLEQ transducer on r copies of the state,
12
+ copy c occupying the block c * 2057 .. (c + 1) * 2057 - 1; its identity rows
13
+ become majority units, one restoring organ per level. The device reads each
14
+ bit of a cell as the majority of its copies and writes every copy.
15
+
16
+ python src/redundant.py build [--r 3] sigma(N_r), its sizes, one step against SUBLEQ
17
+ python src/redundant.py selfrep [--r 3] Omega*_r on the evaluator in C, to completion
18
+ python src/redundant.py omega [--r 3] the instance Omega* of the host on N_r under read noise
19
+ python src/redundant.py curve [--r 3] the deviation rate of N_r against the bounds
20
+ python src/redundant.py restore [--r 3] wrong copies along a noisy run, and the state
21
+ read by majority
22
+ python src/redundant.py layers [--r 3] the profile bound of N_r split by layer
23
+ """
24
+ from __future__ import annotations
25
+
26
+ import argparse
27
+ import hashlib
28
+ import json
29
+ import math
30
+ import os
31
+ import subprocess
32
+ import sys
33
+ import tempfile
34
+ import time
35
+ from typing import Dict, List, Tuple
36
+
37
+ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
38
+ REPO = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
39
+ SRC = os.path.join(REPO, "src")
40
+
41
+ from check_c import levelize, parse_sigma, write_flat, framed_parts
42
+ from host_family import encode
43
+ from selfrep import (M_P, M_STAR, HALT_PC, Tape, describe, field, inst, read_host,
44
+ ser, tau_star, run_reference, STATE_LAYOUT, IO_CELLS, STATE_BITS)
45
+
46
+
47
+ def runs_path(name: str) -> str:
48
+ d = os.path.join(REPO, "paper", "runs")
49
+ os.makedirs(d, exist_ok=True)
50
+ return os.path.join(d, name)
51
+
52
+
53
+ def sha(b: bytes) -> str:
54
+ return hashlib.sha256(b).hexdigest()
55
+
56
+
57
+ # ---------------------------------------------------------------------------
58
+ # the construction
59
+ # ---------------------------------------------------------------------------
60
+
61
+ class Amplified:
62
+ """N_r = A_r(Lev(N)) for the netlist N of a serialization, in flat form.
63
+
64
+ `units` lists the amplified rows in layer order, copies of a row adjacent,
65
+ as (bias, [(signal, weight), ...]) over the signal numbering of N_r: state
66
+ bit i of copy c is c n + i, and copy c of row j of Lev(N) is r n + r j + c.
67
+ `layers` gives the number of rows of Lev(N) in each layer.
68
+ """
69
+
70
+ def __init__(self, sigma: bytes, r: int):
71
+ assert r >= 1 and r % 2 == 1, "the redundancy must be odd"
72
+ n, units, nxt = parse_sigma(sigma)
73
+ ln, lunits, lnxt, info = levelize(n, units, nxt)
74
+ assert ln == n
75
+ self.r, self.n, self.sigma0 = r, n, sigma
76
+ self.layers: List[int] = info["layer_sizes"]
77
+ self.depth = info["depth"]
78
+ self.lev_rows = len(lunits)
79
+ self.lev_units = lunits
80
+ self.lev_nxt = lnxt
81
+ shift = (r - 1) // 2
82
+
83
+ def pos(k: int, c: int) -> int:
84
+ return c * n + k if k < n else r * n + r * (k - n) + c
85
+
86
+ out: List[Tuple[int, List[Tuple[int, int]]]] = []
87
+ for b, ins in lunits:
88
+ ins_r = [(pos(k, c), w) for k, w in ins for c in range(r)]
89
+ for c in range(r):
90
+ out.append((r * b + shift, ins_r))
91
+ self.units = out
92
+ self.nxt = [r * n + r * (lnxt[i] - n) + c for c in range(r) for i in range(n)]
93
+ self.state_bits = r * n
94
+ self.edges = sum(len(ins) for _, ins in out)
95
+
96
+ def sigma(self) -> bytes:
97
+ bias, fanin, pred = [], [], []
98
+ for b, ins in self.units:
99
+ bias.append(b)
100
+ fanin.append(len(ins))
101
+ for k, w in ins:
102
+ pred.append(w * (k + 1))
103
+ lay = dict(STATE_LAYOUT)
104
+ lay["replicas"] = self.r
105
+ lay["copy_stride"] = self.n
106
+ return encode(8, bias, fanin, pred, self.nxt, f"subleq8r{self.r}", lay, IO_CELLS)
107
+
108
+ def write_flat(self, path: str) -> None:
109
+ write_flat(path, self.state_bits, self.units, self.nxt)
110
+
111
+ # -- the layered plan for the evaluator on the accelerator ----------------
112
+ def plan(self, device: str, pad: bool):
113
+ """Per layer, groups (rows, idx, w, b): the rows of the amplified layer,
114
+ the positions of their inputs in the previous layer's vector, the
115
+ weights and the biases. Copy c of row m sits at position m r + c of its
116
+ layer; layer 0 is the state, copy c of bit i at c n + i."""
117
+ import torch
118
+ r, n = self.r, self.n
119
+ base = [n]
120
+ for L in self.layers:
121
+ base.append(base[-1] + L)
122
+ plan = []
123
+ j = 0
124
+ for ell, L in enumerate(self.layers, start=1):
125
+ rows_of = []
126
+ for m in range(L):
127
+ b, ins = self.lev_units[j]
128
+ j += 1
129
+ if ell == 1:
130
+ idx = [c * n + k for k, w in ins for c in range(r)]
131
+ else:
132
+ idx = [r * (k - base[ell - 1]) + c for k, w in ins for c in range(r)]
133
+ w = [wt for k, wt in ins for c in range(r)]
134
+ for c in range(r):
135
+ rows_of.append((m * r + c, idx, w, r * b + (r - 1) // 2))
136
+ groups = []
137
+ if pad:
138
+ K = max(len(x[1]) for x in rows_of)
139
+ idx_t = torch.zeros(len(rows_of), K, dtype=torch.long)
140
+ w_t = torch.zeros(len(rows_of), K)
141
+ for q, (row, idx, w, b) in enumerate(rows_of):
142
+ idx_t[q, :len(idx)] = torch.tensor(idx)
143
+ w_t[q, :len(w)] = torch.tensor(w, dtype=torch.float32)
144
+ rows_t = torch.tensor([x[0] for x in rows_of])
145
+ b_t = torch.tensor([x[3] for x in rows_of], dtype=torch.float32)
146
+ groups.append((rows_t.to(device), idx_t.to(device), w_t.to(device), b_t.to(device)))
147
+ else:
148
+ by_k: Dict[int, list] = {}
149
+ for x in rows_of:
150
+ by_k.setdefault(len(x[1]), []).append(x)
151
+ for K in sorted(by_k):
152
+ g = by_k[K]
153
+ rows_t = torch.tensor([x[0] for x in g])
154
+ idx_t = torch.tensor([x[1] for x in g], dtype=torch.long)
155
+ w_t = torch.tensor([x[2] for x in g], dtype=torch.float32)
156
+ b_t = torch.tensor([x[3] for x in g], dtype=torch.float32)
157
+ groups.append((rows_t.to(device), idx_t.to(device), w_t.to(device), b_t.to(device)))
158
+ plan.append((r * L, groups))
159
+ # the final layer holds copy c of state bit i at i r + c; the state
160
+ # holds it at c n + i
161
+ perm = torch.tensor([i * r + c for c in range(r) for i in range(n)]).to(device)
162
+ return plan, perm
163
+
164
+
165
+ class Evaluator:
166
+ """N_r on the accelerator, with read noise and the device on the copies."""
167
+
168
+ def __init__(self, amp: Amplified, device: str = "cuda", pad: bool = True,
169
+ graph: bool = False):
170
+ import torch
171
+ self.torch = torch
172
+ self.amp, self.device = amp, device
173
+ self.r, self.n = amp.r, amp.n
174
+ self.plan, self.perm = amp.plan(device, pad)
175
+ self.M = sum(L for L, _ in self.plan)
176
+ self.N = amp.state_bits
177
+ cells = (IO_CELLS["c_wr"], IO_CELLS["c_eot"], IO_CELLS["c_rw"],
178
+ IO_CELLS["c_rd"], IO_CELLS["r_in"], IO_CELLS["r_out"])
179
+ self.cells = cells
180
+ # bit t of cell j of copy c
181
+ self.cell_idx = torch.tensor([[c * self.n + 9 + 8 * j + t for j in cells for t in range(8)]
182
+ for c in range(self.r)], device=device)
183
+ self.pow2 = torch.tensor([1 << (7 - t) for t in range(8)], device=device)
184
+ self.shift = torch.tensor([7 - t for t in range(8)])
185
+ self.graph = None
186
+ self.gen = None
187
+ if graph:
188
+ self.capture()
189
+
190
+ # -- one application of the map, over a batch --------------------------
191
+ def _forward(self, v, s: float = 0.0, gen=None):
192
+ torch = self.torch
193
+ x = v
194
+ for width, groups in self.plan:
195
+ y = torch.empty(x.shape[0], width, device=x.device)
196
+ for rows, idx, w, b in groups:
197
+ pre = (x[:, idx] * w).sum(-1) + b
198
+ if s > 0:
199
+ pre = pre + torch.randn(pre.shape, generator=gen, device=pre.device) * s
200
+ y[:, rows] = (pre >= -0.5).float()
201
+ x = y
202
+ return x[:, self.perm]
203
+
204
+ def step(self, v):
205
+ if self.graph is not None and v.shape[0] == 1 and self.gs == 0.0:
206
+ return self._replay(v)
207
+ return self._forward(v)
208
+
209
+ def step_noisy(self, v, s: float, gen):
210
+ if self.graph is not None and v.shape[0] == 1 and self.gs == s and gen is self.gen:
211
+ return self._replay(v)
212
+ return self._forward(v, s, gen)
213
+
214
+ def capture(self, s: float = 0.0, seed: int = 0):
215
+ """Capture one application, with noise of deviation s, as a CUDA graph."""
216
+ torch = self.torch
217
+ self.gs = s
218
+ self.gin = torch.zeros(1, self.N, device=self.device)
219
+ gen = None
220
+ if s > 0:
221
+ gen = torch.Generator(device=self.device).manual_seed(seed)
222
+ self.gen = gen
223
+ for _ in range(3):
224
+ self._forward(self.gin, s, gen)
225
+ torch.cuda.synchronize()
226
+ self.graph = torch.cuda.CUDAGraph()
227
+ with torch.cuda.graph(self.graph):
228
+ self.gout = self._forward(self.gin, s, gen)
229
+ torch.cuda.synchronize()
230
+ if s == 0.0:
231
+ probe = (torch.rand(1, self.N, device=self.device) < 0.5).float()
232
+ self.gin.copy_(probe)
233
+ self.graph.replay()
234
+ torch.cuda.synchronize()
235
+ assert bool((self.gout == self._forward(probe)).all()), \
236
+ "the captured graph differs from the eager step"
237
+ return self
238
+
239
+ def _replay(self, v):
240
+ if v.data_ptr() != self.gin.data_ptr():
241
+ self.gin.copy_(v)
242
+ self.graph.replay()
243
+ self.gin.copy_(self.gout)
244
+ return self.gin
245
+
246
+ # -- states --------------------------------------------------------------
247
+ def vec(self, pc: int, mem: List[int], copies: int = 1):
248
+ torch = self.torch
249
+ v0 = torch.zeros(self.n)
250
+ for k in range(8):
251
+ v0[k] = (pc >> (7 - k)) & 1
252
+ for j in range(256):
253
+ for k in range(8):
254
+ v0[9 + j * 8 + k] = (mem[j] >> (7 - k)) & 1
255
+ v = v0.repeat(self.r).unsqueeze(0).to(self.device)
256
+ return v.repeat(copies, 1)
257
+
258
+ def device_step(self, v, tapes: List[Tape], shadow: List[List[int]]):
259
+ """The device on every copy of the batch: cells read by majority over
260
+ the r copies, the clauses applied on a shadow memory, every copy
261
+ written. Returns the halt flags, also by majority."""
262
+ torch = self.torch
263
+ B = v.shape[0]
264
+ bits = v[:, self.cell_idx] # (B, r, 48)
265
+ maj = (bits.sum(1) * 2 > self.r).long() # (B, 48)
266
+ vals = (maj.reshape(B, len(self.cells), 8) * self.pow2).sum(-1).cpu()
267
+ halts = (v[:, [c * self.n + 8 for c in range(self.r)]].sum(1) * 2 > self.r).cpu().tolist()
268
+ new = torch.empty(B, len(self.cells), dtype=torch.long)
269
+ for i in range(B):
270
+ for k, j in enumerate(self.cells):
271
+ shadow[i][j] = int(vals[i, k])
272
+ tapes[i].apply(shadow[i])
273
+ for k, j in enumerate(self.cells):
274
+ new[i, k] = shadow[i][j]
275
+ nb = ((new.unsqueeze(-1) >> self.shift) & 1).reshape(B, 1, -1).float().to(self.device)
276
+ v[:, self.cell_idx] = nb.expand(B, self.r, -1)
277
+ return halts
278
+
279
+
280
+ # ---------------------------------------------------------------------------
281
+ def build_amplified(r: int) -> Amplified:
282
+ return Amplified(read_host(), r)
283
+
284
+
285
+ def compile_c(work: str, cc: str = "gcc") -> str:
286
+ """The evaluator in C, with the levels of a large netlist evaluated in
287
+ parallel; the threads spin between levels rather than sleep."""
288
+ exe = os.path.join(work, "netlist_eval")
289
+ subprocess.run([cc, "-O3", "-march=native", "-fopenmp", "-o", exe,
290
+ os.path.join(SRC, "netlist_eval.c")], check=True)
291
+ os.environ.setdefault("OMP_WAIT_POLICY", "ACTIVE")
292
+ os.environ.setdefault("OMP_PROC_BIND", "true")
293
+ os.environ.setdefault("OMP_NUM_THREADS", str(max(1, min(16, (os.cpu_count() or 2) - 4))))
294
+ return exe
295
+
296
+
297
+ def cmd_build(args) -> int:
298
+ t0 = time.perf_counter()
299
+ amp = build_amplified(args.r)
300
+ s = amp.sigma()
301
+ t_build = time.perf_counter() - t0
302
+ rec = {"r": args.r, "state_bits": amp.state_bits, "units": len(amp.units),
303
+ "edges": amp.edges, "depth": amp.depth, "lev_rows": amp.lev_rows,
304
+ "layer_widths": [args.r * L for L in amp.layers],
305
+ "sigma_bytes": len(s), "sigma_sha256": sha(s),
306
+ "bias_min": min(b for b, _ in amp.units), "bias_max": max(b for b, _ in amp.units),
307
+ "max_fanin": max(len(i) for _, i in amp.units), "build_seconds": t_build}
308
+ print(f"[build] N_{args.r}: {amp.state_bits:,} state bits, {len(amp.units):,} units, "
309
+ f"{amp.edges:,} edges, depth {amp.depth}; sigma {len(s):,} bytes, "
310
+ f"sha {sha(s)[:16]} ({t_build:.1f} s)", flush=True)
311
+ # the serialization denotes the netlist it was written from
312
+ n2, u2, x2 = parse_sigma(s)
313
+ rec["sigma_roundtrip"] = (n2 == amp.state_bits and u2 == amp.units and x2 == amp.nxt)
314
+ print(f" parses back to the same netlist: {rec['sigma_roundtrip']}")
315
+ # one step against SUBLEQ on the evaluator in C, every copy checked
316
+ work = tempfile.mkdtemp(prefix="redundant_")
317
+ exe = compile_c(work, args.cc)
318
+ flat = os.path.join(work, "net.bin")
319
+ amp.write_flat(flat)
320
+ p = subprocess.run([exe, "rand", flat, str(args.states), "1"], capture_output=True, text=True)
321
+ rec["c_random"] = p.stdout.strip()
322
+ rec["c_random_ok"] = p.returncode == 0 and " 0 disagree" in p.stdout
323
+ print(f" {p.stderr.strip()}")
324
+ print(f" {p.stdout.strip()}")
325
+ # the margins: every pre-activation on a replicated state is r z + (r-1)/2
326
+ import torch
327
+ device = "cuda" if torch.cuda.is_available() else "cpu"
328
+ E = Evaluator(amp, device=device, pad=True)
329
+ gen = torch.Generator().manual_seed(11)
330
+ worst = float("inf")
331
+ for _ in range(4):
332
+ base = (torch.rand(8, amp.n, generator=gen) < 0.5).float()
333
+ x = base.repeat(1, args.r).to(device)
334
+ for width, groups in E.plan:
335
+ y = torch.empty(x.shape[0], width, device=device)
336
+ for rows, idx, w, b in groups:
337
+ pre = (x[:, idx] * w).sum(-1) + b
338
+ worst = min(worst, float((pre + 0.5).abs().min()))
339
+ y[:, rows] = (pre >= 0).float()
340
+ x = y
341
+ rec["min_margin_random_states"] = worst
342
+ print(f" minimum distance of a pre-activation from -1/2 on 32 replicated random "
343
+ f"states: {worst}")
344
+ # the evaluator on the accelerator agrees with the evaluator in C on a prefix
345
+ tau = tau_star(read_host(), M_STAR)
346
+ v = E.vec(0, M_STAR)
347
+ tapes, shadow = [Tape(tau)], [[0] * 256]
348
+ for _ in range(300):
349
+ v = E.step(v)
350
+ E.device_step(v, tapes, shadow)
351
+ st = v[0].cpu().long().tolist()
352
+ open(os.path.join(work, "mstar"), "wb").write(bytes(M_STAR))
353
+ open(os.path.join(work, "tau"), "wb").write(tau)
354
+ p = subprocess.run([exe, "run", flat, os.path.join(work, "mstar"), os.path.join(work, "tau"),
355
+ os.path.join(work, "out"), "net", "300"], capture_output=True, text=True)
356
+ # replay the C state through the same 300 steps by the reference, then compare the
357
+ # emitted prefix and the memory read by majority
358
+ mem = list(M_STAR); pc = 0; dev = Tape(tau)
359
+ for _ in range(300):
360
+ a, b, c = mem[pc], mem[(pc + 1) & 255], mem[(pc + 2) & 255]
361
+ rr = (mem[b] - mem[a]) & 255
362
+ mem[b] = rr
363
+ pc = c if (rr == 0 or rr >= 128) else (pc + 3) & 255
364
+ dev.apply(mem)
365
+ got_mem = [sum(st[c * amp.n + 9 + 8 * j + t] << (7 - t) for t in range(8))
366
+ for j in range(256) for c in (0,)]
367
+ all_copies_equal = all(st[c * amp.n + i] == st[i] for c in range(args.r) for i in range(amp.n))
368
+ rec["accelerator_prefix_ok"] = (got_mem == mem and all_copies_equal
369
+ and tapes[0].out == dev.out
370
+ and open(os.path.join(work, "out"), "rb").read() == bytes(dev.out))
371
+ print(f" 300 steps of Omega* on the accelerator and in C agree with the reference, "
372
+ f"all copies equal: {rec['accelerator_prefix_ok']}")
373
+ rec["ok"] = bool(rec["sigma_roundtrip"] and rec["c_random_ok"]
374
+ and abs(worst - args.r / 2) < 1e-9 and rec["accelerator_prefix_ok"])
375
+ json.dump(rec, open(runs_path(f"paper_redundant_r{args.r}.json"), "w"), indent=1)
376
+ print("REDUNDANT HOST:", "PASS" if rec["ok"] else "FAIL")
377
+ return 0 if rec["ok"] else 1
378
+
379
+
380
+ def census(r: bytes) -> Dict[str, int]:
381
+ """L, R, f_lit, f_rep of a recipe."""
382
+ L = R = fl = fr = 0
383
+ i = 0
384
+ while True:
385
+ t = r[i]
386
+ if t == 0:
387
+ break
388
+ if 1 <= t <= 127:
389
+ L += 1; fl += t; i += 1 + t
390
+ else:
391
+ R += 1; fr += 256 - t; i += 2
392
+ return {"L": L, "R": R, "f_lit": fl, "f_rep": fr}
393
+
394
+
395
+ def closed_form(c: Dict[str, int], tape_len: int) -> Dict[str, int]:
396
+ a = 5 * c["f_lit"] + 4 * c["f_rep"] + 7 * c["L"] + 9 * c["R"] + 7
397
+ return {"A": a, "R": 1, "B": 6 * tape_len + 2, "total": a + 1 + 6 * tape_len + 2}
398
+
399
+
400
+ def cmd_selfrep(args) -> int:
401
+ """Omega*_r = (N_r, m*, tau*_r) on the evaluator in C, in lockstep with the
402
+ reference, to completion; the output is compared with ser(Omega*_r)."""
403
+ t0 = time.perf_counter()
404
+ amp = build_amplified(args.r)
405
+ s_r = amp.sigma()
406
+ tau = tau_star(s_r, M_STAR)
407
+ target = ser(s_r, bytes(M_STAR), tau)
408
+ cen = census(tau)
409
+ cf = closed_form(cen, len(tau))
410
+ print(f"[selfrep] N_{args.r}: sigma {len(s_r):,} bytes, tau*_r {len(tau):,} bytes, "
411
+ f"ser {len(target):,} bytes; closed form {cf['total']:,} steps", flush=True)
412
+ work = tempfile.mkdtemp(prefix="redundant_")
413
+ exe = compile_c(work, args.cc)
414
+ flat = os.path.join(work, "net.bin")
415
+ amp.write_flat(flat)
416
+ open(os.path.join(work, "mstar"), "wb").write(bytes(M_STAR))
417
+ open(os.path.join(work, "tau"), "wb").write(tau)
418
+ t1 = time.perf_counter()
419
+ p = subprocess.run([exe, "run", flat, os.path.join(work, "mstar"), os.path.join(work, "tau"),
420
+ os.path.join(work, "out"), args.cmode], capture_output=True, text=True)
421
+ dt = time.perf_counter() - t1
422
+ out = open(os.path.join(work, "out"), "rb").read()
423
+ exact = out == target
424
+ import re
425
+ m = re.search(r"after (\d+) steps", p.stdout)
426
+ steps = int(m.group(1)) if m else None
427
+ sg, mb, tb = inst(out) if exact else (None, None, None)
428
+ rec = {"r": args.r, "sigma_bytes": len(s_r), "sigma_sha256": sha(s_r),
429
+ "tau_bytes": len(tau), "ser_bytes": len(target), "ser_sha256": sha(target),
430
+ "census": cen, "closed_form": cf, "mode": args.cmode,
431
+ "c_result": p.stdout.strip(), "steps": steps, "seconds": dt,
432
+ "steps_per_second": steps / dt if steps and dt else None,
433
+ "out_bytes": len(out), "out_sha256": sha(out), "equals_ser": exact,
434
+ "closed_form_agrees": steps == cf["total"],
435
+ "inst_recovers_instance": bool(exact and sg == s_r and mb == bytes(M_STAR) and tb == tau),
436
+ "units": len(amp.units), "edges": amp.edges, "state_bits": amp.state_bits}
437
+ rec["ok"] = bool(exact and rec["closed_form_agrees"] and rec["inst_recovers_instance"]
438
+ and p.returncode == 0)
439
+ print(f" {p.stderr.strip()}")
440
+ print(f" {p.stdout.strip()} ({dt / 60:.1f} min, {rec['steps_per_second'] or 0:,.0f} steps/s)")
441
+ print(f" Out = ser(Omega*_r): {exact}; closed form agrees: {rec['closed_form_agrees']}; "
442
+ f"inst recovers the instance: {rec['inst_recovers_instance']}; sha {sha(out)[:16]}")
443
+ rec["total_seconds"] = time.perf_counter() - t0
444
+ json.dump(rec, open(runs_path(f"paper_redundant_selfrep_r{args.r}.json"), "w"), indent=1)
445
+ print("REDUNDANT SELF-REPRODUCTION:", "PASS" if rec["ok"] else "FAIL")
446
+ return 0 if rec["ok"] else 1
447
+
448
+
449
+ def tail_bound(s: float, r: int, M: int, T: int) -> float:
450
+ """T M erfc(r / (2 sqrt 2 s)): the bound of the fault-tolerance theorem."""
451
+ return T * M * math.erfc(r / (2.0 * math.sqrt(2.0) * s))
452
+
453
+
454
+ def cmd_omega(args) -> int:
455
+ """The instance Omega* of the host, run on N_r under read noise on every
456
+ pre-activation, to completion: the same tape and the same output bytes as
457
+ the run of Table 5 on Lev(N_host)."""
458
+ import torch
459
+ amp = build_amplified(args.r)
460
+ sigma = read_host()
461
+ tau = tau_star(sigma, M_STAR)
462
+ target = ser(sigma, bytes(M_STAR), tau)
463
+ E = Evaluator(amp, device=args.device, pad=True)
464
+ M = E.M
465
+ print(f"[omega] N_{args.r}: {amp.depth} layers, M = {M:,}, target {len(target):,} bytes",
466
+ flush=True)
467
+ grid = [float(x) for x in args.grid.split(",")]
468
+ rows = []
469
+ for s in grid:
470
+ seed = 20260929 + int(1000 * s)
471
+ try:
472
+ E.capture(s, seed)
473
+ gen = E.gen
474
+ except Exception as e: # noqa: BLE001
475
+ print(f" (graph capture unavailable: {e}; running eagerly)", flush=True)
476
+ E.graph = None
477
+ gen = torch.Generator(device=args.device).manual_seed(seed)
478
+ v = E.vec(0, M_STAR)
479
+ tapes, shadow = [Tape(tau)], [[0] * 256]
480
+ steps, wrong, halted = 0, None, False
481
+ budget = args.budget
482
+ t0 = time.perf_counter()
483
+ while steps < budget:
484
+ v = E.step_noisy(v, s, gen)
485
+ steps += 1
486
+ before = len(tapes[0].out)
487
+ halted = E.device_step(v, tapes, shadow)[0]
488
+ out = tapes[0].out
489
+ if len(out) > before:
490
+ k = len(out) - 1
491
+ if k >= len(target) or out[k] != target[k]:
492
+ wrong = k
493
+ break
494
+ if halted:
495
+ break
496
+ if steps % 200000 == 0:
497
+ print(f" s={s:.2f}: {steps:,} steps, {len(out):,} bytes "
498
+ f"({steps / (time.perf_counter() - t0):.0f}/s)", flush=True)
499
+ dt = time.perf_counter() - t0
500
+ emitted = len(tapes[0].out)
501
+ complete = emitted == len(target) and wrong is None and halted
502
+ outcome = ("emitted the whole instance" if complete else
503
+ f"a wrong byte after {wrong} correct" if wrong is not None
504
+ else "the halt bit was set" if halted else "the budget was exhausted")
505
+ rows.append({"sigma": s, "steps": steps, "bytes": emitted, "complete": complete,
506
+ "first_wrong_byte": wrong, "halted": halted, "seconds": dt,
507
+ "bound": tail_bound(s, args.r, M, max(steps, 1))})
508
+ print(f" s={s:.2f}: {steps:,} steps, {emitted:,} bytes, {outcome} "
509
+ f"({dt / 60:.1f} min); bound {rows[-1]['bound']:.3e}", flush=True)
510
+ json.dump({"r": args.r, "M": M, "target_bytes": len(target), "rows": rows},
511
+ open(runs_path(f"paper_redundant_omega_r{args.r}.json"), "w"), indent=1)
512
+ return 0
513
+
514
+
515
+ def upper_tail(x: float) -> float:
516
+ return 0.5 * math.erfc(x / math.sqrt(2.0))
517
+
518
+
519
+ def cmd_curve(args) -> int:
520
+ """One noise-free and B noisy copies of N_r stepped together from the initial
521
+ state of the self-describing instance; the step at which each noisy copy
522
+ first differs from the exact one is recorded, and the rate is compared with
523
+ the profile bound scaled by r and with M_r erfc(r / (2 sqrt2 s))."""
524
+ import torch
525
+ amp = build_amplified(args.r)
526
+ sigma = read_host()
527
+ r_H = describe(sigma)
528
+ E = Evaluator(amp, device=args.device, pad=False)
529
+ M = E.M
530
+ B = args.batch
531
+ print(f"[curve] N_{args.r}: M = {M:,}; {B} noisy copies per level, {args.steps:,} steps each",
532
+ flush=True)
533
+ prof = None
534
+ pp = runs_path("paper_noise_profile.json")
535
+ if os.path.exists(pp):
536
+ prof = json.load(open(pp))["histogram_per_step"]
537
+ grid = [float(x) for x in args.grid.split(",")]
538
+ rows = []
539
+ for s in grid:
540
+ cap = args.steps if s >= 0.24 else min(args.steps, 3000)
541
+ gen = torch.Generator(device=args.device).manual_seed(7 + int(1000 * s))
542
+ v = E.vec(0, M_P, copies=B + 1)
543
+ tapes = [Tape(r_H) for _ in range(B + 1)]
544
+ shadow = [[0] * 256 for _ in range(B + 1)]
545
+ first = [None] * B
546
+ live = cap
547
+ t0 = time.perf_counter()
548
+ for n in range(cap):
549
+ x = v
550
+ for width, groups in E.plan:
551
+ y = torch.empty(x.shape[0], width, device=x.device)
552
+ for rws, idx, w, b in groups:
553
+ pre = (x[:, idx] * w).sum(-1) + b
554
+ noise = torch.randn(pre.shape, generator=gen, device=pre.device) * s
555
+ noise[0] = 0.0
556
+ y[:, rws] = ((pre + noise) >= -0.5).float()
557
+ x = y
558
+ v = x[:, E.perm]
559
+ diff = (v[1:] != v[0]).any(dim=1).cpu().tolist()
560
+ for i, d in enumerate(diff):
561
+ if d and first[i] is None:
562
+ first[i] = n + 1
563
+ if all(f is not None for f in first):
564
+ live = n + 1
565
+ break
566
+ E.device_step(v, tapes, shadow)
567
+ dt = time.perf_counter() - t0
568
+ deviated = [f for f in first if f is not None]
569
+ exposure = sum(f if f is not None else live for f in first)
570
+ rate = len(deviated) / exposure if exposure else 0.0
571
+ bound_tail = M * math.erfc(args.r / (2.0 * math.sqrt(2.0) * s))
572
+ bound_profile = None
573
+ if prof is not None:
574
+ bound_profile = args.r * sum(c * upper_tail(args.r * abs(int(z) + 0.5) / s)
575
+ for z, c in prof.items())
576
+ rows.append({"sigma": s, "copies": B, "steps": live, "deviated": len(deviated),
577
+ "median_first_deviation":
578
+ sorted(deviated)[len(deviated) // 2] if deviated else None,
579
+ "step_exposure": exposure, "empirical_rate_per_step": rate,
580
+ "bound_tail_per_step": bound_tail,
581
+ "bound_profile_per_step": bound_profile,
582
+ "first_deviation": first, "seconds": dt})
583
+ print(f" s={s:.2f}: {len(deviated)}/{B} deviated within {live:,} steps; "
584
+ f"empirical {rate:.3e} per step, profile bound "
585
+ f"{bound_profile if bound_profile is None else format(bound_profile, '.3e')}, "
586
+ f"M erfc {bound_tail:.3e} ({dt / 60:.1f} min)", flush=True)
587
+ json.dump({"r": args.r, "M": M, "grid": grid, "rows": rows},
588
+ open(runs_path(f"paper_redundant_curve_r{args.r}.json"), "w"), indent=1)
589
+ return 0
590
+
591
+
592
+ def cmd_restore(args) -> int:
593
+ """Restoration along the orbit: one exact and one noisy copy of N_r from the
594
+ initial state of the self-describing instance. After every step the copies
595
+ of every state bit of the noisy run are compared with the exact run: a
596
+ wrong copy is counted, and the state read by majority over the r copies is
597
+ compared with the exact state. The run stops at the first step whose
598
+ majority-read state is wrong, or after the given number of steps."""
599
+ import torch
600
+ amp = build_amplified(args.r)
601
+ sigma = read_host()
602
+ r_H = describe(sigma)
603
+ E = Evaluator(amp, device=args.device, pad=False)
604
+ n, r = amp.n, args.r
605
+ grid = [float(x) for x in args.grid.split(",")]
606
+ rows = []
607
+ print(f"[restore] N_{r}: {args.steps:,} steps per level", flush=True)
608
+ for s in grid:
609
+ gen = torch.Generator(device=args.device).manual_seed(31 + int(1000 * s))
610
+ v = E.vec(0, M_P, copies=2)
611
+ tapes = [Tape(r_H) for _ in range(2)]
612
+ shadow = [[0] * 256 for _ in range(2)]
613
+ copy_errors = steps_with = worst = 0
614
+ carried = 0
615
+ prev = None
616
+ decoded_first = None
617
+ t0 = time.perf_counter()
618
+ for t in range(args.steps):
619
+ x = v
620
+ for width, groups in E.plan:
621
+ y = torch.empty(x.shape[0], width, device=x.device)
622
+ for rws, idx, w, b in groups:
623
+ pre = (x[:, idx] * w).sum(-1) + b
624
+ noise = torch.randn(pre.shape, generator=gen, device=pre.device) * s
625
+ noise[0] = 0.0
626
+ y[:, rws] = ((pre + noise) >= -0.5).float()
627
+ x = y
628
+ v = x[:, E.perm]
629
+ wrong = (v[1] != v[0]).reshape(r, n)
630
+ k = int(wrong.sum())
631
+ if k:
632
+ copy_errors += k
633
+ steps_with += 1
634
+ worst = max(worst, k)
635
+ if prev is not None:
636
+ carried += int((wrong & prev).sum())
637
+ prev = wrong
638
+ maj = (v[1].reshape(r, n).sum(0) * 2 > r)
639
+ if bool((maj != (v[0, :n] > 0.5)).any()):
640
+ decoded_first = t + 1
641
+ break
642
+ E.device_step(v, tapes, shadow)
643
+ dt = time.perf_counter() - t0
644
+ ran = decoded_first or args.steps
645
+ rows.append({"sigma": s, "steps": ran, "copy_errors": copy_errors,
646
+ "steps_with_copy_errors": steps_with, "max_copy_errors_in_a_step": worst,
647
+ "copy_errors_carried_to_next_step": carried,
648
+ "decoded_first_deviation": decoded_first,
649
+ "bytes": len(tapes[1].out), "bytes_equal": tapes[1].out == tapes[0].out,
650
+ "seconds": dt})
651
+ print(f" s={s:.2f}: {ran:,} steps; {steps_with:,} steps with a wrong copy, "
652
+ f"{copy_errors:,} wrong copies in all, at most {worst} in one step, {carried} still "
653
+ f"wrong a step later; majority-read state "
654
+ f"{'exact throughout' if decoded_first is None else f'wrong at step {decoded_first:,}'} "
655
+ f"({dt / 60:.1f} min)", flush=True)
656
+ json.dump({"r": r, "steps": args.steps, "rows": rows},
657
+ open(runs_path(f"paper_redundant_restore_r{r}.json"), "w"), indent=1)
658
+ return 0
659
+
660
+
661
+ def cmd_layers(args) -> int:
662
+ """The profile bound of N_r split by layer.
663
+
664
+ Along the first 4000 steps of the orbit of the self-describing instance on
665
+ Lev(N_host), the pre-activations of every layer are recorded; by
666
+ Proposition 6.8(ii) the rows of N_r at a layer are those of Lev(N_host) with
667
+ every distance multiplied by r, so the bound of Theorem 6.9(ii) restricted to
668
+ a layer is r * sum_i Q(r d_i / s) over its rows. The term of the last layer,
669
+ whose rows are the state, is compared with the measured rate of the curve
670
+ experiment where that record exists."""
671
+ import torch
672
+ from selfrep import M_P, LevEvaluator
673
+ from noise import Devices
674
+ r = args.r
675
+ sigma = read_host()
676
+ L = LevEvaluator(sigma, device=args.device, dense=False)
677
+ v = L._vec(0, M_P).unsqueeze(0).to(args.device)
678
+ D = Devices(L, [describe(sigma)], args.device)
679
+ lo, hi = -300, 300
680
+ nl = len(L.plan)
681
+ H = torch.zeros(nl, hi - lo + 1, dtype=torch.float64, device=args.device)
682
+ T = args.steps
683
+ for n in range(args.steps):
684
+ x = v
685
+ for li, (groups, width) in enumerate(zip(L.plan, L.widths)):
686
+ y = torch.empty(1, width, device=args.device)
687
+ for rows, idx, w, b in groups:
688
+ pre = (x[:, idx] * w).sum(-1) + b
689
+ H[li] += torch.bincount(pre.round().long().flatten() - lo,
690
+ minlength=hi - lo + 1).double()
691
+ y[:, rows] = (pre >= 0).float()
692
+ x = y
693
+ v = x
694
+ if D.step(v)[0]:
695
+ T = n + 1
696
+ break
697
+ H = (H / T).cpu()
698
+ zs = list(range(lo, hi + 1))
699
+ measured = {}
700
+ cp = runs_path(f"paper_redundant_curve_r{r}.json")
701
+ if os.path.exists(cp):
702
+ for row in json.load(open(cp))["rows"]:
703
+ measured[round(row["sigma"], 3)] = (row["empirical_rate_per_step"], row["deviated"])
704
+ out = {"r": r, "steps": T,
705
+ "per_layer_rows_at_half": [float(H[l][-1 - lo] + H[l][-lo]) for l in range(nl)],
706
+ "last_layer_hist": {z: float(H[nl - 1][z - lo]) for z in zs if H[nl - 1][z - lo] > 0},
707
+ "rows": []}
708
+ for s in [float(x) for x in args.grid.split(",")]:
709
+ q = torch.tensor([upper_tail(r * abs(z + 0.5) / s) for z in zs], dtype=torch.float64)
710
+ per_layer = [r * float(H[l] @ q) for l in range(nl)]
711
+ m = measured.get(round(s, 3))
712
+ out["rows"].append({"sigma": s, "measured": m[0] if m else None,
713
+ "deviated": m[1] if m else None, "full": sum(per_layer),
714
+ "last_layer": per_layer[-1], "per_layer": per_layer})
715
+ print(f" s={s:.2f}: last layer {per_layer[-1]:.3e}, all layers {sum(per_layer):.3e}"
716
+ + (f", measured {m[0]:.3e} ({m[1]} deviations)" if m else ""), flush=True)
717
+ json.dump(out, open(runs_path(f"paper_redundant_layers_r{r}.json"), "w"), indent=1)
718
+ return 0
719
+
720
+
721
+ def main() -> int:
722
+ ap = argparse.ArgumentParser()
723
+ ap.add_argument("mode", choices=["build", "selfrep", "omega", "curve", "restore", "layers"])
724
+ ap.add_argument("--r", type=int, default=3)
725
+ ap.add_argument("--cc", default="gcc")
726
+ ap.add_argument("--device", default="cuda")
727
+ ap.add_argument("--states", type=int, default=1 << 16)
728
+ ap.add_argument("--batch", type=int, default=256)
729
+ ap.add_argument("--steps", type=int, default=4000)
730
+ ap.add_argument("--budget", type=int, default=1 << 21)
731
+ ap.add_argument("--cmode", default="lock",
732
+ help="for selfrep: lock (compared with the reference every step) or net")
733
+ ap.add_argument("--grid", default=None)
734
+ args = ap.parse_args()
735
+ if args.grid is None:
736
+ args.grid = {"omega": "0.10,0.15,0.20,0.25",
737
+ "curve": "0.06,0.12,0.18,0.24,0.27,0.30,0.33,0.36,0.45,0.60",
738
+ "restore": "0.24,0.27,0.30,0.33,0.36",
739
+ "layers": "0.06,0.12,0.18,0.24,0.27,0.30,0.33,0.36,0.45,0.60"}.get(args.mode, "")
740
+ return {"build": cmd_build, "selfrep": cmd_selfrep, "omega": cmd_omega,
741
+ "curve": cmd_curve, "restore": cmd_restore, "layers": cmd_layers}[args.mode](args)
742
+
743
+
744
+ if __name__ == "__main__":
745
+ sys.exit(main())
src/selfrep.py CHANGED
@@ -551,7 +551,7 @@ class NetEvaluator(_Transducer):
551
  The units are grouped by depth and each reads its predecessors out of one
552
  signal vector, so no unit is evaluated before its predecessors and none is
553
  padded to a common width: the evaluation carries the netlist's own
554
- 50,250 predecessor entries and nothing else.
555
  """
556
 
557
  tag = "net"
 
551
  The units are grouped by depth and each reads its predecessors out of one
552
  signal vector, so no unit is evaluated before its predecessors and none is
553
  padded to a common width: the evaluation carries the netlist's own
554
+ 51,132 predecessor entries and nothing else.
555
  """
556
 
557
  tag = "net"
src/throughput.py CHANGED
@@ -1,4 +1,4 @@
1
- """Throughput of the three evaluators, measured on one idle machine.
2
 
3
  Each evaluator runs the same prefix of the self-describing instance and is
4
  timed after a warm-up, so the rates reported in the paper are not those of runs
@@ -24,6 +24,7 @@ def main() -> int:
24
  import torch
25
  from selfrep import (M_P, LevEvaluator, NetEvaluator, describe, read_host,
26
  run_reference)
 
27
  sigma = read_host()
28
  r_H = describe(sigma)
29
  out = {}
@@ -87,6 +88,29 @@ def main() -> int:
87
  print(f" the same map from its nonzero entries on one core: {N:,} steps in "
88
  f"{dt:.1f} s ({N / dt:,.0f} steps/s)", flush=True)
89
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
  json.dump(out, open(runs_path("paper_throughput.json"), "w"), indent=1)
91
  return 0
92
 
 
1
+ """Throughput of the four evaluators, measured on one idle machine.
2
 
3
  Each evaluator runs the same prefix of the self-describing instance and is
4
  timed after a warm-up, so the rates reported in the paper are not those of runs
 
24
  import torch
25
  from selfrep import (M_P, LevEvaluator, NetEvaluator, describe, read_host,
26
  run_reference)
27
+ torch.set_num_threads(1) # the processor rates are for one core
28
  sigma = read_host()
29
  r_H = describe(sigma)
30
  out = {}
 
88
  print(f" the same map from its nonzero entries on one core: {N:,} steps in "
89
  f"{dt:.1f} s ({N / dt:,.0f} steps/s)", flush=True)
90
 
91
+ # evaluator (d): the netlist in C, one core, on the self-describing instance
92
+ import subprocess
93
+ import tempfile
94
+ from check_c import parse_sigma, write_flat
95
+ work = tempfile.mkdtemp(prefix="throughput_")
96
+ exe = os.path.join(work, "netlist_eval")
97
+ subprocess.run(["gcc", "-O3", "-march=native", "-fopenmp", "-o", exe,
98
+ os.path.join(REPO, "src", "netlist_eval.c")], check=True)
99
+ nb, units, nxt = parse_sigma(sigma)
100
+ write_flat(os.path.join(work, "host.bin"), nb, units, nxt)
101
+ open(os.path.join(work, "mP"), "wb").write(bytes(M_P))
102
+ open(os.path.join(work, "rH"), "wb").write(r_H)
103
+ env = dict(os.environ, OMP_NUM_THREADS="1")
104
+ t0 = time.perf_counter()
105
+ subprocess.run([exe, "run", os.path.join(work, "host.bin"), os.path.join(work, "mP"),
106
+ os.path.join(work, "rH"), os.path.join(work, "out"), "net"],
107
+ check=True, capture_output=True, env=env)
108
+ dt = time.perf_counter() - t0
109
+ assert open(os.path.join(work, "out"), "rb").read() == sigma
110
+ out["c_evaluator"] = {"steps": n, "seconds": dt, "steps_per_second": n / dt}
111
+ print(f" the netlist of sigma in C, one core: {n:,} steps in {dt:.1f} s "
112
+ f"({n / dt:,.0f} steps/s)", flush=True)
113
+
114
  json.dump(out, open(runs_path("paper_throughput.json"), "w"), indent=1)
115
  return 0
116
 
src/verify.py CHANGED
@@ -3,15 +3,21 @@
3
  The checks are in three tiers, and the checks of a tier run concurrently. The
4
  first establishes the statements: each one is an exhaustive or near-exhaustive
5
  audit of a definition, a lemma or a proposition, and none of them runs the full
6
- instance. The second executes every construction end to end: the instances on
7
- the integer reference, four machines on the netlist that sigma denotes, the
8
- organism on the interpreter, the hierarchy, the constructor inside the
9
- interpreter, and the host and the organism on the evaluator in C, which runs
10
- three generations of the self-reproducing instance.
11
-
12
- The third runs the complete instance on the threshold evaluators and the
13
- perturbation experiments. Its cost belongs to the object: one generation is
14
- 1,647,743 steps of a map of 87,080 units.
 
 
 
 
 
 
15
  The rate of each evaluator is in paper/runs/paper_throughput.json, so the cost
16
  of any one line below is a multiplication.
17
 
@@ -34,21 +40,23 @@ SRC = os.path.join(REPO, "src")
34
  PY = sys.executable
35
 
36
  TIER1 = [
37
- ("check_sigma.py", [], "the canonical serialization, Definition 2.11"),
38
  ("check_device.py", [], "the device, Definition 2.8"),
39
- ("check_framing.py", [], "the framing, Definition 2.14"),
40
  ("check_host.py", [], "the machine, Definition 3.1"),
41
  ("check_lev.py", [], "the levelization, Lemma 2.6"),
42
  ("check_ternarity.py", [], "ternary depth, Proposition 3.5"),
43
- ("check_codec.py", [], "the recipe codec, Lemma 4.6"),
44
- ("check_optimal.py", [], "optimality of the bound, Proposition 4.4"),
45
- ("check_steps.py", [], "the step counts, Theorem 4.8 and Proposition 5.4"),
46
- ("check_total.py", [], "arbitrary tapes, Propositions 4.12 and 4.14"),
47
- ("check_environment.py", [], "the environment, Proposition 2.18"),
48
  ("check_settle.py", [], "order-independent settling, all 9! orders"),
49
  ("check_dependence.py", [], "the size hypothesis"),
50
  ("check_interp.py", [], "the one-record semantics of the interpreter"),
51
  ("check_host_family.py", [], "the host family H_A against SUBLEQ_A, A = 3 to 12"),
 
 
52
  ]
53
 
54
  TIER2 = [
@@ -79,6 +87,12 @@ TIER3 = [
79
  ("noise.py", ["profile"], "the pre-activation profile and its bound"),
80
  ("organism.py", ["--generations", "8", "--net-generations", "2"],
81
  "the organism over eight generations, two on the netlist"),
 
 
 
 
 
 
82
  ]
83
 
84
 
 
3
  The checks are in three tiers, and the checks of a tier run concurrently. The
4
  first establishes the statements: each one is an exhaustive or near-exhaustive
5
  audit of a definition, a lemma or a proposition, and none of them runs the full
6
+ instance; it covers the host family H_A for every word width from 3 to 12, the
7
+ fan-in-two rewriting, and the amplified host N_3 of Section 6.3. The second
8
+ executes every construction end to end: the instances on the integer reference,
9
+ four machines on the netlist that sigma denotes, the organism on the
10
+ interpreter, the hierarchy, the constructor inside the interpreter, and the
11
+ host and the organism on the evaluator in C, which runs three generations of
12
+ the self-reproducing instance.
13
+
14
+ The third runs the complete instance on the threshold evaluators, the
15
+ perturbation experiments, the orbit certificate, and the amplified host: its
16
+ exact self-reproduction on the evaluator in C, the self-reproducing instance of
17
+ the host on it under read noise, its deviation curve split by layer, and the
18
+ correction of single wrong copies along a noisy run. Its cost belongs to
19
+ the object: one generation is 1,664,939 steps of a map of 41,967 units, and
20
+ the amplified host reproduces itself in 33,796,449 steps of 125,901 units.
21
  The rate of each evaluator is in paper/runs/paper_throughput.json, so the cost
22
  of any one line below is a multiplication.
23
 
 
40
  PY = sys.executable
41
 
42
  TIER1 = [
43
+ ("check_sigma.py", [], "the canonical serialization, Definition 2.10"),
44
  ("check_device.py", [], "the device, Definition 2.8"),
45
+ ("check_framing.py", [], "the framing, Definition 2.12"),
46
  ("check_host.py", [], "the machine, Definition 3.1"),
47
  ("check_lev.py", [], "the levelization, Lemma 2.6"),
48
  ("check_ternarity.py", [], "ternary depth, Proposition 3.5"),
49
+ ("check_codec.py", [], "the recipe codec, Lemma 4.5"),
50
+ ("check_optimal.py", [], "optimality of the bound, Proposition 4.3"),
51
+ ("check_steps.py", [], "the step counts, Theorem 4.7 and Proposition 5.4"),
52
+ ("check_total.py", [], "arbitrary tapes, Propositions 4.10 and 4.12"),
53
+ ("check_environment.py", [], "the environment, Proposition 2.15"),
54
  ("check_settle.py", [], "order-independent settling, all 9! orders"),
55
  ("check_dependence.py", [], "the size hypothesis"),
56
  ("check_interp.py", [], "the one-record semantics of the interpreter"),
57
  ("check_host_family.py", [], "the host family H_A against SUBLEQ_A, A = 3 to 12"),
58
+ ("fanin2.py", [], "the fan-in-two rewriting, Corollary 7.7"),
59
+ ("redundant.py", ["build"], "the amplified host N_3, Proposition 6.8"),
60
  ]
61
 
62
  TIER2 = [
 
87
  ("noise.py", ["profile"], "the pre-activation profile and its bound"),
88
  ("organism.py", ["--generations", "8", "--net-generations", "2"],
89
  "the organism over eight generations, two on the netlist"),
90
+ ("noise.py", ["certify"], "the active-input counts along the orbits, Proposition 6.4"),
91
+ ("redundant.py", ["selfrep"], "exact self-reproduction of N_3 on the evaluator in C"),
92
+ ("redundant.py", ["omega"], "Omega* on N_3 under read noise, to completion"),
93
+ ("redundant.py", ["curve"], "the deviation rate of N_3 against the bounds"),
94
+ ("redundant.py", ["restore"], "wrong copies of N_3 under noise, and the state read by majority"),
95
+ ("redundant.py", ["layers"], "the profile bound of N_3 split by layer"),
96
  ]
97
 
98