econiac.routing.tir
econiac.routing.tir
Thermodynamic Information Routing (TIR): universal Gibbs routing primitive.
Four axioms: candidates, admissibility geometry, β, Gibbs output. The Gibbs weights are the unique routing primitive preserving: (i) conformal invariance — scale-free in utility units (ii) symplectic structure — Hamiltonian flow, no information dissipation (iii) adiabatic invariance — β-schedule tracks free energy minimum
Eight independent rediscoveries: McFadden, Sims, McKelvey-Palfrey, Jaynes, Gibbs, Maslov, Goel, Friston — all derived the same theorem.
Reference: Buckley (2026) TIR, doi:10.5281/zenodo.20237288
TIRInstance
dataclass
One TIR routing problem: candidates × utilities × geometry × beta.
candidates: list of n candidate labels (strings or ints) utilities: shape (n,) — utility of each candidate geometry: admissibility filter (Abelian, Fano, G2, Catalan) beta: inverse temperature; β→0 is uniform, β→∞ is argmax geometry_kwargs: extra keyword args passed to geometry.mask()
Source code in src/econiac/routing/tir.py
route(tir)
Compute Gibbs routing weights for a TIRInstance.
Applies the geometry mask (setting inadmissible candidates to -∞), then computes Gibbs weights: w_i = softmax(β · U_i).
Returns:
| Type | Description |
|---|---|
Array
|
shape (n,) — routing probabilities summing to 1. |
Array
|
Inadmissible candidates receive weight 0. |
Source code in src/econiac/routing/tir.py
free_energy(utilities, beta)
Gibbs free energy: F(β) = -β⁻¹ · log Σ exp(β · U_i).
At β→0: F → -β⁻¹ · log(n) (entropy-dominated, uniform routing). At β→∞: F → -max(U) (utility-dominated, greedy routing).
The free energy is the generating function for all moments of the routing distribution: ∂F/∂U_i = -w_i (negative routing weight).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
utilities
|
Array
|
shape (n,) — may include NEG_INF for masked candidates |
required |
beta
|
float
|
inverse temperature (≥ 0) |
required |
Returns:
| Type | Description |
|---|---|
Array
|
scalar free energy F(β). |
Source code in src/econiac/routing/tir.py
escape_arrow(tir)
Does this TIRInstance escape Arrow's Impossibility Theorem?
Arrow's theorem applies to deterministic, transitive, rank-based voting. TIR escapes because: 1. Stochastic (Gibbs weights ≠ deterministic rank aggregation) 2. Cardinal (utilities, not ordinal rankings) 3. Non-transitive admissibility (Fano, G2, Catalan geometries)
Returns True if the instance has any non-Abelian geometry feature that breaks Arrow's transitivity assumption, OR if beta < ∞ (stochastic).
Formally
- Any β < ∞: stochastic → escapes (Independence of Irrelevant Alternatives fails)
- Fano/G2/Catalan geometry: non-transitive admissibility → escapes
- Abelian + β→∞: deterministic, transitive → Arrow applies (returns False)
Source code in src/econiac/routing/tir.py
admissible_count(tir)
Number of admissible candidates under the geometry.
routing_entropy(tir)
Shannon entropy of the routing distribution.
H = 0 at β→∞ (deterministic routing to argmax). H = log(n_admissible) at β=0 (uniform routing).
Returns scalar entropy in nats.
Source code in src/econiac/routing/tir.py
social_multiplier(tir)
Social multiplier (participation ratio) χ(β) = 1 / Σ_i w_i².
χ = 1 at β→∞ (winner-take-all: one agent gets all weight). χ = n at β=0 (equal participation: all weights equal 1/n).
Phase transition: χ drops sharply as β crosses a critical β*. This is the Gibbs equivalent of the replica symmetry breaking transition.
Returns scalar participation ratio ∈ [1, n_admissible].
Source code in src/econiac/routing/tir.py
tir_from_scores(candidates, scores, beta=1.0, n_nodes=None)
Convenience: build an Abelian TIRInstance from a list of scalar scores.
Uses a complete graph (all candidates reachable from all sources).