Why does EconIAC use connections and curvature?
Conservation says every financial claim has a matching counter-claim. Flatness says the path doesn't matter. Only the first is always true.
Conservation vs flatness
The Pacioli Combinator Library enforces ∂²=0 by construction: every debit has a credit, column sums of the balance sheet are exactly zero. This is the double-entry identity — not a claim that money cannot be created, but a claim that money can only be created by simultaneously creating a matching liability. When a bank makes a loan it creates both an asset (the loan receivable) and a liability (the deposit); when the central bank issues reserves it acquires an asset (a bond) and creates a liability (reserves). ∂²=0 holds throughout. The same structure governs Kirchhoff's current law at a junction: current is not destroyed, it is rerouted — and every outflow has a matching inflow.
The flatness assumption is correct as a matter of accounting identity. It is frequently wrong as a matter of data. EconIAC provides three mechanisms to handle the gap — not by abandoning conservation, but by being explicit about where and why it is violated.
The four cases
1. Measurement error and statistical discrepancy
National accounts are assembled from surveys, administrative records, and census data collected by different agencies at different times. The headline GDP figures are reconciled by statisticians who insert a statistical discrepancy line to make the totals agree. The discrepancy is real, it is published, and it is sometimes large (US: routinely ±$50–100 billion per quarter).
The error is in the measurement, not in the double-entry identity. Every transaction balanced; we just do not know exactly which sectors it moved between.
2. Reporting lags and float
At the moment a cheque is written, the payer's balance sheet shows a reduction in deposits. The payee's balance sheet does not yet show the corresponding increase — the payment is in transit. At any snapshot, the consolidated balance sheet appears to violate conservation. Over the interval from sending to settlement, it does not.
The same phenomenon appears in interbank clearing, cross-border payments (correspondent banking), and any system where transmission takes time. The books balance eventually, not instantaneously.
3. Genuine arbitrage — non-zero curvature
Two assets that ought to trade at the same price do not. A share of Apple trades at slightly different prices on NASDAQ and the LSE. A government bond has a different yield than an equivalent synthetic constructed from swaps. Covered interest parity fails persistently in some currency pairs.
In gauge-theoretic language: the Pacioli manifold is curved. The field strength F = dA + A∧A is non-zero. A round trip — buy on one exchange, sell on the other, repatriate the profit — does not return you to your starting point. The holonomy of the connection is non-trivial.
This is not a violation of conservation. It is a violation of flatness — the stronger condition that the manifold has no curvature. Conservation (∂²=0) and flatness (F=0) are distinct. PCL enforces conservation; EconIAC's geometry module provides the language for curvature.
4. Risk-adjusted mispricing — incomplete markets
The apparent arbitrage in case 3 is not free money. It persists because it is compensation for a risk that the balance sheet does not represent: liquidity risk, settlement risk, regulatory capital cost, currency repatriation risk. The price gap is fair given the full risk space; it looks like mispricing only because the model's instrument set is incomplete.
The correct response is to extend the balance sheet — add the missing instrument (liquidity buffer, regulatory capital account, repatriation reserve) — not to relax conservation. When the full risk is on the balance sheet, the apparent arbitrage disappears.
The three relaxation mechanisms
Mechanism 1: ResidualFlow — explicit discrepancy accounting
For cases 1 and 2, EconIAC introduces a residual sector convention. Rather than letting an
imbalance hide in rounding error or disappear from the model, it is routed through a designated
_residual sector (or instrument):
from econiac.pcl import flow, sequence
# Known flows
wages = flow("firms", "households", "deposits", 1000.0)
taxes = flow("households", "government", "deposits", 200.0)
# Observed discrepancy: $7 unaccounted
discrepancy = flow("households", "_residual", "deposits", 7.0)
quarterly = sequence(wages, sequence(taxes, discrepancy))
Conservation is preserved — the _residual sector absorbs the imbalance. During model
calibration, the residual's magnitude enters the loss function: a well-fitted model minimises
the discrepancy. A poorly-fitted model has a large, persistent residual — a diagnostic, not a
hidden error.
For reporting lags, _residual is replaced by an explicit float account:
in_transit = flow("payer", "_float", "deposits", payment)
settlement = flow("_float", "payee", "deposits", payment)
The float account has zero balance at settlement. Its time profile is observable and auditable.
Mechanism 2: CurvedBalanceSheet — non-flat Pacioli manifold
For case 3, EconIAC extends BalanceSheet to carry a curvature field F — a skew-symmetric
tensor measuring the arbitrage / risk-premium at each point of the manifold:
from econiac.core.manifold import BalanceSheet, CurvedBalanceSheet
bs = CurvedBalanceSheet(
positions=...,
sectors=...,
instruments=...,
curvature=F, # field strength tensor; zero recovers flat PCL
)
The type system is extended: instead of checking col_sums ≈ 0, it checks
col_sums ≈ F(bs). When F=0, CurvedBalanceSheet reduces to BalanceSheet; the flat PCL
type system is a special case.
Computations on a curved manifold accumulate holonomy — the path-dependent residual of a round trip. Non-zero holonomy is the mathematical fingerprint of a genuine arbitrage opportunity. EconIAC can compute it explicitly:
from econiac.core.manifold import holonomy
h = holonomy(round_trip_computation, curved_balance_sheet)
# h ≈ 0: no arbitrage
# h ≠ 0: arbitrage profit equals ||h||
Mechanism 3: conservation_loss() — soft enforcement for calibration
For gradient-based calibration against noisy real-world data, hard conservation is too brittle. A model that fits historical national accounts must tolerate the statistical discrepancy in the data — it cannot demand that the ONS or BEA data satisfy ∂²=0 to machine precision.
conservation_loss() replaces the binary typecheck() with a differentiable penalty:
from econiac.pcl import conservation_loss
loss = conservation_loss(comp, balance_sheet, sigma=10.0)
# Returns ||col_sums(comp(bs))||² / sigma²
# sigma: measurement noise scale (e.g. £10bn for national accounts)
# At sigma → 0: hard conservation (infinite penalty for any violation)
# At finite sigma: Bayesian likelihood under Gaussian measurement noise
This is the soft typecheck — conservation is a prior, not a constraint. The calibration minimises total loss (fit to data + conservation penalty), trading off the two according to σ. When σ is estimated from the known measurement uncertainty of the data source (ONS publishes standard errors for GDP components), the conservation penalty is automatically calibrated.
What is not relaxed
The PCL combinators themselves are never modified. flow, sequence, parallel, choose,
fold, and repeat always enforce ∂²=0 by construction. The relaxation mechanisms are layered
on top:
_residualand_floatsectors live inside the balance sheet — the combinators see them as ordinary sectors and still enforce conservation across all sectors including the residual.CurvedBalanceSheetextends the type system — it does not change the combinators.conservation_loss()is a loss function used during calibration — it is not a combinator.
The circuit analogy holds: Kirchhoff's current law is never suspended. What changes is whether we model an unaccounted current as a short circuit (error), a capacitor (lag), or a battery (curvature source).
What the central bank's liability is a claim on
Under a gold standard, the central bank's liability (banknotes) is redeemable in a commodity — the connection has an external anchor, the manifold is flat. Under fiat money, the central bank's reserve liability is redeemable in more of the same liability. ∂²=0 still holds — the balance sheet balances — but the substance of the liability is the continued functioning of the monetary network itself, a topological rather than a balance-sheet property.
Different monetary regimes correspond to different gauge fixings of the unit
of account. Switching from gold standard to fiat is a gauge transformation;
the underlying real economic relationships are unchanged, but the reference
point for the unit of account floats free. This is why models calibrated
under one monetary regime give systematically different answers from models
calibrated under another — and why EconIAC's CurvedBalanceSheet makes the
gauge choice explicit rather than hiding it in a calibration constant.
For a fuller treatment see What is money a claim on?.
Design principle
Make imbalances visible, not impossible.
Strict flatness catches bugs during development. Explicit residuals, curvature fields, and soft penalties handle reality during deployment. The two modes are complementary: build with hard conservation, calibrate with soft conservation, diagnose with the residual and the holonomy.