Powered by OpenAIRE graph
Found an issue? Give us feedback
image/svg+xml art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos Open Access logo, converted into svg, designed by PLoS. This version with transparent background. http://commons.wikimedia.org/wiki/File:Open_Access_logo_PLoS_white.svg art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos http://www.plos.org/ ZENODOarrow_drop_down
image/svg+xml art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos Open Access logo, converted into svg, designed by PLoS. This version with transparent background. http://commons.wikimedia.org/wiki/File:Open_Access_logo_PLoS_white.svg art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos http://www.plos.org/
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: ZENODO
image/svg+xml art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos Open Access logo, converted into svg, designed by PLoS. This version with transparent background. http://commons.wikimedia.org/wiki/File:Open_Access_logo_PLoS_white.svg art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos http://www.plos.org/
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: ZENODO
image/svg+xml art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos Open Access logo, converted into svg, designed by PLoS. This version with transparent background. http://commons.wikimedia.org/wiki/File:Open_Access_logo_PLoS_white.svg art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos http://www.plos.org/
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: ZENODO
image/svg+xml art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos Open Access logo, converted into svg, designed by PLoS. This version with transparent background. http://commons.wikimedia.org/wiki/File:Open_Access_logo_PLoS_white.svg art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos http://www.plos.org/
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: ZENODO
image/svg+xml art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos Open Access logo, converted into svg, designed by PLoS. This version with transparent background. http://commons.wikimedia.org/wiki/File:Open_Access_logo_PLoS_white.svg art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos http://www.plos.org/
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: ZENODO
image/svg+xml art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos Open Access logo, converted into svg, designed by PLoS. This version with transparent background. http://commons.wikimedia.org/wiki/File:Open_Access_logo_PLoS_white.svg art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos http://www.plos.org/
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: ZENODO
image/svg+xml art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos Open Access logo, converted into svg, designed by PLoS. This version with transparent background. http://commons.wikimedia.org/wiki/File:Open_Access_logo_PLoS_white.svg art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos http://www.plos.org/
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: ZENODO
image/svg+xml art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos Open Access logo, converted into svg, designed by PLoS. This version with transparent background. http://commons.wikimedia.org/wiki/File:Open_Access_logo_PLoS_white.svg art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos http://www.plos.org/
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: ZENODO
image/svg+xml art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos Open Access logo, converted into svg, designed by PLoS. This version with transparent background. http://commons.wikimedia.org/wiki/File:Open_Access_logo_PLoS_white.svg art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos http://www.plos.org/
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: ZENODO
image/svg+xml art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos Open Access logo, converted into svg, designed by PLoS. This version with transparent background. http://commons.wikimedia.org/wiki/File:Open_Access_logo_PLoS_white.svg art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos http://www.plos.org/
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: ZENODO
image/svg+xml art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos Open Access logo, converted into svg, designed by PLoS. This version with transparent background. http://commons.wikimedia.org/wiki/File:Open_Access_logo_PLoS_white.svg art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos http://www.plos.org/
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: ZENODO
image/svg+xml art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos Open Access logo, converted into svg, designed by PLoS. This version with transparent background. http://commons.wikimedia.org/wiki/File:Open_Access_logo_PLoS_white.svg art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos http://www.plos.org/
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: ZENODO
image/svg+xml art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos Open Access logo, converted into svg, designed by PLoS. This version with transparent background. http://commons.wikimedia.org/wiki/File:Open_Access_logo_PLoS_white.svg art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos http://www.plos.org/
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: ZENODO
image/svg+xml art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos Open Access logo, converted into svg, designed by PLoS. This version with transparent background. http://commons.wikimedia.org/wiki/File:Open_Access_logo_PLoS_white.svg art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos http://www.plos.org/
ZENODO
Preprint . 2026
License: CC BY NC ND
Data sources: ZENODO
image/svg+xml art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos Open Access logo, converted into svg, designed by PLoS. This version with transparent background. http://commons.wikimedia.org/wiki/File:Open_Access_logo_PLoS_white.svg art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos http://www.plos.org/
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: ZENODO
image/svg+xml art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos Open Access logo, converted into svg, designed by PLoS. This version with transparent background. http://commons.wikimedia.org/wiki/File:Open_Access_logo_PLoS_white.svg art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos http://www.plos.org/
ZENODO
Preprint . 2026
License: CC BY NC ND
Data sources: ZENODO
image/svg+xml art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos Open Access logo, converted into svg, designed by PLoS. This version with transparent background. http://commons.wikimedia.org/wiki/File:Open_Access_logo_PLoS_white.svg art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos http://www.plos.org/
ZENODO
Preprint . 2026
License: CC BY NC ND
Data sources: ZENODO
image/svg+xml art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos Open Access logo, converted into svg, designed by PLoS. This version with transparent background. http://commons.wikimedia.org/wiki/File:Open_Access_logo_PLoS_white.svg art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos http://www.plos.org/
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: ZENODO
ZENODO
Preprint . 2026
License: CC BY NC ND
Data sources: Datacite
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: Datacite
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: Datacite
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: Datacite
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: Datacite
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: Datacite
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: Datacite
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: Datacite
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: Datacite
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: Datacite
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: Datacite
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: Datacite
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: Datacite
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: Datacite
ZENODO
Preprint . 2026
License: CC BY NC ND
Data sources: Datacite
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: Datacite
ZENODO
Preprint . 2026
License: CC BY NC ND
Data sources: Datacite
ZENODO
Preprint . 2026
License: CC BY NC ND
Data sources: Datacite
ZENODO
Preprint . 2025
License: CC BY NC ND
Data sources: Datacite
versions View all 19 versions
addClaim

Chronotopic Theory of Matter and Time

Authors: Rada, Matěj;

Chronotopic Theory of Matter and Time

Abstract

Motivation This preprint presents the Chronotopic Theory of Matter and Time (CTMT) as a coherence—theoretic framework for physical inference. The central claim is not that CTMT replaces governing equations, nor that it is a “theory of everything,” but that it provides a compact, falsifiable discipline for deciding when reduced, kernel-based models are informationally well-posed, causally admissible, and transportable across operating regimes. Primitive and metricThe primitive object is a kernel-based forward map with Jacobian $J$; the experiment induces a coherence metric on parameter space via the Fisher information $F=J^\top C^{-1}J$, where $C$ is the observable covariance. CTMT treats $F$ not as a statistical convenience but as the physically operative geometry of distinguishability: its rank, conditioning, and behavior under transformations determine whether the world, as probed, supplies identifiable degrees of freedom. Admissibility gates and falsificationPhysical interpretation is permitted only if a small set of gates hold across windows and morphisms (e.g. sensor rotations, coarse-graining): rank stability (constant effective dimension), bounded conditioning (well-posed sensitivity), coarse-grain monotonicity (information does not increase under sensor thinning), transport invariance (rank and conditioning preserved under admissible changes of view), plus practical checks for window consistency, rupture exclusion, and drift decay. CTMT is falsified if any of the following occur: regime-dependent rank loss, divergence of $\operatorname{Tr}F$ under forward propagation, transport failure, loss of differentiability of the forward map, or non-monotonic/divergent coherence proper time $\tau(t)=\int_0^t \lambda_{\max}(F(t'))\,dt'$. What CTMT detectsCTMT does not assume accessible dimensionality; it detects it. The spectrum of $F$ reveals which parameter directions are supported by the data. Stacking independent regimes (e.g. poses or frequencies) increases cumulative coherence and raises the smallest informative eigenvalues, resolving degeneracies in a controlled, auditable manner. The coherence density $\rho_{\mathrm{coh}}:=V(\Omega)^{-1}\operatorname{Tr}F$ serves as an intensive measure of identifiable information per spacetime volume and bounds transportable model complexity in a given class. What CTMT recovers (proof by use)We demonstrate two canonical uses. (i) Single-tuning (vacuum): recovery of source current and geometric offsets from magnetostatic field data, with Fisher full rank andtight uncertainties, certifying immediate physical interpretability. (ii) Stacked views (anisotropy): recovery of principal-axis orientation $\psi$ and contrast $\eta$ becomes well-conditioned only after adding an independent sensor frame; Fisher confirms the dimensional lift and quantifies the uncertainty reduction. In both cases, admissibility gates provide a pass/fail decision, and the metric furnishes uncertainties without heuristic regularization. The same protocol extends to multi-frequency dispersion, distributed sources, and regime-to-regime parameter transport. Position and contributionCTMT is neither a replacement for equations of motion nor a mere meta-theory. It is an admissibility operator for physics: a minimal, experiment-rooted geometry that says when a reduced kernel can carry physical meaning, how much it can carry, and how to increase it by design (stacking, pose, frequency). The contribution is a self-contained, reproducible package—definitions, gates, falsification criteria, coherence diagnostics, and an inversion battery—that invites replication, counterexamples, and domain-specific extensions. Negative results are valued: when gates fail, CTMT refuses interpretation and thereby prevents nonphysical conclusions. InvitationReaders are invited to apply the gates to independent kernels, to use $\rho_{\mathrm{coh}}$ and $\tau(t)$ as design guides, and to report successes and failures. CTMT aims to make reduced models legible, testable, and transportable—so that the dimensionality and parameters we claim come from the world, not from us. Coherence-Weighted Trigonometry and Rupture as a Pre-Fit Diagnostic Classical trigonometry appears as a stable, low-curvature limit of a fundamentally chaotic coherence-transport geometry; its exactness reflects uniformity, not fundamentality. CTMT Axis and Hessian Boundary Constant $\alpha$ CTMT Axis and Hessian Boundary Constant $\alpha$ II Geomagnetic Falsification Test Using IGRF Data Experimental Grounding and Interpretive Bridge The abstract characterizes CTMT as a coherence-theoretic admissibility framework. To ground these claims, we summarize the concrete protocol used throughout the preprint and show how the reported numerical values instantiate the abstract principles. Forward map and Fisher geometryEach experiment begins with a kernel-based forward model $Y=\mathcal{F}(\theta)$, where $\theta$ contains physical parameters such as source current $I$, geometric offsets $(dx,dy)$, and—in the anisotropic case—principal-axis orientation $\psi$ and contrast $\eta$. The Jacobian $J=\partial Y/\partial\theta$ is computed by finite differences, and the observable covariance $C$ is estimated from repeated measurements. The Fisher information\[F(\theta)=J^\top C^{-1}J\]is treated as the operative geometry of distinguishability: its rank, eigenvalues, and conditioning determine which parameter directions are supported by the measurements. CTMT's admissibility gates act directly on this geometry. Vacuum single-tuning: supported degrees of freedomFor the vacuum experiment, the true parameters were $I=4.0$, $dx=2\times 10^{-3}$, $dy=-10^{-3}$. CTMT recovered\[I=4.0000\pm 7.4\times10^{-5},\qquaddx=(2.00\pm 0.02)\times10^{-3},\qquaddy=(-1.00\pm 0.009)\times10^{-3},\]with Fisher rank $3$ and maximal eigenvalue $\lambda_{\max}\approx 4.7\times10^{15}$. All gates passed: rank stability, bounded conditioning, window consistency, and monotonic coherence proper time $\tau\approx 4.7\times10^{15}$. This directly instantiates the abstract's assertion that CTMT certifies immediate physical interpretability when the experiment supplies identifiable degrees of freedom. Anisotropic single-tuning: falsification of unsupported directionsWhen anisotropy parameters $(\psi,\eta)$ were added, the forward model allowed them, but the data did not. Two Fisher eigenvalues collapsed to $10^{-25}$–$10^{-41}$, reducing the effective rank to $3$. Estimates for $\psi$ and $\eta$ drifted and their uncertainties inflated, while the coherence density $\rho_{\mathrm{coh}}$ remained unchanged. This realizes the abstract's claim that CTMT rejects unsupported degrees of freedom and prevents nonphysical interpretation even when the parameterization permits them. Stacked sensor frames: controlled dimensional liftAdding a second, independent sensor frame produced a measurable increase in informative curvature. The Fisher spectrum lifted, with $\lambda_{\max}\approx 1.27\times10^{16}$ and improved conditioning. The anisotropy parameters became identifiable, with uncertainties reduced by 30—40 % relative to the single-frame case. Coherence time increased to $\tau\approx 1.3\times10^{16}$, consistent with the abstract's claim that stacking increases cumulative coherence and resolves degeneracies in an auditable, gate-certified manner. Interpretive bridge.Together, these three regimes confirm the central claims of the abstract: (i) CTMT does not assume dimensionality; it detects it through the rank and spectrum of $F$; (ii) admissibility gates provide model-agnostic pass/fail criteria; (iii) coherence proper time $\tau(t)$ supplies a monotone causal ordering across admissible regimes; and (iv) stacking increases identifiable information without heuristic regularization. The numerical experiments therefore serve as a concrete instantiation of CTMT as an admissibility operator: a tool for determining when reduced kernels carry physical meaning and how that meaning can be increased by design. # CTMT — Experimental Grounding Snippet # Regimes: # (A) Vacuum, single-tune -> supported DOF: (I, dx, dy) # (B) Anisotropy, 1 frame -> unsupported DOF: (psi, eta) near-singular # (C) Anisotropy, 2 frames -> stacked dimensional lift, improved uncertainties # # Dependencies: numpy # Run: python ctmt_experiment.py import numpy as np import numpy.linalg as npl # -------------------------- # Geometry & sensors # -------------------------- mu0 = 4e-7 * np.pi rng = np.random.default_rng(7) # reproducible noise def loop_polyline(radius=0.05, nseg=400, center=(0.0, 0.0, 0.0)): phi = np.linspace(0, 2*np.pi, nseg, endpoint=False) x = radius*np.cos(phi) + center[0] y = radius*np.sin(phi) + center[1] z = np.zeros_like(phi) + center[2] return np.c_[x, y, z] def axial_and_radial_sensors(nz=60, zmax=0.06, nr=40, rmax=0.08): z_axis = np.linspace(-zmax, zmax, nz) axis_pts = np.c_[np.zeros(nz), np.zeros(nz), z_axis] r_line = np.linspace(0.0, rmax, nr) rad_pts = np.c_[r_line, np.zeros(nr), np.zeros(nr)] return np.vstack([axis_pts, rad_pts]) def rotate_sensors_z(sensors, angle_rad): c, s = np.cos(angle_rad), np.sin(angle_rad) R = np.array([[c, -s, 0.0], [s, c, 0.0], [0.0, 0.0, 1.0]]) return sensors @ R.T # -------------------------- # Biot–Savart (polyline) # -------------------------- def biot_savart_line(sensors, polyline, current=1.0): Ns = sensors.shape[0] P0 = polyline P1 = np.roll(polyline, -1, axis=0) dL = P1 - P0 B = np.zeros((Ns, 3)) for i in range(Ns): r = sensors[i][None, :] - P0 # (Nw,3) rn = np.linalg.norm(r, axis=1) + 1e-12 rh = r / rn[:, None] cross = np.cross(dL, rh) / (rn**2)[:, None] B[i] += (mu0/(4*np.pi)) * current * np.sum(cross, axis=0) return B def biot_savart_multi(sensors, conductors, currents): B = np.zeros((sensors.shape[0], 3)) for poly, I in zip(conductors, currents): B += biot_savart_line(sensors, poly, current=I) return B # -------------------------- # Uniaxial anisotropy tensor # -------------------------- def rotation_matrix_z(psi): c, s = np.cos(psi), np.sin(psi) R = np.eye(3) R[:2, :2] = np.array([[c, -s], [s, c]]) return R def mu_tensor_uniaxial(mu_perp, mu_par, psi): R = rotation_matrix_z(psi) Mloc = np.diag([mu_perp, mu_par, mu_perp]) return R @ Mloc @ R.T # -------------------------- # Forward models # -------------------------- def forward_vac(theta, sensors, conductors): I = theta.get('I', 1.0) dx = theta.get('dx', 0.0) dy = theta.get('dy', 0.0) shifted = [poly + np.array([dx, dy, 0.0]) for poly in conductors] return biot_savart_multi(sensors, shifted, [I]*len(shifted)) def forward_aniso(theta, sensors, conductors): # B = mu * H, with H_vac = B_vac / mu0 ; mu is uniaxial with axis rotation psi I = theta.get('I', 1.0) dx = theta.get('dx', 0.0) dy = theta.get('dy', 0.0) psi = theta.get('psi', 0.0) eta = theta.get('eta', 1.0) # mu_par / mu0 mu_par = eta * mu0 mu_perp = mu0 shifted = [poly + np.array([dx, dy, 0.0]) for poly in conductors] Bvac = biot_savart_multi(sensors, shifted, [I]*len(shifted)) Hvac = Bvac / mu0 M = mu_tensor_uniaxial(mu_perp, mu_par, psi) return (Hvac @ M.T) # B = M * H # -------------------------- # Jacobian, inversion, Fisher # -------------------------- def jacobian_fd_full(theta0, sensors, conductors, forward, keys, h_frac=1e-6): base = forward(theta0, sensors, conductors).reshape(-1) # stack 3 comps m = base.size d = len(keys) J = np.zeros((m, d)) for j, k in enumerate(keys): t1 = theta0.copy() step = h_frac * max(1.0, abs(theta0.get(k, 1.0))) t1[k] = theta0.get(k, 0.0) + step pert = forward(t1, sensors, conductors).reshape(-1) J[:, j] = (pert - base) / step return base, J def invert_laplace(theta0, sensors, conductors, forward, keys, y_meas, sigma, ridge_rel=1e-12): base, J = jacobian_fd_full(theta0, sensors, conductors, forward, keys) resid = y_meas.reshape(-1) - base # Fisher = J^T C^-1 J; with C = sigma^2 I -> ATA/sigma^2 ATA = (J.T @ J) / (sigma**2) ATy = (J.T @ resid) / (sigma**2) # tiny ridge to avoid singularities in degenerate cases ridge = ridge_rel * np.trace(ATA) if np.isfinite(np.trace(ATA)) else 1e-12 try: dtheta = npl.solve(ATA + ridge*np.eye(ATA.shape[0]), ATy) Cov = npl.inv(ATA + ridge*np.eye(ATA.shape[0])) except npl.LinAlgError: dtheta = npl.pinv(ATA + ridge*np.eye(ATA.shape[0])) @ ATy Cov = npl.pinv(ATA + ridge*np.eye(ATA.shape[0])) theta_hat = theta0.copy() for k, v in zip(keys, dtheta): theta_hat[k] = theta_hat.get(k, 0.0) + float(v) # Fisher invariants from ATA (∝ Fisher) evals = npl.eigvalsh(ATA) lam_max = float(np.max(evals)) if evals.size else 0.0 thr = 1e-12 * (lam_max if lam_max > 0 else 1.0) rank = int(np.sum(evals > thr)) kappa = float(lam_max / (np.min(evals[evals > 0]) if np.any(evals > 0) else np.inf)) if lam_max > 0 else np.inf return theta_hat, Cov, {'rank': rank, 'kappa': kappa, 'lam_max': lam_max, 'evals': evals}, (base, J) # -------------------------- # Run three regimes # -------------------------- def run(): # Geometry conductors = [loop_polyline(0.05, 400)] sensors = axial_and_radial_sensors(nz=60, zmax=0.06, nr=40, rmax=0.08) sensors2 = rotate_sensors_z(sensors, np.deg2rad(30.0)) # second frame SIGMA = 2e-8 # Tesla per component # --- (A) Vacuum, single-tuning --- true_A = {'I': 4.0, 'dx': 2e-3, 'dy': -1e-3} start_A = {'I': 3.5, 'dx': 0.0, 'dy': 0.0} B_A = forward_vac(true_A, sensors, conductors) + SIGMA*rng.standard_normal((sensors.shape[0], 3)) keys_A = ['I', 'dx', 'dy'] thA, CovA, invA, _ = invert_laplace(start_A, sensors, conductors, forward_vac, keys_A, B_A, SIGMA) stdA = np.sqrt(np.diag(CovA)) # --- (B) Anisotropy, single frame (often near-singular in psi/eta) --- true_B = {'I': 4.0, 'dx': 1e-3, 'dy': -1e-3, 'psi': np.deg2rad(30.0), 'eta': 1.30} start_B = {'I': 3.5, 'dx': 0.0, 'dy': 0.0, 'psi': 0.0, 'eta': 1.0} B_B = forward_aniso(true_B, sensors, conductors) + SIGMA*rng.standard_normal((sensors.shape[0], 3)) keys_B = ['I', 'dx', 'dy', 'psi', 'eta'] thB, CovB, invB, designB = invert_laplace(start_B, sensors, conductors, forward_aniso, keys_B, B_B, SIGMA) stdB = np.sqrt(np.diag(CovB)) # --- (C) Anisotropy, stacked frames (dimensional lift) --- B_B2 = forward_aniso(true_B, sensors2, conductors) + SIGMA*rng.standard_normal((sensors2.shape[0], 3)) # reuse the same linearization point (start_B) for both frames base1, J1 = designB base2, J2 = jacobian_fd_full(start_B, sensors2, conductors, forward_aniso, keys_B) A_stack = np.vstack([J1, J2]) y_stack = np.concatenate([B_B.reshape(-1) - base1, B_B2.reshape(-1) - base2]) ATA_s = (A_stack.T @ A_stack) / (SIGMA**2) ATy_s = (A_stack.T @ y_stack) / (SIGMA**2) ridge_s = 1e-12*np.trace(ATA_s) try: dtheta_s = npl.solve(ATA_s + ridge_s*np.eye(ATA_s.shape[0]), ATy_s) CovC = npl.inv(ATA_s + ridge_s*np.eye(ATA_s.shape[0])) except npl.LinAlgError: dtheta_s = npl.pinv(ATA_s + ridge_s*np.eye(ATA_s.shape[0])) @ ATy_s CovC = npl.pinv(ATA_s + ridge_s*np.eye(ATA_s.shape[0])) thC = start_B.copy() for k, v in zip(keys_B, dtheta_s): thC[k] = thC.get(k, 0.0) + float(v) stdC = np.sqrt(np.diag(CovC)) evalsC = npl.eigvalsh(ATA_s) lam_max_s = float(np.max(evalsC)) if evalsC.size else 0.0 thrC = 1e-12 * (lam_max_s if lam_max_s > 0 else 1.0) rankC = int(np.sum(evalsC > thrC)) kappaC = float(lam_max_s / (np.min(evalsC[evalsC > 0]) if np.any(evalsC > 0) else np.inf)) if lam_max_s > 0 else np.inf # -------------------------- # Print results (formatted) # -------------------------- def fmt_pm(val, sig): return f"{val:.6g} ± {sig:.3g}" print("\n=== (A) Vacuum, single-tuning ===") print("Truth: I=4.0, dx=2e-3, dy=-1e-3") print("Estimates (±1σ):") for k, s in zip(keys_A, stdA): print(f" {k:>3s} : {fmt_pm(thA[k], s)}") print(f"Fisher rank = {invA['rank']}, κ(F) ≈ {invA['kappa']:.3e}, λ_max ≈ {invA['lam_max']:.3e}") print(f"τ (coherence proper time proxy) ≈ {invA['lam_max']:.3e}") print("\n=== (B) Anisotropy, single frame (expected soft rank in (psi, eta)) ===") print("Truth: I=4.0, dx=1e-3, dy=-1e-3, psi=30deg, eta=1.3") print("Estimates (±1σ):") for k, s in zip(keys_B, stdB): out = f" {k:>3s} : {fmt_pm(thB[k] if k!='psi' else np.rad2deg(thB[k]), s if k!='psi' else np.rad2deg(s))}" if k == 'psi': out += " deg" print(out) print(f"Fisher rank = {invB['rank']}, κ(F) ≈ {invB['kappa']:.3e}, λ_max ≈ {invB['lam_max']:.3e}") print(f"τ ≈ {invB['lam_max']:.3e} (often similar to A; smallest eigenvalues soft/near-zero)") print("\n=== (C) Anisotropy, stacked frames (dimensional lift) ===") print("Estimates (±1σ):") for k, s in zip(keys_B, stdC): out = f" {k:>3s} : {fmt_pm(thC[k] if k!='psi' else np.rad2deg(thC[k]), s if k!='psi' else np.rad2deg(s))}" if k == 'psi': out += " deg" print(out) print(f"Fisher rank = {rankC}, κ(F) ≈ {kappaC:.3e}, λ_max ≈ {lam_max_s:.3e}") print(f"τ (stacked) ≈ {invB['lam_max'] + lam_max_s:.3e} (τ increases with stacking)") print("\nNotes:") print(" • Rank threshold = 1e-12 * λ_max. • Ridge = 1e-12 * trace(Fisher).") print(" • Expect tight (I,dx,dy) in (A); soft (psi,eta) in (B); improved (psi,eta) in (C).") if __name__ == "__main__": run() Falsification attempt: Monotonicity and Redundancy-as-Null Curvature We report two compact falsification tests on the same synthetic family used previously, chosen to be computationally light:(i) Fisher monotonicity under a Markov morphism (coarse-graining), and(ii) the CTMT equivalence redundancy = null Fisher curvature via phase-invariant observables. (A) Monotonicity Under Coarse-GrainingForward map: $y_i = s_i(\theta) + \varepsilon_i$ with $\varepsilon_i\sim\mathcal{N}(0, \sigma^2)$ and $s_i = R\,\cos(\omega t_i + \phi)$. The Fisher matrix for additive Gaussian noise is $F = (1/\sigma^2)\sum_i \partial s_i\,\partial s_i^\top$. A Markov morphism $T$ is implemented by averaging adjacent samples: $y'_j = (y_{2j-1}+y_{2j})/2$, which reduces noise variance to $\sigma'^2 = \sigma^2/2$. We compare quadratic forms $q(v)=v^\top F v$ before and after coarse-graining. Numerical configuration$N=256$ samples over $T=1.0$ s, $R=1.2$, $\phi=0.7$, $\omega=1.000$ Hz, $\sigma^2=0.001$. Coarse-grained $N/2$ samples; $\sigma'^2=\sigma^2/2$. Results: For a random unit direction $v$, we find $q_{\text{full}} = 1.348409e+05$ and $q_{\text{cg}} = 1.348206e+05$, with $q_{\text{cg}} \le q_{\text{full}}$. Along the pure-$R$ direction, $q_{R,\text{full}} = 1.280000e+05$ vs. $q_{R,\text{cg}} = 1.279807e+05$, again showing monotone decrease under coarse-graining.Falsifier: Any reproducible $q_{\text{cg}} > q_{\text{full}}$ would contradict monotonicity and falsify CTMT's metric assumptions. Not observed. (B) Redundancy Equals Null Fisher Curvature (Phase-Invariant Observables)We define observables $Z(\theta)=[Z_1, Z_2]$ by $Z_1=R$ and $Z_2=R^2$, which are invariant to the phase $\phi$. The observation model $Z_{\text{meas}}=Z(\theta)+\eta$ with $\eta\sim\mathcal{N}(0,\sigma_Z^2 I)$ yields Fisher $F_Z = J_Z^\top J_Z/ \sigma_Z^2$ with $J_Z = \partial Z/ \partial \theta = \begin{bmatrix} 1 & 0 \ 2R & 0 \end{bmatrix}$. Results: With $R=1.2$ and \sigma_Z^2=0.0001$, the Fisher spectrum has a zero eigenvalue: $\min\,\mathrm{eig}(F_Z) = 0.000000e+00$; the effective rank is $r_{\mathrm{eff}}(F_Z)=1$. The curvature along the phase direction is identically zero: $q_\phi=\phi^\top F_Z \phi = 0.000000e+00$. This matches CTMT's claim that redundant directions (observationally invariant) are precisely the null space of the Fisher metric.Falsifier: Any robustly positive $q_\phi$ (beyond numerical tolerance) under a phase-invariant observable would falsify the redundancy=Null-Fisher equivalence. Not observed. ConclusionBoth tests support CTMT's distinctive information-geometric claims at light computational cost: (i) Fisher monotonicity under a Markov morphism (coarse-graining), and (ii) redundancy mapped to null curvature when observables are phase-invariant. Neither falsifier is triggered by these runs. To stress-test further, one may vary sampling windows and noise levels; monotonicity and null-curvature should persist provided the observable invariances and coarse-graining are correctly implemented. Falsification attempt: Minimal Action and Coherence Density We test CTMT's joint claims that (i) the minimal action scale $S_\ast$ is extractable from phase geometry under stationary-phase dominance, and (ii) coherence density $\rho_{\mathrm{coh}}$ behaves as a Fisher-geometric invariant. The synthetic kernel is\begin{equation}T(t)=\sum_{t'\le t}\Xi(t')\,\exp\!\Big(i\,\frac{2\alpha\,(t-t')}{S_*}-\epsilon\,(t-t')\Big)\,\Delta t,\end{equation}with planted parameters $\alpha$ and $S_*^{(\mathrm{true})}$, regulator $\epsilon$, and coherent amplitude laws $\Xi(t')\in\{\text{constant},\ \text{Hann}\}$. Protocol Synthesis: Generate $T(t)$ on a uniform grid over $[0,T]$ using the kernel above.Phase extraction: Compute the unwrapped phase $\arg T(t)$ and fit \[ \arg T(t)\approx \omega_{\mathrm{eff}}\,t + c \] via least squares. Record the phase-fit RMS.Minimal action estimate: Compute \[ S_*^{(\mathrm{est})}=\frac{\alpha}{\omega_{\mathrm{eff}}}. \] Fisher geometry: Treat complex noise as i.i.d. Gaussian with variance $\sigma^2$ per real/imag component and parameters $\theta=(\alpha,S)$. Compute \[ F=\frac{1}{\sigma^2}\sum_t \Re\!\big(\partial_\theta T\cdot \partial_\theta T^\ast\big), \qquad \rho_{\mathrm{coh}}=\frac{\mathrm{Tr}F}{T}. \] Bound check: Define $C_{\mathrm{eff}}=\rho_{\mathrm{coh}}\,S_*$ and verify boundedness and stability across coherent settings. Results Representative numerical outputs (each line: $\epsilon$, amplitude law $\Xi$, fitted $\omega_{\mathrm{eff}}$, estimated $S_*^{(\mathrm{est})}$, phase-fit RMS, coherence density $\rho_{\mathrm{coh}}$, effective constant $C_{\mathrm{eff}}$, and Fisher components):$\epsilon=0.0005$, $\Xi$=constant:$\omega_\mathrm{eff}=0.749935$, $S_*^{(est)}=1.000086$, $\mathrm{RMS}_\phi=4.99\!\times\!10^{-6}$, $\rho_\mathrm{coh}=2.296\!\times\!10^{6}$, $C_\mathrm{eff}=2.296\!\times\!10^{6}$, $\mathrm{Tr}F=2.296\!\times\!10^{6}$, $F_{\alpha\alpha}=1.469\!\times\!10^{6}$, $F_{\alpha S}=-1.102\!\times\!10^{6}$, $F_{SS}=8.265\!\times\!10^{5}$; $\epsilon=0.0005$, $\Xi$=hann:$\omega_\mathrm{eff}=0.700113$, $S_*^{(est)}=1.071256$, $\mathrm{RMS}_\phi=4.73\!\times\!10^{-2}$, $\rho_\mathrm{coh}=5.192\!\times\!10^{5}$, $C_\mathrm{eff}=5.562\!\times\!10^{5}$, $\mathrm{Tr}F=5.192\!\times\!10^{5}$, $F_{\alpha\alpha}=3.323\!\times\!10^{5}$, $F_{\alpha S}=-2.492\!\times\!10^{5}$, $F_{SS}=1.869\!\times\!10^{5}$; $\epsilon=0.001$, $\Xi$=constant:$\omega_\mathrm{eff}=0.749871$, $S_*^{(est)}=1.000172$, $\mathrm{RMS}_\phi=9.98\!\times\!10^{-6}$, $\rho_\mathrm{coh}=2.295\!\times\!10^{6}$, $C_\mathrm{eff}=2.295\!\times\!10^{6}$, $\mathrm{Tr}F=2.295\!\times\!10^{6}$, $F_{\alpha\alpha}=1.469\!\times\!10^{6}$, $F_{\alpha S}=-1.101\!\times\!10^{6}$, $F_{SS}=8.261\!\times\!10^{5}$; $\epsilon=0.001$, $\Xi$=hann:$\omega_\mathrm{eff}=0.700083$, $S_*^{(est)}=1.071301$, $\mathrm{RMS}_\phi=4.73\!\times\!10^{-2}$, $\rho_\mathrm{coh}=5.190\!\times\!10^{5}$, $C_\mathrm{eff}=5.560\!\times\!10^{5}$, $\mathrm{Tr}F=5.190\!\times\!10^{5}$, $F_{\alpha\alpha}=3.322\!\times\!10^{5}$, $F_{\alpha S}=-2.491\!\times\!10^{5}$, $F_{SS}=1.868\!\times\!10^{5}$. Falsifier CTMT predicts that under coherent transport: the phase is locally linear (small $\mathrm{RMS}_\phi$), $S_*^{(\mathrm{est})}$ is stable across $\epsilon$, $\mathrm{Tr}F$ remains finite and well-conditioned, $\rho_{\mathrm{coh}}$ is bounded and consistent with $C_{\mathrm{eff}}/S_*$. A reproducible violation of any of these-large phase RMS, unstable $S_*^{(\mathrm{est})}$, or unbounded Fisher trace under coherent amplitudes-would falsify CTMT's coherence-geometry interpretation for this kernel. Conclusion Across coherent amplitude laws, the minimal action estimate $S_*^{(\mathrm{est})}$ remains accurate, phase residuals remain small, and the Fisher trace stays finite with table off-diagonal structure. Coherence density $\rho_{\mathrm{coh}}$ behaves as a Fisher-geometric invariant and satisfies the bound $\rho_{\mathrm{coh}}\le C_{\mathrm{eff}}/S_*$. These results jointly support CTMT's claims regarding (i) minimal action extraction from phase geometry and (ii) coherence density as a regime-level invariant. Falsification attempt: Navier-Stokes-like data We test whether causal ordering is sufficient to stabilize the Jacobian and enable Fisher-geometry construction on Navier-Stokes-like data, and whether CTMT's information-geometric machinery (Fisher metric, rank behavior, and scaling) can be derived from a fully synthetic dataset. We execute two experiments: (i) a viscous linear proxy in Fourier shells to isolate the role of causal ordering; (ii) an inertial shell model (Sabra-type) to probe an ``inertial window'' and attempt a Kolmogorov-like scaling test. We report explicit Jacobians, Fisher spectra, conditioning, ranks, and log-log slopes. Results: causal ordering is indeed sufficient to stabilize the Jacobian and yield a well-behaved Fisher spectrum; CTMT derives Fisher cleanly in both experiments. The inertial-window scaling using a reduced shell model is inconclusive at this resolution and horizon: the measured energy slope and Fisher slope differ from the Kolmogorov expectations, indicating the need for longer integrations and more shells for a decisive test. The falsification protocol and outcomes are recorded for replication. Forward Map and Fisher GeometryLet $\mathcal{F}_\theta$ map parameters $\theta$ (initial amplitudes per Fourier shell) to observables $Y$ (time-integrated shell energies). With observational noise covariance $C=\sigma^2 I$, the Fisher matrix is $F(\theta)=J^\top C^{-1}J$, where $J(\theta)=\partial \mathcal{F}_\theta/\partial \theta$. CTMT requires: (a) existence of $J$ under causal ordering; (b) $F\succeq 0$ with stable rank along admissible forward propagation; (c) scaling regularities within a coherence class. Experiment I: Viscous Linear Proxy (Causal vs. Anti-causal)We model $\hat u(k,t)=\hat u(k,0)\,e^{-\nu k^2 t}$, and define the observable $Y_k=\int_0^T |\hat u(k,t)|^2\,dt$. The per-shell Jacobian exists in closed form:\begin{equation}J_k = \int_0^T e^{-2\nu k^2 t}\,dt = \frac{1-e^{-2\nu k^2 T}}{2\nu k^2}.\end{equation}The anti-causal comparator replaces $e^{-2\nu k^2 t}$ by $e^{+2\nu k^2 t}$. Results: Using $(\nu, T, \sigma^2)=(10^{-3},1,10^{-4})$ over integer shells $k\in[1,256]$, we obtain (forward vs backward): Conditioning: $\kappa(F_{\text{forward}})\approx 1.71\times10^{4}$ vs $\kappa(F_{\text{backward}})\approx 4.09\times10^{109}$. Effective rank: $r_{\text{eff}}(F_{\text{forward}})=256$ (full by the chosen threshold) vs $r_{\text{eff}}(F_{\text{backward}})=7$. Scaling: log-log slope of $\lambda_k$ in a midrange window $k\in[8,64]$: forward $\approx -2.21$; backward $\approx 5.60$. UV asymptotic (forward, $k\ge 128$) $\approx -4.0$, matching the analytic $k^{-4}$ prediction for the viscous proxy. Conclusion: Causal ordering stabilizes the Jacobian and yields a well-posed Fisher geometry; anti-causal ordering catastrophically ill-conditions the problem. This confirms the CTMT claim that causal admissibility is necessary for stable identifiability. Experiment II: Inertial Shell Model (Sabra-type)We simulate a Sabra shell model with $N=10$ shells, $k_n=k_0\,2^n$, coefficients $(a,b,c)=(1,-\tfrac12,-\tfrac12)$, viscosity $\nu=5\times10^{-6}$, forcing on shell $n=2$, horizon $T=2$, and RK4 time step $\Delta t=5\times10^{-4}$. Observables are time-integrated shell energies $Y_n=\int_0^T |u_n(t)|^2 dt$. We build the full Jacobian by central differences with respect to the magnitude of each initial shell amplitude, then compute $F=J^\top J/\sigma^2$ with $\sigma^2=10^{-6}$. Results: In an inertial-style window excluding forcing and dissipative tails (heuristic shells $n\in[3, N-3]$): Energy slope (log $E$ vs log $k$): $\approx -3.35$. Fisher slope (log $\lambda$ vs log $k$ for column norms): $\approx -6.69$. Fisher conditioning and rank: $r_{\text{eff}}(F)=5$; $\kappa(F)\approx 5.18\times10^{14}$. Interpretation: The reduced shell system and short horizon do not develop a clear Kolmogorov $-5/3$ energy scaling; correspondingly, the Fisher slope does not approximate $-4/3$. This is an expected limitation of low $N$, modest forcing, and short integration. Crucially, the existence of a stable Jacobian and a computable Fisher metric persists; CTMT's Fisher machinery is therefore derivable on inertial data as well, but the specific scaling falsifier remains inconclusive at this resolution. Falsification ProtocolCTMT would be falsified on this synthetic track if any of the following held: (Jacobian failure) Under causal ordering, $J$ is ill-defined or divergent. Not observed. (Fisher indefiniteness) Any negative eigenvalue of $F$ beyond numerical roundoff. Not observed. (Rank pathology) No monotone rank thinning with wavenumber when an inertial cascade is present. Not testable here without a clearer inertial range. (Scaling falsifier) With a demonstrable $E(k)\sim k^{-5/3}$, the Fisher spectrum fails to approach the predicted inertial slope. Inconclusive due to absent $-5/3$ window. (Instability) Small observational noise destroys Fisher scaling or rank. Not observed in our settings. Outcome and Next StepsOutcome: CTMT survives the strictest parts of this test: causal ordering stabilizes the Jacobian; the Fisher metric exists and is computable; fixed-point style calibration (rank and conditioning checks) is meaningful without algorithmic tuning. The specific inertial-range scaling falsifier is not decided here due to model size and horizon. Next steps: Increase shell count ($N\gtrsim 20$), reduce viscosity, and integrate to a statistically steady state under constant flux; then re-run Fisher sensitivities (full $J$ columns) and report slopes in a broader inertial window. This should make the $-5/3$ (energy) and the corresponding Fisher prediction decisively testable. Reproducibility: All code used to produce the numbers above (forward viscous proxy, causal vs anti-causal; reduced Sabra model; finite-difference Jacobian; Fisher construction; slope fits) is included in the companion notebook. Noise variance, windows, and thresholds are explicitly stated. # sabra_fisher_run.py # Sabra shell model + Fisher analysis with inertial window import numpy as np def sabra_rhs(u, k, a, b, c, nu, f_amp, n_force): N = len(u) du = np.zeros_like(u, dtype=np.complex128) for n in range(N): term = 0.0 + 0.0j if n+2 = 0 and n+1 = 0: term += c * k[n-2] * u[n-1] * u[n-2] f = f_amp if n == n_force else 0.0 du[n] = 1j * term - nu * (k[n]**2) * u[n] + f return du def integrate(u0, k, a, b, c, nu, f_amp, n_force, T, dt, store_energy=False): u = np.array(u0, dtype=np.complex128) N = len(u) steps = int(T/dt) accum = np.zeros(N) if store_energy else None for _ in range(steps): k1 = sabra_rhs(u, k, a, b, c, nu, f_amp, n_force) k2 = sabra_rhs(u + 0.5*dt*k1, k, a, b, c, nu, f_amp, n_force) k3 = sabra_rhs(u + 0.5*dt*k2, k, a, b, c, nu, f_amp, n_force) k4 = sabra_rhs(u + dt*k3, k, a, b, c, nu, f_amp, n_force) u = u + (dt/6.0)*(k1 + 2*k2 + 2*k3 + k4) if store_energy: accum += (np.abs(u)**2) * dt return (u, accum) if store_energy else u def loglog_slope(x, y): xlog = np.log10(x); ylog = np.log10(y + 1e-300) a, b = np.polyfit(xlog, ylog, 1) return a def run(N=20, T=4.0, dt=1e-4, nu=1e-7, f_amp=0.05, n_force=2, lam=2.0, k0=1.0, a=1.0, b=-0.5, c=-0.5, delta=5e-4, sigma2=1e-6, inertial_lo=5, inertial_hi_offset=5, seed=1): # shells k = k0 * (lam ** np.arange(N)) # IC: small complex amplitudes decreasing with k rng = np.random.default_rng(seed) r0 = rng.standard_normal(N); i0 = rng.standard_normal(N) amp = 3e-4 * (k/k0)**(-1.0) u0 = (r0 + 1j*i0) * amp # baseline uT, Y = integrate(u0, k, a, b, c, nu, f_amp, n_force, T, dt, store_energy=True) E = Y / T # inertial window n_lo = inertial_lo; n_hi = N - inertial_hi_offset mask = np.zeros(N, dtype=bool) if n_hi > n_lo: mask[n_lo:n_hi+1] = True energy_slope = loglog_slope(k[mask], E[mask]) if mask.sum()>1 else np.nan # Jacobian columns (2 * N integrations) J = np.zeros((N, N)) for n in range(N): u0_plus = u0.copy(); u0_plus[n] *= (1.0 + delta) u0_minus = u0.copy(); u0_minus[n] *= (1.0 - delta) _, Yp = integrate(u0_plus, k, a, b, c, nu, f_amp, n_force, T, dt, store_energy=True) _, Ym = integrate(u0_minus, k, a, b, c, nu, f_amp, n_force, T, dt, store_energy=True) J[:, n] = ((Yp - Ym).real) / (2.0 * delta) # Fisher F = (J.T @ J) / sigma2 lam_param = np.sum(J**2, axis=0) / sigma2 fisher_slope = loglog_slope(k[mask], lam_param[mask]) if mask.sum()>1 else np.nan # conditioning / rank w = np.linalg.eigvalsh(F); w = np.clip(w, 0, None) eps = 1e-8 rank_eff = int(np.sum(w >= eps * np.max(w))) cond_F = float(np.max(w) / (np.min(w[w>0]) if np.any(w>0) else np.inf)) return { "N": N, "T": T, "dt": dt, "nu": nu, "inertial_window_shells": (n_lo, n_hi), "energy_slope": float(energy_slope), "fisher_slope": float(fisher_slope), "rank_eff_F": rank_eff, "cond_number_F": cond_F, } if __name__ == "__main__": out = run() print(out) Kernel Stacking and Composability (on the Same Synthetic Data) This continues from the datasets and notation introduced earlier:(i) the viscous linear proxy in Fourier shells with observable $Y_k=\int_0^T|\hat u(k,t)|^2\,dt$, and(ii) the Sabra inertial shell model with time–integrated shell energies $Y_n=\int_0^T |u_n(t)|^2\,dt$.We test the CTMT claim that stacked kernels remain within the same Fisher coherence class as a direct kernel, i.e. that multi–step transport is representable by a single effective kernel without loss of identifiability. Kernel Stacking PrincipleLet $K_{t_2\gets t_1}$ denote the effective transport from $t_1$ to $t_2$. For $010\%$) indicates breakdown of stationary-phase dominance. Result:Constant window ($\Xi$), $\epsilon=5\!\times\!10^{-4}$: $S_*^{(\mathrm{est})}=1.000086$, RMS $=4.99\times 10^{-6}$. Hann window: $S_*^{(\mathrm{est})}=1.071256$, RMS $=4.73\times 10^{-2}$. Maximum relative drift: $7.13\times 10^{-2}$. Outcome: Drift remains below the wild-drift threshold; falsifier not triggered. (iv) $\mathrm{Tr}F$ diverges under stationary phaseUnder admissible coherent transport, Fisher trace must remain finite. Result:$\mathrm{Tr}F = 2.296\times 10^{6}$ (constant window), $\mathrm{Tr}F = 5.192\times 10^{5}$ (Hann window). No infinities or numerical blow-up. Outcome: No divergence; falsifier not triggered. (v) Kernel stacking destroys rank in a coherent regimeCTMT predicts that stacked kernels remain in the same Fisher coherence class. Rank loss would falsify composability. Result:$\operatorname{rank}(F_{\mathrm{direct}})=64$, $\operatorname{rank}(F_{\mathrm{stack}})=64$. Outcome: No rank loss; stacking preserves Fisher geometry. SummaryAll five falsifiers-monotonicity, null-curvature, estimator stability, trace boundedness, and rank preservation-are satisfied. These results support CTMT's coherence geometry and kernel-stacking principles. Bibliographyamari2000methods:title=Methods of Information Geometryauthor=Amari, Shun-ichi and Nagaoka, Hiroshiyear=2000publisher=AMS/Oxfordchentsov1982statistical:title=Statistical Decision Rules and Optimal Inferenceauthor=Chentsov, N.~N.year=1982publisher=AMS import numpy as np from numpy.linalg import lstsq # (1) Monotonicity R_true = 1.2 phi_true = 0.7 omega = 2*np.pi*1.0 sigma2 = 1e-3 N = 256 T_total = 1.0 t = np.linspace(0, T_total, N, endpoint=False) cos_term = np.cos(omega*t + phi_true) sin_term = np.sin(omega*t + phi_true) dR = cos_term dphi = -R_true * sin_term F_full = np.zeros((2,2)) F_full[0,0] = (1/sigma2) * np.sum(dR*dR) F_full[1,1] = (1/sigma2) * np.sum(dphi*dphi) F_full[0,1] = (1/sigma2) * np.sum(dR*dphi) F_full[1,0] = F_full[0,1] dR_pairs = (dR[0::2] + dR[1::2]) / 2.0 dphi_pairs = (dphi[0::2] + dphi[1::2]) / 2.0 sigma2_cg = sigma2 / 2.0 F_cg = np.zeros((2,2)) F_cg[0,0] = (1/sigma2_cg) * np.sum(dR_pairs*dR_pairs) F_cg[1,1] = (1/sigma2_cg) * np.sum(dphi_pairs*dphi_pairs) F_cg[0,1] = (1/sigma2_cg) * np.sum(dR_pairs*dphi_pairs) F_cg[1,0] = F_cg[0,1] rng = np.random.default_rng(321) violations = 0 samples = 1000 max_diff = -1e9 for _ in range(samples): v = rng.standard_normal(2) v = v/np.linalg.norm(v) q_full = float(v @ F_full @ v) q_cg = float(v @ F_cg @ v) if q_cg > q_full + 1e-10: violations += 1 max_diff = max(max_diff, q_cg - q_full) monotone_R_full = float(F_full[0,0]) monotone_R_cg = float(F_cg[0,0]) # (2) Phase-invariant sigma2_Z = 1e-4 J_Z = np.array([[1.0, 0.0], [2.0*R_true, 0.0]]) F_Z = (J_Z.T @ J_Z) / sigma2_Z phi_dir = np.array([0.0, 1.0]) curv_phi = float(phi_dir @ F_Z @ phi_dir) wZ = np.linalg.eigvalsh(F_Z) min_eig_FZ = float(np.min(wZ)) rank_FZ = int(np.sum(wZ >= 1e-12*np.max(wZ))) # (3) Minimal action & (4) Fisher trace alpha = 0.75 S_true = 1.0 N_coh = 800 T_total_coh = 1.0 tc = np.linspace(0, T_total_coh, N_coh) Xi_constant = np.ones(N_coh) Xi_hann = 0.5*(1 - np.cos(2*np.pi*tc/T_total_coh)) PHASE_FACTOR = 2.0 sigma2_meas = 1e-4 def fisher_TS_coh(t, Xi_seq, eps): dt = t[1] - t[0] T_vals = np.zeros_like(t, dtype=np.complex128) dT_dalpha = np.zeros_like(t, dtype=np.complex128) dT_dS = np.zeros_like(t, dtype=np.complex128) for i, ti in enumerate(t): tp = t[:i+1] Xi = Xi_seq[:i+1] tau = (ti - tp) phase = PHASE_FACTOR * alpha * tau / S_true reg = eps * tau exp_term = np.exp(1j*phase - reg) T_vals[i] = np.sum(Xi * exp_term) * dt dphase_dalpha = PHASE_FACTOR * tau / S_true dphase_dS = -PHASE_FACTOR * alpha * tau / (S_true**2) dT_dalpha[i] = np.sum(Xi * (1j * dphase_dalpha) * exp_term) * dt dT_dS[i] = np.sum(Xi * (1j * dphase_dS) * exp_term) * dt F = np.zeros((2,2), dtype=float) F[0,0] = (1/sigma2_meas) * np.sum(np.real(dT_dalpha * np.conj(dT_dalpha))) F[1,1] = (1/sigma2_meas) * np.sum(np.real(dT_dS * np.conj(dT_dS))) F[0,1] = (1/sigma2_meas) * np.sum(np.real(dT_dalpha * np.conj(dT_dS))) F[1,0] = F[0,1] return T_vals, F eps_list = [5e-4, 1e-3] coh_runs = [] for eps in eps_list: for name, Xi in [('constant', Xi_constant), ('hann', Xi_hann)]: T_vals, F = fisher_TS_coh(tc, Xi, eps) phase = np.unwrap(np.angle(T_vals)) A = np.column_stack([tc, np.ones_like(tc)]) omega_eff, c = lstsq(A, phase, rcond=None)[0] S_est = alpha / omega_eff resid = phase - (omega_eff*tc + c) rms = float(np.sqrt(np.mean(resid**2))) trF = float(np.trace(F)) coh_runs.append((name, eps, omega_eff, S_est, rms, trF, F)) max_rel_drift = max(abs(r[3] - S_true)/S_true for r in coh_runs) any_diverged = any((not np.isfinite(r[5])) or (r[5] > 1e12) for r in coh_runs) # (5) Stacking rank viscous nu = 1e-3 T_obs = 1.0 t1 = 0.4 k_max = 64 k = np.arange(1, k_max+1) J_direct = (1.0 - np.exp(-2.0*nu*(k**2)*T_obs)) / (2.0*nu*(k**2)) J_pre = (1.0 - np.exp(-2.0*nu*(k**2)*t1)) / (2.0*nu*(k**2)) J2 = (1.0 - np.exp(-2.0*nu*(k**2)*(T_obs - t1))) / (2.0*nu*(k**2)) J1 = np.exp(-2.0*nu*(k**2)*t1) J_stack = J_pre + J1*J2 sigma2_stack = 1e-4 F_direct_stack = (J_direct**2)/sigma2_stack F_stack_stack = (J_stack**2)/sigma2_stack rel_eps = 1e-8 rank_direct = int(np.sum(F_direct_stack >= rel_eps*np.max(F_direct_stack))) rank_stack = int(np.sum(F_stack_stack >= rel_eps*np.max(F_stack_stack))) rank_destroyed = (rank_stack 0$ is an a priori unknown action scale. The integral is taken over forward-ordered histories $t'\le t$; backward ordering is not excluded by assumption but becomes inadmissible by Theorem of admissibility. Let $\theta\in\Theta\subset\mathbb{R}^d$ denote parameters controlling $\Phi$ and $\Xi$, and let $Y$ be an observable extracted from $T$ via\begin{equation}Y = \mathcal{F}_\theta[T].\label{eq:ctmt_anchor_forward_map}\end{equation} Jacobian and Fisher geometryAssuming differentiability with respect to $\theta$, the Jacobian is\begin{equation}J(\theta)=\frac{\partial Y}{\partial \theta},\label{eq:ctmt_anchor_jacobian}\end{equation}and for observational noise covariance $C=\sigma^2 I$, the Fisher information matrix is\begin{equation}F(\theta)=J(\theta)^\top C^{-1} J(\theta)=\frac{1}{\sigma^2}\,J(\theta)^\top J(\theta).\label{eq:ctmt_anchor_fisher}\end{equation} On a spacetime region $\Omega$ of finite volume $V(\Omega)$, we define the coherence density\begin{equation}\rho_{\mathrm{coh}}(\theta;\Omega)=\frac{1}{V(\Omega)}\,\mathrm{Tr}\,F(\theta).\label{eq:ctmt_anchor_coherence_density}\end{equation} Theorem: CTMT admissibility principleA kernel of the form (\( T(t) \)) represents a physically admissible evolution on $\Omega$ if and only if the following conditions hold under forward extension of the observation horizon $t$:(i) Jacobian finiteness:The Jacobian (\( J(\theta) \)) exists almost everywhere on $\Theta$ and satisfies $\|J(\theta)\|0.\] (iii) Coherence density bound:The coherence density (\( \rho_{\mathrm{coh}}(\theta;\Omega) \)) remains uniformly bounded,\begin{equation}\rho_{\mathrm{coh}}(\theta;\Omega)\;\le\;\frac{C}{\mathcal{S}_\ast},\label{eq:ctmt_anchor_coherence_bound}\end{equation}for some finite dimensionless constant $C$ determined by the number of identifiable degrees of freedom. Violation of any of (i)-(iii) corresponds to inadmissible dynamics: loss of identifiability, breakdown of causal orientation, or excessive phase density incompatible with finite action resolution. Such violations provide direct falsification criteria for CTMT. InterpretationTheorem of admissibility shows that CTMT does not assume causality, geometry, or metric structure. These emerge as the unique conditions under which the kernel admits a stable Jacobian, a well-defined Fisher geometry, and a bounded coherence density. The action scale $\mathcal{S}_\ast$ appears as the minimal regulator preventing divergence of distinguishable structure. CTMT Magnetism Validation on a Chaotic Coil (Coherence Extraction and Magnetic Field Computation) This report documents a validation of Chronotopic Metric Theory (CTMT) on a synthetic but laboratory-realistic coil driven by a chaotic current. We demonstrate that CTMT's coherence geometry---via Fisher invariants---remains admissible under chaotic drive, and that the CTMT magnetism law (vacuum/static limit) computes a magnetic field \(\mathbf B\) matching the measured field within the stated sensor noise (median coverage at the 95\% acceptance band). Artefacts of the run and a minimal protocol for repeating the test in a laboratory are included. Data and Experiment SetupGeometry and Sensors Coil: Single circular loop, radius \(R=5\,\mathrm{cm}\), discretized into \(N_{\mathrm{seg}}=400\) straight segments for line-integral computation. Sensors: \(60\) points on the coil axis (\(z\)-axis, \([-6,6]\,\mathrm{cm}\)) and \(40\) points along a radial line in the coil plane (\([0,8]\,\mathrm{cm}\)). Noise model: Independent Gaussian noise \(\sigma=10^{-8}\,\mathrm{T}\) per sensor. Chaotic Drive Current: Lorenz-modulated \(I(t)=I_0\bigl[1+\alpha\tanh\bigl(0.5\,x_n(t)\bigr)\bigr]\), with \(I_0=4\,\mathrm{A}\), \(\alpha=0.6\), and \(x_n\) the normalized Lorenz \(x\) component (\(\sigma=10,\;\rho=28,\;\beta=8/3\)). Drift: Small center drift \(dx(t)=0.002\tanh\bigl(0.5\sin(2\pi\cdot 3\,\mathrm{Hz}\cdot t)\bigr)\), \(dy(t)=-dx(t)\). Measured FieldAt each time sample, the magnetic field \(\mathbf B(\mathbf r,t)\) is computed by the CTMT magnetism law in its vacuum/static limit (Biot--Savart), then perturbed by sensor noise. Per CTMT, the structural ratio \(\rho_{\Phi}/\rho_{S}\) reduces to \(\mu_0\), and the kernel response \(G(x,x')\to 1\) See Magnetism.htm. CTMT Magnetism Law (Vacuum/Static Limit) The magnetism law used is the structural form provided in the artefact citation: Magnetism.htm, structural magnetism law and acceptance band.\begin{equation}\mathbf B(x)=\frac{\rho_{\Phi}}{\rho_{S}}\int G(x,x')\Big[\mathbf u(x')\times\frac{x-x'}{4\pi\,\lVert x-x'\rVert^3}\Big] \; d^3x'.\end{equation}In the static vacuum limit, \(\rho_{\Phi}/\rho_{S}\to\mu_0\) and \(G\to 1\), yielding the standard Biot--Savart expression for line currents: Magnetism.htm\begin{equation}\mathbf B(x)=\frac{\mu_0}{4\pi}\int \frac{I\,d\mathbf\ell\times\hat{\mathbf r}}{r^2}.\end{equation}CTMT's acceptance band is defined via residuals bounded by the propagated uncertainty: for predicted \(\mathbf B_{\rm pred}(x)\) and measured \(\mathbf B_{\rm obs (x)\), accept if \(\bigl\lVert\mathbf B_{\rm obs}-\mathbf B_{\rm pred}\bigr\rVert\le 2\,\sigma_{\mathbf B}(x)\) (95\% band). (Magnetism.htm) Procedure Windowed Coherence ExtractionThe time series is processed in sliding windows (200 samples; step 100). Within each window, we treat \(\theta=[I,dx,dy]\) as quasi-static and compute: Forward map \(y(\theta)=B_z(\mathrm{sensors};\theta)\) by Biot--Savart (vacuum/static CTMT law). Jacobian \(J=\partial y/\partial\theta\) via central finite differences. Fisher \(F=J^\top C^{-1}J\), with \(C=\sigma^2 I\). Invariants: rank stability, bounded conditioning \(\kappa(F)\), monotonicity (coarse-grain sensors), composability (axis+radial vs full Fisher). Refit \(\hat\theta=\theta_0+J^{+}\bigl(y_{\rm obs}-y(\theta_0)\bigr)\) and acceptance-band coverage. Full numerical artefacts and a readable summary are included. Magnetism ComputationFor each window, the refit \(\hat\theta\) is used in the CTMT magnetism law to compute \(\mathbf B_{\rm pred}\). We compare to the window-averaged measurement \(\mathbf B_{\rm obs}\) and report acceptance-band coverage. Results Coherence GeometryAcross windows, the \textbf{Fisher rank} mode is 3 (parameters \(I,dx,dy\) identifiable); \textbf{conditioning} is bounded (median \(\kappa(F)\) finite with moderate IQR); monotonicity violations under coarse-graining are rare; \textbf{composability} holds (axis+radial Fisher spectrum closely matches the full spectrum). ctmt_coil_chaos_report.md Magnetism vs MeasurementUsing the vacuum/static CTMT magnetism law per Magnetism.htm, the median window achieves 95 % acceptance-band coverage-i.e., the predicted \(\mathbf B\) lies within \(2\sigma\) of the measurements at the median rate. CTMT therefore computes \(\mathbf B\) consistent with magnetometer data under chaotic drive and sensor noise, without ad-hoc calibration constants. Parameter Recovery (Current)Refitted currents \(\hat I\) track the chaotic median \(I_{\rm med}\) per window with small median relative error and low mean absolute error (see artefact summary for exact values). ctmt_coil_chaos_summary.json Minimal Protocol for Laboratory Repetition Hardware: Single-turn loop (\(R\!\approx\!5\)\,cm), DC source with chaotic or pseudo-random modulation (Lorenz generator, FPGA, or software DAC), magnetometer array placed axially and radially. Acquisition: Sample \(\mathbf B\) time series and (optionally) current probe \(I(t)\); record geometry (loop radius, segment count if using numerical line integral) and small positional drifts. Processing: Segment into sliding windows; compute \(y(\theta)\) via Biot--Savart (vacuum CTMT magnetism law), \(J\), \(F\), invariants; refit \(\hat\theta\); report acceptance-band coverage. Acceptance: Declare validation if median coverage \(\ge 95\%\) and invariants satisfy (rank stability, bounded \(\kappa(F)\), monotonicity, composability). All software steps used here are in the supplied artefacts and are directly portable to a laboratory data set. Conclusions CTMT coherence geometry (Fisher invariants) remains admissible under chaotic excitation. With the CTMT magnetism law in the static vacuum limit (\(\rho_{\Phi}/\rho_{S}\to\mu_0\), \(G\to 1\)), CTMT computes magnetic fields that match measurements within the 95 % acceptance band in the median window. The protocol is readily repeatable in a laboratory. Short Usage Note: CTMT Magnetism Law for This Test Use the static vacuum mapping: \(\rho_{\Phi}/\rho_{S}\to\mu_0\), \(G\to 1\). Evaluate Biot-Savart over the measured conductor geometry to obtain \(\mathbf B_{\rm pred}\). Propagate uncertainty per your Jacobian; apply the 95\% acceptance band to declare match. For dispersive/anisotropic media, replace \(G\) by \(G(k,\omega)\) and carry the same CTMT invariants; for rank-deficient observables, project with \(\Pi_{\\rm null}=I-FF^+\) to demonstrate transport on the non-null sector. (Magnetism.htm) Artefacts and ReproducibilityAll results referenced above are archived (MagnetismChaosTest.zip): Summary report: ctmt_coil_chaos_report.md Window metrics (JSON): ctmt_coil_chaos_windows.json Aggregate summary (JSON): ctmt_coil_chaos_summary.json Magnetism law note: Magnetism.htm CTMT Magnetism — Battery Stress Test (Dispersive/Anisotropic Kernel, Discontinuities, and Inverse Reconstruction) Stress-test CTMT on three fronts relevant to laboratory use: (i) dispersive & anisotropic magnetic response via a tensorial kernel \(G(k,\omega)\), (ii) discontinuities/sudden jumps in drive or medium with Fisher stabilization by a Coherence-Rigidity Stabilization Constraint (CRSC), and (iii) inverse reconstruction of the source velocity/current field \(\mathbf u(x)\) from field data \(\mathbf B(x)\). The goal is to keep the report succinct while making reproduction straightforward. Magnetism follows the CTMT structural law in the static/vacuum limit and its extension with \(G(k,\omega)\) coherence geometry and acceptance bands follow the chaotic-coil validation. Causal Ordering of the Jacobian in Magnetostatic Inference Forward Causal StructureThe inference pipeline considered here obeys a strict causal ordering:\begin{equation}\{\text{sources, geometry}\}\;\longrightarrow\;\mathbf{B}(\mathbf{x})\;\longrightarrow\;\mathbf{B}_{\mathrm{meas}}\;\longrightarrow\;\text{parameter inference}.\end{equation} In the magnetoquasistatic regime, Maxwell's equations reduce to the elliptic system\begin{equation}\nabla \times \mathbf{B} = \mu \mathbf{J},\qquad\nabla \cdot \mathbf{B} = 0,\end{equation}whose Green's function is the Biot--Savart kernel. The magnetic field is therefore a linear, instantaneous functional of the current distribution and conductor geometry:\begin{equation}\mathbf{B}(\mathbf{x})=\int K(\mathbf{x},\mathbf{x}')\,\mathbf{J}(\mathbf{x}')\,d\mathbf{x}'.\end{equation} No dynamical feedback from field to source is present, and uncertainty enters only at the measurement stage. Definition of the JacobianLet $\theta$ denote a vector of control parameters (e.g., current magnitude, conductor displacement, anisotropy orientation). The Jacobian is defined as the Fréchet derivative of the forward map:\begin{equation}J_{ij}=\frac{\partial B_z(\mathbf{x}_i)}{\partial \theta_j}.\end{equation} Crucially, derivatives are taken with respect to external control parameters, not with respect to field variables or measured data. The Jacobian therefore represents the linearized causal response of the physical system to infinitesimal source or geometry perturbations. Statistical InterpretationAssuming additive, zero-mean Gaussian sensor noise,\begin{equation}\mathbf{B}_{\mathrm{meas}}=\mathbf{B}(\theta) + \mathbf{\varepsilon},\qquad\mathbf{\varepsilon} \sim \mathcal{N}(0, C),\end{equation}the Fisher information matrix follows directly:\begin{equation}F = J^\top C^{-1} J.\end{equation} This construction is standard in inverse electromagnetics and does not rely on any non-classical assumptions. Causality is preserved because uncertainty propagates strictly forward through the inference pipeline. Conditions for ValidityThe above causal ordering is valid under the following conditions: Magnetostatic or magnetoquasistatic regime (no radiation or retardation). Smooth conductor geometry and sensor placement away from singularities. Perturbations small enough to justify linearization. Noise applied only to observables, not to control parameters. Violation of these conditions requires additional structure to preserve causal consistency. Other Physical Regimes and Required Ordering MechanismsIn more general settings, the naive Jacobian construction must be modified: Radiative electromagnetism: Retarded potentials introduce finite signal propagation. Causal ordering must be enforced using retarded Green's functions or time-domain adjoint methods. Dispersive or memory media: The field depends on the history of sources. State augmentation or convolutional kernels are required to maintain temporal causality. Relativistic synchronization problems: Sensor clocks must be synchronized using a local proper-time convention. Jacobians must be constructed on simultaneity slices consistent with the chosen synchronization scheme. Nonlinear or back-reacting systems: Source dynamics influenced by the field require coupled forward-adjoint evolution, and the Jacobian must be replaced by a full variational operator. In all cases, causal admissibility hinges on respecting the directionality of physical influence: sources precede fields, fields precede measurements, and inference follows last. # CTMT causality battery — magnetostatics # Case 1: noise on observables (causal-consistent) # Case 2: unmodeled parameter noise on I (causal-violating) # Artefacts: ctmt_causal_battery_report.md, ctmt_causal_battery_results.json import numpy as np from numpy.linalg import eigvalsh, lstsq, norm from pathlib import Path import json mu0 = 4e-7*np.pi # geometry + sensors def loop_polyline(radius=0.05, nseg=400, center=(0,0,0)): phi = np.linspace(0, 2*np.pi, nseg, endpoint=False) return np.c_[radius*np.cos(phi)+center[0], radius*np.sin(phi)+center[1], np.zeros_like(phi)+center[2]] def axial_and_radial_sensors(nz=60, zmax=0.06, nr=40, rmax=0.08): z_axis = np.linspace(-zmax, zmax, nz) axis = np.c_[np.zeros(nz), np.zeros(nz), z_axis] r_line = np.linspace(0.0, rmax, nr) rad = np.c_[r_line, np.zeros(nr), np.zeros(nr)] return np.vstack([axis, rad]) conductors = [loop_polyline(0.05, 400)] sensors = axial_and_radial_sensors() # Biot–Savart def biot_savart_line(sensors, polyline, current=1.0): Ns = sensors.shape[0] P0 = polyline; P1 = np.roll(polyline, -1, axis=0) dL = P1-P0; B = np.zeros((Ns,3)) for i in range(Ns): r = sensors[i][None,:] - P0 rn = np.linalg.norm(r, axis=1) + 1e-12 rh = r/rn[:,None] cross = np.cross(dL, rh)/(rn**2)[:,None] B[i] += (mu0/(4*np.pi))*current*np.sum(cross, axis=0) return B def biot_savart_multi(sensors, conductors, currents): B = np.zeros((sensors.shape[0],3)) for poly,I in zip(conductors, currents): B += biot_savart_line(sensors, poly, I) return B def forward_B(theta, sensors, conductors): I = theta.get('I', 4.0); dx = theta.get('dx', 0.0); dy = theta.get('dy', 0.0) shifted = [poly + np.array([dx,dy,0.0]) for poly in conductors] return biot_savart_multi(sensors, shifted, [I]*len(conductors)) def jacobian_fd(theta0, sensors, conductors, keys=('I','dx','dy'), h_frac=1e-6): base = forward_B(theta0, sensors, conductors)[:,2] # Bz J = np.zeros((base.size, len(keys))) for j,k in enumerate(keys): t1 = theta0.copy() step = h_frac*max(1.0, abs(theta0.get(k,1.0))) t1[k] = theta0.get(k,0.0) + step J[:,j] = (forward_B(t1, sensors, conductors)[:,2] - base)/step return base, J def fisher_invariants(J, sigma, sensors): F = J.T @ (np.eye(J.shape[0])/(sigma**2)) @ J evals = eigvalsh(F) rank = int(np.sum(evals > 1e-12*np.max(evals))) if np.max(evals)>0 else 0 kappa = float(np.max(evals)/(np.min(evals[evals>0]) if np.any(evals>0) else np.inf)) J_cg = J[::2,:]; F_cg = J_cg.T @ J_cg / (sigma**2) rng = np.random.default_rng(0) viol = sum((v/norm(v))@F_cg@(v/norm(v)) > (v/norm(v))@F@(v/norm(v)) + 1e-12 for v in rng.standard_normal((200,J.shape[1]))) n_axis = np.sum(np.isclose(sensors[:,0], 0.0)) F_axis = (J[:n_axis,:].T @ J[:n_axis,:])/(sigma**2) F_rad = (J[n_axis:,:].T @ J[n_axis:,:])/(sigma**2) rel_spec = float(np.max(np.abs(eigvalsh(F_axis+F_rad)-eigvalsh(F))/(np.abs(eigvalsh(F))+1e-18))) return F, {'rank':rank,'kappa':kappa,'violations':viol,'rel_spec':rel_spec} # Battery results = {} # Case 1: causal-consistent theta0 = {'I':4.0,'dx':0.0,'dy':0.0} B_true = forward_B(theta0, sensors, conductors); sigma_B = 2e-8 rng = np.random.default_rng(42); B_meas = B_true + sigma_B*rng.standard_normal(B_true.shape) base, J = jacobian_fd(theta0, sensors, conductors); F, inv = fisher_invariants(J, sigma_B, sensors) dtheta, *_ = lstsq(J, B_meas[:,2]-base, rcond=None) theta_hat = theta0.copy(); for k,val in zip(('I','dx','dy'), dtheta): theta_hat[k]+=float(val) B_pred = forward_B(theta_hat, sensors, conductors) coverage95 = np.mean(np.abs(B_meas - B_pred) inv['violations']), 'composability_worsened': bool(inv_bad['rel_spec'] > inv['rel_spec']) } Path('ctmt_causal_battery_results.json').write_text(json.dumps(results, indent=2) Kernel Model and Problem Statements CTMT Magnetism with Dispersive/Anisotropic KernelCTMT magnetism is computed from (ctmtB)\begin{equation}\mathbf B(x)=\frac{\rho_{\Phi}}{\rho_{S}}\int G(x,x';k,\omega)\,\Big[\mathbf u(x')\times \frac{x-x'}{4\pi\,\lVert x-x'\rVert^3}\Big] d^3x'\,,\label{eq:ctmtB}\end{equation}where \(\rho_{\Phi}/\rho_S\) reduces to \(\mu_0\) in static vacuum; a medium is represented by a (possibly tensorial) \(G\). In homogeneous frequency--space we use\begin{equation}\widehat{G}(k,\omega)=R(\psi)\,\mathrm{diag}\,\big(\mu_\perp(k,\omega),\,\mu_\parallel(k,\omega),\,\mu_z(k,\omega)\big)\,R(\psi)^{\top},\label{eq:Gtensor}\end{equation}with rotation \(R(\psi)\) setting principal directions; dispersion enters through \(\omega\mapsto\mu_{\bullet}(k,\omega)\).Discontinuities and CRSC StabilizationLet the experiment contain step-like jumps in drive \(I(t)\) or medium parameters (e.g., rotating principal axis \(\psi\) or piecewise \(\mu_{\bullet}\)). With sliding windows \(w\), coherence is certified if Fisher invariants (rank, conditioning, monotonicity, composability) hold. We stabilize fits using a Coherence-Rigidity Stabilization Constraint (CRSC):\begin{equation}\theta_w^{\ast}=\arg\min_{\theta}\;\underbrace{\kappa\big(F_w(\theta)\big)}_{\text{conditioning}}\;+\;\underbrace{\alpha\,\big\lVert F_w(\theta)-F_{w,\mathrm{cg}}(\theta)\big\rVert_2}_{\text{coarse--grain invariance}}\;+\;\underbrace{\beta\,\big\lVert\theta-\theta_{w-1}^{\ast}\big\rVert_{W}}_{\text{jump regularizer}}\,,\label{eq:CRSC}\end{equation}with weights \(\alpha,\beta\ge 0\); \(F_{w,\mathrm{cg}}\) is the Fisher under sensor coarse--graining. This keeps Fisher well--conditioned across jumps without masking true discontinuities.Inverse Reconstruction of \(\mathbf u(x)\)Discretize ctmtB to \(\mathbf b=\mathbf A\,\mathbf u\), where \(\mathbf b\in\mathbb R^{3N_s}\) stacks field samples and \(\mathbf u\in\mathbb R^{3N_v}\) stacks \(\mathbf u(x')\) on a voxel grid. CTMT inverse uses CRSC--regularized Fisher least squares:\begin{equation}\widehat{\mathbf u}\;=\;\arg\min_{\mathbf u}\;\big\lVert\mathbf b-\mathbf A\mathbf u\big\rVert_{\mathbf C^{-1}}^{2}\;+\;\lambda\,\big\lVert\mathbf R\mathbf u\big\rVert_2^2\,;\qquad\lambda=\arg\min_{\lambda}\;\kappa(F(\lambda))+\alpha\lVert F-F_{\mathrm{cg}}\rVert_2\,,\label{eq:inv}\end{equation}with noise covariance \(\mathbf C\); \(\mathbf R\) encodes smoothness or sparsity (e.g., TV); \(F=J^\top\!\mathbf C^{-1}J\) with \(J=\partial(\mathbf A\mathbf u)/\partial\mathbf u=\mathbf A\).Battery and Outcomes (A) Dispersive/Anisotropic \(\widehat{G}(k,\omega)\): We simulated a coil in a uniaxial medium with \(\mu_{\parallel}(\omega)=\mu_0\bigl(1+\omega_p^2/(\omega_0^2-\omega^2-i\gamma\omega)\bigr)\), \(\mu_{\perp}=\mu_0\), and rotated principal axis \(R(\psi)\). CTMT windows satisfied rank 3 with bounded \(\kappa(F)\); monotonicity and composability held within numerical tolerance. The predicted \(\mathbf B\) met the 95\% acceptance band at the median window. Numerical settings mirror those in the chaotic-coil validation. (B) Discontinuities/Jumps with CRSC: We injected step changes in \(I(t)\) and toggled \(\psi\) between two orientations. With CRSC, Fisher conditioning remained bounded across jumps, avoiding spurious rank loss; acceptance coverage stayed at or near the 95 % target.(C) Inverse Reconstruction \(\mathbf u\leftarrow \mathbf b\): Using inverse reconstruction and the same \(\widehat{G}\), we reconstructed \(\mathbf u(x)\) on a grid. The CRSC-selected \(\lambda\) minimized \(\kappa(F)\) while preserving high acceptance coverage. The recovered \(\mathbf u\) was spatially consistent with the known conductor path (up to voxelization), and insensitive to moderate anisotropy/dispersion mis-specifications. Reproducibility Define geometry (loop or PCB trace), sensor layout, and a frequency grid; pick \(\mu_{\bullet}(k,\omega)\) and \(R(\psi)\). Acquire \(\mathbf B(x,t)\) with controlled jumps in \(I(t)\) or known medium reorientation; set noise model \(\mathbf C\). Windows: compute \(y(\theta), J, F\); enforce CRS; check invariants (rank, \(\kappa(F)\), monotonicity, composability). Forward: compute \(\mathbf B_{\rm pred}\) from ctmtB; report acceptance coverage. Inverse: assemble \(\mathbf A\) from \(G\) and geometry; solve Inverse Reconstruction for \(\widehat{\mathbf u}\); visualize streamlines vs. conductor. All steps follow the earlier chaotic-coil workflow with \(G\) generalized to \(G(k,\omega)\). # ============================================================ # CTMT MAGNETISM — MEASUREMENT → CTMT COHERENCE → MAGNETISM → INVERSE u # ============================================================ # Requirements: numpy only. (You can add matplotlib for plots.) # Author: Your lab team # ------------------------------------------------------------ import numpy as np from numpy.linalg import lstsq, eigvalsh, norm # --------------------------- # 0) UTILS # --------------------------- def rotation_matrix_z(psi): """2D rotation around z for anisotropy principal axes.""" c, s = np.cos(psi), np.sin(psi) R = np.eye(3) R[:2,:2] = np.array([[c, -s],[s, c]]) return R def block_diag(blocks): """Simple block diagonal stack for small blocks.""" n = sum(b.shape[0] for b in blocks) m = sum(b.shape[1] for b in blocks) out = np.zeros((n,m)) r=c=0 for b in blocks: rr, cc = b.shape out[r:r+rr, c:c+cc] = b r += rr; c += cc return out # --------------------------- # 1) GEOMETRY & SENSORS # --------------------------- # A) Conductor geometry: polyline(s) representing wire centerlines. # Provide list of arrays [ (N_i x 3) for each conductor i ]. # Or use the helper to generate a canonical circular loop. def loop_polyline(radius=0.05, nseg=400, center=(0,0,0)): phi = np.linspace(0, 2*np.pi, nseg, endpoint=False) x = radius*np.cos(phi) + center[0] y = radius*np.sin(phi) + center[1] z = np.zeros_like(phi) + center[2] return np.c_[x,y,z] # === REPLACE HERE (if you have your own conductor polylines) === conductors = [loop_polyline(radius=0.05, nseg=400, center=(0,0,0))] # list of polylines # B) Sensor positions: an (Ns x 3) array of sensor coordinates. def axial_and_radial_sensors(nz=60, zmax=0.06, nr=40, rmax=0.08): z_axis = np.linspace(-zmax, zmax, nz) axis_pts = np.c_[np.zeros(nz), np.zeros(nz), z_axis] r_line = np.linspace(0.0, rmax, nr) rad_pts = np.c_[r_line, np.zeros(nr), np.zeros(nr)] return np.vstack([axis_pts, rad_pts]) # === REPLACE HERE (if you already have sensors) === sensors = axial_and_radial_sensors(nz=60, zmax=0.06, nr=40, rmax=0.08) # --------------------------- # 2) KERNELS: VACUUM & DISPERSIVE/ANISOTROPIC # --------------------------- mu0 = 4e-7*np.pi def biot_savart_line(sensors, polyline, current=1.0): """ Biot-Savart for a single polyline: sensors: (Ns,3), polyline: (Nw,3) closed or open, current scalar. Returns B field (Ns,3) from that conductor. """ Ns = sensors.shape[0] Nw = polyline.shape[0] # segments P0 = polyline P1 = np.roll(polyline, -1, axis=0) # wrap to form loop if needed dL = P1 - P0 # field accumulate B = np.zeros((Ns,3)) for i in range(Ns): r_vec = sensors[i][None,:] - P0 # (Nw,3) r_norm = np.linalg.norm(r_vec, axis=1) + 1e-12 r_hat = r_vec / r_norm[:,None] cross = np.cross(dL, r_hat) / (r_norm**2)[:,None] B[i] += (mu0/(4*np.pi))*current*np.sum(cross, axis=0) return B def biot_savart_multi(sensors, conductors, currents): """ Sum B fields from multiple polylines with given currents. currents: list/array (len == number of conductors). """ B = np.zeros((sensors.shape[0],3)) for poly, I in zip(conductors, currents): B += biot_savart_line(sensors, poly, current=I) return B # --- Dispersive/anisotropic medium (homogeneous approximation) --- # For practical lab use, you typically know an effective permeability tensor μ_eff(ω). # We'll evaluate frequency-by-frequency and average or select window-ω. def mu_tensor_uniaxial(mu_perp, mu_par, psi): R = rotation_matrix_z(psi) Mloc = np.diag([mu_perp, mu_par, mu_perp]) # e.g., axis along y after rotation return R @ Mloc @ R.T def frequency_response_mu(omega, params): """ Example Drude-Lorentz-like scalar component for μ_par(ω). params: dict with keys omega0, gamma, wp for illustrative dispersion. """ w0, g, wp = params["omega0"], params["gamma"], params["wp"] # μ(ω) = μ0 * (1 + wp^2 / (w0^2 - ω^2 - i γ ω)) return mu0 * (1.0 + (wp**2) / (w0**2 - omega**2 - 1j*g*omega)) def B_with_anisotropy_dispersion(sensors, conductors, currents, psi, omega, params, scalar_mu_perp=mu0): """ Illustrative approach: compute vacuum Biot-Savart B, then map via μ_eff tensor as a linear operator (homogeneous medium, small-k assumption). For general media you'd form the full integral operator in k-space. """ # Base vacuum field (as a proxy for H), then scale by μ_eff: B_vac = biot_savart_multi(sensors, conductors, currents) mu_par = frequency_response_mu(omega, params) M = mu_tensor_uniaxial(mu_perp=scalar_mu_perp, mu_par=mu_par, psi=psi) # Apply tensor to each sensor vector: return (B_vac @ M.T).real # take real part for measurable field # --------------------------- # 3) DATA: MEASURED B AND NOISE # --------------------------- # === REPLACE HERE with your measured B(t) or window-averaged B === # For demonstration, we simulate a static window with I=4 A (single loop). I_true = 4.0 B_meas = biot_savart_multi(sensors, conductors, currents=[I_true]) sigma_B = 1e-8 # T (sensor noise s.d.) rng = np.random.default_rng(1) B_meas += sigma_B * rng.standard_normal(B_meas.shape) # If you have time series, average over a window before proceeding, or repeat per window. # --------------------------- # 4) WINDOWED PARAMETER FIT + FISHER + INVARIANTS + CRSC # --------------------------- # We'll fit theta=[I, dx, dy, psi] in a single window, showing all "wires". # For vacuum test set psi=0 and keep anisotropy off, or include it for anisotropic test. def forward_B(params, sensors, conductors): """ params: dict with keys: 'I' : scalar current (A) 'dx','dy': small center shifts (m) 'psi' : anisotropy axis rotation (rad), optional 'use_aniso': bool 'omega': freq (rad/s), 'mu_params': dict for dispersion (optional) 'sigma_mu_perp': scalar μ_perp (default mu0) """ I = params.get('I', 1.0) dx = params.get('dx', 0.0) dy = params.get('dy', 0.0) # shift conductors shifted = [poly + np.array([dx,dy,0.0]) for poly in conductors] if params.get('use_aniso', False): psi = params.get('psi', 0.0) omega = params['omega'] mu_params = params['mu_params'] mu_perp = params.get('mu_perp', mu0) return B_with_anisotropy_dispersion(sensors, shifted, [I]*len(shifted), psi, omega, mu_params, scalar_mu_perp=mu_perp) else: return biot_savart_multi(sensors, shifted, [I]*len(shifted)) def jacobian_fd(theta0, sensors, conductors, keys=('I','dx','dy','psi'), h_frac=1e-6): """ Finite-difference Jacobian of Bz wrt theta keys. """ base = forward_B(theta0, sensors, conductors)[:,2] # Bz only m = base.size d = len(keys) J = np.zeros((m,d)) for j,k in enumerate(keys): t1 = theta0.copy() step = h_frac*max(1.0, abs(theta0.get(k,1.0))) t1[k] = theta0.get(k,0.0) + step pert = forward_B(t1, sensors, conductors)[:,2] J[:,j] = (pert - base)/step return base, J def fisher_invariants(J, sigma): Cinv = np.eye(J.shape[0])/(sigma**2) F = J.T @ Cinv @ J w = eigvalsh(F) # invariants rank = int(np.sum(w > 1e-12*np.max(w))) if np.max(w)>0 else 0 kappa = float(np.max(w)/(np.min(w[w>0]) if np.any(w>0) else np.inf)) # monotonicity: coarse-grain sensors J_cg = J[::2,:] F_cg = J_cg.T @ J_cg / (sigma**2) rng = np.random.default_rng(0) viol=0 for _ in range(200): v = rng.standard_normal(J.shape[1]); v/=norm(v) if (v@F_cg@v) > (v@F@v) + 1e-12: viol+=1 # composability: split axis vs radial n_axis = np.sum(sensors[:,0]==0) # assuming our sensor builder; adjust for your layout J_axis, J_rad = J[:n_axis,:], J[n_axis:,:] F_axis = J_axis.T@J_axis/(sigma**2); F_rad = J_rad.T@J_rad/(sigma**2) eig_full = eigvalsh(F); eig_sum = eigvalsh(F_axis+F_rad) rel_spec = float(np.max(np.abs(eig_sum-eig_full)/(np.abs(eig_full)+1e-18))) return F, {'rank':rank, 'kappa':kappa, 'violations':viol, 'rel_spec':rel_spec} def crsc_objective(F, F_cg, theta, theta_prev, alpha=1.0, beta=0.0, W=None): w = eigvalsh(F) kappa = float(np.max(w)/(np.min(w[w>0]) if np.any(w>0) else np.inf)) # spectral diff sd = norm(F-F_cg,2) # jump if theta_prev is None or beta==0.0: jump=0.0 else: diff = np.array([theta.get(k,0.0)-theta_prev.get(k,0.0) for k in theta.keys()]) if W is None: jump = norm(diff) else: jump = float(diff @ W @ diff) return kappa + alpha*sd + beta*jump # --- Fit a single window with CRSC guidance --- theta0 = {'I':3.5,'dx':0.0,'dy':0.0,'psi':0.0,'use_aniso':False} base, J = jacobian_fd(theta0, sensors, conductors, keys=('I','dx','dy','psi')) F, inv = fisher_invariants(J, sigma_B) # refit by least squares for acceptance check resid = B_meas[:,2] - base dtheta, *_ = lstsq(J, resid, rcond=None) theta_hat = theta0.copy() for k,val in zip(('I','dx','dy','psi'), dtheta): theta_hat[k] = theta_hat.get(k,0.0) + float(val) # acceptance band (95% ~ 2 sigma; per-sensor) B_pred = forward_B(theta_hat, sensors, conductors) coverage95 = np.mean(np.abs(B_meas - B_pred) 0]) if np.any(w>0) else np.inf)) return kappa Cinv = np.eye(3*sensors.shape[0])/(sigma_B**2) lambdas = np.logspace(-6, -1, 12) kappas = [fisher_kappa_for_lambda(A, Cinv, lam) for lam in lambdas] lam_star = float(lambdas[int(np.argmin(kappas))]) # Solve (A^T Cinv A + lam I) u = A^T Cinv b ATA = A.T @ Cinv @ A rhs = A.T @ Cinv @ b u_hat = np.linalg.solve(ATA + lam_star*np.eye(ATA.shape[0]), rhs) print("Reconstruction done. lambda*=", lam_star, "||u_hat||=", norm(u_hat)) # You can reshape u_hat to a (Nv,3) field and visualize streamlines on the ROI. CTMT Nonlinear Attack Battery (Magnetostatics) Scenario: baseline Fisher: rank=3, kappa=6.00e+08, monotonicity_violations=0, composability_rel_spec=1.241e-14Acceptance (95%): 83.00% Scenario: saturation Fisher: rank=3, kappa=6.00e+08, monotonicity_violations=0, composability_rel_spec=1.241e-14Acceptance (95%): 52.33%Mitigated acceptance (95%): 29.33% Scenario: geo_backreaction Fisher: rank=3, kappa=6.00e+08, monotonicity_violations=0, composability_rel_spec=1.241e-14Acceptance (95%): 33.33%Mitigated acceptance (95%): 33.33% Scenario: outliers_clip Fisher: rank=3, kappa=6.00e+08, monotonicity_violations=0, composability_rel_spec=1.241e-14Acceptance (95%) LS: 62.00%Acceptance (95%) IRLS: 62.00% Scenario: large_signal_GN Fisher: rank=3, kappa=2.51e+08, monotonicity_violations=0, composability_rel_spec=3.064e-14Acceptance (95%) LS: 24.00%Acceptance (95%) GN: 25.00% CTMT Magnetism Law — Invariant Extraction Report Fit summary (vacuum/static, Biot–Savart with effective permeability m)I_hat = 3.812958 A (SE ≈ nan)dx_hat = -1.106005e-08 m, dy_hat = -2.107559e-04 mm_hat = 1.049241 (mu_eff = 1.318515e-06 H/m; SE ≈ nan)Acceptance coverage (95% band): 77.00% Coherence density and phase densityAssumed wire radius a = 1.0 mm → A = 3.141593e-06 m^2rho_S (coherence density) = 1/A = 3.183099e+05 m^-2rho_Phi (phase density) = mu_eff * rho_S = 4.196964e-01 (units consistent with permeability mapping) Minimal action scale S_* (operational, normalized law)Using B0 ≈ (rho_Phi/rho_S) * (u0/r0^2) with u0 = I_hat/L, r0 at high-|Bz| sensor, G≈1.L = 2πR = 3.141593e-01 m, u0 = 1.213702e+01 A/m, r0 ≈ 4.923077e-02 mCalibration S_* = (rho_Phi/rho_S)/B0 → S_*_hat = 1.193854e-03 (median over top sensors = 5.298205e-03; IQR -1.409484e-03–1.021445e-02) #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ CTMT rho_S and S_* Guided Extraction (stepwise reasoning; lab placeholders) WHAT THIS DOES -------------- This script focuses solely on the two invariants: 1) rho_S (coherence/source density) -> geometry-determined: rho_S = 1/(pi a^2). 2) S_* (operational minimal action scale) From CTMT magnetism law in vacuum/static mapping: (rho_Phi / rho_S) -> mu_eff, G -> 1. So B(x) = mu_eff * B_vacuum(x), where B_vacuum is Biot–Savart. Define S_* := (rho_Phi/rho_S) / B0 = mu_eff / B0 at calibration sensors. Aggregate across top-|Bz| sensors for robust median & IQR. REPLACE ALL TODOs with your lab data and parameters. """ import json, math from dataclasses import dataclass, asdict from typing import Dict, List, Optional, Tuple import numpy as np from numpy.linalg import lstsq, inv # -------------------------------------------------------------------- # 0) CONSTANTS & USER CONFIG # -------------------------------------------------------------------- MU0 = 4e-7 * math.pi # vacuum permeability [H/m] @dataclass class RunConfig: # REASONING: sensor noise used only for reporting; GLS uses supplied cov_Bz. sigma_B: float = 2e-8 # [Tesla] Bz noise s.d. (if no cov_Bz) wire_radius_m: float = 1e-3 # TODO: set to your lab wire radius [m] theta0: Dict[str, float] = None # Initial guess: I, dx, dy, m (m = mu_eff/mu0) cov_Bz: Optional[np.ndarray] = None # Optional covariance on Bz (Ns x Ns) top_k_sensors: int = 10 # S_* aggregation over top-|Bz| sensors out_json: str = "ctmt_rho_Sstar_guided_results.json" out_md: str = "ctmt_rho_Sstar_guided_report.md" def __post_init__(self): if self.theta0 is None: self.theta0 = {"I": 4.0, "dx": 0.0, "dy": 0.0, "m": 1.0} # -------------------------------------------------------------------- # 1) LAB PLACEHOLDERS: SENSORS, POLYLINES, MEASUREMENTS # -------------------------------------------------------------------- # TODO: Replace these demo builders with your real arrays def demo_loop_polyline(radius=0.05, nseg=400, center=(0,0,0)): """Demo conductor: circular loop (Nw x 3) centerline.""" phi = np.linspace(0.0, 2.0*math.pi, nseg, endpoint=False) x = radius*np.cos(phi)+center[0] y = radius*np.sin(phi)+center[1] z = np.zeros_like(phi)+center[2] return np.c_[x,y,z] def demo_axial_and_radial_sensors(nz=60, zmax=0.06, nr=40, rmax=0.08): """Demo sensor layout: nz axial points + nr radial points in plane.""" z_axis = np.linspace(-zmax, zmax, nz) axis = np.c_[np.zeros(nz), np.zeros(nz), z_axis] r_line = np.linspace(0.0, rmax, nr) rad = np.c_[r_line, np.zeros(nr), np.zeros(nr)] return np.vstack([axis, rad]) # TODO: Replace with your lab arrays SENSORS = demo_axial_and_radial_sensors() # shape (Ns,3) POLYLINES = [demo_loop_polyline()] # list of (Nw,3) # TODO: Replace with your measured B field (T windows) of shape (T, Ns, 3). # If you already average per window upstream, make T=1 and pass that. _rng = np.random.default_rng(123) I_true_demo = 4.0 # We'll simulate a single-window measurement for the demo. # Replace the next 3 lines with your window-averaged B_meas_time. # (You can keep the forward helpers below and just supply real B_meas_time.) # -------------------------------------------------------------------- # -------------------------------------------------------------------- # 2) FORWARD: BIOT–SAVART (VACUUM/STATIC CTMT MAPPING) # -------------------------------------------------------------------- # REASONING: In the vacuum/static mapping, CTMT reduces to Biot–Savart, # with an overall scale m = mu_eff/mu0 (so B = m * B_vac). def biot_savart_line(sensors: np.ndarray, polyline: np.ndarray, current: float=1.0) -> np.ndarray: Ns = sensors.shape[0] P0 = polyline P1 = np.roll(polyline, -1, axis=0) dL = P1 - P0 B = np.zeros((Ns,3)) chunk = max(256, min(4096, Ns)) for s0 in range(0, Ns, chunk): s1 = min(Ns, s0+chunk) S = sensors[s0:s1] r = S[:,None,:] - P0[None,:,:] rn = np.linalg.norm(r, axis=2) + 1e-12 rh = r / rn[:,:,None] cross = np.cross(dL[None,:,:], rh) / (rn[:,:,None]**2) B[s0:s1] += (MU0/(4.0*math.pi))*current*np.sum(cross, axis=1) return B def biot_savart_multi(sensors: np.ndarray, polylines: List[np.ndarray], currents: List[float]) -> np.ndarray: B = np.zeros((sensors.shape[0],3)) for poly, I in zip(polylines, currents): B += biot_savart_line(sensors, poly, I) return B def forward_B(theta: Dict[str,float], sensors: np.ndarray, polylines: List[np.ndarray]) -> np.ndarray: """CTMT vacuum/static mapping: B = m * B_vac(I, dx, dy).""" I = theta.get("I", 4.0) dx = theta.get("dx", 0.0) dy = theta.get("dy", 0.0) m = theta.get("m", 1.0) # m = mu_eff / mu0 shifted = [poly + np.array([dx,dy,0.0]) for poly in polylines] Bvac = biot_savart_multi(sensors, shifted, [I]*len(shifted)) return m * Bvac # -------------------------------------------------------------------- # 3) CAUSAL JACOBIAN wrt CONTROLS [I, dx, dy, m] # -------------------------------------------------------------------- # REASONING: Jacobian must be with respect to control parameters (causal). def jacobian_fd(theta0: Dict[str,float], sensors: np.ndarray, polylines: List[np.ndarray], keys: Tuple[str,...] = ("I","dx","dy","m"), h_frac: float=1e-6) -> Tuple[np.ndarray,np.ndarray]: base = forward_B(theta0, sensors, polylines)[:,2] m = base.size; d = len(keys) J = np.zeros((m,d)) for j,k in enumerate(keys): t1 = theta0.copy() step = h_frac * max(1.0, abs(theta0.get(k,1.0))) t1[k] = theta0.get(k,0.0) + step J[:,j] = (forward_B(t1, sensors, polylines)[:,2] - base)/step return base, J # -------------------------------------------------------------------- # 4) FIT mu_eff AND I (LS/GLS) -> THEN rho_S and S_* # -------------------------------------------------------------------- # REASONING: Fit theta=[I,dx,dy,m] by LS (or GLS if cov_Bz provided), # then mu_eff_hat = m_hat * mu0. rho_S is determined by geometry; S_* uses mu_eff and measured B. def compute_rho_S_from_wire_radius(radius_m: float) -> float: # S = rho_S * u (A/m). For a round wire area A = pi a^2: rho_S = 1/A A = math.pi * radius_m**2 return 1.0 / A def fit_theta_mu_eff(B_win: np.ndarray, sensors: np.ndarray, polylines: List[np.ndarray], cfg: RunConfig) -> Dict[str,float]: base, J = jacobian_fd(cfg.theta0, sensors, polylines) resid = B_win[:,2] - base if cfg.cov_Bz is None: dtheta, *_ = lstsq(J, resid, rcond=None) else: Cinv = inv(cfg.cov_Bz) lhs = J.T @ Cinv @ J rhs = J.T @ Cinv @ resid dtheta = np.linalg.solve(lhs, rhs) theta_hat = cfg.theta0.copy() for k,val in zip(("I","dx","dy","m"), dtheta): theta_hat[k] = theta_hat.get(k,0.0) + float(val) mu_eff_hat = theta_hat["m"] * MU0 return {"theta_hat": theta_hat, "mu_eff_hat": mu_eff_hat} def compute_S_star_operational(B_win: np.ndarray, sensors: np.ndarray, mu_eff_hat: float, top_k: int=10) -> Dict[str,float]: # Operational normalized S_* := (rho_Phi/rho_S)/B0 = mu_eff / B0 # Aggregate over top-|Bz| sensors for a robust median & IQR Bz = B_win[:,2] idx = np.argsort(-np.abs(Bz))[:max(1, top_k)] S_vals = mu_eff_hat / (Bz[idx] + 1e-18) return { "S_star_med": float(np.median(S_vals)), "S_star_iqr": [float(np.percentile(S_vals,25)), float(np.percentile(S_vals,75))], "S_star_samples": S_vals.tolist() } # -------------------------------------------------------------------- # 5) DRIVER: RUN EXTRACTION (one averaged window) # -------------------------------------------------------------------- def run_guided_rho_S_Sstar(B_meas_time: np.ndarray, sensors: np.ndarray, polylines: List[np.ndarray], cfg: RunConfig) -> Dict: # Step 5a. average the time window (if you have many windows, call this per-window upstream) B_win = np.mean(B_meas_time, axis=0) # (Ns,3) # Step 5b. fit theta and mu_eff from causal Jacobian (LS/GLS) fit = fit_theta_mu_eff(B_win, sensors, polylines, cfg) # Step 5c. compute rho_S (geometry) and S_* (operational) rho_S = compute_rho_S_from_wire_radius(cfg.wire_radius_m) S_op = compute_S_star_operational(B_win, sensors, fit["mu_eff_hat"], top_k=cfg.top_k_sensors) # Step 5d. write artefacts results = { "theta_hat": fit["theta_hat"], "mu_eff_hat": fit["mu_eff_hat"], "rho_S": rho_S, "S_star_operational": S_op } with open(cfg.out_json, "w") as f: json.dump({"results": results, "config": asdict(cfg)}, f, indent=2) # Step 5e. human mini-report lines = [] lines += ["# CTMT rho_S and S_* Guided Extraction", ""] lines += [f"Wire radius a = {cfg.wire_radius_m:.6e} m -> rho_S = 1/(pi a^2) = {rho_S:.6e} m^-2"] lines += [f"mu_eff_hat = {fit['mu_eff_hat']:.6e} H/m"] lines += [f"S_* median (top sensors) = {S_op['S_star_med']:.6e} (IQR {S_op['S_star_iqr'][0]:.6e} - {S_op['S_star_iqr'][1]:.6e})", ""] with open(cfg.out_md, "w") as f: f.write("\n".join(lines)) return {"results": results} # -------------------------------------------------------------------- # 6) DEMO HARNESS (remove for lab use) # -------------------------------------------------------------------- if __name__ == "__main__": # Build a demo measurement from the forward and add noise B_true_demo = biot_savart_multi(SENSORS, POLYLINES, [I_true_demo]) B_meas_demo = B_true_demo + 2e-8 * _rng.standard_normal(B_true_demo.shape) B_meas_time = B_meas_demo[None,:,:] # T=1 demo cfg = RunConfig(wire_radius_m=1.0e-3, sigma_B=2e-8) artefacts = run_guided_rho_S_Sstar(B_meas_time, SENSORS, POLYLINES, cfg) print("mu_eff_hat:", artefacts["results"]["mu_eff_hat"]) print("rho_S:", artefacts["results"]["rho_S"]) print("S_* median:", artefacts["results"]["S_star_operational"]["S_star_med"]) Coherence Health Monitor Falsification Attempt: NAO Index Methodology Data: Monthly NAO index (1950--2025), NOAA CPC. CTMT Principle: Fisher curvature collapse vs. variability (Lyapunov surrogate). Steps: Compute Jacobian sensitivity from NAO series. Build Fisher matrix $F = J^\top J / \sigma^2$. Extract $\lambda_{\min}(F)$ as rigidity metric. Compare with rolling standard deviation. We used a 2-parameter Jacobian sensitivity (lagged NAO values), so full rank = 2. During coherence-stable epochs, Fisher eigenvalues are both positive and well-separated → rank = 2. During rupture epochs (e.g., 1962–63, 1993, 2015–16), one eigenvalue collapses toward zero → rank drops to 1 (or near 1 numerically). Dimensional residuum ($\epsilon_{\rm dim}$) stayed at $10^{-14}∼10−14$, confirming global closure even when local rank collapsed. Results Fisher $\lambda_{\min}$ collapses during high variability epochs (1962–63, 1993, 2015–16). Rank Stability: Fisher matrix rank dropped from full to low-rank during high variability epochs (1962–63, 1993, 2015–16), consistent with CRSC. Dimensional Residuum: $\epsilon_{\rm dim} = 4.3 \times 10^{-14}$, confirming dimensional closure $\epsilon_{\rm dim} < 10 ^{ -12}$. Confirms CTMT prediction: coherence rupture aligns with chaotic bursts. Rank collapse indicates coherence rupture, not ill-posedness; dimensional closure ensures kernel composability. DiscussionThese results extend CTMT beyond synthetic chaos (logistic, Duffing, Lorenz) to real climate oscillations, supporting Fisher geometry as a universal coherence detector. SourceNOAA CPC NAO index: https://www.cpc.ncep.noaa.gov/products/precip/CWlink/pna/nao.shtml Rank, Dimensionality, and Unit Closure in CTMT In CTMT, the rank of the Fisher information matrix\[F = \frac{J^\top J}{\sigma^2}\]corresponds to the number of independent modulation parameters that remain coherent. For a kernel with $d$ modulation degrees of freedom, full rank is $d$. Rank collapse (e.g., from $d$ to $d-1$) indicates a coherence rupture under the Coherence-Redundancy Stabilization Criterion (CRSC), not numerical ill-posedness. Dimensional closure requires that the emergent configuration space remains unit-consistent under kernel stacking and modulation. For a time-series observable $x(t)$, the Jacobian\[J_{ij} = \frac{\partial x_i}{\partial \theta_j}\]introduces implicit units (observable per parameter step). Fisher curvature aggregates these into a metric structure, which CTMT normalizes against an invariant action scale to ensure dimensional coherence. The dimensional residuum is defined as:\[\epsilon_{\mathrm{dim}} =\left| \frac{\Lambda_{\mathrm{comp}}}{\Lambda_{\mathrm{inv}}} - 1 \right|,\]where $\Lambda_{\mathrm{comp}}$ is the composed kernel scale and $\Lambda_{\mathrm{inv}}$ is the invariant scale derived from the Recursive Modulation Impulse (RMI). CTMT requires $\epsilon_{\mathrm{dim}} < 10^{-12}$ for falsifiability. Units: For NAO index (dimensionless), Jacobian derivatives introduce a rat-like quantity per lag step, analogous to cycles per sample (Hz if sampling interval is fixed). This ensures that Fisher curvature and coherence proper time are dimensionally consistent. Falsification Battery for Ohm's Law: Causal vs. Non-Causal Noise Placement We test whether the CTMT can distinguish a valid physical law from a causally violated one. Using Ohm's law $V = RI$ as a minimal system, we compare two regimes:(i) noise placed only on observables (causal-consistent), and(ii) noise placed on the parameter $R$ itself (causal-violating).CTMT predicts that Fisher geometry, coverage, and window-consistency should remain stable in the first case and collapse in the second. The results confirm this prediction. Model and CTMT Setup We consider the forward map \[f(R)_k = R\,I_k,\] with a single control parameter $R$ and currents $I_k \in \{0.1,0.2,\dots,1.0\}$ A. The Jacobian with respect to $R$ is \[J_k = \frac{\partial f_k}{\partial R} = I_k.\] With measurement noise variance $\sigma^2$, the Fisher information is \[F = \frac{1}{\sigma^2} J^\top J= \frac{1}{\sigma^2} \sum_{k=1}^{10} I_k^2.\] Since $F$ is $1\times 1$, its inverse $F^{-1}$ gives the predicted variance of the estimator $\hat R$. Case 1: Causal-Consistent Noise Measurements follow \[V_k^{\mathrm{meas}} = R_0 I_k + \epsilon_k,\qquad\epsilon_k \sim \mathcal{N}(0,\sigma^2),\] with $R_0 = 10\,\Omega$ and $\sigma = 0.1$ V. The least-squares estimator is \[\hat R = \frac{\sum I_k V_k^{\mathrm{meas}}}{\sum I_k^2}.\] Fisher Prediction The Fisher information is \[F = \frac{1}{\sigma^2}\sum I_k^2= \frac{1}{0.1^2}\cdot 3.85= 385.\] Thus \[F^{-1} = 0.002597,\qquad\mathrm{Std}(\hat R) = \sqrt{F^{-1}} = 0.051.\] A 95 % confidence interval is \[\hat R \pm 1.96\cdot 0.051.\] Empirical Coverage Repeating the experiment over many trials yields empirical coverage \[\mathrm{Coverage}_{95} = 0.94 \pm 0.02,\] consistent with the Fisher prediction. CTMT Verdict Fisher geometry stable. Coverage matches prediction. Window-to-window estimates agree within Fisher uncertainty. CTMT accepts the model as causally consistent. Case 2: Causal-Violating Noise Now the resistance fluctuates per measurement: \[R_k = R_0(1 + 0.05\,\eta_k),\qquad\eta_k \sim \mathcal{N}(0,1),\] and \[V_k^{\mathrm{meas}} = R_k I_k + \epsilon_k.\] The model incorrectly assumes a single constant $R$. Effective Noise The true noise becomes \[\tilde\epsilon_k= 0.05 R_0 \eta_k I_k + \epsilon_k,\] which is heteroscedastic and violates the causal pipeline. Fisher Mismatch The model still computes \[F = \frac{1}{\sigma^2}\sum I_k^2 = 385,\] but this no longer reflects the true information content. Empirical Results Across repeated trials: The empirical variance of $\hat R$ is \[\mathrm{Var}_{\mathrm{emp}}(\hat R) \approx 0.012,\] almost \emph{five times larger} than $F^{-1}$.95 % coverage collapses to \[\mathrm{Coverage}_{95} \approx 0.42,\] far below the nominal 0.95.Window-to-window estimates differ by \[|\hat R^{(1)} - \hat R^{(2)}| \approx 0.25,\] which is five standard deviations larger than Fisher predicts. CTMT Verdict Fisher geometry inconsistent with empirical fluctuations. Coverage failure indicates causal violation. Window consistency breaks. CTMT rejects the model as causally invalid. Summary Case & Fisher OK? & Coverage OK? & CTMT VerdictCausal-consistent & Yes & Yes & AcceptCausal-violating & No & No & Reject CTMT falsification battery results for Ohm's law. CTMT successfully distinguishes a valid physical law from a causally broken one, even though both produce superficially similar data. This demonstrates CTMT's ability to detect causal violations and inferability collapse in the simplest possible physical system. Extended CTMT Stress Tests We now extend the falsification battery to test whether CTMT(i) can repair causal violations by model extension,(ii) is invariant under benign reparameterizations,and (iii) behaves continuously as causal violations vanish. Attempted Model Repair (Null Result) One may attempt to ``fix'' Case~2 by promoting resistance to a latentrandom effect,\[R_k = R + \delta R_k,\qquad\delta R_k \sim \mathcal{N}(0,\sigma_R^2),\]and marginalizing over $\delta R_k$. This yields an effective noise variance\[\mathrm{Var}(V_k \mid I_k)= \sigma^2 + \sigma_R^2 I_k^2,\]which is explicitly input-dependent. While this modification improves likelihood fit, CTMT diagnostics show: Fisher information becomes ill-conditioned under windowing. Rank is unstable under coarse-graining of $\{I_k\}$. Coverage improves only marginally and remains $<70\%$. Thus, CTMT identifies the apparent improvement as non-causal overfitting, not a valid physical repair. CTMT does not forbid latent-variable models; it rejects them when they fail causal transport invariance. Reparameterization Invariance Test We reparameterize the model using $\theta=\log R$, yielding\[V_k = e^\theta I_k,\qquadJ_k = \frac{\partial V_k}{\partial \theta} = e^\theta I_k.\] Both Case~1 and Case~2 are recomputed in $\theta$-space. In Case~1, Fisher predictions, coverage, and window consistency remain invariant under reparameterization. In Case~2, Fisher mismatch and coverage collapse persist. This confirms that CTMT rejection is not an artifact of parameter choice or scaling. Vanishing Violation Limit Finally, we scale the causal violation amplitude:\[R_k = R_0(1 + \alpha\,\eta_k),\qquad\alpha \in [0,0.05].\] For each $\alpha$, we compute empirical variance, Fisher prediction, and 95 % coverage. As $\alpha \to 0$, empirical variance converges smoothly to $F^{-1}$. Coverage rises continuously from $\approx 0.42$ to $\approx 0.95$. No discontinuity or threshold behavior is observed. Theorem: Continuity of CTMT AcceptanceCTMT acceptance is continuous in the amplitude of causal violation and reduces smoothly to classical Fisher behavior when causal consistency is restored. This demonstrates that CTMT detects structural violations rather than numerical noise. Publishing note For those wondering why I am taking an unconventional route to publish CTMT: it is simply the only path available to me. I do not come from an academic background, I have no institutional affiliation, and I have no professional network to rely on. This work grew entirely out of personal study, self‑teaching, and a long process of independent development. I have done my best to extract the core machinery of the idea and to show that it can operate fully within standard physics, without metaphysical assumptions or speculative claims. Over time, I hope to publish additional components of the framework through double‑blind peer review, piece by piece. But I am aware that, without affiliation, recognition, or career incentives, the path is difficult and I have little to gain personally from pursuing it. (And my motivation was literally just to contribute, if this to be taken as metaphysics, all is in vane.) My goal is simply to reach the people who might benefit from this work and who are in a position to develop it further. My time is limited, but I hope I have demonstrated that the underlying structure is genuine physics and that it deserves to be brought to a fully operational form.

Keywords

Water engineering, Physics, Quantum physics, Physics/education, Particle physics

  • BIP!
    Impact byBIP!
    selected citations
    These citations are derived from selected sources.
    This is an alternative to the "Influence" indicator, which also reflects the overall/total impact of an article in the research community at large, based on the underlying citation network (diachronically).
    0
    popularity
    This indicator reflects the "current" impact/attention (the "hype") of an article in the research community at large, based on the underlying citation network.
    Average
    influence
    This indicator reflects the overall/total impact of an article in the research community at large, based on the underlying citation network (diachronically).
    Average
    impulse
    This indicator reflects the initial momentum of an article directly after its publication, based on the underlying citation network.
    Average
Powered by OpenAIRE graph
Found an issue? Give us feedback
selected citations
These citations are derived from selected sources.
This is an alternative to the "Influence" indicator, which also reflects the overall/total impact of an article in the research community at large, based on the underlying citation network (diachronically).
BIP!Citations provided by BIP!
popularity
This indicator reflects the "current" impact/attention (the "hype") of an article in the research community at large, based on the underlying citation network.
BIP!Popularity provided by BIP!
influence
This indicator reflects the overall/total impact of an article in the research community at large, based on the underlying citation network (diachronically).
BIP!Influence provided by BIP!
impulse
This indicator reflects the initial momentum of an article directly after its publication, based on the underlying citation network.
BIP!Impulse provided by BIP!
0
Average
Average
Average
Green