From 2e60ce2670613ae80a405a71a2725b41d7e1a111 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 6 Sep 2026 16:29:04 +0000 Subject: [PATCH 1/3] Harden bounded API contracts and synchronize freeze interpretation Full pinned-hosted controls and included-data workflows passed before this commit. Preserve historical raw data, public figures, licences, dependency locks and existing tags. Temporary transfer content is excluded from this tree and its ancestry. --- CHANGELOG.md | 9 +++ README.md | 4 ++ SCIENTIFIC_POSITION.md | 8 ++- data/geometry_chronology_controls.zip | Bin 509489 -> 509548 bytes docs/FREEZE_AUDIT.md | 47 ++++++++++++++++ docs/METRIC_ROBUSTNESS_RESULT.md | 2 + docs/NUMERICAL_FOUNDATIONS.md | 8 +++ docs/SCIENTIFIC_OVERVIEW.md | 2 + llms-full.txt | 10 ++++ metadata/geometry_chronology_controls.json | 9 +-- metadata/public_claims.json | 45 +++++++++++++-- src/entanglement_trajectories/boundaries.py | 8 ++- src/entanglement_trajectories/dynamics.py | 7 ++- src/entanglement_trajectories/metrics.py | 22 ++++++-- src/entanglement_trajectories/spectra.py | 2 +- tests/test_freeze_edges.py | 58 ++++++++++++++++++++ 16 files changed, 220 insertions(+), 21 deletions(-) create mode 100644 docs/FREEZE_AUDIT.md create mode 100644 tests/test_freeze_edges.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 35667a1..2fabe4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## Unreleased: freeze audit + +- Validated boundary dimensions and XXZ refinement inputs before coercion; documented logarithm bases greater than one. +- Removed avoidable logarithmic-gap overflow and made normalized rank coordinates consistent at dimension one. +- Added independent regression tests for these API cases. +- Propagated the geometry-versus-chronology interpretation to the scientific entry documents. +- Recomputed the control record with the hardened source while preserving raw release data, public figures, existing tags, and the scientific conclusions. + + ## Unreleased - geometry-versus-chronology controls - Added joint, fixed-endpoint, within-window, and late-time chronology controls, plus four explicit dimension/largest-eigenvalue-matched spectrum references. diff --git a/README.md b/README.md index 95c063b..80e04dc 100644 --- a/README.md +++ b/README.md @@ -238,6 +238,10 @@ This repository concerns pure-state dynamics, specified bipartitions or explicit The complete public nonclaim list is maintained in [AI_CONTEXT.md](AI_CONTEXT.md) and [Limitations](docs/LIMITATIONS.md). +## Freeze-audit record + +The [September 2026 frozen-scope audit](docs/FREEZE_AUDIT.md) records the numerical/API checks, interpretation updates, and explicit limits of the rerun. It does not substitute automated checks for external peer review or extend the scope of the 2024 article. + ## Repository-edition status Version `1.0.0` is the corrected public repository edition. It freezes the exact mathematical layer, the repaired follow-up computation, the quantitative metric-robustness result, the paper-correction record, and the human/AI discovery layer. A narrow formal journal corrigendum remains recommended, but none has yet been submitted. diff --git a/SCIENTIFIC_POSITION.md b/SCIENTIFIC_POSITION.md index 24e1fbc..c0d7871 100644 --- a/SCIENTIFIC_POSITION.md +++ b/SCIENTIFIC_POSITION.md @@ -23,13 +23,17 @@ The family of these projections is the **entanglement-trajectory atlas**. ## Central claim for the upgraded repository -Standard bipartite pure-state entanglement measures are nonlinear projections of a common Schmidt-spectrum path. Across four tested dynamical families used to probe scrambling, recurrence, disorder, and spectral complexity, three non-equivalent metric classes share a dominant common trajectory mode and preserve substantial relational morphology after exact-boundary normalization. The preservation is hierarchical rather than exact, and local metric contradictions reveal internal spectral redistribution that no single scalar measure captures. +Standard bipartite pure-state entanglement measures are nonlinear projections of a common Schmidt-spectrum path. Across four tested dynamical families used to probe scrambling, recurrence, disorder, and spectral complexity, three non-equivalent metric classes share a dominant instantaneous common mode and substantial descriptive cross-metric morphology after exact-boundary normalization. The later chronology controls separate this point-cloud agreement from temporal organization: the observed paths are smoother and contain more local raw-metric disagreements than the specified reorderings, but unusually high common-mode variance is not a dynamical discriminator. The preservation is hierarchical rather than exact, and local metric contradictions reveal internal spectral redistribution that no single scalar measure captures. This claim has three distinct parts: 1. **Exact common origin.** The fixed-cut measures considered here are functions of the same spectrum. 2. **Empirical robustness.** Coarse trajectory morphology and the relative geometry among tested model families persist across several metric projections. -3. **Permitted disagreement.** Different metrics can contradict one another locally, especially when successive spectra are incomparable by majorization. +3. **Permitted disagreement.** Schur-concave metrics can contradict one another locally only when the spectrum pair is incomparable by majorization (subject to the declared numerical tolerances). Incomparability permits, but does not require, disagreement. + +## Interpretation after the chronology controls + +The historical common-mode percentage and classifier results remain descriptive evidence, not proofs of special temporal structure. Joint reordering preserves point-cloud PCA exactly; four constructed fixed-(d,p) references exhibit still higher agreement. Temporal smoothness and excess local metric competition survive the stated controls. The path-distance benefit is not uniform across sizes or order-preserving surrogates. See [geometry versus chronology](docs/GEOMETRY_VS_CHRONOLOGY.md) for the full comparison, including negative controls and limitations. These are later repository findings, not results already demonstrated in the 2024 journal article. ## Quantitative status of the follow-up study diff --git a/data/geometry_chronology_controls.zip b/data/geometry_chronology_controls.zip index d85215d2f848d86b2efa8bf266fb4cffd9471d34..e82cc475c3ec9964224c6a9c0141858eeb4e1fb9 100644 GIT binary patch delta 12067 zcmY+~RZtw!wgzBeUXR-uhwfH|}0}AVefd ziGL2tAoc!d9uBHr3n^3dD!AU@pRAV79ph@QgbFKBMgWg*G>vPfMp8Zc9Tf$$) zUvDWsyhgwFJIwwv@f@P1n6ehuA31+)JK^SR&eoD+3tOm_pCuWh`3g_3Gw(zS$mpI35U6^!2>doSY^$yaC~OD8lE)&{+e?<-@>P+u z5Jix@3=U=0A!x2EmnQL40^c-&iLBdiLC0)MNugwvG>KMR+hYnE3$z)c@&en(H318~ zj5Am~52K_Mw;WOA8dEz{TbE*INSSz5ManhqnGS!fQ!025d!-M#<$uv8+#b@r0Q$nB zQJJ+_L}mL`JlD}gj)wVzP8?~3Q!ZCeqHKkiqZ@HkZF(1cQE7ICFss;c!e4BMTd>Rx zc)IJdL+;Ne_Y_5GY=8R|ZlDk2uU7A0t<->r;%;pr!Y6JPzVC6?!3nWhf7iaUgmKqbfRV_8?;oa<=Y5`qhos}^>G7w};z^&UkUxQp$8Z}( z`e)}dvB&7nu-Md4JyP&n^tv)nDbSWO~9w-B|AZy?d0pmHn;H*0}I6UA70l1JQCm!0NvB-a#~y zyiVKo6`Ex)v;5>G*l#jMl%~vEx;FhD-l2B&C3MCpC1TXGZYa^MXw#>UPP$RA(CH#Z zSo~X9O)Ug0;3?bqw94&%bP4uH5zzA+!NLzV=@8sYbFI;ewRd}kvQ6Q($#yT8PAwGA zO6A#d`I~oBX~g_dM+w^jL}ujtmw@>v+|EqZjp%GdnYtqewz@&p8xJ+6SnCIY1RkC) z`c5xmmMqQnR;;{smjoWZO}+`F!}^Ejm45A;eGnhs+Yw!_6bqQ@OJ78F&fll~H?cqc zhS>TomUNkdX1IY>tL4_$M`T*knMc>xl3CI`*m}#1H&4dsnc5-HZ(Z|%NY+@HRFhnU z^D%l&I12Nd=WA_IUeW&U=q2M9{bp>~#aeCTQ!{{-*riaa(&%F}vXF$q>-AbZbw8YU zvGF2R*vV!dvFmhIB>Lo|X6np2Pg`++Z1q#iX#ahWHS|GryliIE4?)s+!%7oB)a1A$gQA>m)1bl{@vK zKrWMvr2o7O*ub7iTTloazwuQaGrq-jd@vmO1&C6EJKriWe`|$3l z>2or}q5G+&)V>7mFekr_-G~}FXHh|oI%UugPSwSId=pefvIZNW+1=kDR#tbjCrXBd1ZkgRYi5#?%Ies4*Q6#;mRp$pxZ3G2UN zKJqVk=)?v4Eqmx}9joptzD=pem8NH8VNzzyO34P=M-_I;4tE!%WcU~@n?KI2kDn^x6%J^5RhJ5o`c%hom_m_*W7$B1_5jTug#m5y5* zubx=W+QvN@9wW4Mj_g5MKlr$E^{aWKKWWLD2yG){Qk`CYzkQ=U{ze^Dhc>Six*g<< z8!-lC;H~Z{{S`ULMhhxB_E@SgT3u1~s9;LSzfMuq9#SuM$y7HWpp9opoFp_GLQP2W zko(C)iLXr=VcH&}^KIocQsg*l3~*FY%T}Pk+17%pb)$El9gBT)o5#t%U$W_oNuj{NLmRZE`64H7*1RU*tgCkVip=X=2nFabXWU zz0e#<=D+;l`L|3_sO}M`xM*I`Pc9#jZe&4)MmMV2DjM0C-$@zbIU%$X z-Cb7BufZiOIG_OppMl(CJT8%B$xm&VTaGV?N@mIg@0JTcT*&Z-5WyyjxUi_}vwK+> zEj=_7Y}b*IC|IORBu$*WXT@9|%-W^s2Z=h($%?Kz~34(+0+xr15cxG%j>BVu%A#@HFWWM#VY4 z^CifFh!`{>(j{*h>2Y(je)#^5;rO_pZGn!i7oy_-23&zS&E|`MEp}LV5*Y}ouH`_y zn}KI683ngv!&5k%*C=}gu;~D~IT}5^uhe`3cLb;p`@f}#Eh!CUYpSm9_WOf*3D+V5 z*B%smX1pvG;};Cxw_&m4%89c|M3&AhEQTR+<2`Z4jJD9jq$`&sCP=#_))O7^B-p~5 z3;p;b^g0iOjk3J9%HjyG9KRY9$}l3Qg{hG;Pew~jz7n`k`wI?mm0 zcE}Ix-+X-Yq8St0Ck&5X>`QS@JQeg5M(FArAm8Hte#SD(X&>vhI-F()>8!_gtL$;K z^Osv+F`@W961ZcfT!0!b!DNs)o)8h!5hLSy1E<*cR}A4!k7P#UW-=L%L||+qV=^{# zq<7gLJEdMUv?`<%QCr}MJ%+|t1~^li zPBbGyc{hZR#n%ujk(Py^=&RU}mPMx{?wn-sNf4HG-x>(vdPqkCuL_P;qR6s~mO=bW zEH=)Z&ojB7f1P*eSsJya$b5TOYXJ8c*ejfuZfsi=Zch__0xQ~;2D-64xN0iRis7*3d+$0sNGE53Tl!Yq9W;jA_Ae@LBb(kW46p;c*TO#Zk z&6Prfb@vm~oxn%aS2p8E%~1*%l7o_iyR@Y>A!H%y3_ zp}-$A08M<&Fk5OpdIPM@bVklG*R4$JU&KEJmbMsL+ zz&n8#q0(tSNZb!{3m0y6&T^&xb6C)HF)HUksS%BWL+s>U+KA_zskc@l{k@8BWnlO2 z5&|TCZ)2<4v@xVdRPJ4AWJbYRVV{m!1p9uZbUGYNW3kg2zQ7=%O>4& z^Ofu1x<#?*3(yqD+|nAj7i7WbX3dg_6#||Z$`9fm<5%nIG05Y%H-z)EArC~DC%pMO zavChHywXksUMlfWw6bcej@H^CZGQAO5{O>(6{nwW_$}s>^J!Y`BT09TjBIE!P#2Z* zvdil`8-Pi?z|?^Q=x|~AydBGfzK@v5holJmJ?E$M0IRe1b%kae-U;zK$JEvhT0qxr zy&60oYSLsuwo%`^4Z3ht2|Gy#5L>x~!DV@Q=mAF2U65{X7crscl6%FAbfv87IvK_- zmhzM%xb$ksgnD4w#F^`;bCIxPbToHeKXdS2=vdub&^T^-c2KZ0l%12IzZ;H7s_eZF zvdS{2)RVep9QNC*7#ANYi)8+JK&&bjE<`y%(F+71IZUu4x}G&nkxn>+{?<;yKVm7o zOp#VAtIiku2X0wQX0`0zg7{btn~z>#Ays|Jad5FANCn{PMK{ewL6$r#FV{)XQ2Du7 zQA3-zN(P}1c)G%+n}6$3D$F77AP}gG3{o9%MCViS-8X`(f&LWZl2o#7xwRdgOM3nZj^Dk?&ipl*Wl7k2?7mB;p?VUxw(1YaO{Ocsg^O`7C}pkKnp0 z+2HOlm>CaOEP{Q#71AE0&q_>yl8RSLYK4Ww)`@duUg

*4LwMDQ*UiInBg*TB#ny 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 delta 12008 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 diff --git a/docs/FREEZE_AUDIT.md b/docs/FREEZE_AUDIT.md new file mode 100644 index 0000000..50c2ddb --- /dev/null +++ b/docs/FREEZE_AUDIT.md @@ -0,0 +1,47 @@ +# Frozen-scope audit: September 2026 + +## Decision and scope + +The repository is suitable to freeze as a corrected computational companion and a finite designed-data follow-up, after the checks on the final merged commit pass. Existing release tags are not moved. This is an AI-assisted numerical and consistency audit, not independent journal peer review and not a proof that undiscovered defects are impossible. + +The audit starts from commit `88d8e420ee292359cb5fb6c10869534c9e59cb03`. A bounded API and interpretation patch closes the findings below. No new physical model, new ensemble claim, or stronger topology claim is introduced. + +## Repairs + +- Fixed-p boundary routines validate the dimension before integer coercion and reject booleans and fractional dimensions. +- Entropy and entanglement-energy units require finite logarithm bases greater than one. +- The entanglement-Hamiltonian gap uses a difference of logarithms. A strictly positive second eigenvalue no longer becomes an infinite gap through an intermediate ratio overflow. +- Normalized support and effective-rank coordinates are zero in the one-dimensional space, consistently with the exact boundary API; raw ranks remain one. +- XXZ substep counts must be positive integers. Record intervals must be finite and positive. Negative counts can no longer silently produce an empty evolution loop. +- The primary claim registry and scientific entry documents now include the geometry-versus-chronology controls and their negative results. Historical numerical snapshots remain explicitly identified as such. + +Thirty regression cases cover these API findings. None changes a declared physical run or the three metric coordinates used by the control study. The control archive is regenerated from the hardened source, rather than assigning new implementation hashes to old output tables. + +## Checks and independent probes + +The standard suite contains 233 cases after this patch. The audit additionally runs the public-figure rebuild and numerical source comparison, the paper-correction checks, the numerical-foundations command, the full included-data analysis with its default 3,000 bootstrap and 1,000 permutation settings, and the full geometry/chronology study with 999 chronology draws and 199 draws for each matched-spectrum law. + +Independent local probes supplement those workflows: 585 high-precision entropy cases; 500 random spectra with 5,000 metric-envelope comparisons; 36 analytical Schmidt-state constructions; direct partial-transpose checks; 32 independently assembled small-system step operators covering all 16 model conditions at n=4 and n=5; exact-matrix-exponential XXZ refinement and magnetization checks; independent Marchenko-Pastur quadrature and Page means; and all 16,200 distinct pairs in the selected-spectrum archive. Scripts and detailed measurements are retained in the companion freeze-audit evidence package. + +The random-spectrum test distinguishes exact identities from rounded input contracts. Two naive fixed-float-p comparisons at very small positive Renyi order differ by several parts in 10^9 near a collapsed two-level envelope. Their separately rounded input components imply a largest-value uncertainty below one floating-point step; the discrepancies are enclosed by the explicit input-rounding allowance. This is not evidence of a majorization violation or a claim of arbitrary relative accuracy. The naive discrepancies remain in the audit record. + +## What is and is not established + +The common spectrum and majorization geometry remain the mathematical framework. The approximately 90.26% point-cloud mode is descriptive, not an order-sensitive test. Chronological smoothness and excess local metric competition survive the specified reorderings. Constructed matched spectra can have stronger common-mode fractions; chronology does not improve path-distance agreement uniformly. These limits are part of the result, not exceptions to hide. + +The full n=20 physical simulation suite and the complete large-system XXZ convergence production are not regenerated in this freeze audit. Included archives, reproduction paths, independent small-system operators, and contained reruns are checked. Historical one-substep XXZ rows remain circuits, not convergence-controlled continuous-time Hamiltonian trajectories. The pinned package set is a declared reproducibility environment, not a bitwise-frozen operating-system image. + +## Reproduction + +In a fresh working copy with the documented dependencies: + +```bash +make test +make public +make numerical-check +make rebuild-included +make geometry-chronology-controls +make peer-review-check +``` + +Full controls require a fresh output directory. The hosted pull-request and post-merge checks identify the exact audited revision. No new release is implied by this document; version/tag metadata should be updated coherently only when a new release is intentionally created. diff --git a/docs/METRIC_ROBUSTNESS_RESULT.md b/docs/METRIC_ROBUSTNESS_RESULT.md index d556fcf..8433875 100644 --- a/docs/METRIC_ROBUSTNESS_RESULT.md +++ b/docs/METRIC_ROBUSTNESS_RESULT.md @@ -1,5 +1,7 @@ # Quantitative result: metric-robust trajectory morphology +> **Historical result with a later control.** High point-cloud or first-difference common-mode fractions alone do not identify exceptional temporal organization. Read [geometry versus chronology](GEOMETRY_VS_CHRONOLOGY.md) alongside these preserved descriptive results. Static matched references can have stronger agreement, and chronology does not improve path-distance agreement uniformly. + ## Result in one sentence Across the tested pure-state dynamical families, three non-equivalent Schmidt-spectrum metric classes share a dominant common trajectory mode and preserve substantial relational morphology after exact-boundary normalization, but the preservation is hierarchical rather than exact. diff --git a/docs/NUMERICAL_FOUNDATIONS.md b/docs/NUMERICAL_FOUNDATIONS.md index fdde331..67c6e8d 100644 --- a/docs/NUMERICAL_FOUNDATIONS.md +++ b/docs/NUMERICAL_FOUNDATIONS.md @@ -220,6 +220,14 @@ its analytically exact power-of-two reciprocal knots remain exact. This fixes a plotting-grid rounding artifact rather than snapping user-supplied spectra; the public-data comparator retains its original tolerances. +## Freeze-audit API domain + +The entropy and entanglement-energy APIs use finite logarithm bases greater than one, so their stated ranges and Schur directions remain valid. Fixed-p bounds validate a positive integer dimension before coercion. XXZ simulation rejects noninteger or nonpositive substep counts and nonpositive or nonfinite record intervals. Normalized support/effective-rank coordinates are zero in a one-dimensional Hilbert space; their unnormalized value remains one. + +The entanglement-Hamiltonian gap is evaluated as a difference of logarithms rather than a potentially overflowing ratio. A strictly positive represented second eigenvalue therefore has a finite logarithmic gap, even when the ratio exceeds floating-point range. Exact zero still gives infinity. + +These repairs do not change the supplied trajectories or the three metrics used in the control study. Extremely small positive Renyi orders remain sensitive to input rounding: separately rounded weights and a rounded largest eigenvalue can produce differences near a collapsed envelope. The input-error assessment, rather than a claim of arbitrary relative accuracy, governs that case. + ## 6. Reproduction ```bash diff --git a/docs/SCIENTIFIC_OVERVIEW.md b/docs/SCIENTIFIC_OVERVIEW.md index 63db19d..477ca51 100644 --- a/docs/SCIENTIFIC_OVERVIEW.md +++ b/docs/SCIENTIFIC_OVERVIEW.md @@ -1,5 +1,7 @@ # Scientific Overview +> **Interpretation update.** The common-mode percentage describes an instantaneous point cloud. The later [geometry-versus-chronology study](GEOMETRY_VS_CHRONOLOGY.md) separates that agreement from temporal smoothness and local metric competition. It does not establish a universal chronology-enhanced fingerprint. The historical numerical results below are preserved. + ## 1. Why another representation of entanglement? Entanglement is not naturally one-dimensional. Even for a fixed bipartition of a pure state, the reduced density matrix has a complete ordered spectrum. A scalar entanglement measure compresses that spectrum according to a chosen sensitivity: the leading eigenvalue, the bulk, the tail, or a weighted mixture. diff --git a/llms-full.txt b/llms-full.txt index f757cc8..6242611 100644 --- a/llms-full.txt +++ b/llms-full.txt @@ -167,6 +167,8 @@ Observed paths are smoother and their adjacent raw entanglement increments compe # Scientific Overview +> **Interpretation update.** The common-mode percentage describes an instantaneous point cloud. The later [geometry-versus-chronology study](GEOMETRY_VS_CHRONOLOGY.md) separates that agreement from temporal smoothness and local metric competition. It does not establish a universal chronology-enhanced fingerprint. The historical numerical results below are preserved. + ## 1. Why another representation of entanglement? Entanglement is not naturally one-dimensional. Even for a fixed bipartition of a pure state, the reduced density matrix has a complete ordered spectrum. A scalar entanglement measure compresses that spectrum according to a chosen sensitivity: the leading eigenvalue, the bulk, the tail, or a weighted mixture. @@ -2025,6 +2027,14 @@ its analytically exact power-of-two reciprocal knots remain exact. This fixes a plotting-grid rounding artifact rather than snapping user-supplied spectra; the public-data comparator retains its original tolerances. +## Freeze-audit API domain + +The entropy and entanglement-energy APIs use finite logarithm bases greater than one, so their stated ranges and Schur directions remain valid. Fixed-p bounds validate a positive integer dimension before coercion. XXZ simulation rejects noninteger or nonpositive substep counts and nonpositive or nonfinite record intervals. Normalized support/effective-rank coordinates are zero in a one-dimensional Hilbert space; their unnormalized value remains one. + +The entanglement-Hamiltonian gap is evaluated as a difference of logarithms rather than a potentially overflowing ratio. A strictly positive represented second eigenvalue therefore has a finite logarithmic gap, even when the ratio exceeds floating-point range. Exact zero still gives infinity. + +These repairs do not change the supplied trajectories or the three metrics used in the control study. Extremely small positive Renyi orders remain sensitive to input rounding: separately rounded weights and a rounded largest eigenvalue can produce differences near a collapsed envelope. The input-error assessment, rather than a claim of arbitrary relative accuracy, governs that case. + ## 6. Reproduction ```bash diff --git a/metadata/geometry_chronology_controls.json b/metadata/geometry_chronology_controls.json index e5f4899..89d2d41 100644 --- a/metadata/geometry_chronology_controls.json +++ b/metadata/geometry_chronology_controls.json @@ -50,9 +50,9 @@ "implementation_sha256": { "analysis/run_geometry_chronology_controls.py": "b6341e320c8cf31f0d27a48375b4a6561c9aa9fa8ee395de4631b115a84e70a5", "src/entanglement_trajectories/controls.py": "0db50f97c7033b1afeafdc577b86127e6201d1fae53c7149508b647ee3bc034b", - "src/entanglement_trajectories/boundaries.py": "c950e9e258cf43de2fccc4824da9938162e39916565d9093fd0e1d569ff39f70", - "src/entanglement_trajectories/metrics.py": "3cdaa8e404849c0fae40e10e1a46b9cd1dab9a896a4a1572b0069811329b9cef", - "src/entanglement_trajectories/spectra.py": "541cac648f65ae439758337fe9cbb2ee01ddafb5883aebc6bb20b1fc1ac40fcb" + "src/entanglement_trajectories/boundaries.py": "369c07643f8dd1774127e237fe831e42fbebc66161cb6607438cb79383c2f97b", + "src/entanglement_trajectories/metrics.py": "2733f2e157a3eaeb28f3baf72c48de9d95cdeac2bdbeeb5488cac1ce57013373", + "src/entanglement_trajectories/spectra.py": "d856c4ef8df9da81dc599a9c597f5fc18c8b643fbba6b86eccf9419db3413a74" }, "chronology": { "joint": { @@ -1680,11 +1680,12 @@ } }, "preservation": { - "file_count": 23, + "file_count": 24, "all_unchanged": true, "input_hashes": { "data/public_analysis_inputs.zip": "f50591d2a8129ec88484ee33414e11da552260c2d0e9bbfa25c27adf6083e5c2", "data/trajectory_observations.csv": "940d68a1dd865559a2b8a63145fc10411a2363e99e86004e8613defee59ef202", + "data/geometry_chronology_controls.zip": "5c3e3a91d3e62f2384f139f73dbf2b23b85c4b9ccc4ef50fdd268928c85c8eb6", "data/spectra_selected_n20.zip": "1193202290b488cf3621b2c816be6a338166dadd916ee210d92d2f6559047fb8", "data/README.md": "72210e79e78f4e87919e97bbae4fd86af06bc5f941599f4907e49408b8fedbc9", "data/xxz_convergence_n10_n12_n14.zip": "0b579066f7a69699c730210d6b062189b70101928f92da71b9825a206b344d0f", diff --git a/metadata/public_claims.json b/metadata/public_claims.json index ef85c39..b1baaae 100644 --- a/metadata/public_claims.json +++ b/metadata/public_claims.json @@ -1,8 +1,8 @@ { "schema_version": "1.0.0", "repository_version": "1.0.0", - "updated_on": "2026-08-20", - "canonical_claim": "For fixed-cut bipartite pure-state dynamics, standard spectrum-based entanglement measures are nonlinear projections of one Schmidt-spectrum path. Across the tested dynamical families, three non-equivalent metric classes share a dominant exact-boundary-normalized trajectory mode and preserve substantial relational morphology. The preservation is hierarchical rather than exact, and local contradictions occur on majorization-incomparable spectral steps. This supports an empirical metric-robust trajectory class, not a formal topological invariant or universal individual-run fingerprint.", + "updated_on": "2026-09-07", + "canonical_claim": "For fixed-cut bipartite pure-state dynamics, standard spectrum-based entanglement measures are nonlinear projections of one Schmidt-spectrum path. The tested metrics share a dominant instantaneous common component and descriptive cross-metric morphology. A large point-cloud common mode is not by itself evidence of temporal organization: joint row reordering leaves it unchanged, and the declared matched-spectrum references have higher agreement. Chronological paths are smoother and have more local raw-metric disagreements than the specified reorderings. Disagreement is constrained by majorization incomparability. This is scoped finite-data evidence, not a formal topological invariant, universal chaos diagnostic, or universal individual-run fingerprint.", "claims": [ { "id": "PUB-DEF-001", @@ -110,7 +110,7 @@ "data/public_analysis_inputs.zip::metric_robustness_scientific_summary.json", "data/public_analysis_inputs.zip::common_metric_modes.json" ], - "prohibited_overstatement": "Do not call this exact metric equivalence or a universal invariant." + "prohibited_overstatement": "Do not call this exact metric equivalence, a universal invariant, or evidence of temporal organization by itself. This is the preserved v1.0.0 snapshot; later controls use the repaired numerical implementation." }, { "id": "PUB-EMP-002", @@ -244,7 +244,7 @@ "metadata/common_mode_sensitivity.json", "docs/METRIC_ROBUSTNESS_RESULT.md" ], - "prohibited_overstatement": "Do not describe these reformulations as independent datasets or population replication." + "prohibited_overstatement": "Do not describe these reformulations as independent datasets or population replication. The first-difference common-mode fraction does not show unusually high chronological agreement relative to the later shuffle controls." }, { "id": "PUB-LIM-001", @@ -354,6 +354,38 @@ "docs/LIMITATIONS.md", "data/spectra_selected_n20.zip" ] + }, + { + "id": "PUB-CONTROL-001", + "status": "exact", + "statement": "Joint row permutation leaves the centered covariance and standardized point-cloud principal-component fractions unchanged.", + "scope": "the same complete metric tuples and fixed missing-value support", + "source_paths": [ + "docs/GEOMETRY_VS_CHRONOLOGY.md", + "src/entanglement_trajectories/controls.py" + ] + }, + { + "id": "PUB-CONTROL-002", + "status": "empirical_control", + "statement": "The four declared dimension- and largest-eigenvalue-matched reference generators produce higher point-cloud common-mode fractions than the observed data.", + "scope": "Constructed gamma-water-fill and extremizer-segment reference distributions, not uniform-polytope or Haar samples. They do not match locality, conservation laws, purity, or rank.", + "source_paths": [ + "docs/GEOMETRY_VS_CHRONOLOGY.md", + "metadata/geometry_chronology_controls.json" + ], + "prohibited_overstatement": "This does not establish a universal geometric lower bound on common-mode variance or quantify a causal fraction due to dynamics." + }, + { + "id": "PUB-CONTROL-003", + "status": "empirical_control", + "statement": "The chronological paths are smoother and have more locally competing raw metric increments than the specified joint, endpoint-preserving, and within-window reorderings; path-distance agreement is not uniformly improved by chronology.", + "scope": "Designed finite-size dataset under the declared masks, thresholds and reference policies; exploratory later repository evidence, not a result of the 2024 article.", + "source_paths": [ + "docs/GEOMETRY_VS_CHRONOLOGY.md", + "metadata/geometry_chronology_controls.json" + ], + "prohibited_overstatement": "No universal chronology-enhanced fingerprint, chaos certificate, population significance, or formal topological invariant is established." } ], "required_nonclaims": [ @@ -366,6 +398,9 @@ "Entropy magnitude alone certifies simulation cost, computational usefulness, or quantum advantage.", "The current atlas is a universal individual-run classifier.", "All named metrics in the package are independent.", - "A threshold-dependent numerical Schmidt rank is not the exact Hartley entropy." + "A threshold-dependent numerical Schmidt rank is the exact Hartley entropy.", + "A high point-cloud PCA fraction by itself demonstrates temporal organization.", + "The constructed fixed-largest-eigenvalue references are Haar states or uniform capped-simplex samples.", + "Chronology improves cross-metric classification or path-distance agreement universally." ] } diff --git a/src/entanglement_trajectories/boundaries.py b/src/entanglement_trajectories/boundaries.py index 54b3364..b17e0ec 100644 --- a/src/entanglement_trajectories/boundaries.py +++ b/src/entanglement_trajectories/boundaries.py @@ -74,6 +74,7 @@ def _canonical(metric_id: str) -> str: "vn": "von_neumann_entropy", "h1": "von_neumann_entropy", "h0": "hartley_entropy", + "rank": "schmidt_rank", "hhalf": "renyi_half", "h2": "renyi_two", "hinf": "min_entropy", @@ -107,8 +108,8 @@ def _exact_zero_order_bounds( rank_lower, rank_upper = schmidt_rank_bounds_fixed_lmax(p, d, atol=atol) if key in {"hartley_entropy", "renyi_entropy"}: base = float(base) - if not np.isfinite(base) or base <= 0.0 or abs(base - 1.0) < 1e-15: - raise ValueError("Logarithm base must be positive and different from one.") + if not np.isfinite(base) or base <= 1.0: + raise ValueError("Entropy units require a finite base greater than one.") if normalized: if d <= 1: lower = upper = 0.0 @@ -209,6 +210,9 @@ def metric_bounds_fixed_lmax( ``renyi_entropy`` and ``effective_rank``. Zero-order support boundaries are evaluated analytically rather than inferred from a numerical threshold. """ + # Validate the dimension before coercing it; never silently truncate 2.5. + validate_largest_value(1.0, d, atol=atol) + d = int(d) arr = np.asarray(p, dtype=np.float64) scalar = arr.ndim == 0 flat = arr.reshape(-1) diff --git a/src/entanglement_trajectories/dynamics.py b/src/entanglement_trajectories/dynamics.py index 1dead24..dffad2a 100644 --- a/src/entanglement_trajectories/dynamics.py +++ b/src/entanglement_trajectories/dynamics.py @@ -379,8 +379,13 @@ def build_evolver(run: ModelRun, n: int) -> Evolver: if run.model == "quantum_baker": return BakerEvolver(n=n, perturb_phase=baker_perturb_phase(n, float(p["epsilon"]))) if run.model == "random_field_xxz": - substeps = int(p.get("trotter_substeps", XXZ_TROTTER_SUBSTEPS)) + substeps = p.get("trotter_substeps", XXZ_TROTTER_SUBSTEPS) + if isinstance(substeps, (bool, np.bool_)) or not isinstance(substeps, (int, np.integer)) or substeps < 1: + raise ValueError("trotter_substeps must be a positive integer.") + substeps = int(substeps) dt_record = float(p.get("dt_record", DT_RECORD_XXZ)) + if not math.isfinite(dt_record) or dt_record <= 0.0: + raise ValueError("dt_record must be finite and positive.") dt = dt_record / substeps fields = xxz_disorder_fields(run, n) return XXZEvolver( diff --git a/src/entanglement_trajectories/metrics.py b/src/entanglement_trajectories/metrics.py index 324f820..d263963 100644 --- a/src/entanglement_trajectories/metrics.py +++ b/src/entanglement_trajectories/metrics.py @@ -15,8 +15,8 @@ def _validate_base(base: float) -> float: base = float(base) - if not np.isfinite(base) or base <= 0.0 or abs(base - 1.0) < 1e-15: - raise ValueError("Logarithm base must be positive and different from one.") + if not np.isfinite(base) or base <= 1.0: + raise ValueError("Entropy and entanglement-energy units require a finite base greater than one.") return base @@ -53,7 +53,9 @@ def schmidt_rank( """ p = normalize_spectrum(lam, atol=atol) rank = _exact_support_size(p) - if not normalized or p.size <= 1: + if normalized and p.size <= 1: + return 0.0 + if not normalized: return rank return float((rank - 1.0) / (p.size - 1.0)) @@ -83,7 +85,9 @@ def numerical_schmidt_rank( if cutoff >= float(p[0]): raise ValueError("The numerical-rank threshold removes the largest eigenvalue.") rank = int(np.count_nonzero(p > cutoff)) - if not normalized or p.size <= 1: + if normalized and p.size <= 1: + return 0.0 + if not normalized: return rank return float((rank - 1.0) / (p.size - 1.0)) @@ -299,7 +303,9 @@ def effective_rank( else: # Avoid underflow of sum(p**q) at large finite q. value = math.exp(renyi_entropy(p, q, base=math.e, atol=atol)) - if not normalized or p.size <= 1: + if normalized and p.size <= 1: + return 0.0 + if not normalized: return float(value) return float((value - 1.0) / (p.size - 1.0)) @@ -369,11 +375,15 @@ def entanglement_hamiltonian_gap( ``zero_tol``. This is the gap between the two lowest entanglement energies ``xi_i=-log(lambda_i)``. """ + base = _validate_base(base) + if not math.isfinite(zero_tol) or zero_tol < 0.0: + raise ValueError("zero_tol must be finite and nonnegative.") p = normalize_spectrum(lam, atol=atol) second = float(p[1]) if p.size > 1 else 0.0 if second <= zero_tol: return math.inf - return float(_log_base(float(p[0] / second), base)) + # A finite log gap must not overflow just because lambda_1/lambda_2 does. + return (math.log(float(p[0])) - math.log(second)) / math.log(base) def metric_value( diff --git a/src/entanglement_trajectories/spectra.py b/src/entanglement_trajectories/spectra.py index 554ae2e..84470c4 100644 --- a/src/entanglement_trajectories/spectra.py +++ b/src/entanglement_trajectories/spectra.py @@ -51,7 +51,7 @@ def normalize_spectrum( def validate_largest_value(p: float, d: int, *, atol: float = 1e-12) -> float: """Validate ``p=lambda_max`` for a ``d``-dimensional spectrum.""" - if isinstance(d, bool) or int(d) != d or d < 1: + if isinstance(d, (bool, np.bool_)) or int(d) != d or d < 1: raise ValueError("d must be a positive integer.") d = int(d) p = float(p) diff --git a/tests/test_freeze_edges.py b/tests/test_freeze_edges.py new file mode 100644 index 0000000..c27b2d8 --- /dev/null +++ b/tests/test_freeze_edges.py @@ -0,0 +1,58 @@ +"""Freeze audit: input contracts and extreme represented-spectrum diagnostics.""" +from dataclasses import replace +import math +import numpy as np +import pytest +from entanglement_trajectories.boundaries import metric_bounds_fixed_lmax +from entanglement_trajectories.dynamics import build_evolver +from entanglement_trajectories.models import xxz_runs +from entanglement_trajectories.metrics import ( + entanglement_hamiltonian_gap, renyi_entropy, hartley_entropy, + schmidt_rank, numerical_schmidt_rank, effective_rank, +) + +@pytest.mark.parametrize("d", [True, np.bool_(True), 2.5, 0, -1]) +def test_bound_dimension_rejected_before_coercion(d): + with pytest.raises(ValueError): + metric_bounds_fixed_lmax("vn", 1.0, d) + +@pytest.mark.parametrize("base", [0.5, 1.0, 0.0, -2.0, float("inf"), float("nan")]) +def test_entropy_units_have_positive_logarithm(base): + for operation in [lambda: renyi_entropy([.6,.4], .5, base=base), + lambda: hartley_entropy([.6,.4], base=base), + lambda: metric_bounds_fixed_lmax("h0", .6, 4, base=base)]: + with pytest.raises(ValueError): operation() + +@pytest.mark.parametrize("tail", [1e-300, 1e-320, np.nextafter(0.,1.)]) +def test_finite_log_gap_does_not_overflow(tail): + result=entanglement_hamiltonian_gap([1.,tail]) + assert math.isfinite(result) + assert result==pytest.approx(-math.log(tail),abs=2e-13) + assert entanglement_hamiltonian_gap([1.,0.])==math.inf + +@pytest.mark.parametrize("q", [0., .5, 1., 2., math.inf]) +def test_normalized_rank_trivial_space(q): + assert effective_rank([1.],q,normalized=True)==0. + assert schmidt_rank([1.],normalized=True)==0. + assert numerical_schmidt_rank([1.],normalized=True)==0. + assert effective_rank([1.],q)==1. + bounds=metric_bounds_fixed_lmax("effective_rank",1.,1,q=q,normalized=True) + assert bounds.lower==bounds.upper==0. + +@pytest.mark.parametrize("bad", [-1,0,1.5,True,float("nan"),float("inf")]) +def test_invalid_substeps_rejected(bad): + r=xxz_runs()[0] + with pytest.raises(ValueError): + build_evolver(replace(r,parameters={**r.parameters,"trotter_substeps":bad}),4) + +@pytest.mark.parametrize("bad", [0.,-1.,float("nan"),float("inf")]) +def test_invalid_record_interval_rejected(bad): + r=xxz_runs()[0] + with pytest.raises(ValueError): + build_evolver(replace(r,parameters={**r.parameters,"dt_record":bad}),4) + + +def test_rank_alias_is_shared_by_metric_and_boundary_interfaces(): + a=metric_bounds_fixed_lmax("rank",.6,4) + b=metric_bounds_fixed_lmax("schmidt_rank",.6,4) + assert a==b From 9da25b91c5e2b53f189ba1a0aaad46b38c87e2ef Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 6 Sep 2026 16:45:54 +0000 Subject: [PATCH 2/3] Report unresolved per-path variation instead of standardizing roundoff Expanded tests, numerical checks and full included-data analysis passed in the pinned environment. Preserve all released inputs, public figures and geometry/chronology controls. Historical per-path rank statistics are explicitly distinguished from current resolved estimates. --- CHANGELOG.md | 2 + README.md | 2 + analysis/analyze_metric_robustness.py | 4 + docs/FREEZE_AUDIT.md | 14 +- docs/NUMERICAL_FOUNDATIONS.md | 8 + llms-full.txt | 8 + metadata/freeze_audit_statistics.json | 273 ++++++++++++++++++++ src/entanglement_trajectories/robustness.py | 51 +++- tests/test_resolved_variation.py | 69 +++++ 9 files changed, 423 insertions(+), 8 deletions(-) create mode 100644 metadata/freeze_audit_statistics.json create mode 100644 tests/test_resolved_variation.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fabe4d..9fdafa8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Changelog +- Freeze audit: report unresolved per-path variation instead of PCA or rank correlation of numerical noise; preserve and distinguish historical snapshots. + ## Unreleased: freeze audit - Validated boundary dimensions and XXZ refinement inputs before coercion; documented logarithm bases greater than one. diff --git a/README.md b/README.md index 80e04dc..1e655ab 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,8 @@ Random matrix theory enters only afterward, as a family of Haar/Wishart or spike ## What the follow-up study establishes +The table and committed figures below preserve the v1.0.0 analysis snapshot. Current per-path PCA and correlation calculations exclude unresolved near-constant coordinates under a declared numerical floor; fine rank statistics need not reproduce old roundoff orderings. See [numerical foundations](docs/NUMERICAL_FOUNDATIONS.md#numerically-constant-paths-and-historical-summaries) and the [freeze audit](docs/FREEZE_AUDIT.md). The global common-mode and later chronology-control conclusions are unchanged. + The included deterministic designed dataset contains 5,856 observations from 96 trajectories: four dynamical families, four declared conditions per family, and sizes $n=10,12,14,16,18,20$. The conditions are controlled examples, not independent draws from a population. | Controlled result | Value | Interpretation | diff --git a/analysis/analyze_metric_robustness.py b/analysis/analyze_metric_robustness.py index 49cb2f3..2f9efe1 100644 --- a/analysis/analyze_metric_robustness.py +++ b/analysis/analyze_metric_robustness.py @@ -727,6 +727,10 @@ def classification_block(fold: str, mode: str) -> dict: "boundary_pc1_loadings": [float(x) for x in boundary_fit.components[0]], "boundary_pc2_loadings": [float(x) for x in boundary_fit.components[1]], "boundary_pc1_cluster_bootstrap_ci95": common_modes["boundary_cluster_bootstrap"]["pc1_explained_ci95"], + "per_trajectory_resolved": int(per_boundary["pc1_explained"].notna().sum()), + "per_trajectory_total": int(len(per_boundary)), + "per_trajectory_scale_floor": 1e-10, + "per_trajectory_status_counts": per_boundary["variation_status"].value_counts().to_dict(), "per_trajectory_pc1_median": float(per_boundary["pc1_explained"].median()), "per_trajectory_pc1_iqr": [ float(per_boundary["pc1_explained"].quantile(0.25)), diff --git a/docs/FREEZE_AUDIT.md b/docs/FREEZE_AUDIT.md index 50c2ddb..b681ad2 100644 --- a/docs/FREEZE_AUDIT.md +++ b/docs/FREEZE_AUDIT.md @@ -15,11 +15,11 @@ The audit starts from commit `88d8e420ee292359cb5fb6c10869534c9e59cb03`. A bound - XXZ substep counts must be positive integers. Record intervals must be finite and positive. Negative counts can no longer silently produce an empty evolution loop. - The primary claim registry and scientific entry documents now include the geometry-versus-chronology controls and their negative results. Historical numerical snapshots remain explicitly identified as such. -Thirty regression cases cover these API findings. None changes a declared physical run or the three metric coordinates used by the control study. The control archive is regenerated from the hardened source, rather than assigning new implementation hashes to old output tables. +Thirty regression cases cover these API findings, with eleven further cases covering resolved variation. None changes a declared physical run or the three metric coordinates used by the control study. The control archive is regenerated from the hardened source, rather than assigning new implementation hashes to old output tables. ## Checks and independent probes -The standard suite contains 233 cases after this patch. The audit additionally runs the public-figure rebuild and numerical source comparison, the paper-correction checks, the numerical-foundations command, the full included-data analysis with its default 3,000 bootstrap and 1,000 permutation settings, and the full geometry/chronology study with 999 chronology draws and 199 draws for each matched-spectrum law. +The standard suite contains 244 cases after the API and resolved-variation patches. The audit additionally runs the public-figure rebuild and numerical source comparison, the paper-correction checks, the numerical-foundations command, the full included-data analysis with its default 3,000 bootstrap and 1,000 permutation settings, and the full geometry/chronology study with 999 chronology draws and 199 draws for each matched-spectrum law. Independent local probes supplement those workflows: 585 high-precision entropy cases; 500 random spectra with 5,000 metric-envelope comparisons; 36 analytical Schmidt-state constructions; direct partial-transpose checks; 32 independently assembled small-system step operators covering all 16 model conditions at n=4 and n=5; exact-matrix-exponential XXZ refinement and magnetization checks; independent Marchenko-Pastur quadrature and Page means; and all 16,200 distinct pairs in the selected-spectrum archive. Scripts and detailed measurements are retained in the companion freeze-audit evidence package. @@ -31,6 +31,14 @@ The common spectrum and majorization geometry remain the mathematical framework. The full n=20 physical simulation suite and the complete large-system XXZ convergence production are not regenerated in this freeze audit. Included archives, reproduction paths, independent small-system operators, and contained reruns are checked. Historical one-substep XXZ rows remain circuits, not convergence-controlled continuous-time Hamiltonian trajectories. The pinned package set is a declared reproducibility environment, not a bitwise-frozen operating-system image. +## Numerically constant paths and historical summaries + +Standardizing a coordinate whose variation is only numerical noise can produce arbitrary PCA fractions and rank correlations. Current per-trajectory PCA and half-chain within-trajectory Spearman calculations therefore declare a standard-deviation floor of `1e-10` in normalized-coordinate units, measured on each statistic's finite overlap. Unresolved cases return `NaN` with an eligibility status and the chosen floor. This is a numerical-resolution convention, not a proof that every smaller physical change is zero. `scale_floor=0` is an explicit unprotected option. Absolute metric separation remains reported. + +This matters for the Clifford-reference QCA boundary paths, where nearly constant entropies must not be converted into standardized roundoff. The global point-cloud PCA and the later chronology controls are unaffected by this change. The chronology roughness already used this floor. Historical archived per-path minima, correlations, and fine-descriptor ranks are retained as snapshots, not certified precision estimates. + +A fresh included-data analysis uses the current numerical kernels and the declared resolution floor. It is not required to reproduce all secondary v1.0.0 rank statistics exactly. Even before the floor is applied, recomputing very small or tied descriptor values can reorder them; the archived minimum per-path PCA changed from about 0.537 to 0.429 when roundoff was standardized. Neither is meaningful for those unresolved paths. Current tables expose eligibility rather than presenting such minima as scientific evidence. The frozen headline table remains historical, while current analysis tables and source provenance are written to `outputs/rebuild/`. + ## Reproduction In a fresh working copy with the documented dependencies: @@ -45,3 +53,5 @@ make peer-review-check ``` Full controls require a fresh output directory. The hosted pull-request and post-merge checks identify the exact audited revision. No new release is implied by this document; version/tag metadata should be updated coherently only when a new release is intentionally created. + +The [fresh-versus-historical statistics](../metadata/freeze_audit_statistics.json) record the pinned-hosted values, eligibility decisions, and source fingerprints. diff --git a/docs/NUMERICAL_FOUNDATIONS.md b/docs/NUMERICAL_FOUNDATIONS.md index 67c6e8d..bfd45c5 100644 --- a/docs/NUMERICAL_FOUNDATIONS.md +++ b/docs/NUMERICAL_FOUNDATIONS.md @@ -228,6 +228,14 @@ The entanglement-Hamiltonian gap is evaluated as a difference of logarithms rath These repairs do not change the supplied trajectories or the three metrics used in the control study. Extremely small positive Renyi orders remain sensitive to input rounding: separately rounded weights and a rounded largest eigenvalue can produce differences near a collapsed envelope. The input-error assessment, rather than a claim of arbitrary relative accuracy, governs that case. +## Numerically constant paths and historical summaries + +Standardizing a coordinate whose variation is only numerical noise can produce arbitrary PCA fractions and rank correlations. Current per-trajectory PCA and half-chain within-trajectory Spearman calculations therefore declare a standard-deviation floor of `1e-10` in normalized-coordinate units, measured on each statistic's finite overlap. Unresolved cases return `NaN` with an eligibility status and the chosen floor. This is a numerical-resolution convention, not a proof that every smaller physical change is zero. `scale_floor=0` is an explicit unprotected option. Absolute metric separation remains reported. + +This matters for the Clifford-reference QCA boundary paths, where nearly constant entropies must not be converted into standardized roundoff. The global point-cloud PCA and the later chronology controls are unaffected by this change. The chronology roughness already used this floor. Historical archived per-path minima, correlations, and fine-descriptor ranks are retained as snapshots, not certified precision estimates. + +A fresh included-data analysis uses the current numerical kernels and the declared resolution floor. It is not required to reproduce all secondary v1.0.0 rank statistics exactly. Even before the floor is applied, recomputing very small or tied descriptor values can reorder them; the archived minimum per-path PCA changed from about 0.537 to 0.429 when roundoff was standardized. Neither is meaningful for those unresolved paths. Current tables expose eligibility rather than presenting such minima as scientific evidence. The frozen headline table remains historical, while current analysis tables and source provenance are written to `outputs/rebuild/`. + ## 6. Reproduction ```bash diff --git a/llms-full.txt b/llms-full.txt index 6242611..cb66cc6 100644 --- a/llms-full.txt +++ b/llms-full.txt @@ -2035,6 +2035,14 @@ The entanglement-Hamiltonian gap is evaluated as a difference of logarithms rath These repairs do not change the supplied trajectories or the three metrics used in the control study. Extremely small positive Renyi orders remain sensitive to input rounding: separately rounded weights and a rounded largest eigenvalue can produce differences near a collapsed envelope. The input-error assessment, rather than a claim of arbitrary relative accuracy, governs that case. +## Numerically constant paths and historical summaries + +Standardizing a coordinate whose variation is only numerical noise can produce arbitrary PCA fractions and rank correlations. Current per-trajectory PCA and half-chain within-trajectory Spearman calculations therefore declare a standard-deviation floor of `1e-10` in normalized-coordinate units, measured on each statistic's finite overlap. Unresolved cases return `NaN` with an eligibility status and the chosen floor. This is a numerical-resolution convention, not a proof that every smaller physical change is zero. `scale_floor=0` is an explicit unprotected option. Absolute metric separation remains reported. + +This matters for the Clifford-reference QCA boundary paths, where nearly constant entropies must not be converted into standardized roundoff. The global point-cloud PCA and the later chronology controls are unaffected by this change. The chronology roughness already used this floor. Historical archived per-path minima, correlations, and fine-descriptor ranks are retained as snapshots, not certified precision estimates. + +A fresh included-data analysis uses the current numerical kernels and the declared resolution floor. It is not required to reproduce all secondary v1.0.0 rank statistics exactly. Even before the floor is applied, recomputing very small or tied descriptor values can reorder them; the archived minimum per-path PCA changed from about 0.537 to 0.429 when roundoff was standardized. Neither is meaningful for those unresolved paths. Current tables expose eligibility rather than presenting such minima as scientific evidence. The frozen headline table remains historical, while current analysis tables and source provenance are written to `outputs/rebuild/`. + ## 6. Reproduction ```bash diff --git a/metadata/freeze_audit_statistics.json b/metadata/freeze_audit_statistics.json new file mode 100644 index 0000000..fae3184 --- /dev/null +++ b/metadata/freeze_audit_statistics.json @@ -0,0 +1,273 @@ +{ + "schema_version": "entanglement-trajectories-freeze-audit-statistics-1.0", + "audit_date": "2026-09-07", + "audited_base_commit": "88d8e420ee292359cb5fb6c10869534c9e59cb03", + "environment": { + "python": "3.11.15", + "numpy": "2.4.6", + "pandas": "3.0.5" + }, + "source_sha256": { + "src/entanglement_trajectories/robustness.py": "beede4e546179bc6d00a9f98fe2fd4a2b3284fe296a97385e71b8de9faf7fda6", + "analysis/analyze_metric_robustness.py": "e8cb3cd6757723f888ac4c0ed14e23610e8394136415cbb84ffef7b747bb377b", + "data/trajectory_observations.csv": "940d68a1dd865559a2b8a63145fc10411a2363e99e86004e8613defee59ef202", + "metadata/geometry_chronology_controls.json": "a3d1ae7497b0284425d7fc700e00fc0f1db8c1abc22d74b867bf6d242c74c85f" + }, + "scope": { + "trajectory_rows": 5856, + "trajectories": 96, + "model_families": 4, + "conditions_per_model": 4, + "sizes": [ + 10, + 12, + 14, + 16, + 18, + 20 + ], + "selected_full_spectrum_runs": 5, + "selected_full_spectrum_transitions": 400 + }, + "historical_common_mode": { + "raw_pc1_explained": 0.9537884097754765, + "boundary_pc1_explained": 0.9026282298671149, + "boundary_pc2_explained": 0.09309760279391623, + "boundary_pc1_loadings": [ + 0.5953332516609564, + 0.5449830041977367, + 0.5903997328949278 + ], + "boundary_pc2_loadings": [ + 0.34647835880885375, + -0.8371025379746986, + 0.42333448689356945 + ], + "boundary_pc1_cluster_bootstrap_ci95": [ + 0.8626128030927239, + 0.9341235189039404 + ], + "per_trajectory_pc1_median": 0.9475141487435563, + "per_trajectory_pc1_iqr": [ + 0.9154636848662878, + 0.9650399152801113 + ], + "per_trajectory_pc1_minimum": 0.5371338949212004, + "finite_boundary_rows": 5657, + "total_rows": 5856 + }, + "current_common_mode": { + "raw_pc1_explained": 0.9537884097754765, + "boundary_pc1_explained": 0.9026282301130131, + "boundary_pc2_explained": 0.09309760253251137, + "boundary_pc1_loadings": [ + 0.5953332515096298, + 0.5449830043049584, + 0.5903997329485456 + ], + "boundary_pc2_loadings": [ + 0.3464783604001777, + -0.8371025380091122, + 0.4233344855231002 + ], + "boundary_pc1_cluster_bootstrap_ci95": [ + 0.8626128030949844, + 0.9341235192885842 + ], + "per_trajectory_resolved": 90, + "per_trajectory_total": 96, + "per_trajectory_scale_floor": 1e-10, + "per_trajectory_status_counts": { + "resolved": 90, + "unresolved_variation": 6 + }, + "per_trajectory_pc1_median": 0.9483959944036638, + "per_trajectory_pc1_iqr": [ + 0.9210996069758545, + 0.9653541905315604 + ], + "per_trajectory_pc1_minimum": 0.7540652326909661, + "finite_boundary_rows": 5657, + "total_rows": 5856 + }, + "unresolved_boundary_paths": [ + { + "model": "qca", + "n": 10, + "run_id": "QCA_1", + "finite_points": 26, + "variation_status": "unresolved_variation", + "scale_floor": 1e-10 + }, + { + "model": "qca", + "n": 12, + "run_id": "QCA_1", + "finite_points": 36, + "variation_status": "unresolved_variation", + "scale_floor": 1e-10 + }, + { + "model": "qca", + "n": 14, + "run_id": "QCA_1", + "finite_points": 35, + "variation_status": "unresolved_variation", + "scale_floor": 1e-10 + }, + { + "model": "qca", + "n": 16, + "run_id": "QCA_1", + "finite_points": 48, + "variation_status": "unresolved_variation", + "scale_floor": 1e-10 + }, + { + "model": "qca", + "n": 18, + "run_id": "QCA_1", + "finite_points": 53, + "variation_status": "unresolved_variation", + "scale_floor": 1e-10 + }, + { + "model": "qca", + "n": 20, + "run_id": "QCA_1", + "finite_points": 65, + "variation_status": "unresolved_variation", + "scale_floor": 1e-10 + } + ], + "current_pair_status_counts": { + "resolved": 270, + "unresolved_variation": 18 + }, + "historical_pair_statistics": [ + { + "metric_a": "half_linear", + "metric_b": "half_logneg", + "clusters": 16, + "models": 4, + "resampling": "model-stratified design-cluster bootstrap", + "bootstrap_iterations": 3000, + "raw_spearman_cluster_mean": 0.9558888465406898, + "raw_spearman_ci_low": 0.9220246586722112, + "raw_spearman_ci_high": 0.9830468735719023, + "boundary_spearman_cluster_mean": 0.6922451746677301, + "boundary_spearman_ci_low": 0.6061712509824537, + "boundary_spearman_ci_high": 0.7668880672118888, + "boundary_rmse_cluster_mean": 0.1878287793829022, + "boundary_rmse_ci_low": 0.15700311058187746, + "boundary_rmse_ci_high": 0.21886462447554939, + "boundary_mae_cluster_mean": 0.16395195849614386, + "boundary_mae_ci_low": 0.13293187664781742, + "boundary_mae_ci_high": 0.19698769478092687 + }, + { + "metric_a": "half_vn", + "metric_b": "half_linear", + "clusters": 16, + "models": 4, + "resampling": "model-stratified design-cluster bootstrap", + "bootstrap_iterations": 3000, + "raw_spearman_cluster_mean": 0.9798006840975884, + "raw_spearman_ci_low": 0.9589837295067378, + "raw_spearman_ci_high": 0.9936201727274904, + "boundary_spearman_cluster_mean": 0.7593112466770355, + "boundary_spearman_ci_low": 0.6563739750904716, + "boundary_spearman_ci_high": 0.8484657937387818, + "boundary_rmse_cluster_mean": 0.2376074726923604, + "boundary_rmse_ci_low": 0.20160105072410986, + "boundary_rmse_ci_high": 0.27485927218087186, + "boundary_mae_cluster_mean": 0.21943219100766234, + "boundary_mae_ci_low": 0.1804325134006306, + "boundary_mae_ci_high": 0.2592104811510569 + }, + { + "metric_a": "half_vn", + "metric_b": "half_logneg", + "clusters": 16, + "models": 4, + "resampling": "model-stratified design-cluster bootstrap", + "bootstrap_iterations": 3000, + "raw_spearman_cluster_mean": 0.9875605595249874, + "raw_spearman_ci_low": 0.9786966303017353, + "raw_spearman_ci_high": 0.9946092619296366, + "boundary_spearman_cluster_mean": 0.9473411195443137, + "boundary_spearman_ci_low": 0.9116172793636892, + "boundary_spearman_ci_high": 0.9732555697010231, + "boundary_rmse_cluster_mean": 0.08831065072832672, + "boundary_rmse_ci_low": 0.0735002430086765, + "boundary_rmse_ci_high": 0.10178370509067884, + "boundary_mae_cluster_mean": 0.08135429138117665, + "boundary_mae_ci_low": 0.0672068476495891, + "boundary_mae_ci_high": 0.0944434435628532 + } + ], + "current_pair_statistics": [ + { + "metric_a": "half_linear", + "metric_b": "half_logneg", + "clusters": 16, + "models": 4, + "resampling": "model-stratified design-cluster bootstrap", + "bootstrap_iterations": 3000, + "raw_spearman_cluster_mean": 0.9558888465406898, + "raw_spearman_ci_low": 0.9220246586722112, + "raw_spearman_ci_high": 0.9830468735719023, + "boundary_spearman_cluster_mean": 0.7238935595038053, + "boundary_spearman_ci_low": 0.6671377494208303, + "boundary_spearman_ci_high": 0.7767891087997923, + "boundary_rmse_cluster_mean": 0.1878287791385836, + "boundary_rmse_ci_low": 0.1570031101035009, + "boundary_rmse_ci_high": 0.2188646244595862, + "boundary_mae_cluster_mean": 0.1639519582305821, + "boundary_mae_ci_low": 0.1329318761305867, + "boundary_mae_ci_high": 0.19698769473390323 + }, + { + "metric_a": "half_vn", + "metric_b": "half_linear", + "clusters": 16, + "models": 4, + "resampling": "model-stratified design-cluster bootstrap", + "bootstrap_iterations": 3000, + "raw_spearman_cluster_mean": 0.9798006840975884, + "raw_spearman_ci_low": 0.9589837295067378, + "raw_spearman_ci_high": 0.9936201727274904, + "boundary_spearman_cluster_mean": 0.8022340570279466, + "boundary_spearman_ci_low": 0.7309279868567737, + "boundary_spearman_ci_high": 0.8632727023595064, + "boundary_rmse_cluster_mean": 0.2376074726802504, + "boundary_rmse_ci_low": 0.2016010507117713, + "boundary_rmse_ci_high": 0.2748592721805123, + "boundary_mae_cluster_mean": 0.21943219098763314, + "boundary_mae_ci_low": 0.18043251340199098, + "boundary_mae_ci_high": 0.25921048110798156 + }, + { + "metric_a": "half_vn", + "metric_b": "half_logneg", + "clusters": 16, + "models": 4, + "resampling": "model-stratified design-cluster bootstrap", + "bootstrap_iterations": 3000, + "raw_spearman_cluster_mean": 0.9875605595249874, + "raw_spearman_ci_low": 0.9786966303017353, + "raw_spearman_ci_high": 0.9946092619296366, + "boundary_spearman_cluster_mean": 0.9629136420508497, + "boundary_spearman_ci_low": 0.9463367722920508, + "boundary_spearman_ci_high": 0.974840256442057, + "boundary_rmse_cluster_mean": 0.08831065049997677, + "boundary_rmse_ci_low": 0.07350024255768539, + "boundary_rmse_ci_high": 0.10178370509067881, + "boundary_mae_cluster_mean": 0.0813542911356483, + "boundary_mae_ci_low": 0.06720684715853241, + "boundary_mae_ci_high": 0.09444344355671497 + } + ], + "interpretation": "Historical public tables are snapshots. Current per-path PCA and within-path correlations omit unresolved coordinate variation at std <= 1e-10. This convention is not a certified measurement error. Global PCA and geometry/chronology-control results are unchanged within numerical precision. Fine tied-rank descriptors remain sensitive to numerical ordering.", + "full_physical_n20_regenerated": false +} diff --git a/src/entanglement_trajectories/robustness.py b/src/entanglement_trajectories/robustness.py index f9c987e..86403c8 100644 --- a/src/entanglement_trajectories/robustness.py +++ b/src/entanglement_trajectories/robustness.py @@ -210,12 +210,38 @@ def fit_common_metric_mode( ) +def _variation_status(matrix: np.ndarray, scale_floor: float) -> str: + """Resolve variation on already complete rows, in coordinate units.""" + if not math.isfinite(scale_floor) or scale_floor < 0.0: + raise ValueError("scale_floor must be finite and nonnegative.") + if matrix.shape[0] < 3: + return "insufficient_points" + if np.any(matrix.std(axis=0) <= scale_floor): + return "unresolved_variation" + return "resolved" + + +def _resolved_spearman(x: np.ndarray, y: np.ndarray, scale_floor: float): + matrix = np.column_stack([x, y]) + matrix = matrix[np.all(np.isfinite(matrix), axis=1)] + status = _variation_status(matrix, scale_floor) + value = _safe_spearman(matrix[:, 0], matrix[:, 1]) if status == "resolved" else float("nan") + return value, status + + def per_trajectory_common_mode_table( df, *, coordinate: Literal["raw", "boundary"] = "boundary", + scale_floor: float = 1e-10, ): - """Explained-variance ratios from separate standardized fits per trajectory.""" + """Separate standardized fits only when every coordinate varies resolvably. + + The declared floor is in normalized-coordinate units and matches the + chronology roughness convention. A near-constant coordinate produces NaN, + not a PCA of roundoff. Setting the floor to zero restores the unprotected + statistical convention, not the old numerical kernels or an accuracy claim. + """ import pandas as pd validate_canonical_frame(df) @@ -229,7 +255,8 @@ def per_trajectory_common_mode_table( for key, group in work.groupby(["model", "n", "run_id"], sort=True): matrix = group[columns].to_numpy(dtype=float) matrix = matrix[np.all(np.isfinite(matrix), axis=1)] - if matrix.shape[0] < 3 or np.any(matrix.std(axis=0) <= 0.0): + status = _variation_status(matrix, scale_floor) + if status != "resolved": explained = np.array([np.nan, np.nan, np.nan]) else: standardized = (matrix - matrix.mean(axis=0)) / matrix.std(axis=0) @@ -243,6 +270,8 @@ def per_trajectory_common_mode_table( "run_id": key[2], "coordinate": coordinate, "finite_points": int(matrix.shape[0]), + "variation_status": status, + "scale_floor": float(scale_floor), "pc1_explained": float(explained[0]), "pc2_explained": float(explained[1]), "pc3_explained": float(explained[2]), @@ -251,8 +280,13 @@ def per_trajectory_common_mode_table( return pd.DataFrame(rows) -def pairwise_metric_robustness(df): - """Within-trajectory rank agreement and exact-boundary separation.""" +def pairwise_metric_robustness(df, *, scale_floor: float = 1e-10): + """Within-path rank agreement where both coordinates vary resolvably. + + Correlations use their pair-specific finite overlap and report the floor + and eligibility status. Absolute separation statistics remain available + for constant paths; only the unresolved correlation is omitted. + """ import pandas as pd validate_canonical_frame(df) @@ -266,6 +300,8 @@ def pairwise_metric_robustness(df): a_boundary = group[BOUNDARY_HEIGHT_COLUMNS[first]].to_numpy(dtype=float) b_boundary = group[BOUNDARY_HEIGHT_COLUMNS[second]].to_numpy(dtype=float) overlap = np.isfinite(a_boundary) & np.isfinite(b_boundary) + raw_rank, raw_status = _resolved_spearman(a_raw, b_raw, scale_floor) + boundary_rank, boundary_status = _resolved_spearman(a_boundary, b_boundary, scale_floor) rows.append( { "model": key[0], @@ -273,8 +309,11 @@ def pairwise_metric_robustness(df): "run_id": key[2], "metric_a": first, "metric_b": second, - "raw_spearman": _safe_spearman(a_raw, b_raw), - "boundary_spearman": _safe_spearman(a_boundary, b_boundary), + "raw_spearman": raw_rank, + "boundary_spearman": boundary_rank, + "raw_variation_status": raw_status, + "boundary_variation_status": boundary_status, + "scale_floor": float(scale_floor), "boundary_rmse": _nan_rms_distance(a_boundary, b_boundary), "boundary_mae": float( np.mean(np.abs(a_boundary[overlap] - b_boundary[overlap])) diff --git a/tests/test_resolved_variation.py b/tests/test_resolved_variation.py new file mode 100644 index 0000000..e6e7354 --- /dev/null +++ b/tests/test_resolved_variation.py @@ -0,0 +1,69 @@ +"""No arbitrary PCA or rank correlation from numerically constant paths.""" +from pathlib import Path +import numpy as np +import pandas as pd +import pytest +from entanglement_trajectories import robustness as r + +@pytest.fixture +def frame(): + df = pd.read_csv(Path(__file__).parents[1] / "data/trajectory_observations.csv") + group = next(iter(df.groupby(["model", "n", "run_id"], sort=True)))[1].copy() + t = np.linspace(0., 1., len(group)) + for i, col in enumerate(r.HALF_METRICS): + group[col] = .2 + .1 * t ** (i + 1) + return group + +@pytest.mark.parametrize("amplitude", [0., 1e-14, 1e-12]) +def test_per_path_pca_omits_unresolved_coordinate(frame, amplitude): + frame["half_vn"] = .5 + amplitude * np.linspace(0., 1., len(frame)) + row = r.per_trajectory_common_mode_table(frame, coordinate="raw").iloc[0] + assert row.variation_status == "unresolved_variation" + assert np.isnan(row.pc1_explained) + assert row.scale_floor == 1e-10 + +@pytest.mark.parametrize("floor", [-1., np.inf, np.nan]) +def test_bad_variation_allowance_rejected(frame, floor): + with pytest.raises(ValueError): + r.per_trajectory_common_mode_table(frame, coordinate="raw", scale_floor=floor) + with pytest.raises(ValueError): + r.pairwise_metric_robustness(frame, scale_floor=floor) + + +def test_resolved_fit_matches_independent_svd(frame): + matrix=frame[list(r.HALF_METRICS)].to_numpy() + standardized=(matrix-matrix.mean(axis=0))/matrix.std(axis=0) + squared=np.linalg.svd(standardized,compute_uv=False)**2 + row=r.per_trajectory_common_mode_table(frame,coordinate="raw").iloc[0] + assert row.variation_status=="resolved" + assert row.pc1_explained==pytest.approx(squared[0]/squared.sum(),abs=2e-15) + + +def test_zero_floor_is_explicit_unprotected_convention(frame): + frame["half_vn"] = .5 + 1e-12*np.linspace(0.,1.,len(frame)) + row=r.per_trajectory_common_mode_table(frame,coordinate="raw",scale_floor=0).iloc[0] + assert row.variation_status=="resolved" + + +def test_pairwise_correlation_reports_status_but_keeps_distance(frame, monkeypatch): + enriched=frame.copy() + for col in r.HALF_METRICS: + enriched[r.BOUNDARY_HEIGHT_COLUMNS[col]]=.4 + monkeypatch.setattr(r,"add_exact_boundary_coordinates",lambda _:enriched) + table=r.pairwise_metric_robustness(frame) + assert (table.boundary_variation_status=="unresolved_variation").all() + assert table.boundary_spearman.isna().all() + assert (table.boundary_rmse==0).all() + assert (table.raw_variation_status=="resolved").all() + + +def test_pairwise_scale_uses_finite_overlap_only(): + x=np.array([0.,1e-14,2e-14,1.]) + y=np.array([.1,.2,.3,np.nan]) + value,status=r._resolved_spearman(x,y,1e-10) + assert status=="unresolved_variation" and np.isnan(value) + + +def test_pca_insufficient_rows(frame): + row=r.per_trajectory_common_mode_table(frame.iloc[:2],coordinate="raw").iloc[0] + assert row.variation_status=="insufficient_points" and np.isnan(row.pc1_explained) From 8be63b49f795c83418bec8c5f8d4069fed3508e8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 6 Sep 2026 16:48:35 +0000 Subject: [PATCH 3/3] Identify preserved secondary estimates in canonical claim registry --- metadata/public_claims.json | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/metadata/public_claims.json b/metadata/public_claims.json index b1baaae..619b97b 100644 --- a/metadata/public_claims.json +++ b/metadata/public_claims.json @@ -120,7 +120,9 @@ "scope": "96 included trajectories", "source_paths": [ "data/public_analysis_inputs.zip::metric_robustness_scientific_summary.json" - ] + ], + "analysis_edition": "preserved v1.0.0 numerical snapshot", + "current_qualification": "Current per-path PCA and half-chain within-path correlations omit unresolved variation at standard deviation <= 1e-10. Historical values involving nearly constant paths or tied ranks are not precision guarantees for the current implementation. Consult metadata/freeze_audit_statistics.json and docs/NUMERICAL_FOUNDATIONS.md." }, { "id": "PUB-EMP-003", @@ -134,7 +136,9 @@ "scope": "cluster means over the 16 model-condition runs", "source_paths": [ "data/public_analysis_inputs.zip::metric_robustness_scientific_summary.json" - ] + ], + "analysis_edition": "preserved v1.0.0 numerical snapshot", + "current_qualification": "Current per-path PCA and half-chain within-path correlations omit unresolved variation at standard deviation <= 1e-10. Historical values involving nearly constant paths or tied ranks are not precision guarantees for the current implementation. Consult metadata/freeze_audit_statistics.json and docs/NUMERICAL_FOUNDATIONS.md." }, { "id": "PUB-EMP-004", @@ -244,7 +248,9 @@ "metadata/common_mode_sensitivity.json", "docs/METRIC_ROBUSTNESS_RESULT.md" ], - "prohibited_overstatement": "Do not describe these reformulations as independent datasets or population replication. The first-difference common-mode fraction does not show unusually high chronological agreement relative to the later shuffle controls." + "prohibited_overstatement": "Do not describe these reformulations as independent datasets or population replication. The first-difference common-mode fraction does not show unusually high chronological agreement relative to the later shuffle controls.", + "analysis_edition": "preserved v1.0.0 numerical snapshot", + "current_qualification": "Current per-path PCA and half-chain within-path correlations omit unresolved variation at standard deviation <= 1e-10. Historical values involving nearly constant paths or tied ranks are not precision guarantees for the current implementation. Consult metadata/freeze_audit_statistics.json and docs/NUMERICAL_FOUNDATIONS.md." }, { "id": "PUB-LIM-001",