babylon.systems.formulas

Mathematical formulas for the Babylon simulation.

This module contains the pure mathematical functions that drive the dialectical mechanics of the simulation. These are deterministic functions with no side effects - the same inputs always produce the same outputs.

Key Formulas: 1. Fundamental Theorem of MLM-TW:

  • Imperial Rent: Φ(Wp, Ψp) = α × Wp × (1 - Ψp)

  • Labor Aristocracy: Wc/Vc > 1

  • Consciousness Drift: dΨc/dt = k(1 - Wc/Vc) - λΨc

  1. Survival Calculus: - Acquiescence: P(S|A) = 1 / (1 + e^(-k(x - x_critical))) - Revolution: P(S|R) = Cohesion / (Repression + ε) - Loss Aversion: λ = 2.25

  2. Unequal Exchange: - Exchange Ratio: ε = (Lp/Lc) × (Wc/Wp) - Prebisch-Singer Effect

Functions

apply_loss_aversion(value)

Apply Kahneman-Tversky loss aversion (λ = 2.25).

calculate_acquiescence_probability(wealth, ...)

Calculate P(S|A) = 1 / (1 + e^(-k(x - x_critical))).

calculate_biocapacity_delta(...[, ...])

Calculate change in biocapacity stock: ΔB = R - (E × η).

calculate_bourgeoisie_decision(pool_ratio, ...)

Calculate bourgeoisie policy decision based on pool level and tension.

calculate_consciousness_drift(core_wages, ...)

Calculate consciousness drift with Fascist Bifurcation mechanic.

calculate_crossover_threshold(cohesion, ...)

Find wealth level where P(S|R) = P(S|A) (revolution becomes rational).

calculate_exchange_ratio(...)

Calculate exchange ratio: ε = (Lp/Lc) × (Wc/Wp).

calculate_exploitation_rate(exchange_ratio)

Convert exchange ratio to exploitation rate percentage.

calculate_ideological_routing(wage_change, ...)

Calculate ideological routing from crisis conditions.

calculate_imperial_rent(alpha, ...)

Calculate Imperial Rent: Φ(Wp, Ψp) = α × Wp × (1 - Ψp).

calculate_labor_aristocracy_ratio(...)

Calculate labor aristocracy ratio: Wc/Vc.

calculate_overshoot_ratio(total_consumption, ...)

Calculate ecological overshoot ratio: O = C / B.

calculate_revolution_probability(cohesion, ...)

Calculate P(S|R) = Cohesion / (Repression + ε).

calculate_solidarity_transmission(...[, ...])

Calculate consciousness transmission via solidarity edges.

calculate_value_transfer(production_value, ...)

Calculate value transferred from periphery to core.

is_labor_aristocracy(core_wages, value_produced)

Determine if a worker is part of the labor aristocracy.

prebisch_singer_effect(initial_price, ...)

Calculate Prebisch-Singer effect on commodity prices.

Classes

BourgeoisieDecision()

Enumeration of bourgeoisie decision types.

babylon.systems.formulas.calculate_imperial_rent(alpha, periphery_wages, periphery_consciousness)[source]

Calculate Imperial Rent: Φ(Wp, Ψp) = α × Wp × (1 - Ψp).

Imperial Rent is the value extracted from the periphery that flows to the core, enabling the labor aristocracy.

Parameters:
  • alpha (float) – Extraction efficiency coefficient (0 to 1)

  • periphery_wages (float) – Periphery wage share (0 to 1)

  • periphery_consciousness (float) – Periphery consciousness/resistance (0 = submissive, 1 = revolutionary)

Return type:

float

Returns:

Imperial rent value (always >= 0)

Examples

>>> calculate_imperial_rent(0.5, 0.3, 0.2)
0.12
>>> calculate_imperial_rent(1.0, 0.5, 0.0)
0.5
>>> calculate_imperial_rent(0.0, 0.5, 0.5)
0.0
>>> calculate_imperial_rent(0.8, 0.6, 1.0)  # Full consciousness = no extraction
0.0
babylon.systems.formulas.calculate_labor_aristocracy_ratio(core_wages, value_produced)[source]

Calculate labor aristocracy ratio: Wc/Vc.

When this ratio > 1, the worker receives more than they produce, with the difference coming from Imperial Rent.

Parameters:
  • core_wages (float) – Wages received by core worker

  • value_produced (float) – Value produced by core worker

Return type:

float

Returns:

Labor aristocracy ratio

Raises:

ValueError – If value_produced is zero or negative

Examples

>>> calculate_labor_aristocracy_ratio(120.0, 100.0)  # Labor aristocracy
1.2
>>> calculate_labor_aristocracy_ratio(80.0, 100.0)   # Exploited worker
0.8
>>> calculate_labor_aristocracy_ratio(100.0, 100.0)  # Fair exchange
1.0
babylon.systems.formulas.is_labor_aristocracy(core_wages, value_produced)[source]

Determine if a worker is part of the labor aristocracy.

A worker is labor aristocracy when Wc/Vc > 1, meaning they receive more in wages than the value they produce.

Parameters:
  • core_wages (float) – Wages received by core worker

  • value_produced (float) – Value produced by core worker

Return type:

bool

Returns:

True if worker is labor aristocracy

Raises:

ValueError – If value_produced is zero or negative

Examples

>>> is_labor_aristocracy(120.0, 100.0)
True
>>> is_labor_aristocracy(80.0, 100.0)
False
>>> is_labor_aristocracy(100.0, 100.0)  # Exact equality = not aristocracy
False
babylon.systems.formulas.calculate_consciousness_drift(core_wages, value_produced, current_consciousness, sensitivity_k, decay_lambda, solidarity_pressure=0.0, wage_change=0.0)[source]

Calculate consciousness drift with Fascist Bifurcation mechanic.

Base formula: dΨc/dt = k(1 - Wc/Vc) - λΨc

Extended with Fascist Bifurcation (Sprint 3.4.2b): When wages are FALLING (wage_change < 0), crisis creates “agitation energy” that channels into either: - Revolution (if solidarity_pressure > 0) - negative drift - Fascism (if solidarity_pressure = 0) - positive drift via loss aversion

This encodes the historical insight: “Agitation without solidarity produces fascism, not revolution.” (Germany 1933 vs Russia 1917)

Parameters:
  • core_wages (float) – Wages received by core worker

  • value_produced (float) – Value produced by core worker

  • current_consciousness (float) – Current consciousness level (0 to 1)

  • sensitivity_k (float) – Sensitivity coefficient for material conditions

  • decay_lambda (float) – Decay coefficient (consciousness fades without basis)

  • solidarity_pressure (float) – Sum of incoming SOLIDARITY edge strengths [0, 1+]

  • wage_change (float) – Change in wages since last tick (negative = falling)

Return type:

float

Returns:

Rate of change of consciousness (positive = revolutionary drift, negative = reactionary/fascist drift when wages fall without solidarity)

Raises:

ValueError – If value_produced is zero or negative

babylon.systems.formulas.calculate_acquiescence_probability(wealth, subsistence_threshold, steepness_k)[source]

Calculate P(S|A) = 1 / (1 + e^(-k(x - x_critical))).

Sigmoid function modeling survival through compliance. At the threshold, probability is 0.5 (coin flip).

Parameters:
  • wealth (float) – Current wealth/resources

  • subsistence_threshold (float) – Minimum needed for survival (x_critical)

  • steepness_k (float) – Steepness of survival curve

Return type:

float

Returns:

Probability of survival through acquiescence [0, 1]

Examples

>>> calculate_acquiescence_probability(100.0, 100.0, 0.1)  # At threshold
0.5
>>> p = calculate_acquiescence_probability(150.0, 100.0, 0.1)  # Above threshold
>>> p > 0.99
True
>>> p = calculate_acquiescence_probability(50.0, 100.0, 0.1)  # Below threshold
>>> p < 0.01
True
babylon.systems.formulas.calculate_revolution_probability(cohesion, repression)[source]

Calculate P(S|R) = Cohesion / (Repression + ε).

Survival through collective action depends on organization outpacing state repression.

Parameters:
  • cohesion (float) – Unity and organization level (0 to 1)

  • repression (float) – State violence capacity (0 to 1)

Return type:

float

Returns:

Probability of survival through revolution [0, 1]

Examples

>>> calculate_revolution_probability(0.8, 0.2)  # Strong org, weak state
1.0
>>> round(calculate_revolution_probability(0.2, 0.8), 2)  # Weak org, strong state
0.25
>>> calculate_revolution_probability(0.0, 0.5)  # No organization
0.0
>>> p = calculate_revolution_probability(0.5, 0.5)  # Balanced
>>> p > 0.99
True
babylon.systems.formulas.calculate_crossover_threshold(cohesion, repression, subsistence_threshold, steepness_k)[source]

Find wealth level where P(S|R) = P(S|A) (revolution becomes rational).

This is the critical point where collective action becomes a rational survival strategy.

Parameters:
  • cohesion (float) – Unity and organization level

  • repression (float) – State violence capacity

  • subsistence_threshold (float) – Subsistence threshold for acquiescence

  • steepness_k (float) – Steepness of acquiescence curve

Return type:

float

Returns:

Wealth level at crossover point

babylon.systems.formulas.apply_loss_aversion(value)[source]

Apply Kahneman-Tversky loss aversion (λ = 2.25).

Losses are perceived as 2.25x more impactful than equivalent gains. This affects decision-making under risk.

Parameters:

value (float) – Raw value change (negative = loss, positive = gain)

Return type:

float

Returns:

Perceived value after loss aversion

Examples

>>> apply_loss_aversion(100.0)  # Gains unchanged
100.0
>>> apply_loss_aversion(-100.0)  # Losses amplified
-225.0
>>> apply_loss_aversion(0.0)  # Zero unchanged
0.0
babylon.systems.formulas.calculate_exchange_ratio(periphery_labor_hours, core_labor_hours, core_wage, periphery_wage)[source]

Calculate exchange ratio: ε = (Lp/Lc) × (Wc/Wp).

The exchange ratio quantifies unequal exchange. When ε > 1, the periphery gives more value than it receives.

Parameters:
  • periphery_labor_hours (float) – Labor hours in periphery

  • core_labor_hours (float) – Labor hours in core for same product

  • core_wage (float) – Core wage rate

  • periphery_wage (float) – Periphery wage rate

Return type:

float

Returns:

Exchange ratio

Raises:

ValueError – If any denominator value is zero or negative

Examples

>>> calculate_exchange_ratio(100.0, 100.0, 20.0, 5.0)  # Equal labor, 4x wage gap
4.0
>>> calculate_exchange_ratio(200.0, 100.0, 20.0, 10.0)  # 2x labor, 2x wage
4.0
>>> calculate_exchange_ratio(100.0, 100.0, 10.0, 10.0)  # Fair exchange
1.0
babylon.systems.formulas.calculate_exploitation_rate(exchange_ratio)[source]

Convert exchange ratio to exploitation rate percentage.

ε = 2 means 100% exploitation (double value extracted). ε = 1 means 0% exploitation (fair exchange).

Parameters:

exchange_ratio (float) – The exchange ratio ε

Return type:

float

Returns:

Exploitation rate as a percentage

babylon.systems.formulas.calculate_value_transfer(production_value, exchange_ratio)[source]

Calculate value transferred from periphery to core.

Value transfer = production × (1 - 1/ε)

Parameters:
  • production_value (float) – Value of peripheral production

  • exchange_ratio (float) – The exchange ratio ε

Return type:

float

Returns:

Value transferred to core

babylon.systems.formulas.prebisch_singer_effect(initial_price, production_increase, elasticity)[source]

Calculate Prebisch-Singer effect on commodity prices.

Terms of trade decline for commodity exporters: More production → lower prices → same poverty.

Parameters:
  • initial_price (float) – Initial commodity price

  • production_increase (float) – Fractional increase in production (0.2 = 20%)

  • elasticity (float) – Price elasticity of demand (typically negative)

Return type:

float

Returns:

New price after production increase

babylon.systems.formulas.calculate_solidarity_transmission(source_consciousness, target_consciousness, solidarity_strength, activation_threshold=0.3)[source]

Calculate consciousness transmission via solidarity edges.

Formula: dPsi_target = sigma * (Psi_source - Psi_target)

Where: - sigma = solidarity_strength (STORED ON EDGE, not auto-calculated) - Psi_source = source_consciousness (periphery worker) - Psi_target = target_consciousness (core worker)

Transmission only occurs if: 1. source_consciousness > activation_threshold (strictly greater) 2. solidarity_strength > 0

This implements the Fascist Bifurcation scenario: - Periphery revolts BUT solidarity_strength=0 -> NO transmission (Fascist turn) - Periphery revolts AND solidarity_strength>0 -> Transmission (Revolutionary turn)

Parameters:
  • source_consciousness (float) – Consciousness level of source (periphery worker) [0, 1]

  • target_consciousness (float) – Consciousness level of target (core worker) [0, 1]

  • solidarity_strength (float) – Strength of solidarity infrastructure on edge [0, 1]

  • activation_threshold (float) – Minimum source consciousness for transmission (default 0.3)

Return type:

float

Returns:

Change in target consciousness (delta). Can be negative if target has higher consciousness than source.

Examples

>>> round(calculate_solidarity_transmission(0.8, 0.2, 0.5), 2)  # High source, low target
0.3
>>> calculate_solidarity_transmission(0.2, 0.5, 0.5)  # Below threshold
0.0
>>> calculate_solidarity_transmission(0.8, 0.2, 0.0)  # No solidarity
0.0
>>> round(calculate_solidarity_transmission(0.5, 0.8, 0.5), 2)  # Target > source
-0.15
babylon.systems.formulas.calculate_ideological_routing(wage_change, solidarity_pressure, current_class_consciousness, current_national_identity, current_agitation, agitation_decay=0.1)[source]

Calculate ideological routing from crisis conditions.

Sprint 3.4.3 (George Jackson Refactor): This formula implements the multi-dimensional consciousness routing mechanic.

Key insight: “Fascism is the defensive form of capitalism.” - Agitation (from wage fall) + Solidarity -> Class Consciousness - Agitation (from wage fall) + No Solidarity -> National Identity

Parameters:
  • wage_change (float) – Change in wages since last tick (negative = crisis)

  • solidarity_pressure (float) – Sum of incoming SOLIDARITY edge strengths [0, inf)

  • current_class_consciousness (float) – Current class consciousness [0, 1]

  • current_national_identity (float) – Current national identity [0, 1]

  • current_agitation (float) – Current accumulated agitation [0, inf)

  • agitation_decay (float) – Rate at which agitation decays per tick (default 0.1)

Return type:

tuple[float, float, float]

Returns:

Tuple of (new_class_consciousness, new_national_identity, new_agitation)

Example

Worker with falling wages and high solidarity routes to revolutionary:

cc, ni, ag = calculate_ideological_routing(
    wage_change=-20.0,
    solidarity_pressure=0.9,
    current_class_consciousness=0.5,
    current_national_identity=0.5,
    current_agitation=0.0,
)
# cc will increase, ni will stay flat

Worker with falling wages and no solidarity routes to fascism:

cc, ni, ag = calculate_ideological_routing(
    wage_change=-20.0,
    solidarity_pressure=0.0,
    current_class_consciousness=0.5,
    current_national_identity=0.5,
    current_agitation=0.0,
)
# ni will increase, cc will stay flat
class babylon.systems.formulas.BourgeoisieDecision[source]

Bases: object

Enumeration of bourgeoisie decision types.

Sprint 3.4.4: Dynamic Balance - The “Driver” decisions based on imperial rent pool level and aggregate class tension.

NO_CHANGE = 'no_change'
BRIBERY = 'bribery'
AUSTERITY = 'austerity'
IRON_FIST = 'iron_fist'
CRISIS = 'crisis'
babylon.systems.formulas.calculate_bourgeoisie_decision(pool_ratio, aggregate_tension, high_threshold=0.7, low_threshold=0.3, critical_threshold=0.1)[source]

Calculate bourgeoisie policy decision based on pool level and tension.

Sprint 3.4.4: Dynamic Balance - The bourgeoisie as a rational actor responding to material conditions.

Decision Matrix:

pool_ratio >= high AND tension < 0.3 -> BRIBERY (increase wages +5%) pool_ratio < critical -> CRISIS (wages to minimum, repression +20%) pool_ratio < low AND tension > 0.5 -> IRON_FIST (repression +10%) pool_ratio < low AND tension <= 0.5 -> AUSTERITY (wages -5%) else -> NO_CHANGE (maintain status quo)

Parameters:
  • pool_ratio (float) – Current pool / initial pool (0.0 to 1.0+)

  • aggregate_tension (float) – Average tension across class relationships (0.0 to 1.0)

  • high_threshold (float) – Pool ratio above which prosperity is declared (default 0.7)

  • low_threshold (float) – Pool ratio below which austerity begins (default 0.3)

  • critical_threshold (float) – Pool ratio below which crisis fires (default 0.1)

Returns:

str, wage_delta: float, repression_delta: float) - decision: One of BourgeoisieDecision values - wage_delta: Change to wage rate (positive = increase) - repression_delta: Change to repression level (positive = increase)

Return type:

Tuple of (decision

Example

# Prosperity: high pool, low tension -> increase wages decision, wage_d, repr_d = calculate_bourgeoisie_decision(0.8, 0.2) # Returns (“bribery”, 0.05, 0.0)

# Crisis: pool below critical -> emergency measures decision, wage_d, repr_d = calculate_bourgeoisie_decision(0.05, 0.5) # Returns (“crisis”, -0.15, 0.20)

babylon.systems.formulas.calculate_biocapacity_delta(regeneration_rate, max_biocapacity, extraction_intensity, current_biocapacity, entropy_factor=1.2)[source]

Calculate change in biocapacity stock: ΔB = R - (E × η).

The core metabolic formula. Extraction always costs more than the raw value obtained due to entropy/waste (η > 1.0).

Parameters:
  • regeneration_rate (float) – Fraction of max_biocapacity restored per tick [0, 1]

  • max_biocapacity (float) – Maximum biocapacity ceiling

  • extraction_intensity (float) – Current extraction pressure [0, 1]

  • current_biocapacity (float) – Current biocapacity stock

  • entropy_factor (float) – Waste multiplier for extraction (default 1.2)

Return type:

float

Returns:

Change in biocapacity (positive = regeneration, negative = depletion)

Examples

>>> calculate_biocapacity_delta(0.02, 100.0, 0.0, 50.0)  # No extraction
2.0
>>> calculate_biocapacity_delta(0.02, 100.0, 0.05, 50.0)  # Light extraction
-1.0
>>> calculate_biocapacity_delta(0.02, 100.0, 0.0, 100.0)  # At max, no regen
0.0
babylon.systems.formulas.calculate_overshoot_ratio(total_consumption, total_biocapacity, max_ratio=999.0)[source]

Calculate ecological overshoot ratio: O = C / B.

When O > 1.0, consumption exceeds biocapacity (overshoot). When O <= 1.0, the system is within ecological limits.

Parameters:
  • total_consumption (float) – Total consumption needs across all entities

  • total_biocapacity (float) – Total available biocapacity

  • max_ratio (float) – Cap for ratio when biocapacity depleted (default 999.0)

Return type:

float

Returns:

Overshoot ratio (>1.0 = ecological overshoot)

Examples

>>> calculate_overshoot_ratio(100.0, 200.0)  # Sustainable
0.5
>>> calculate_overshoot_ratio(200.0, 100.0)  # Overshoot
2.0
>>> calculate_overshoot_ratio(100.0, 0.0)  # Depleted biocapacity
999.0