Skip to content

Releases: seto77/Temari

Temari dataset v5.0.0 — F(s, E₀), 525 channels

Choose a tag to compare

@seto77 seto77 released this 10 Aug 01:29

The record of reference is on Zenodo: 10.5281/zenodo.21872050 — cite that version DOI, which guarantees the files have not changed. 10.5281/zenodo.21872049 is version-independent and resolves to whichever version is current.

The archive here is a byte-identical mirror. It is built deterministically, so the two copies can be compared rather than merely trusted: sha256 = ceee8a2351d56a4feda6a3d6d69c943f094f88f30fc136728e7b64ff65518396.

Inner-shell ionization form factors F(s, E₀) for STEM-EDX — 525 channels (K, L1–L3, M1–M5), 14,796 rows, s ≤ 16 Å⁻¹ on 321 nodes.

This is the data only. The software is released separately and carries its own version; the two version lines are independent.

Dataset version 5.0.0
Model DHFS-KS23-DiracB-KDIRAC2C-jsplit-fullrange-sym-v4-DSCF
Schema 2
Generated with Temari, Julia 1.11.9 (pinned in MANIFEST.md)
Archive SHA-256 ceee8a2351d56a4feda6a3d6d69c943f094f88f30fc136728e7b64ff65518396
Manifest digest fcd4e2bdd843d1bfe695a6d16bb338d7db6e0cc047c23140475ccb72f05ecbbd

Licence

The data is CC-BY-4.0; the bundled loader (tools/temari_contract.py) is MIT. LICENSE.md in the archive states the split. Attribution may be given by link, which is what makes it workable when the tables are embedded in a binary resource.

Self-contained

The archive carries the JSON schema, the manifest (per-file SHA-256 plus an order-independent digest), and an executable contract — a reference loader in the Python standard library only, which also checks the seven traps a consumer falls into.

sha256sum -c temari-dataset-v5.0.0.tar.gz.sha256
tar -xzf temari-dataset-v5.0.0.tar.gz && cd temari-dataset-v5.0.0
python tools/temari_contract.py .      # exits non-zero on failure

Reproducible bytes

The archive is built deterministically (tools/make_dataset_release.sh): sorted entries, mtime pinned to the dataset's own date, fixed ownership, no gzip timestamp. Building twice gives identical bytes — which is what will let a copy deposited on Zenodo be compared with this one rather than merely trusted.

Read before use

F is signed. 358 of the 525 channels contain negative values (minimum −0.3194). Any path treating it as non-negative — clip(0), abs, assumed monotonicity — corrupts it silently, and the corruption survives integration over q. This is why F is not published in the GOSH format.

The momentum convention is q = 4πs [Å⁻¹]. Beyond s_cert the values are exactly-zero padding, not calculated. The E₀ axis differs per channel (459 distinct axes). eps is a bound and must not be interpolated. E₀ interpolation runs in ln(u−1). The README states all of it, and temari_contract.py checks it.

Beyond s ≈ 4 Å⁻¹ there is no external yardstick — the most recent published database in the field stops at q = 50 Å⁻¹ = s 3.98 Å⁻¹ in this convention. The range past that is verified against internal identities and analytic limits, not against anyone else's numbers.

Temari v1.0.1

Choose a tag to compare

@seto77 seto77 released this 10 Aug 10:17

A patch release. Nothing in the shipping prescription or the generated values changed — dataset v5.0.0 is untouched, and the engine's output is bit-identical to what 1.0.0 produced (checked with bitident_snapshot.jl on both prescriptions).

What is in it is verification and contract work.

⚠ If you use tools/temari_contract.py, read this

Two changes affect callers:

  1. f_at() now returns three values, (F, bound, region), where it previously returned two. region is tabulated, unrecorded or impossible — the last being a request above s_kin = 1/λ(E₀), where no such beam pair exists on the Ewald sphere and the bound is therefore NaN rather than eps.
  2. The golden vector moved at off-node E₀. The loader's E₀ interpolation disagreed with the shipping consumer in three ways: the coordinate (raw E₀ over raw F, instead of ln(u−1) with log F where the column is positive), the endpoint slopes (a one-sided difference instead of the three-point formula), and out-of-range behaviour (clamping instead of extrapolating on the end cubic). Over 4.58 M points the worst disagreement was 2.9e-03, and 175 % where the sign flips. Corrected, and cross-checked against the Julia implementation to 4.5e-15.

Fe K at 137 kV, s = 2.50 now reads +3.8749841608e-01 (was +3.8749427661e-01). Values at E₀ nodes are unchanged.

Verification

  • The E₀ interpolation error was measured directly, by recomputing rows inside the intervals rather than inferring from leave-one-out. Over a stratified sample of 50 channels and 450 points the worst is 3.0e-03. C6 does not bound it — in the risky stratum it falls below the truth in 20 of 25 channels, because its leave-one-out drops only interior nodes and never examines the interval next to the threshold. Widening it does not help either: the widened figure comes in low in 4 of 50, with the ratio spanning a factor of 48. check_tables reports it, and does not gate on it.
  • The error in F was pushed through to the ALCHEMI observable. Since F enters only through μ and the Bloch solution does not depend on F, two runs differing only in the shape isolate it exactly. The observable responds only below about 2 Å⁻¹ — a perturbation at 4–6 Å⁻¹ moves it by 1.5e-09, above 10 Å⁻¹ by nothing. The interpolation error sits at 6.7–11.6 Å⁻¹, so it does not reach the observable: at most 1.2e-04 on the site ratio.
  • The small-component fraction now has an external check, and is gated in CI. All six values, three elements in both spin states, fall inside the interval that rounds to the one-significant-digit figures in the literature.
  • Beyond s_cert the contract now distinguishes two regions rather than treating them alike. No format change: s_kin depends only on E₀, so it is computed rather than stored — putting it in the JSON would create a second source of truth. schema_version stays at 2.

Other

  • Julia 1.12.6 produces bit-identical output (both snapshots differ only in the version header). The long fleet run is still unevaluated.
  • The watchdog now treats a frozen CPU with a stalled log as wedged after three minutes, instead of waiting fifteen; if CPU cannot be read it falls back to the old rule rather than risk killing a healthy lane.
  • The sample output in the documentation had been showing v2-era numbers and is regenerated from a real run.

The data

Distributed separately, under CC-BY-4.0: dataset-v5.0.0. The software remains MIT.