1.1 Core objects (forward and inverse)
Forward phase model (per channel i).
phi_i(t) = wrap360( b0_i + w_i * t ) # degrees
t= time in days on a latent scalar axis.b0_i= frozen initial phase (deg).w_i= frozen angular speed (deg/day).- All channels share the same
t(the latent “now”).
Inverse clock (estimate time from observed phases).
err_i(t) = angdiff( phi_i_obs , b0_i + w_i * t ) # shortest signed diff in deg
E(t) = SUM_i [ alpha_i * (err_i(t))^2 ]
tau_hat = argmin_t E(t)
phi_i_obs= measured phase (deg) for channeli.alpha_i >= 1= gentle reliability weights (see 1.5).E(t)is a scalar; choose thetthat minimizes it.- The solution lives on a circular horizon (see 1.2).
Angle utilities (ASCII, branch-safe).
wrap360(x): y = x % 360.0 ; return (y + 360.0) if (y < 0.0) else y
angdiff(a,b): return ((a - b + 180.0) % 360.0) - 180.0
Why squared residuals?
- Smooth + non-negative. Squared angular distance keeps
E(t)smooth and ≥ 0, with a unique bottom inside each valley. - Curvature-ready. Absolute errors locate valleys similarly, but squared errors yield a clean curvature for confidence (1.4).
1.2 Horizon selection (T_search) and circular distance
Rule (deterministic).
- If all periods are integers (days):
T_search = LCM(periods)
- Else:
T_search = max(periods)
Rationale. The inverse only needs to search one fundamental window that repeats. When any period is non-integer (e.g., 29.5306), the exact joint repeat is astronomically long; using max(periods) is a tight, sufficient window when combined with stacking (1.6).
Circular error (time reported modulo horizon).
err_time_days = min( |tau_hat - tau_true| ,
T_search - |tau_hat - tau_true| )
This matches the physics: the same phase consensus repeats every horizon.
Navigation
Back: SSM-Clock—SSM/SSMS Bridge & Caution (0.6–0.7)
Next: SSM-Clock—Identifiability, Confidence & Reliability (1.3–1.5)