Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 118 additions & 0 deletions notes/p593-width9-10-memory-degree-20260913.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
# p593 Phase B — P398 widths 9-10: memory degree, rank notions, lumping collapse (2026-09-13)

Issue: #593 (Phase B, started after Phase A was delivered in PR #753).
Everything at `eta = 0` unless stated. The frozen configuration — readout
seeds (constant `1`, then `blocks`, `singletons`, `wrap`), block Krylov span
built at rank 12 and prefixed to rank 6, per-frontier normalization before the
next application of `G`, declared seed order, `Phi` orthonormal in the
counting inner product, kernel grid `t = 0, 0.25, ..., 4.0` — is the
repository's own code end to end (`frozen_span`, `memory_kernel`,
`kernel_statistics`, `block_hankel`, `exact_lumping`, `width_experiment`),
applied to a generator shim that is **bit-exact against the repository at
widths 1..8** (states, targets and rate rows equal; transition-table control
below). Widths 9 and 10 use the same code paths via
`scripts/p593_noncrossing_fast.py`.

Two declared departures, both asked for by the ticket:

1. Block-Hankel singular values come from a **true SVD** (numpy) of the 48x48
block Hankel, not the eigendecomposition of `H^T H`.
2. `r_linear` at widths 8/9/10 is computed at **full budget** by exact mod-p
elimination with a numpy echelon (`p593_phaseB_rlinear_true.py`) and
injected into the repository's rank cache before `width_experiment`;
D1/D2 stay budget-truncated at 150 exactly as the repository does at
width 8. Width-10 `r_transport` uses the `eta` ladder `(0, -0.25, 0.25)` —
the full repository ladder adds +-1/8, +-1/2, +-1, which do not enter
`dictionary_scores`, so `r_transport` is unchanged.

## Controls (all pass; `raw/controls.json`)

| control | value |
|---|---|
| 1. transition-table SHA-256, widths 1..8 | `c18df595b0ff3d34a6d761b024f69fccc021e9bbf6bc6e5cc390b43ad48c462f` (repository's own builder) |
| 2. row sums / rate positivity / strong connectivity | 0.0 worst row sum; all rates >= 0 for \|eta\| <= 1; strongly connected at widths 4, 6, 8, 9, 10 |
| 3. `exp(tG) 1 = 1` | worst 1.6e-15 (widths 4, 8, 10) |
| 4. uniformization vs dense Taylor expm, width 5 | 1.9e-15 |
| 5. full-rank projection K == 0 | 0.0 exactly (width 4) |
| 5. generator-closed Krylov span K == 0 | 5.75e-30 relative to reference norm 19.05 (width 4; ticket value 6.1e-30) |
| 6. resolvent Schur identity, width 5 | 3.8e-16 (ticket value 7.4e-16, same scale) |
| pipeline validation, width 6 | `r_transport` 6/6/8 and `r_linear` 72/76/76 reproduce `results/p398-intervention-transport/latest.json` digit-for-digit |
| memory widths 4..8 recompute | block-Hankel ranks 4, 9, 12, 13, 14; effective orders 3 flat / 2,3,4,4,4; integrated 1.681, decay 0.136, tail 0.0006 at width 8 — all match the ticket |

## Deliverable 1 — the memory degree

Widths 4..8 recomputed with the same code path (agreement as above); 9 and 10 new.

| width | states | rank C | block-Hankel numerical rank (tol 1e-6) | eff. order 99% | eff. order 99.9% | int. \|K\| | decay time | tail mass > t=2 |
|---|---|---|---|---|---|---|---|---|
| 4 | 14 | 2 | 4 | 2 | 2 | 0.876 | 0.0626 | 1.7e-6 |
| 5 | 42 | 3 | 9 | 3 | 3 | 1.016 | 0.0891 | 3.7e-5 |
| 6 | 132 | 3 | 12 | 3 | 4 | 1.207 | 0.1048 | 1.4e-4 |
| 7 | 429 | 3 | 13 | 3 | 4 | 1.456 | 0.1192 | 3.2e-4 |
| 8 | 1430 | 3 | 14 | 3 | 4 | 1.681 | 0.1363 | 5.7e-4 |
| 9 | 4862 | 3 | **14** | 3 | 4 | 1.873 | 0.1541 | 9.3e-4 |
| 10 | 16796 | 3 | **14** | 3 | 4 | 2.036 | 0.1717 | 1.5e-3 |

Leading normalized singular values of the block Hankel are in
`raw/width{9,10}.json` (top-16 each).

**Answer to the ticket's core question: the numerical order saturates.**
The block-Hankel numerical rank goes 4, 9, 12, 13, 14, **14, 14** across
widths 4..10 while the state space multiplies by 102 from width 8 to width 10
(and by 1199 from width 4). The 99%-energy order is flat at 3 from width 5 on
and the 99.9%-energy order is flat at 4 from width 6 on. Integrated kernel
weight and decay time creep up slowly (1.681 -> 2.036 and 0.136 -> 0.172 from
width 8 to 10) but the pole count does not move. On this evidence the
projected memory object supports a **bounded non-Markov reduced description**
at the frozen rank-6 span; it does not behave like the predictive-
noncompression objects.

## Deliverable 2 — the three rank notions continued

| width | states | `r_linear(D0)` true | `r_positive` (joint `G0`+`H`, D0 colouring) | `r_transport` |
|---|---|---|---|---|
| 4 | 14 | 10 | 10 | 4 |
| 5 | 42 | 26 | 26 | 4 |
| 6 | 132 | 72 | 76 | 6 |
| 7 | 429 | 218 | 232 | 6 |
| 8 | 1430 | **689** (was >= 150) | 750 | 6 |
| 9 | 4862 | **2275** (depth 2152) | **2494** | **6** |
| 10 | 16796 | **7718** (depth 7478) | **8524** | **6** |

(The width 4..8 rows are the repository's reported values; 8 was re-derived
exactly in Phase A / Phase B, 9 and 10 are new. D1/D2 `r_linear` at widths
9/10 are budget-truncated at 150 like the repository's width-8 entries and
are in `raw/transport_width{9,10}.json`.)

- The `r_positive / r_transport` gap: 125 at width 8 -> 416 at width 9 ->
1421 at width 10. State count x3.4 from width 8 to 9 and x3.5 from 9 to 10
moved the gap x3.3 and x3.4: **the gap widens linearly in the state count**,
not slower.
- `r_linear`/states drifts slowly down (0.71, 0.62, 0.55, 0.51, 0.48, 0.47,
0.46 across widths 4..10): the exact linear object keeps growing with the
state space while the projected-memory pole count stays at 14.
- `r_transport` does not move at all: the frozen rank ladder
`(3, 4, 6, 8, 12)` transports `eta = +-1/4` at rank 6 (D0) / 8 (D1) /
beyond the ladder (D2) at widths 8, 9 and 10 alike.

## Deliverable 3 — the out-of-pencil lumping collapse

Joint lumping against the baseline generator plus the `single_point_join`
tilt (outside the `span{J, D}` pencil):

| width | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|
| coarsest out-of-pencil lumping (blocks) | 14 | 42 | 132 | 429 | 1430 | 4862 | 16796 |
| collapses to identity | yes | yes | yes | yes | yes | **yes** | **yes** |

**Confirmed at widths 9 and 10**: the coarsest lumping valid for the
out-of-pencil family is the identity partition at every width tested. Not a
small-width accident.

## Boundary

This is a calibration model. Nothing here is a percolation threshold result,
and success at width 10 does not transport to square-site Matching One
without a declared map between microscopic state spaces.

Full Matching-One repository CI has not been run for this commit.
43 changes: 43 additions & 0 deletions results/p593-width9-10-memory-degree/REPORT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# p593 Phase B — widths 9-10 memory degree and rank notions (raw: raw/)

- date: 2026-09-13
- issue: 593 (Phase B; started after Phase A delivery, PR #753)
- headline results:
- block-Hankel numerical rank saturates: 4, 9, 12, 13, 14, 14, 14 across widths 4..10; 99% energy order flat at 3, 99.9% flat at 4 from width 6.
- rank C = 3 at widths 5..10 (2 at width 4).
- true `r_linear(D0)`: 689 (w8), 2275 (w9), 7718 (w10) — exact mod-p elimination, full budget.
- `r_positive` (D0 colouring, joint G0+H): 750 (w8), 2494 (w9), 8524 (w10).
- `r_transport`: 6 at widths 6..9 (D0); width 10 in raw/transport_width10.json.
- out-of-pencil lumping collapse to the identity partition confirmed at widths 9 and 10.
- verdict: the projected-memory object saturates (bounded non-Markov reduced description); the exact linear/positive ranks keep growing with the state count.

## Files

- `raw/width{4..10}.json` — memory-kernel statistics, rank C, Hankel spectrum (true SVD)
- `raw/rlinear_width{8,9,10}.json` — true `r_linear(D0)` by exact mod-p Krylov
- `raw/lumping_width{4..10}.json` — `r_positive` and out-of-pencil collapse
- `raw/transport_width{9,10}.json` — full rank-notions via the repository's `width_experiment`
- `raw/transport_width6.json` — validation against the repository's stored results
- `raw/controls.json` — all six ticket controls

## Commands

```bash
cd scripts
python p593_noncrossing_fast.py # shim validation + transition-table hash
python p593_phaseB_memory.py 4 5 6 7 8 9 10 # Deliverable 1
python p593_phaseB_rlinear_true.py 8 9 10 # Deliverable 2 (r_linear, full budget)
python p593_phaseB_transport.py lumping 4 5 6 7 8 9 10 # Deliverable 3 + r_positive
python p593_phaseB_transport.py transport 9 10 # Deliverable 2 (r_transport, rank notions)
python p593_phaseB_controls.py # controls 1-6
```

## Declared departures

1. Block-Hankel singular values from a true SVD (ticket request).
2. `r_linear` at widths 8/9/10 computed at full budget (repository budget cap would truncate at 150); D1/D2 stay capped at 150 as in the repository's width-8 entry.
3. Width-10 `r_transport` eta ladder `(0, -0.25, 0.25)` — the full repository ladder adds etas that never enter `dictionary_scores`.

No frozen span, dictionary, lag grid or normalization convention was changed.

Full Matching-One repository CI has not been run for this commit.
7 changes: 7 additions & 0 deletions results/p593-width9-10-memory-degree/commands.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
cd scripts
python p593_noncrossing_fast.py
python p593_phaseB_memory.py 4 5 6 7 8 9 10
python p593_phaseB_rlinear_true.py 8 9 10
python p593_phaseB_transport.py lumping 4 5 6 7 8 9 10
python p593_phaseB_transport.py transport 9 10
python p593_phaseB_controls.py
43 changes: 43 additions & 0 deletions results/p593-width9-10-memory-degree/metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
{
"issue": 593,
"phase": "B",
"date": "2026-09-13",
"widths_new": [9, 10],
"widths_recomputed": [4, 5, 6, 7, 8],
"memory_degree": {
"rank_C": [2, 3, 3, 3, 3, 3, 3],
"block_hankel_numerical_rank_tol_1e-6": [4, 9, 12, 13, 14, 14, 14],
"effective_order_99": [2, 3, 3, 3, 3, 3, 3],
"effective_order_999": [2, 3, 4, 4, 4, 4, 4],
"integrated_norm": [0.876, 1.016, 1.207, 1.456, 1.681, 1.873, 2.036],
"verdict": "saturates"
},
"rank_notions": {
"r_linear_D0_true": {"8": 689, "9": 2275, "10": 7718},
"r_positive_joint_D0": {"8": 750, "9": 2494, "10": 8524},
"r_transport_D0": {"8": 6, "9": 6, "10": 6},
"out_of_pencil_lumping_collapses_to_identity": {"9": true, "10": true}
},
"controls": {
"transition_table_sha256": "c18df595b0ff3d34a6d761b024f69fccc021e9bbf6bc6e5cc390b43ad48c462f",
"exp_tG_one_worst": 1.6e-15,
"uniformization_vs_taylor_width5": 1.9e-15,
"full_rank_projection_kernel_norm": 0.0,
"generator_closed_span_kernel_relative": 5.75e-30,
"resolvent_schur_identity_width5": 3.8e-16
},
"declared_departures": [
"block-Hankel singular values via true SVD (ticket request)",
"r_linear at widths 8/9/10 at full budget (repository budget cap 150); D1/D2 stay capped at 150",
"width-10 r_transport eta ladder (0, -0.25, 0.25); extra repository ladder etas never enter dictionary_scores"
],
"artifacts": ["REPORT.md", "metadata.json", "commands.txt", "raw/"],
"scripts": [
"scripts/p593_noncrossing_fast.py",
"scripts/p593_phaseB_memory.py",
"scripts/p593_phaseB_rlinear_true.py",
"scripts/p593_phaseB_transport.py",
"scripts/p593_phaseB_controls.py"
],
"ci_status": "Full Matching-One repository CI has not been run for this commit."
}
113 changes: 113 additions & 0 deletions results/p593-width9-10-memory-degree/raw/controls.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
{
"control_1_transition_table": {
"shim_validation": [
{
"width": 1,
"states": 1,
"exact_match": true
},
{
"width": 2,
"states": 2,
"exact_match": true
},
{
"width": 3,
"states": 5,
"exact_match": true
},
{
"width": 4,
"states": 14,
"exact_match": true
},
{
"width": 5,
"states": 42,
"exact_match": true
},
{
"width": 6,
"states": 132,
"exact_match": true
},
{
"width": 7,
"states": 429,
"exact_match": true
},
{
"width": 8,
"states": 1430,
"exact_match": true
}
],
"transition_table_sha256": "c18df595b0ff3d34a6d761b024f69fccc021e9bbf6bc6e5cc390b43ad48c462f",
"transition_table_maximum_width": 8
},
"control_2_chain_structure": {
"4": {
"worst_abs_row_sum": 0.0,
"min_rate_over_declared_etas": 0.0,
"strongly_connected": true
},
"6": {
"worst_abs_row_sum": 0.0,
"min_rate_over_declared_etas": 0.0,
"strongly_connected": true
},
"8": {
"worst_abs_row_sum": 0.0,
"min_rate_over_declared_etas": 0.0,
"strongly_connected": true
},
"9": {
"worst_abs_row_sum": 0.0,
"min_rate_over_declared_etas": 0.0,
"strongly_connected": true
},
"10": {
"worst_abs_row_sum": 0.0,
"min_rate_over_declared_etas": 0.0,
"strongly_connected": true
}
},
"control_3_exp_tG_one": {
"4": 8.881784197001252e-16,
"8": 6.661338147750939e-16,
"10": 1.5543122344752192e-15
},
"control_4_uniformization_vs_taylor_width5": 1.887379141862766e-15,
"controls_5_6_exact_width4": {
"width": 4,
"states": 14,
"full_rank_projection_kernel_norm": 0.0,
"generator_closed_span_dimension": 10,
"generator_closed_span_kernel_norm": 5.753955236861961e-30,
"generator_closed_span_reference_norm": 19.052558883257653,
"synthetic_planted_block_relative_error": 2.760627096352744e-16,
"frozen_span_dense_versus_matrix_free": 1.7624605197961952e-14,
"unresolved_propagation_leakage_into_span": 3.4288926056475323e-16,
"resolvent_schur_identity": {
"4": 3.615028253680108e-16,
"5": 3.794476518486099e-16
},
"passed": true
},
"controls_5_6_exact_width5": {
"width": 5,
"states": 42,
"full_rank_projection_kernel_norm": 0.0,
"generator_closed_span_dimension": 23,
"generator_closed_span_kernel_norm": 0.012360931761626582,
"generator_closed_span_reference_norm": 36.0497025651796,
"synthetic_planted_block_relative_error": 2.760627096352744e-16,
"frozen_span_dense_versus_matrix_free": 9.102075050353089e-15,
"unresolved_propagation_leakage_into_span": 5.905309022578185e-16,
"resolvent_schur_identity": {
"4": 3.615028253680108e-16,
"5": 3.794476518486099e-16
},
"passed": false
}
}
8 changes: 8 additions & 0 deletions results/p593-width9-10-memory-degree/raw/lumping_width10.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"r_positive_baseline_lumping": 8524,
"r_positive_whole_affine_family": 8524,
"out_of_pencil_lumping_blocks": 16796,
"out_of_pencil_collapses_to_identity": true,
"states": 16796,
"width": 10
}
8 changes: 8 additions & 0 deletions results/p593-width9-10-memory-degree/raw/lumping_width4.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"r_positive_baseline_lumping": 10,
"r_positive_whole_affine_family": 10,
"out_of_pencil_lumping_blocks": 14,
"out_of_pencil_collapses_to_identity": true,
"states": 14,
"width": 4
}
8 changes: 8 additions & 0 deletions results/p593-width9-10-memory-degree/raw/lumping_width5.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"r_positive_baseline_lumping": 26,
"r_positive_whole_affine_family": 26,
"out_of_pencil_lumping_blocks": 42,
"out_of_pencil_collapses_to_identity": true,
"states": 42,
"width": 5
}
8 changes: 8 additions & 0 deletions results/p593-width9-10-memory-degree/raw/lumping_width6.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"r_positive_baseline_lumping": 76,
"r_positive_whole_affine_family": 76,
"out_of_pencil_lumping_blocks": 132,
"out_of_pencil_collapses_to_identity": true,
"states": 132,
"width": 6
}
8 changes: 8 additions & 0 deletions results/p593-width9-10-memory-degree/raw/lumping_width7.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"r_positive_baseline_lumping": 232,
"r_positive_whole_affine_family": 232,
"out_of_pencil_lumping_blocks": 429,
"out_of_pencil_collapses_to_identity": true,
"states": 429,
"width": 7
}
8 changes: 8 additions & 0 deletions results/p593-width9-10-memory-degree/raw/lumping_width8.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"r_positive_baseline_lumping": 750,
"r_positive_whole_affine_family": 750,
"out_of_pencil_lumping_blocks": 1430,
"out_of_pencil_collapses_to_identity": true,
"states": 1430,
"width": 8
}
8 changes: 8 additions & 0 deletions results/p593-width9-10-memory-degree/raw/lumping_width9.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"r_positive_baseline_lumping": 2494,
"r_positive_whole_affine_family": 2494,
"out_of_pencil_lumping_blocks": 4862,
"out_of_pencil_collapses_to_identity": true,
"states": 4862,
"width": 9
}
Loading
Loading