The three irreversible steps: get to Kelvin, choose one lens, compute e_T
This is the core pipeline every SSMT stream must follow.
After you do this once, everyone downstream — ops, ML, audit, even another planet — is speaking the same thermal language.
1. Standardize to Kelvin (1.1)
Everything starts here. Temperature must first become Kelvin, with a safety floor.
to_kelvin(T_raw, unit):
u = lower(unit) # accept "C","c","celsius","F","fahrenheit","K","kelvin"
if u in {"k","kelvin"}:
T_K = T_raw
elif u in {"c","celsius"}:
T_K = T_raw + 273.15
elif u in {"f","fahrenheit"}:
T_K = (T_raw - 32) * 5/9 + 273.15
else:
raise "unknown unit"
# Kelvin floor for numerical safety and domain sanity
T_K = max(T_K, eps_TK)
return T_K
Key points:
eps_TK > 0(for example1e-6) prevents divide-by-zero issues in low-temperature math and makes sureT_Knever hits or crosses 0 K numerically.- Keep at least
0.01 Kof precision internally. - Attach UTC timestamp and sensor identity outside this function. The conversion step is purely physical.
Why Kelvin first?
- °C vs °F fights disappear immediately.
- You can safely apply one global logic path to all sources.
After this step you are no longer “reading a building sensor.”
You are producing a physically grounded value in Kelvin, with a declared floor, that any downstream system can trust.
2. Pick exactly one lens and keep it fixed (1.2)
Now that you have T_K, you map it into a unitless contrast e_T.
That contrast is what everyone actually consumes.
You must choose one lens for the deployment, publish it, and not quietly change it mid-run.
Available lenses:
# Default (log lens; good across wide ranges, cross-fleet, cross-environment)
e_T := ln( T_K / T_ref )
# Linear (tight industrial / HVAC-style bands)
e_T := ( T_K - T_ref ) / DeltaT
# Beta (cold-dominant / cryogenic / near-freezing sensitivity)
e_T := ( T_ref / T_K ) - 1
# kBT (chemistry / reaction / per-mole energy framing)
e_T := (R*T_K)/E_unit - (R*T_ref)/E_unit
# Hybrid (piecewise: sensitive near nominal, robust at extremes)
if abs(T_K - T_ref) > tau:
e_T := ln( T_K / T_ref )
else:
e_T := ( T_K - T_ref ) / DeltaT
# qlog / quantum-safe log (near 0 K; stabilize the math close to absolute zero)
e_T := ln( (T_K/T_ref + alpha) / (1 + alpha) )
Where:
T_refis your declared reference temperature in Kelvin.DeltaTis your declared scale width in Kelvin.E_unitis a chosen energy-per-mole scale.tauis a temperature offset threshold (Kelvin) where you switch behavior in the hybrid lens.alpha > 0is a stabilizer constant for the qlog lens.Ris the gas constant (8.314462618 J/mol/K).
All lenses are:
- monotone in
T_K, - zero-centered at
T_ref(e_T = 0whenT_K = T_ref), - unitless.
How to choose (practical intent):
- Use linear if you’re running a controlled process window (for example ±25 K around nominal).
- Use log if you’re comparing huge ranges (city vs desert vs Martian habitat).
- Use beta if “too cold” is the life-limiting factor.
- Use kBT if you speak in energy per mole (chemistry, bio, catalysis).
- Use hybrid if you care about both “small drift near nominal” and “large deviation far away.”
- Use qlog if you must stay numerically sane near cryogenic limits or other near-zero regimes.
Non-negotiable guardrails:
- log, beta: require
T_K > 0andT_ref > 0 - linear: require
DeltaT > 0 - kBT: require
E_unit > 0 - hybrid: require
DeltaT > 0andtau > 0 - qlog: require
T_ref > 0andalpha > 0
Why “one lens per run” matters:
- If you change lenses mid-run,
e_Tat 14:03 might mean something totally different thane_Tat 14:07, and your audit trail is unusable. - A regulator, insurer, or mission controller needs to know what you meant by “0.8 of heat stress” at that time. That meaning comes from the lens, not from °C.
This is why every emitted record also includes the manifest_id.
That manifest freezes: lens choice, constants (T_ref, DeltaT, …), pivots, valid range, clamp values.
3. Compute the contrast e_T (1.3)
Now we actually generate the number that flows downstream.
encode_eT(
T_K,
lens,
T_ref=None,
DeltaT=None,
E_unit=None,
R=8.314462618,
tau=None,
alpha=None
):
if lens == "linear":
return (T_K - T_ref) / DeltaT
if lens == "log":
return ln(T_K / T_ref)
if lens == "beta":
return (T_ref / T_K) - 1
if lens == "kBT":
return (R*T_K)/E_unit - (R*T_ref)/E_unit
if lens == "hybrid":
if abs(T_K - T_ref) > tau:
return ln(T_K / T_ref)
else:
return (T_K - T_ref) / DeltaT
if lens == "qlog":
return ln(((T_K / T_ref) + alpha) / (1 + alpha))
raise "unknown lens"
Why e_T is the centerpiece:
- It is unitless and portable.
- It is zero-centric:
e_T = 0↔ “at baseline.” - It is interpretable: positive means “hotter than baseline,” negative means “colder than baseline,” with slope/curvature defined by the chosen lens.
- It is the one field (
e_T) that every downstream consumer can understand the same way if they also know the manifest.
You can now:
- alert on
e_T, - compare two cities or two suits on Mars using
e_T, - feed
e_Tinto ML without worrying about °C vs °F, - attach
e_Tto fleet reporting without sharing raw sensor internals.
This is the heart of Shunyaya Symbolic Mathematical Temperature (SSMT):
temperature becomes a stable symbolic contrast, not a fragile local reading.
Navigation
Previous: SSMT – What Goes on the Wire (0E)
Next: SSMT – Making It Operational: Alignment Dials and Survival Bands (1.4–1.5)
Directory of Pages
SSMT – Table of Contents