Skip to content

Sample-to-sample width, which is the thing a disorder run already has - #160

Merged
sotashimozono merged 4 commits into
mainfrom
feat/self-averaging
Sep 14, 2026
Merged

sotashimozono merged 4 commits into
mainfrom
feat/self-averaging

Conversation

@sotashimozono

Copy link
Copy Markdown
Member

An ensemble of samples gives R_X = Var(X)/[X]² at each size, and the slope of
that says which fixed point the calculation is sitting at. Nothing in the registry
read it, so a disorder run's error bars stayed error bars when they are physics.

StrongSelfAveraging         d ln R_X/d ln L = -d        (L ≫ ξ)
CriticalSelfAveraging       d ln R_X/d ln L = α/ν       (critical, randomness irrelevant)
PseudocriticalWidthScaling  d ln δT_c/d ln L = -1/ν     (random fixed point)

The discriminator, and how close it is

The third is the sharp one. δT_c(L) ∼ L^{-1/ν}, not L^{-d/2}: the latter is
the central-limit answer and holds only where the Harris criterion does, at a pure
fixed point.

They are 2% apart in the case people actually measure. For the site-dilute Ising
model in d = 3 the published exponent is 1.449(8) against d/2 = 1.5, six of
its own errors away, with 1/ν = 1.47. So the test asserts that separation in
units of the measurement's error, not the value: a discriminator this tight is
only useful if the data is good enough to resolve it, and saying so is the point.

Relevant randomness is the case with no law to fit

When the randomness is relevant, R_X does not decay at all. It approaches a
universal non-Gaussian distribution of L-independent width, so more samples at
larger L do not improve the statistics. Both decay relations are refused there
rather than fitted, which is asserted.

Wiseman and Domany originally conjectured R_X ∼ L^{α/ν} with the RANDOM fixed
point's exponents. Aharony and Harris contradict it analytically and the later
simulations contradict it numerically. CriticalSelfAveraging's docstring
therefore says the exponents are the pure system's, and that reading it with the
random ones is that refuted conjecture rather than a variant of it.

Two things worth flagging

Both citations were checked against Crossref rather than written from memory. The
Wiseman-Domany title differs between the preprint and the published version; the
published one is used. This follows a pass where a guessed arXiv id returned an
unrelated quantum Hall paper.

1/ν is not affine in ν, so solve(:ν) needs a specialized _solve. Writing
one in scaling.jl defined a NEW local function rather than extending the
parent's, with no error and no warning, because Criticality did not
import ..AbstractQAtlas: _solve the way StatisticalMechanics already does. It
does now. Worth knowing that this failure mode is silent.

Version

Patch, additive. Three relations, one import, no change to anything existing.

An ensemble of samples gives `R_X = Var(X)/[X]²` per size, and its slope says
which fixed point the calculation is at. Nothing read it.

  StrongSelfAveraging        d ln R_X/d ln L = -d            (L ≫ ξ)
  CriticalSelfAveraging      d ln R_X/d ln L = α/ν           (critical, disorder irrelevant)
  PseudocriticalWidthScaling d ln δT_c/d ln L = -1/ν         (random fixed point)

The third is the sharp one. `δT_c ∼ L^{-1/ν}` and not `L^{-d/2}`, which is the
central-limit answer and holds only where Harris does. The two are 2% apart for
the site-dilute Ising model in d = 3, where the measurement is 1.449(8) against
d/2 = 1.5, six of its own errors away, so the test asserts that separation rather
than the value.

Relevant randomness gives no decay at all: `R_X` approaches a universal
non-Gaussian of L-independent width, so both decay laws are refused rather than
fitted. Aharony and Harris, and the simulations in Wiseman and Domany, both
contradict the earlier conjecture that it goes as `L^{α/ν}` with the random fixed
point's exponents, so `CriticalSelfAveraging`'s docstring says the exponents are
the pure system's and that reading it otherwise is that refuted form.

Both citations checked against Crossref rather than written from memory; the
Wiseman-Domany title differs between the preprint and the published version and
the published one is used.

`1/ν` is not affine in `ν`, so `solve(:ν)` needs a specialized `_solve`. Writing
one in `scaling.jl` defined a new local function instead of extending the parent's
and was silently inert, since `Criticality` did not import `_solve` the way
`StatisticalMechanics` does. It does now.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Reference check — doiget verify

  • ✅ resolved: 84
  • ☑️ broken (unresolved / malformed): 0

@github-actions

Copy link
Copy Markdown
Contributor

📚 Docs preview: https://qatlashub.github.io/AbstractQAtlas.jl/previews/PR160/

(updates on each push to this PR)

@codecov

codecov Bot commented Sep 14, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

sotashimozono and others added 3 commits September 14, 2026 15:41
`StrongSelfAveraging` types `d::SpatialDimension`, so `relations_constraining` is
14 and not 13. That table names every entry rather than counting a subset,
precisely so one missing name cannot hide, and this was the missing name.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…he other

`StrongSelfAveraging` and `CriticalSelfAveraging` both called their slope
`dlogR_dlogL`, which in the name-keyed graph is one node, so a critical
measurement could be read by the off-critical law. Typing `d` then put an edge
into a node ten other relations use, and the two together were worse than either:

  derive(:ν; dlogR_dlogL=-0.1/0.7, α=-0.1)  ->  14.7
    StrongSelfAveraging: {dlogR_dlogL} -> d = 0.1428
    Josephson:           {α, d}        -> ν = 14.7

The intended answer is 0.7, and nothing errored. `consistency_report` also
reported a DISAGREE on legitimate off-critical data, because both routes had to
agree independently on a number only one of them was about.

The source says the abscissa off criticality is `L/ξ`, not `L`: `R_X ∼ (L/ξ)^{-d}`.
Writing it that way is both more faithful and a different variable, so the two
regimes are separate nodes. Both symptoms are gone, verified, and the disjointness
is pinned.

`CriticalSelfAveraging`'s `α` and `ν` are the PURE system's, while those types
mean the system under study everywhere else, so a bag built for other scaling
relations could feed this one exponents that turn it into the published, refuted
Wiseman-Domany reading. They are `α_pure`/`ν_pure` and untyped now, which is what
`WeinribHalperinExponent` already does with `ν_dis` two dozen lines below. No
reachability is lost: exponents are not `AbstractQuantity`, so nothing could see
them anyway.

The specialized `_solve` returned `-1/dlogδTc_dlogL` unguarded. At a flat slope,
the case the docstring itself discusses, that is an infinity whose SIGN comes from
whether the caller wrote `0.0` or `-0.0`, and feeding it back passes at `atol=0`.
The generic inverter this override bypasses guards exactly that; this one now does
too.

The test asserting `solve(:ν) ≈ 1/ρ` compared the hand-written inverse to itself.
It round-trips through `check` against the declared residual now, and the
cross-check against the source's separately fitted `1/ν = 1.467(5)` is stated in
units of the combined error, where it sits at 1.9. Adds the positive `check` cases
the testset had none of, the pole refusal, and the `α = 0` vacuity, which is
documented rather than refused because `α = 0` is the marginal case this
literature is about and not a bad input.

Prose: the sources tie "does not improve the statistics" to L, not to sample
count, and averaging over more realisations does help; that clause is gone.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`fetch` is deliberately unexported, so inside a submodule a bare `fetch` resolves
to Base's. A future method defined there without this import would not be inert
like the `_solve` one was; it would be added to `Base.fetch`, invisible to the
seam every atlas dispatches on. No submodule defines or uses `fetch` today, so
this is a no-op that stops being one silently.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@sotashimozono
sotashimozono merged commit 7de0939 into main Sep 14, 2026
27 checks passed
@sotashimozono
sotashimozono deleted the feat/self-averaging branch September 14, 2026 22:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant