10  Exercise Answers

Model solutions to all chapter exercises

This chapter provides model answers to all exercises in Chapters 1–8. Reproduce each exercise from its source chapter before consulting this key. A model answer is not a ceiling — it is a floor. Good engineering thinking will extend beyond what is shown here.


10.1 Chapter 1: What Is a System?

10.1.1 Exercise 1.1

Choose one of the following and draw a stock-flow diagram: (a) a national fish population managed by a commercial fishery, (b) the job market in a single profession, (c) soil organic carbon in an agricultural field, (d) the subscriber count for a newsletter.

Model answer (option a — fish population):

Stocks:

  • Fish population (thousands of tonnes of biomass)

Inflows:

  • Natural recruitment and growth (driven by current population size and spawning stock biomass)

Outflows:

  • Commercial harvest (controlled by fishing effort and quota policy)
  • Natural mortality (disease, predation, senescence)

Key auxiliaries controlling flow rates:

  • Fishing effort (number of vessels × days at sea)
  • Catchability coefficient (gear efficiency)
  • Quota cap (regulatory constraint on harvest)
  • Spawning stock biomass (portion of population that reproduces, drives recruitment inflow)

flowchart LR
    R(["Recruitment\ninflow"]) --> V1{"Recruit\nvalve"}
    V1 --> F["Fish\nPopulation\n(kt biomass)"]
    F --> V2{"Harvest\nvalve"}
    V2 --> H(["Commercial\nharvest"])
    F --> V3{"Mortality\nvalve"}
    V3 --> M(["Natural\nmortality"])
    E(Fishing\neffort) -.->|drives rate| V2
    Q(Quota cap) -.->|limits rate| V2
    F -.->|spawning stock\ndrives| V1

    style F fill:#f5f5f5,stroke:#111111,stroke-width:2px
    style V1 fill:#ffffff,stroke:#888888
    style V2 fill:#ffffff,stroke:#888888
    style V3 fill:#ffffff,stroke:#888888
    style E fill:#fff3f3,stroke:#d52a2a
    style Q fill:#fff3f3,stroke:#d52a2a

Key delays: The recruitment delay — the lag between spawning and juveniles reaching harvestable size — is typically 3–7 years for groundfish species. This means that management decisions made today affect the harvestable stock a half-decade later. The delay is load-bearing: it is the structural reason that overfishing is not immediately visible in catch rates (the fish already in the water buffer the signal) and is the reason the Grand Banks cod collapse was driven by forces set in motion years before the moratorium.

Why this is a system, not just a list: The stock (fish population) has memory — it reflects accumulation and depletion over many years. The feedback from fish population to recruitment inflow is a balancing loop (examined in Chapter 2): as population grows, spawning stock increases, recruitment grows, pushing population further. As population is depleted, recruitment falls. The harvest outflow connects to economic incentives that are explored fully in Chapter 8.


10.1.2 Exercise 1.2

If the current ice mass is 50 km³ and the ablation rate exceeds accumulation by 1 km³/year, how many years until the glacier disappears?

Model answer:

Using the response time formula from the chapter:

\tau = \frac{S}{|F_{\text{net}}|} = \frac{50 \text{ km}^3}{1 \text{ km}^3/\text{yr}} = 50 \text{ years}

At constant net outflow, the glacier disappears in 50 years.

What this implies about decisions made today: The 50-year response time reveals two things. First, the glacier’s current trajectory was set by climate conditions from decades ago — not by today’s choices. The ice mass we are measuring now reflects warming that has already occurred. Second, any policy that reduces the ablation excess (reducing warming, changing the ELA) will not produce visible recovery in the glacier for decades. Actions taken today will be invisible in the stock for a generation. This is the practical meaning of delay in a stock-flow system: the disconnect between the moment of intervention and the moment the stock responds. Policymakers who mistake the absence of visible response for the absence of effect will consistently under-invest.


10.1.3 Exercise 1.2b

Pipeline terminal: 8 million barrels storage, 400,000 bbl/day throughput, upstream receipts drop to zero.

Model answer:

(a) Using the response time formula:

\tau = \frac{S}{|F_{\text{net}}|} = \frac{8{,}000{,}000 \text{ bbl}}{400{,}000 \text{ bbl/day}} = 20 \text{ days}

At zero receipts and full delivery rate, the terminal can sustain 20 days of deliveries before exhausting inventory.

(b) If deliveries are reduced to 300,000 bbl/day:

\tau = \frac{8{,}000{,}000}{300{,}000} \approx 26.7 \text{ days}

Reducing deliveries by 25% extends the buffer by approximately 6.7 days — a roughly proportional but not dramatic extension.

(c) The relationship between stock level at the time of disruption and system resilience is direct: a terminal that was already running at 4 million barrels (half capacity) when the disruption hit would have a τ of only 10 days at full delivery rate — half the resilience of the fully loaded terminal, with the same physical infrastructure. This is a fundamental property of stocks: resilience is not a property of capacity alone but of the stock level relative to the outflow rate at the moment of stress. The midstream industry phrase “operational minimum fill” — the mandatory minimum stock below which the terminal is considered at risk — is a direct application of this relationship. Operating near operational minimum fill is structurally dangerous precisely because τ is then small.


10.1.4 Exercise 1.3

Draw the housing stock-flow diagram twice: narrow boundary (supply only) and wide boundary (at least two additional feedback mechanisms).

Model answer:

The chapter provides reference diagrams; the key analytical point is explaining what the narrow model misses.

Narrow boundary (supply side only):

  • Stock: Dwelling units
  • Inflow: Construction completions (controlled by permits issued)
  • Outflow: Demolitions and conversions
  • Auxiliary: Planning permits (controls build rate)

This model can answer: “How many dwellings will exist in five years given current construction rates?” It cannot answer anything about whether that supply will be adequate, because it contains no representation of demand.

Wide boundary additions:

The wide model adds at minimum:

  1. Population pressure (demand side): population in-migration drives demand, which signals to developers via rental prices, which drives construction. This is a balancing loop: housing shortage → rising rents → signals builders → construction increases → vacancy rate rises → pressure eases.

  2. Investment demand: housing as a financial asset creates a reinforcing loop. Rising prices attract speculative buyers, reducing supply available to renters/owner-occupiers, pushing prices further. This loop competes with the balancing loop above.

What the narrow model misses:

  • The construction pipeline responds to price signals, not to physical vacancy data. A narrow model that ignores price signals will not replicate developer behaviour.
  • Population response to affordability: people move away from expensive cities, reducing demand — a balancing feedback that the supply-only model cannot represent.
  • The balancing loop from dwelling stock back to population pressure (shown in Fig 1.2): when supply increases, vacancy rate rises, pressure on rents falls, in-migration slows. This is the automatic equilibrating mechanism. Without it, the model will consistently predict that construction cures the crisis more quickly than it does in reality.

10.1.5 Exercise 1.4

Identify a system you interact with regularly. What is its stated purpose? What is its actual function? What does the gap tell you about its structure?

Model answer (using a university grading system as illustration):

Stated purpose: Assess student learning and certify competency levels to employers and further educational institutions.

Actual function (revealed by behaviour over time): The grading system, as it operates, primarily functions to rank students relative to each other within a cohort, and to generate a credential whose value derives from the prestige of the institution issuing it rather than from the specific competencies it certifies. Grade inflation — the systematic drift of median grades upward over decades — is evidence that the measurement signal has been corrupted by the system’s response to incentives: instructors face pressure (from student evaluations, from institutional rankings) to award high grades; students respond rationally to those incentives by optimising for grades rather than for learning.

What the gap tells us about structure: The gap between stated and actual purpose reveals that the system is not measuring what it claims to measure. It is measuring compliance, test-taking strategy, and effort relative to peers — not intrinsic competency. The structure that produces this gap: grades are inputs to high-stakes decisions (scholarships, jobs, graduate admissions), so the incentive to optimise for them is large. The feedback loop from grade to decision is strong. The feedback loop from actual competency to grade is weak — because competency is expensive to measure precisely and grades are easy to award. Meadows’ observation applies directly: the system optimises for what it measures and rewards, not for what it claims. The grading system’s actual function is credential production. The learning function is incidental.


10.2 Chapter 2: Feedback Structures

10.2.1 Exercise 2.1

For each of the following, identify the feedback loop type and draw a causal loop diagram: (a) Wildfire, (b) Social proof, (c) Immune response, (d) Traffic.

Model answer:

(a) Wildfire: fire intensity → fuel consumption → available fuel → fire intensity

This is a balancing loop. As fire intensity increases, fuel is consumed; as available fuel decreases, fire intensity decreases. Sign product: (+)(−) = negative → odd number of minus signs → balancing (B).

flowchart LR
    FI["Fire Intensity"] -->|"+"| FC["Fuel Consumption"]
    FC -->|"−"| AF["Available Fuel"]
    AF -->|"+ [B]"| FI

    style FI fill:#fff3f3,stroke:#d52a2a,stroke-width:2px
    style FC fill:#f5f5f5,stroke:#111111
    style AF fill:#f5f5f5,stroke:#111111

Note the important caveat: in the short run, before fuel is meaningfully depleted, the fire-spread dynamics include a reinforcing loop (heat → more ignition → more spread). The above loop is the medium-to-long-run balancing structure that ultimately limits any individual fire.

(b) Social proof: product popularity → recommendation → adoption → popularity

This is a reinforcing loop. All links are positive: more popular → more recommended → more adopted → more popular. Sign product: (+)(+)(+) = positive → even number of minus signs → reinforcing (R).

flowchart LR
    PP["Product\nPopularity"] -->|"+"| REC["Recommendation\nto Others"]
    REC -->|"+"| AD["Adoption"]
    AD -->|"+ [R]"| PP

    style PP fill:#f5f5f5,stroke:#111111,stroke-width:2px
    style REC fill:#f5f5f5,stroke:#111111
    style AD fill:#fff3f3,stroke:#d52a2a

This is the same structure as the agglomeration loop (Fig 2.2) and the recommender amplification loop (Fig 2.3). All three are instances of network-effect reinforcing feedback.

(c) Immune response: pathogen load → immune activation → pathogen clearance → pathogen load

This is a balancing loop. Immune activation increases pathogen clearance, which reduces pathogen load. Sign product: (+)(+)(−) = negative → odd → balancing (B).

flowchart LR
    PL["Pathogen Load"] -->|"+"| IA["Immune Activation"]
    IA -->|"+"| PC["Pathogen Clearance"]
    PC -->|"− [B]"| PL

    style PL fill:#fff3f3,stroke:#d52a2a,stroke-width:2px
    style IA fill:#f5f5f5,stroke:#111111
    style PC fill:#f5f5f5,stroke:#111111

The goal of this balancing loop is zero pathogen load. In practice there are significant delays (the immune response takes days to ramp up), which is why bacterial infections can progress seriously before treatment. The delay in this balancing loop is the structural reason antibiotics have value — they shorten the delay between pathogen load and clearance.

(d) Traffic: congestion → route avoidance → reduced congestion

This is a balancing loop. Higher congestion drives route avoidance, which reduces congestion on the congested route. Sign product: (+)(−) = negative → balancing (B).

flowchart LR
    CON["Congestion\n(on route A)"] -->|"+"| AV["Route Avoidance\n(switch to B)"]
    AV -->|"− [B]"| CON

    style CON fill:#fff3f3,stroke:#d52a2a,stroke-width:2px
    style AV fill:#f5f5f5,stroke:#111111

Important: this is the Braess paradox territory. Adding a new fast link to a congested network can increase the total congestion, because the new link changes the route-avoidance behaviour. The balancing loop above operates on a single route pair; in a network with multiple routes, the feedback structure is more complex and can produce counterintuitive outcomes.


10.2.2 Exercise 2.2

Match each pattern to one of the five archetypes: (a) Aral Sea depletion, (b) smartphone adoption, (c) Fed interest rate adjustment, (d) cod fishery collapse.

Model answer:

(a) Aral Sea depletion (1960–2000): Overshoot and collapse. A reinforcing loop (expansion of irrigated cotton production → economic success → more irrigation investment) operated against a balancing loop (declining river inflow → declining sea level → declining fishery and regional economy) — but with a long delay between the extraction decisions and the visible sea-level collapse. By the time the constraint (water availability) was apparent, the overshoot was already committed. The sea crossed an irreversible threshold before any corrective action was taken.

(b) Smartphone adoption (2007–2015): Limits to growth (with a reinforcing phase). A reinforcing loop (more users → better app ecosystem → more users) drove exponential early adoption. As the technology diffused through the addressable market, a balancing loop (market saturation — fewer potential new users remain) progressively constrained the reinforcing loop, producing the S-curve characteristic of limits to growth. The growth did not collapse; it levelled off.

(c) Fed interest rate adjustment: Goal seeking (balancing loop dominant). The Federal Open Market Committee has an explicit goal (the inflation target, ~2%) and a policy instrument (the federal funds rate). Higher inflation → higher rates → reduced borrowing and spending → lower inflation. One dominant balancing loop seeking a goal. In practice there are delays (monetary policy operates on 12–18 month lags), which produces the oscillation variant — but the structural archetype is goal seeking with delay.

(d) Cod fishery collapse: Overshoot and collapse. A reinforcing loop (profitable fishing → investment in fleet capacity → higher harvest → higher profits) drove harvest levels above the biological maximum sustainable yield. The constraining balancing loop (falling stock → falling catch → falling profit → reduced effort) was delayed by two mechanisms: (i) falling stock raised price per tonne, maintaining profitability longer than biological sustainability would suggest, and (ii) the stock assessment information that should have triggered quota reduction was systematically ignored under political pressure. The delayed constraint was crossed rapidly, and the collapse was near-total.


10.2.3 Exercise 2.3

Implement a stock-flow model for the “oscillation” archetype: room temperature, goal 20°C, 15-minute delay, run 240 minutes starting at 15°C. Plot the time series.

Model answer:

The code below is the direct implementation. The key modelling decision is how to represent the delay: a deque (double-ended queue) of length D_steps pre-filled with zeros acts as a first-in-first-out buffer. The control signal computed at step i is stored in the buffer and applied D_steps later — this is the structural representation of a material or information delay.

"""Delayed thermostat — oscillation archetype simulation.
Euler method with deque delay buffer.
Stock: room temperature T (°C). Goal: 20°C. Delay: 15 min."""
import numpy as np
import matplotlib.pyplot as plt
from collections import deque

T_goal, T0, k, loss = 20.0, 15.0, 0.5, 0.05
dt, t_end = 1.0, 240
steps = int(t_end / dt) + 1
time = np.arange(steps) * dt

# 15-minute delay scenario
delay_min = 15
D_steps = int(delay_min / dt)
buf = deque([0.0] * D_steps, maxlen=D_steps)

T = np.empty(steps)
T[0] = T0

for i in range(steps - 1):
    gap = T_goal - T[i]
    buf.append(k * gap)          # store current control signal
    heating = buf[0]             # oldest (delayed) signal drives heater
    T[i + 1] = T[i] + (heating - loss * T[i]) * dt

fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(time, T, color="#d52a2a", linewidth=1.5, label="15-min delay")
ax.axhline(y=T_goal, color="#888888", linestyle="--", linewidth=0.8)
ax.set_xlabel("Time (minutes)")
ax.set_ylabel("Room temperature (°C)")
ax.set_title("Thermostat with 15-minute delay")
ax.legend()
plt.tight_layout()
plt.show()

Effect of increasing delay: As delay increases, the oscillation amplitude grows and damping decreases. With a 5-minute delay, the system overshoots the goal by a small margin and converges within ~80 minutes. With a 15-minute delay, the oscillations are larger and persist longer. With a 45-minute delay, the oscillation is sustained — the correction that was calibrated to the old gap arrives after the temperature has already reversed direction, so the system perpetually overcorrects in alternating directions.

Effect of increasing feedback strength (k): Counterintuitively, stronger feedback makes the oscillation worse, not better. With k = 0.8 and a 15-minute delay, the system oscillates with larger amplitude than with k = 0.5. This is because stronger feedback means a larger corrective signal is sent when the gap is large — but since the delay means that signal arrives late, the larger signal produces a larger overshoot. This is the central insight of delay dynamics: the prescription for a delayed balancing loop is not stronger feedback but shorter delay or gentler correction.


10.2.4 Exercise 2.4

The ice-albedo feedback is reinforcing, yet the Arctic has not warmed runaway. What balancing loops might limit it? Draw a causal loop diagram.

Model answer:

The ice-albedo reinforcing loop has not produced runaway warming because several balancing loops constrain it.

Potential limiting mechanisms:

  1. Ocean heat uptake balancing loop: As atmospheric temperature rises, the temperature difference between air and ocean surface increases. Heat flows from atmosphere to ocean. As ocean temperature rises, this gradient narrows, slowing heat transfer. The ocean absorbs warming rather than allowing it to drive further ice melt. This is a balancing loop with a very large stock (the ocean) and a correspondingly long response time.

  2. Water vapour and cloud feedback (partially balancing): Increased atmospheric water vapour as oceans warm can increase cloud cover at high latitudes. Clouds reflect incoming solar radiation, partially offsetting the albedo loss from ice retreat. The net sign of this feedback is debated, but in the Arctic there is evidence it operates as a partial brake.

  3. Planck feedback (blackbody radiation): As surface temperature rises, outgoing longwave radiation increases as the fourth power of temperature. This is an absolute physical limit on runaway warming in the absence of a runaway greenhouse effect — any temperature increase raises the energy radiated to space, which is a balancing feedback that grows stronger with temperature.

flowchart LR
    IM["Ice Mass"] -->|"+"| SA["Surface Albedo"]
    SA -->|"−"| SR["Solar Absorption"]
    SR -->|"+"| ST["Surface Temperature"]
    ST -->|"+"| MR["Ice Melt Rate"]
    MR -->|"− [R]"| IM

    ST -->|"+"| OHU["Ocean Heat Uptake"]
    OHU -->|"− [B1]"| ST

    ST -->|"+"| OLR["Outgoing\nLongwave Radiation"]
    OLR -->|"− [B2]"| ST

    style IM fill:#f5f5f5,stroke:#111111,stroke-width:2px
    style ST fill:#fff3f3,stroke:#d52a2a,stroke-width:2px
    style MR fill:#fff3f3,stroke:#d52a2a
    style OHU fill:#f5f5f5,stroke:#111111
    style OLR fill:#f5f5f5,stroke:#111111

The diagram shows the reinforcing loop (R) — ice-albedo — alongside two balancing loops (B1: ocean heat uptake; B2: Planck feedback). The reinforcing loop amplifies any warming perturbation. The balancing loops absorb some of the energy and resist further temperature increase. The net behaviour — warming, but not runaway — is the result of the reinforcing loop operating within the constraints of the balancing loops. The concern from climate science is not that the reinforcing loop will produce literal runaway warming, but that the balancing loops may operate on slower timescales (ocean centuries; ice sheets millennia) than the reinforcing loop, allowing more warming to be “committed” before the constraints engage.


10.3 Chapter 3: Complexity and Emergence

10.3.1 Exercise 3.1

Identify the threshold mechanism and describe what happens to the dominant feedback structure on either side for: (a) fishery stock and recovery, (b) social media platform growth, (c) wildfire and fuel moisture, (d) epidemic and herd immunity.

Model answer:

(a) Fishery stock and population recovery:

Threshold mechanism: The minimum viable population (MVP) — the stock level below which the balancing feedback (reproduction → stock recovery) fails. Below this threshold, fish cannot locate mates efficiently (the Allee effect), juvenile survival falls as predation intensity on small populations is disproportionately high, and food web disruptions reduce recruitment success.

Above threshold: Balancing feedback dominates. The population grows at a rate proportional to stock size, and the recruitment-to-mortality balance drives the stock toward carrying capacity or a sustainable harvest equilibrium. The recovery loop is operational.

Below threshold: Reinforcing feedback takes over. Small population → failed reproduction → further decline → even smaller population. This is the depensation dynamic (Allee effect). The stock cannot self-recover even if fishing pressure is removed. The Grand Banks cod stock is the canonical example: decades after the moratorium, the stock has not recovered because it appears to be trapped below its MVP.

(b) Social media platform growth and network effects:

Threshold mechanism: The critical mass of users above which the platform’s value to each user (Metcalfe’s Law: value ∝ n²) exceeds the cost and effort of participation.

Below threshold: Balancing feedback dominates. Small platform → few connections available → low value → users leave or don’t join → platform stays small. The system is in a “death spiral” equilibrium.

Above threshold: Reinforcing feedback dominates. Large network → high value per user → users join → larger network. The platform grows until market saturation or competitive substitution engages a limiting loop. The threshold is the tipping point between the two stable equilibria (empty platform and saturated platform).

(c) Wildfire and fuel moisture:

Threshold mechanism: The critical fuel moisture content (~8–12% for most fuel types) below which fire spreads faster than it can be controlled by natural moisture variation. The fire behaviour changes qualitatively at this threshold — from patchy, slow-spreading fire to continuous rapid spread.

Above threshold (moist fuels): Balancing feedback dominates. Any ignition produces a small fire; high moisture absorbs heat, extinguishes spread. Small perturbations produce small fires.

Below threshold (dry fuels): Reinforcing feedback takes over. A small ignition heats nearby fuel, dries it, which ignites more easily, which heats more fuel. Fire intensity drives further fire intensity. The fire spreads until a physical boundary (a road, a change in fuel type, a moisture gradient) engages a new balancing feedback.

(d) Epidemic and herd immunity threshold:

Threshold mechanism: The fraction of the population that must be immune (through infection or vaccination) for each new case to infect on average fewer than one new person — i.e., R_effective < 1. This is the herd immunity threshold, H = 1 − 1/R₀.

Below threshold (insufficient immunity): Reinforcing feedback dominates. Each case produces more than one new case → epidemic spreads exponentially. The reinforcing loop is: infected persons → transmission → new cases → more infected persons.

Above threshold (sufficient immunity): Balancing feedback takes over. Each case produces fewer than one new case → epidemic declines. The immune population forms a structural brake: chains of transmission are interrupted before they can sustain growth. The epidemic still occurs in susceptible sub-populations but the whole-population dynamics are now governed by the balancing structure.


10.3.2 Exercise 3.2

Implement a simple Schelling segregation model. Vary the threshold from 10% to 60%. At what threshold does macro-level segregation emerge?

Model answer:

The implementation below mirrors the chapter’s code but is self-contained. The key modelling decisions are: (1) using a Moore neighbourhood (8 adjacent cells), (2) defining satisfaction as the fraction of occupied neighbours sharing the agent’s type, and (3) moving unsatisfied agents to random empty cells (a parallel update would be more accurate; serial update is used here for simplicity).

"""Schelling segregation model — minimal implementation.
Grid: GRID_SIZE x GRID_SIZE. Two agent types. Agents move if
fraction same-type neighbours < THRESHOLD."""
import numpy as np
import matplotlib.pyplot as plt
from collections import defaultdict

GRID_SIZE = 40
DENSITY_A = 0.45
DENSITY_B = 0.45
N_STEPS = 50
SEED = 42

np.random.seed(SEED)
n_cells = GRID_SIZE * GRID_SIZE
n_a = int(n_cells * DENSITY_A)
n_b = int(n_cells * DENSITY_B)
flat = np.zeros(n_cells, dtype=np.int8)
flat[:n_a] = 1
flat[n_a:n_a + n_b] = 2
np.random.shuffle(flat)
base_grid = flat.reshape(GRID_SIZE, GRID_SIZE)


def segregation_index(grid):
    """Average fraction same-type occupied neighbours."""
    totals = []
    for r in range(GRID_SIZE):
        for c in range(GRID_SIZE):
            if grid[r, c] == 0:
                continue
            agent = grid[r, c]
            same, occ = 0, 0
            for dr in [-1, 0, 1]:
                for dc in [-1, 0, 1]:
                    if dr == 0 and dc == 0:
                        continue
                    nr, nc = (r + dr) % GRID_SIZE, (c + dc) % GRID_SIZE
                    if grid[nr, nc] > 0:
                        occ += 1
                        if grid[nr, nc] == agent:
                            same += 1
            if occ > 0:
                totals.append(same / occ)
    return np.mean(totals) if totals else 0.0


def step(grid, threshold):
    same_counts = np.zeros_like(grid, dtype=int)
    occ_counts = np.zeros_like(grid, dtype=int)
    for r in range(GRID_SIZE):
        for c in range(GRID_SIZE):
            for dr in [-1, 0, 1]:
                for dc in [-1, 0, 1]:
                    if dr == 0 and dc == 0:
                        continue
                    nr, nc = (r + dr) % GRID_SIZE, (c + dc) % GRID_SIZE
                    if grid[nr, nc] > 0:
                        occ_counts[r, c] += 1
                        if grid[nr, nc] == grid[r, c]:
                            same_counts[r, c] += 1

    empty = [(r, c) for r in range(GRID_SIZE) for c in range(GRID_SIZE) if grid[r, c] == 0]
    unsatisfied = [
        (r, c) for r in range(GRID_SIZE) for c in range(GRID_SIZE)
        if grid[r, c] > 0 and occ_counts[r, c] > 0
        and same_counts[r, c] / occ_counts[r, c] < threshold
    ]
    np.random.shuffle(unsatisfied)
    for pos in unsatisfied:
        if not empty:
            break
        dest = empty.pop(np.random.randint(len(empty)))
        grid[dest], grid[pos] = grid[pos], 0
        empty.append(pos)
    return grid


# Run for thresholds 0.10 to 0.60
thresholds = [0.10, 0.20, 0.33, 0.50, 0.60]
final_segregation = {}

for T in thresholds:
    g = base_grid.copy()
    for _ in range(N_STEPS):
        g = step(g, T)
    final_segregation[T] = segregation_index(g)
    print(f"T = {T:.2f}  →  segregation index = {final_segregation[T]:.3f}")

Expected output (approximate):

Threshold Final segregation index
T = 0.10 ~0.72
T = 0.20 ~0.82
T = 0.33 ~0.90
T = 0.50 ~0.95
T = 0.60 ~0.97

At what threshold does macro-level segregation emerge?

Macro-level segregation — meaning a segregation index substantially above the baseline random expectation (≈0.50) — emerges even at T = 0.10. An agent who is satisfied as long as even one out of eight neighbours shares their type still produces global segregation of approximately 0.72 after 50 steps.

What this tells us about individual preferences and collective outcomes:

The aggregate pattern (near-complete segregation) bears no proportional relationship to the individual preference (mild tolerance for diversity). This is a canonical demonstration of emergence: the collective outcome cannot be predicted from any single agent’s behaviour. The mechanism is the feedback between individual decisions and neighbourhood composition — the Schelling move-decision loop (Fig 3.3). As agents with mild preferences move, they change the composition of origin and destination neighbourhoods for other agents, who then also move. The cascade rapidly produces macro-level clusters that none of the original preferences required or intended.

The policy implication: policies aimed at integration that work only on individual preferences (anti-discrimination awareness campaigns) are operating at the symptom level. The structural driver is the housing market feedback through which individual preferences aggregate into neighbourhood composition — which is the variable that then drives further individual decisions.


10.3.3 Exercise 3.3

Research a method for detecting critical slowing down in a time series. Apply it conceptually to the AMOC strength or an ecological time series.

Model answer:

Critical slowing down and its detection:

As a system approaches a tipping point, the dominant eigenvalue of the system’s dynamics approaches zero — meaning the system takes longer to return to equilibrium after small perturbations. Two statistical signatures follow:

  1. Increasing autocorrelation (AR(1) coefficient): Slower recovery means observations are more similar to their immediate predecessors. The lag-1 autocorrelation of a time series should increase as the system approaches a tipping point. This is measurable as the AR(1) coefficient in a rolling window.

  2. Increasing variance: Near a tipping point, the system spends more time away from its mean state (because recovery is slow). The variance of a rolling window should increase.

Conceptual application to AMOC strength:

The Atlantic Meridional Overturning Circulation (AMOC) has been weakening since at least 2004 (RAPID array data). Some studies (Caesar et al., 2021; Boers, 2021) have analysed Atlantic sea surface temperature patterns as proxies for AMOC strength over the past 100+ years.

Method: Divide the proxy time series into rolling windows of ~30-year length. For each window, compute the AR(1) coefficient (using an AR(1) autoregressive fit or direct lag-correlation). Compute the detrended variance. Plot these statistics over time.

Expected signal if tipping point is approached: AR(1) should show a secular increase over the 20th and 21st centuries, even through the noise of the raw time series. Variance should also trend upward.

What Boers (2021) found: Exactly this pattern. Using multiple proxy records, the study found that AR(1) and variance both increased across the 20th century, consistent with critical slowing down. The finding does not prove AMOC is near a tipping point — it is consistent with it — but it provides the kind of early warning signal that the chapter describes.

Limitation of this method: Critical slowing down detection requires a long time series, a stationary noise structure, and careful detrending. False positives can arise from non-stationarity in the driving forcing (a linear trend in CO₂ can produce increasing autocorrelation without the system being near a tipping point). The method is a warning signal, not a proof.


10.3.4 Exercise 3.4

Choose a system you work with. Conduct a simple resilience audit: (1) current state, (2) balancing feedbacks, (3) stresses, (4) monitoring indicators.

Model answer (using a production ML pipeline as the system):

1. Current state: A production sentiment analysis model achieves 87% accuracy on a quarterly human-labelled evaluation set. The model was last retrained 9 months ago on data from 2021–2023.

2. Balancing feedbacks that restore the system after perturbation:

  • Retraining loop: Model accuracy degrades → monitoring system detects drop → data team initiates retraining on recent data → accuracy restored. This is the primary corrective loop.
  • Label correction loop: Analysts reviewing model outputs flag systematic errors → corrected labels are added to the training corpus → next retraining incorporates corrections.
  • Feature pipeline monitoring: Upstream data schema changes are detected by feature validation rules → pipeline alerts team → engineering fixes the schema mapping before it corrupts the model’s inputs.

3. Stresses that might weaken these balancing feedbacks:

  • The retraining loop is only as strong as the evaluation cadence. If the quarterly evaluation is cut to annual (budget pressure), the detection delay grows from 3 months to 12 months, substantially reducing resilience.
  • The label correction loop requires analyst bandwidth. If the operations team is under-resourced, the correction feedback starves.
  • The feature monitoring depends on explicit schema tests. A gradual semantic drift (upstream column values shift meaning without schema change) bypasses the tests entirely — the balancing loop exists but is not monitoring the right variable.

4. Indicators of decreasing resilience:

  • Divergence between serving distribution and training distribution (PSI — Population Stability Index for key features): this tracks distance to threshold, not just current accuracy.
  • Trend in AR(1) coefficient of weekly accuracy scores: increasing autocorrelation means the model is recovering more slowly from weekly fluctuations — a direct measure of critical slowing down.
  • Time since last successful label correction batch: if this duration is growing, the correction loop is weakening.
  • Coverage of feature monitoring tests relative to total feature count: if new features are added faster than monitoring tests, blind spots accumulate.

The key insight from the resilience framework: a system can appear stable (accuracy still at 87%) while its resilience is declining (the corrective loops are weakening). Measuring the health of the feedback loops, not just the current accuracy, is what distinguishes resilience monitoring from performance monitoring.


10.4 Chapter 4: Earth as a System

10.4.1 Exercise 4.1

Pre-industrial stocks: atmosphere = 590 GtC, ocean = 38,000 GtC, land biosphere = 2,150 GtC. Anthropogenic emission = 4 GtC/yr. Ocean and land sinks absorb 6 GtC/yr together.

Model answer:

(a) Wait — the problem states anthropogenic emission is 4 GtC/yr and sinks absorb 6 GtC/yr. Re-reading: “An anthropogenic emission inflow of 4 GtC/yr is added” and sinks absorb “6 GtC/yr of the anthropogenic pulse, leaving a net accumulation rate of 4 GtC/yr.”

This requires the anthropogenic emission to be 10 GtC/yr (10 − 6 = 4 net accumulation). Working with net accumulation rate = 4 GtC/yr:

\tau = \frac{S}{|F_{\text{net}}|} = \frac{590 \text{ GtC}}{4 \text{ GtC/yr}} \approx 147 \text{ years}

A 10% increase in atmospheric stock = 59 GtC. At a net accumulation rate of 4 GtC/yr:

t = \frac{59 \text{ GtC}}{4 \text{ GtC/yr}} \approx 15 \text{ years}

Interpretation: At current net emission rates, the atmospheric carbon stock would increase 10% from pre-industrial levels in roughly 15 years. Note that the actual atmosphere is already at approximately 420 ppm — roughly 70% above the pre-industrial value of 280 ppm — because this accumulation has been ongoing since industrialisation. The response time formula gives the forward timescale from a given state; the backward calculation confirms that approximately 175 years of net accumulation at varying rates produced the current atmospheric stock.

(b) Doubled emissions with partial ocean saturation:

If emissions double (net accumulation rises to ~8 GtC/yr), but ocean uptake increases only by 1 GtC/yr (from 6 to 7 GtC/yr combined with land biosphere), the net accumulation in the atmosphere becomes ~9 GtC/yr. Simultaneously, atmospheric CO₂ is now higher, which drives more ocean uptake — but the ocean’s capacity to absorb CO₂ is limited by carbonate chemistry (the biological pump and the solubility pump).

The ocean stock would grow slowly over time as it absorbs the increased partial pressure difference between atmosphere and surface ocean. However, the rate of ocean uptake as a fraction of total emissions declines as the atmospheric concentration rises — ocean chemistry buffering weakens and the ocean becomes progressively less effective as a sink. The ocean carbon stock would increase, but the fraction of anthropogenic emissions it captures would decrease over centuries. In qualitative terms: ocean carbon stock rises slowly; atmospheric carbon stock rises faster than the linear projection from current rates.


10.4.2 Exercise 4.2

Choose two feedbacks from Chapter 4 (one reinforcing, one balancing). Draw their causal loop diagrams, verify loop types, and identify timescales.

Model answer:

Reinforcing feedback: Ice-albedo feedback (covered also in Ch 2, applied here at planetary scale)

flowchart LR
    IS["Arctic Sea Ice\nExtent"] -->|"+"| AL["Surface Albedo"]
    AL -->|"−"| OA["Ocean Heat\nAbsorption"]
    OA -->|"+"| AT["Arctic\nTemperature"]
    AT -->|"+"| IM["Sea Ice Melt\nRate"]
    IM -->|"− [R]"| IS

    style IS fill:#f5f5f5,stroke:#111111,stroke-width:2px
    style AT fill:#fff3f3,stroke:#d52a2a,stroke-width:2px
    style IM fill:#fff3f3,stroke:#d52a2a

Sign verification: (+)(−)(+)(+)(−) = product of five signs. Count the negative signs: two. Even number → reinforcing (R). ✓

Stock primarily acted on: Arctic sea ice extent. Timescale of response: Seasonal to decadal. September sea ice extent shows clear year-to-year variability; the long-run trend driven by this reinforcing loop operates on a decadal timescale as the Arctic warms approximately 3–4 times faster than the global average.

Balancing feedback: Ocean carbon uptake

flowchart LR
    AC["Atmospheric\nCO₂"] -->|"+"| PPG["Partial Pressure\nGradient\n(air − ocean)"]
    PPG -->|"+"| OCU["Ocean CO₂\nUptake Rate"]
    OCU -->|"− [B]"| AC

    style AC fill:#fff3f3,stroke:#d52a2a,stroke-width:2px
    style PPG fill:#f5f5f5,stroke:#111111
    style OCU fill:#f5f5f5,stroke:#111111

Sign verification: (+)(+)(−) = product with one negative sign. Odd number → balancing (B). ✓

Stock primarily acted on: Atmospheric CO₂ (with the ocean carbon stock as the receiving accumulator). Timescale: The surface ocean equilibrates with the atmosphere on a timescale of months to ~1 year. The deep ocean (thermohaline circulation) operates on centuries to millennia. The full equilibration of the ocean carbon stock to a new atmospheric CO₂ level takes centuries — which is why committed atmospheric CO₂ reduction from natural ocean uptake after emissions cease is a very slow process.


10.4.3 Exercise 4.3

Choose one tipping element (AMOC, West Antarctic Ice Sheet, or Amazon dieback). Draw: (i) self-sustaining loop for current state, (ii) external stress, (iii) reinforcing loop after threshold. Identify the System State node and an observable resilience indicator.

Model answer (Amazon forest dieback):

(a) Causal loop diagram:

flowchart LR
    FC["Forest Cover"] -->|"+"| ET["Evapotranspiration"]
    ET -->|"+"| RP["Regional\nPrecipitation"]
    RP -->|"+ [R1]"| FC

    WS["Warming + Drought\nStress"] -->|"−"| ET
    WS -->|"+"| FM["Forest\nMortality Rate"]
    FM -->|"−"| FC

    FC -->|"−"| AL["Albedo\n(dark forest = low)"]
    AL -->|"−"| RT["Regional\nTemperature"]
    RT -->|"+ [R2]"| FM

    style FC fill:#f5f5f5,stroke:#111111,stroke-width:2px
    style WS fill:#fff3f3,stroke:#d52a2a,stroke-width:2px
    style FM fill:#fff3f3,stroke:#d52a2a

Loop R1 (self-sustaining current state): Forest cover → evapotranspiration → regional precipitation → forest cover. This is a reinforcing loop that maintains the forest. The Amazon effectively generates roughly 50% of its own rainfall through moisture recycling via evapotranspiration. This loop sustains the high-cover equilibrium.

External stress: Warming and drought stress weaken evapotranspiration and increase direct mortality, suppressing R1.

Loop R2 (post-threshold reinforcing loop): Forest loss → lower evapotranspiration → reduced regional precipitation → more drought → more forest loss. This is the positive feedback that makes the dieback self-sustaining once triggered. Additionally: forest loss exposes bare ground with higher albedo locally but reduces the dark canopy, changing regional energy balance.

(b) System State node: Forest Cover is the System State node — it is the variable that is positive and self-reinforcing in the healthy regime (R1) and self-reinforcing in the degraded direction in the stressed regime (R2).

(c) Observable resilience indicator: The ratio of actual evapotranspiration (ET) to potential evapotranspiration (PET) — a measure of forest water stress — is the most direct indicator of the system’s proximity to the tipping point. As this ratio falls (forest is transpiring less than it could under ambient conditions), the R1 loop is weakening. Secondary indicators include: the dry-season length measured from satellite Normalised Difference Vegetation Index (NDVI) data, and the autocorrelation of vegetation anomalies (critical slowing down signal). The ET/PET ratio is preferable because it measures the mechanism (moisture recycling capacity) rather than the current state (green cover), and would change before observable cover loss.


10.4.4 Exercise 4.4

CO₂ is held constant at 420 ppm — no further emissions increase. Would temperatures continue to rise? Why?

Model answer:

(a) Surface temperatures would continue to rise for decades to centuries even if atmospheric CO₂ were held constant at 420 ppm.

The reason is the ocean’s thermal response time. The ocean is a very large thermal stock — it is currently absorbing about 90% of the excess heat trapped by elevated GHG concentrations. At 420 ppm, the Earth is in a state of energy imbalance: more solar energy enters than leaves as longwave radiation. This imbalance exists not because CO₂ is still rising but because the ocean has not yet warmed enough to restore the radiative balance. The ocean temperature will continue to rise — slowly, over decades to centuries — until the equilibrium surface temperature consistent with 420 ppm is reached. That equilibrium temperature is higher than the current surface temperature.

Current estimates suggest approximately 0.3–0.5°C of additional warming is already “committed” even at constant CO₂ — sometimes called pipeline warming or committed warming.

(b) What this reveals about the emission-temperature relationship:

The emission trajectory (the inflow rate to the atmospheric stock) sets the current CO₂ concentration (the stock). But the temperature response is driven by the CO₂ stock’s effect on the energy balance, and the temperature is itself a stock (the ocean’s heat content) that changes at the rate determined by the energy imbalance.

There are therefore two stocks in series with two delays: 1. Atmospheric CO₂ responds to net emission flows (balance of sources and sinks), with a delay measured in decades to centuries for natural equilibration. 2. Surface temperature responds to the atmospheric CO₂ stock via the energy imbalance and the ocean thermal stock, with a delay of decades to centuries.

The emission trajectory lags behind temperature response because two stock-flow integrations separate the cause (burning fossil fuels) from the effect (surface warming). This structural delay is the reason the climate problem is so difficult to manage by intuition: the actions that would stabilise climate need to be taken when the current temperatures are not yet alarming, based on commitments already embedded in a stock that cannot be quickly drained.


10.4.5 Exercise 4.5

Section 4.3 describes the oil sands-as-feedback-amplifier loop. Draw the full CLD, identify loops, and describe an intervention.

Model answer:

(a) Full causal loop diagram:

flowchart LR
    OP["Oil Sands\nProduction"] -->|"+"| RE["Regional\nEmissions"]
    RE -->|"+"| RW["Regional\nWarming"]
    RW -->|"+"| RD["Athabasca River\nDischarge (summer)"]
    RD -->|"−"| WA["Water Available\nfor SAGD"]
    WA -->|"− [B]"| OP

    OP -->|"+"| EX["Export Revenue"]
    EX -->|"+"| CI["Capital\nInvestment"]
    CI -->|"+ [R]"| OP

    RW -->|"+"| PC["Permafrost\nCarbon Release"]
    PC -->|"+"| RE

Loop labels:

  • Loop R (reinforcing): Oil sands production → export revenue → capital investment → oil sands production. More production generates revenue that funds more production capacity.
  • Loop B (balancing): Oil sands production → regional emissions → warming → reduced Athabasca River summer discharge → reduced water availability for SAGD → constrained production. This is the long-run environmental constraint on production.
  • Additional reinforcing loop: Warming → permafrost carbon release → regional emissions → more warming. This is a second reinforcing loop embedded in the regional carbon cycle that amplifies regional warming.

(b) Is the overall production-to-production loop reinforcing or balancing?

The dominant loop on economic timescales (decades) is reinforcing: capital investment in production capacity leads to more production leads to more revenue leads to more investment. The balancing loop through water availability operates on longer timescales and with political and regulatory complexity — it is present in the structure but is weaker than the reinforcing loop under current conditions. Long-run direction: continued production growth constrained by the balancing loop only at its limits.

(c) Intervention converting a reinforcing element to a balancing one:

Target: The link from Export Revenue to Capital Investment (the loop gain of the reinforcing loop).

Intervention: A sovereign wealth fund requirement that diverts a fixed fraction of oil sands export revenue into a diversification fund that is legally ring-fenced from reinvestment in fossil fuel extraction. This introduces a new outflow from export revenue that does not feed back into production capacity. The effect: the reinforcing loop gain (the fraction of revenue that returns to production investment) is permanently reduced. This is a LP 7 intervention (reducing the gain of a reinforcing loop) — more structural than a tax on production (LP 12) and more durable than a production quota (LP 12). The new link is: export revenue → sovereign wealth fund → non-fossil investment, which does not feed back into oil sands production.


10.4.6 Exercise 4.6

A satellite providing monthly ice mass data for 15 years is decommissioned. Replacement in 18 months. Resilience analysis.

Model answer:

(a) Balancing feedback supported by the ice mass data stream:

Consider a downstream application: ice sheet mass balance monitoring used to inform sea level rise projections, which in turn inform coastal infrastructure planning and adaptation investment decisions.

The balancing feedback: ice sheet mass anomaly (deviation from expected trajectory) → detection via GRACE or equivalent satellite → updated sea level rise projection → revised infrastructure design requirements → adaptation investment decisions. The corrective flow is adaptation investment; the stock being maintained is the safety margin of coastal infrastructure against flood risk.

(b) Consequences of severing the feedback loop for 18 months:

For the monitored system (ice sheet): No consequence. The ice sheet is indifferent to whether humans are measuring it. It continues accumulating mass anomalies according to its own dynamics. However, the ice sheet’s state 18 months from now will be less well characterised; any event (an unusual calving episode, an accelerated basal melt event) occurring during the gap will not appear in any time series until the new satellite is operational and calibrated.

For model products using ice mass data: Significant consequences. Ice sheet models used for sea level projections use GRACE data as a validation and constraint on their parameters. A gap means: - Annual assessments of mass balance trend (Gt/yr) cannot be updated; the published estimate stagnates at the last available value. - Any acceleration in mass loss that occurs during the gap is not captured. Post-gap recalibration will show a step change in the time series that is actually a gradual change revealed suddenly. - Models that use ice mass as a forcing input to downstream ocean models will be operating with 18–33 months stale forcing, potentially biasing ocean heat content and sea level projections.

(c) Monitoring and modelling strategies to maintain partial feedback function:

  1. Airborne gravimetry campaigns (NASA IceBridge-equivalent): Targeted aerial surveys can measure ice surface elevation and estimate mass change for the most dynamically active regions (outlet glaciers in West Antarctica, Greenland’s rapidly changing glaciers). Limitation: coverage is spatially incomplete (cannot replicate the global coverage of GRACE), cost is high, and campaigns cover only a few weeks per year rather than continuous monthly monitoring.

  2. Continuous altimetry from existing satellites (ICESat-2, Sentinel-3, CryoSat-2): Surface elevation change can be measured continuously and converted to mass change using a firn densification model. Limitation: the conversion from elevation to mass requires modelling of firn compaction and basal dynamics that introduces structural uncertainty not present in direct gravimetric measurement. Rapid calving events that change thickness without changing surface elevation are not captured.

  3. Forward-modelling bridge: Use the last available GRACE trend (Gt/yr) to project mass forward using a physics-based ice sheet model, accepting that the projection uncertainty grows with time. Apply ensemble methods to quantify the growing uncertainty bounds. Limitation: this maintains a model output but not an observation — it cannot detect regime changes or surprises during the gap, which is precisely when observation is most valuable.


10.5 Chapter 5: Cities and Economies as Systems

10.5.1 Exercise 5.1

A growing mid-sized Canadian city is experiencing a housing shortage. (a) Stock-flow diagram. (b) Effect of construction lag on rents. (c) Leverage of upzoning.

Model answer:

(a) Full stock-flow diagram:

Stocks: Housing supply (dwelling units); Population seeking housing (households)

Flows:

  • Into housing supply: Construction completions (rate driven by developer response to price signals, lagged by 3–5 years)
  • Out of housing supply: Demolitions, conversions to non-residential use, unit abandonment
  • Into population: In-migration (driven by employment opportunities and relative affordability)
  • Out of population: Out-migration (driven by unaffordability), mortality/household dissolution

Primary balancing loop: Population growth → housing shortage → rising rents → higher developer returns → construction increases → housing supply grows → shortage eases → rent moderates → in-migration slows. This is the market equilibrium loop; it is balancing but delayed.

Secondary reinforcing loop: Rising prices → speculative investment demand → reduced effective supply available for occupancy → further price rise.

(b) Effect of construction lag on rents:

In response to a step increase in population inflow (say, 5,000 new households arrive in year 0), the rent time series exhibits the oscillation archetype — specifically, the balancing loop with delay pattern.

  • Year 0–3: Vacancy rate falls immediately; rents begin rising. No construction supply response yet (permits must be issued, then construction must complete over 3–5 years).
  • Year 3–6: Construction completions from permits issued at year 1–2 begin to appear. Supply grows. If the population shock was a one-time event, rents begin to moderate.
  • Year 6–10: The supply response may overshoot — developers who committed to projects during the high-price period deliver units into a market that has already partly recovered. If supply exceeds demand, rents fall below the pre-shock level. Completions fall. The cycle repeats.

The archetype sketch is an oscillation around the equilibrium rent level, with period roughly twice the construction lag (6–10 years for a 3–5 year lag). This matches the empirically observed residential rent cycles in Canadian cities.

(c) Leverage of upzoning:

Upzoning primarily affects the construction completions inflow by increasing the potential supply of developable sites at a given location. More specifically, it reduces the per-unit land cost (more units can be placed on a fixed parcel), which increases the developer’s return at any given rent level, lowering the rent threshold at which construction is triggered.

Leverage relative to other interventions:

  • Rent controls (LP 12): Adjust the rent price parameter without changing the supply feedback. Reduce rents for current tenants but reduce developer returns, suppressing the construction inflow. Studies consistently show that rent control reduces long-run supply. Lowest leverage on the affordability problem; potentially negative long-run effect.
  • Foreign buyer taxes (LP 12): Reduce one demand-side flow (speculative purchase from non-residents). Some evidence of short-term price moderation. Does not change the supply feedback structure. Low leverage on structural affordability.
  • Upzoning (LP 10/8): Changes the structure of material flows (what can be built) and indirectly strengthens the balancing loop by lowering the activation threshold for the construction response. This is more structural than LP 12 interventions — it changes what is physically possible, not just the value of a parameter. However, it is not LP 5 or LP 6: developers still respond to price signals, and a zoning change without complementary infrastructure investment may produce paper capacity that is not actually built.

What a LP 6 intervention would look like: Real-time public reporting of vacancy rates, pipeline completions, and permit issuance — changing the information available to developers, renters, and policymakers so that the feedback between shortage and supply response operates with less delay and less uncertainty. Most cities currently publish this data on annual or semi-annual cycles, introducing information delays of 6–12 months into a market that adjusts monthly.


10.5.2 Exercise 5.2

Canadian city scaling law analysis: plot log(GDP) vs log(population). What is β? What does it imply? Explain Ottawa.

Model answer:

(a) Fitting the scaling law:

Using the data provided (in billions CAD and millions of persons):

City Population (M) GDP (bn CAD) log(pop) log(GDP)
Toronto 6.2 480 1.824 2.681
Montreal 4.2 220 1.435 2.342
Vancouver 2.6 180 0.954 2.255
Calgary 1.6 130 0.778 2.114
Ottawa-Gatineau 1.4 90 0.602 1.954
Edmonton 1.5 110 0.699 2.041
Quebec City 0.85 55 0.544 1.740

Fitting a line to log(GDP) = β·log(pop) + constant using ordinary least squares (or visual estimation): the slope β ≈ 1.1–1.2. (A precise OLS fit on these seven points gives approximately β ≈ 1.15.)

(b) β > 1: superlinear scaling

β > 1 means per-capita GDP increases with city size — larger cities are proportionally more productive. This is consistent with agglomeration theory: larger cities generate more face-to-face interactions, thicker labour markets, more knowledge spillovers, and more specialised supplier networks. A city twice as large produces more than twice the economic output. The elasticity of approximately 1.15 means a 10% increase in population is associated with approximately an 11.5% increase in total GDP — and a 1.5% increase in per-capita GDP.

(c) Ottawa-Gatineau as an outlier:

Ottawa-Gatineau plots above the fitted line — its GDP per capita is higher than the scaling law predicts for its population. The mechanism, consistent with agglomeration theory: Ottawa’s primary agglomeration is the federal government. Government employment is: (1) high-wage (federal public service salaries are above private-sector median for equivalent roles), (2) highly stable (no business cycle volatility), and (3) generates thick demand for high-skilled professional services (law, consulting, IT, security clearance work) that are themselves high-wage. The government functions as an anchor institution that creates a specialised labour pool and an institutional ecosystem.

This is agglomeration — but driven by a single dominant institution rather than by general market competition. The prediction: Ottawa is less productive than the scaling law for a purely market-driven city of its size would suggest (government employment generates value but not in the same way that traded sector firms do), but the per-capita wage premium from the federal salary structure inflates measured GDP. The outlier status reflects the type of agglomeration, not its absence.


10.5.3 Exercise 5.3

Dutch Disease: draw the full CLD, label all links, identify all loops.

Model answer:

(a) and (b) Causal loop diagram with all links labelled:

flowchart LR
    RS["Resource Sector\nScale"] -->|"+"| RX["Resource Export\nRevenues"]
    RX -->|"+"| ER["Exchange Rate\n(currency appreciation)"]
    ER -->|"−"| MC["Manufacturing\nCompetitiveness"]
    MC -->|"− [B1]"| RS

    RX -->|"+"| CI["Capital Inflows"]
    CI -->|"+"| ER

    MC -->|"−"| ME["Manufacturing\nEmployment"]
    ME -->|"+"| LS["Labour Supply\nin Mfg"]
    LS -->|"+"| MC

    RS -->|"+"| LM["Labour Demand\nResource Sector"]
    LM -->|"−"| LS

    RS -->|"+ [R]"| RX

Loop identification:

  • Loop B1 (balancing): Resource sector scale → export revenues → exchange rate appreciation → reduced manufacturing competitiveness → reduced manufacturing scale → (reduced pressure on exchange rate, through reduced import competition). The balancing mechanism is partial: as manufacturing declines, some of the upward pressure on the exchange rate is relieved. However, the loop is weak — the resource sector is the dominant driver of exchange rate.

  • Reinforcing loop (R): Resource sector scale → export revenues → capital inflows → further exchange rate appreciation → further decline in manufacturing → labour released from manufacturing flows to resource sector → resource sector scale increases. All steps are positive (or the manufacturing decline frees labour for resource use), making this reinforcing.

  • Labour reallocation loop: Manufacturing employment decline releases labour that can be drawn into the resource sector. This loop is not explicitly shown in a single closed ring but operates through both sectors sharing the same national labour market.

(c) Structural change to avoid Dutch Disease:

A country could avoid Dutch Disease by introducing a sovereign wealth fund mechanism with a forced sterilisation rule: resource export revenues that would otherwise enter the domestic economy (and drive exchange rate appreciation) are sequestered into an offshore sovereign wealth fund. The new link introduced is: resource export revenues → sovereign wealth fund (offshore) → no domestic exchange rate pressure. This severs the link from resource revenues to exchange rate appreciation, preserving manufacturing competitiveness.

Norway’s Government Pension Fund is the canonical example. By investing all oil revenues abroad, Norway’s domestic exchange rate and manufacturing sector were shielded from the resource boom. The structural change is precisely a new information/material flow that reroutes the resource rent away from the domestic economy. This is a LP 5 intervention (rules: a legal requirement to sequester revenues), more durable than any price-level adjustment.


10.5.4 Exercise 5.4

Two-city agglomeration model. (a) Equal populations, no noise. (b) 1% noise, 20 runs, fraction City A > 60%. (c) Double α.

Model answer:

The two-city agglomeration model from Chapter 5 represents each city’s population growth as driven by a reinforcing agglomeration feedback:

\frac{dP_A}{dt} = r \cdot P_A \cdot \left(\frac{P_A}{P_A + P_B}\right)^\alpha - \delta P_A \frac{dP_B}{dt} = r \cdot P_B \cdot \left(\frac{P_B}{P_A + P_B}\right)^\alpha - \delta P_B

(a) Equal populations, zero noise:

When both cities start at exactly equal populations and the model is deterministic, they remain equal forever. By symmetry: if P_A = P_B at t=0, then the right-hand side of both equations is identical at all subsequent times, and neither city gains or loses share. The model converges to equal populations — the system sits at the unstable equilibrium between the two attractor states (City A dominates; City B dominates). This demonstrates that path dependence requires asymmetry to resolve: in a perfectly symmetric world, no agglomeration occurs. The reinforcing loop is present but exactly balanced.

(b) 1% noise, 20 runs:

With 1% random noise added to initial conditions (e.g., P_A = 1000 ± 10, P_B = 1000 with opposite perturbation), the symmetry is broken. Each run resolves to one of the two dominant-city equilibria. Expected result with standard model parameters (α ≈ 1.2, r = 0.05, δ = 0.02): approximately 50% of runs end with City A above 60% of total population, and approximately 50% with City B above 60%. The distribution of final City A shares is bimodal — clustered near 0.1 and 0.9 — not uniform. This is the structural signature of path dependence: outcomes are sensitive to initial conditions, and the system does not find a unique equilibrium.

(c) Doubled agglomeration strength (2α):

Doubling α has two effects: 1. Faster divergence: The reinforcing loop gain is higher. Cities that get even a small initial lead grow faster relative to the lagging city. The time to reach 90% dominance roughly halves. 2. Lower variance of final outcomes: Paradoxically, higher agglomeration strength makes outcomes more predictable in the sense that every run ends in near-complete dominance — the distribution of final City A shares becomes more concentrated near 0 and 1, with less mass near 0.5. The system is more deterministic about where it ends up (one city dominates completely) even though it is more sensitive to initial conditions about which city ends up dominant.

The practical implication: in an economy with strong agglomeration returns (tech hub dynamics, financial centre concentration), policy interventions aimed at directing economic activity to a lagging city must be large relative to the noise in initial conditions to have any chance of reversing the dominant attractor. Small subsidies will be overwhelmed by the reinforcing dynamics. Only interventions that genuinely shift the agglomeration parameter (e.g., a major anchor institution placement, as in the Ottawa example) are likely to produce durable outcomes.


10.5.5 Exercise 5.5

Three leverage points in Alberta oil sector lock-in: (a) low-leverage, (b) medium-leverage, (c) high-leverage, (d) unintended consequence of medium-leverage.

Model answer:

(a) Low-leverage intervention (LP 12 or below feedback structure):

Carbon tax on oil sands production emissions.

What it changes: the cost per barrel of production (raises it slightly, by the carbon price per tonne of CO₂ equivalent). Why the effect is limited: the carbon tax is a parameter adjustment to the revenue-minus-cost equation that drives investment. At moderate carbon prices, the return on investment is reduced but remains positive — the reinforcing loop continues. Production still grows, just slightly less profitably per barrel. The loop structure is unchanged: revenue still drives capital investment, which drives capacity expansion. The political economy also creates a balancing response: industry lobby pressure for carve-outs, exemptions, or competitiveness offsets. The intervention is resisted by the same structures it tries to influence.

(b) Medium-leverage intervention (LP 6 or LP 8 — feedback structure):

Real-time emissions intensity disclosure tied directly to production permits.

What it changes: the information structure available to capital allocators. Currently, investors receive annual emissions reports aggregated by company. A structural change: each production facility reports monthly emissions intensity (tCO₂e per barrel) in a public registry, and renewal of operating permits is automatically conditioned on emissions intensity remaining below a declining benchmark. The feedback loop: higher emissions intensity → permit risk → reduced investor confidence → higher cost of capital → reduced capital available for capacity expansion → emissions intensity pressure.

Why this is more structural than LP 12: it creates an automatic feedback between the environmental outcome and the economic mechanism (capital access). The current structure allows intense lobbying during permit renewal processes; this intervention makes the relationship between emissions performance and permit status algorithmic rather than negotiable, removing the political buffer that allows the reinforcing loop to continue.

Specific feedback loop modified: The link from export revenue to capital investment is now modulated by a new information variable (emissions intensity risk). The balancing loop (emissions intensity → permit risk → capital cost → production rate) is strengthened.

(c) High-leverage intervention (LP 3 — goal of the system):

Legislate a hard end date for oil sands bitumen production (e.g., 2045) and establish a legal trust fund for worker retraining and community transition, funded by current production revenues.

What it requires: the goal of the provincial economic management system changes from “maximise oil sands production for as long as economically viable” to “transition the oil sands economy to a post-bitumen economic structure by a fixed date.” This changes what every downstream management decision is optimised for. Capital allocation decisions, training pipelines, infrastructure investment, R&D priorities — all reorient around the transition goal rather than the expansion goal.

Institutional requirements: Legislation with multi-government party support (to survive electoral cycles), binding commitment of revenues to the transition trust, federal cooperation on employment insurance and retraining programmes. Political resistance: The entire current economic structure of northern Alberta is oriented toward production maximisation. Worker communities, equipment manufacturers, service firms, royalty-dependent municipalities — all have strong interests in the current goal. The resistance is structural, not incidental.

(d) Unintended consequence of the medium-leverage intervention (b):

Carbon leakage and production displacement.

If Alberta’s emissions intensity requirements are tighter than those in competing jurisdictions (Texas, Kazakhstan, Middle East producers), capital flows toward the less-regulated producers. Global oil production may not decline; it simply relocates to producers with lower regulatory costs and, in many cases, higher emissions intensity. Alberta’s reported emissions fall; global emissions do not. This is the classic policy resistance mechanism for LP 6 interventions in a globally integrated commodity market: the information change affects one jurisdiction’s economic decisions while leaving the global reinforcing loop intact.

Monitoring indicator: Global emissions intensity of oil production, tracked against Alberta production market share. If Alberta’s market share falls while its emissions intensity improves but comparable volumes appear in higher-intensity jurisdictions, the carbon leakage mechanism is operating. The corrective action is coordinated international emissions intensity standards (LP 5 at a global level).


10.5.6 Exercise 5.6

Platform loses 20% of users after privacy scandal. (a) Draw network effect and recommendation quality loops. (b) Two feedback dynamics. (c) Three metrics.

Model answer:

(a) Two loops and which links are weakened:

Loop 1: Metcalfe’s Law network effect (Reinforcing):

flowchart LR
    U["Active Users"] -->|"+"| NV["Network Value\n(connections available)"]
    NV -->|"+"| UA["User Acquisition\n(new + returning)"]
    UA -->|"+ [R1]"| U

    style U fill:#f5f5f5,stroke:#111111,stroke-width:2px
    style NV fill:#f5f5f5,stroke:#111111
    style UA fill:#fff3f3,stroke:#d52a2a

Loop 2: Recommendation quality (Reinforcing):

flowchart LR
    U2["Active Users"] -->|"+"| EB["Engagement\nBehavioural Data"]
    EB -->|"+"| MQ["Model Quality\n(recommendation accuracy)"]
    MQ -->|"+"| ENG["User Engagement\n(time on platform)"]
    ENG -->|"+ [R2]"| U2

    style U2 fill:#f5f5f5,stroke:#111111,stroke-width:2px
    style EB fill:#f5f5f5,stroke:#111111
    style MQ fill:#fff3f3,stroke:#d52a2a
    style ENG fill:#fff3f3,stroke:#d52a2a

Links weakened by 20% user loss:

  • R1: Active users → network value. A 20% reduction in users reduces the number of available connections by more than 20% (Metcalfe’s Law: value ∝ n²; a 20% drop in n reduces value by ~36%). Users who joined primarily for the network (to connect with specific communities) now find that network shrunk; their own retention is weakened, potentially triggering further departures.
  • R2: Active users → engagement behavioural data. Fewer users produce less engagement signal, which degrades the recommendation model’s ability to identify relevant content, which reduces recommendation quality, which reduces engagement per remaining user. The data-quality flywheel slows.

(b) Two distinct feedback dynamics:

Recovery scenario (Loop R1 dominates, network effect restores):

The 20% loss was concentrated in a particular demographic (e.g., users who joined primarily for privacy-sensitive sharing). The remaining 80% have high engagement levels and broad social ties within the platform. Network value for these users is still high — their connections mostly remain. Retention is stable. The recommendation engine continues to receive strong signal. New user acquisition, attracted by the remaining strong network, compensates. Over 12–18 months, the active user count recovers to 95% of pre-scandal levels. R1 and R2 both continue operating.

Collapse scenario (Departure reinforcing loop dominates):

The departing 20% were disproportionately high-connectors — influencers, journalists, or community organisers whose presence was the reason other users stayed. Their departure reduces the network value for others, triggering secondary departures. Each wave of departures further reduces value for remaining users. The network effects work in reverse: the same loop that produced growth now produces accelerating decline. R1 is now operating with a negative sign (user loss → reduced value → more user loss). The recommendation engine degrades as engagement data thins. The platform falls toward a low-engagement equilibrium.

(c) Three metrics to distinguish early recovery from collapse spiral:

Metric 1: Cohort retention rate by week-on-platform

What it measures: For each weekly cohort of users who have been on the platform for N weeks, the fraction still active at N+1 weeks. This tracks the “sticky” base independent of gross user counts.

Recovery trajectory: The retention rate stabilises within 3–4 weeks of the scandal’s peak, as users who were going to leave have left and the remaining users are committed. Cohort retention at 4+ weeks returns to pre-scandal baseline within 2 months.

Collapse trajectory: Cohort retention continues declining week over week. Users who had been on the platform for years (highly committed users) begin showing lower retention — a leading indicator that the network value has fallen enough to affect even the most loyal users.

Threshold for escalation: Any cohort with >5 years of tenure showing weekly retention below 95% of pre-scandal baseline.

Metric 2: Connections-per-user for newly active users

What it measures: The average number of connections (friends, followers, communities) that a user joining or re-engaging today can find compared to a user who joined 6 months ago. This tracks network density in real time.

Recovery trajectory: Connections-per-new-user stabilises or begins recovering as departures slow and remaining users maintain their connection graphs.

Collapse trajectory: Connections-per-new-user falls continuously as key connectors and community nodes leave. New users find an increasingly sparse network, reducing acquisition conversion.

Threshold for escalation: 15% or greater decline in median connections-per-new-user from the pre-scandal 90-day baseline.

Metric 3: Recommendation click-through rate per user-hour

What it measures: Recommendation quality as a direct behavioural output. If the model is degrading due to data sparsity, the CTR per user-hour will fall as recommendations become less relevant.

Recovery trajectory: CTR per user-hour holds stable or recovers as the remaining user base provides continued high-quality signal and the recommendation model adapts.

Collapse trajectory: CTR per user-hour falls, indicating model degradation. This triggers a further reduction in engagement, which provides less data, which degrades the model further — the R2 loop in reverse.

Threshold for escalation: 10% decline in CTR per user-hour sustained over 2 consecutive weeks.


10.6 Chapter 6: Data as a System

10.6.1 Exercise 6.1

Production pipeline: 10,000 records/hr ingested, 8,000 records/hr capacity. Three stages. (a) Stock-flow diagram and net accumulation. (b) Sketch trajectory with capacity expansion. (c) Lowering validation strictness.

Model answer:

(a) Stock-flow diagram and net accumulation:

Stock: Backlog of unprocessed records (records)

Inflow: Ingestion rate = 10,000 records/hr (exogenous, controlled by upstream sensor)

Outflow: Processing throughput = 8,000 records/hr (capacity-constrained; three stages in series, each with validated throughput)

Net accumulation rate: 10,000 − 8,000 = +2,000 records/hr

The backlog grows at 2,000 records per hour indefinitely under current conditions. After 24 hours, the backlog is 48,000 records; after one week, it is 336,000 records. The system is structurally out of balance.

flowchart LR
    IN(["Ingestion\n10,000 rec/hr"]) --> V1{"Ingest\nvalve"}
    V1 --> BK["Backlog\n(records)"]
    BK --> V2{"Processing\nvalve"}
    V2 --> OUT([Processed\nrecords])
    CAP(Processing\nCapacity\n8,000 rec/hr) -.->|limits rate| V2
    VALID(Validation\nStrictness) -.->|affects throughput| V2
    ENRICH(Enrichment\nlatency) -.->|slows throughput| V2

    style BK fill:#fff3f3,stroke:#d52a2a,stroke-width:2px
    style V1 fill:#ffffff,stroke:#888888
    style V2 fill:#ffffff,stroke:#888888
    style CAP fill:#f5f5f5,stroke:#111111

(b) Trajectory with capacity expansion (over 6 months):

The archetype is goal seeking with delay — or more precisely, the “fixes that fail” pattern while the expansion is being built.

  • Weeks 1–6 (pre-expansion): Backlog grows linearly at 2,000 records/hr. By week 6, backlog ≈ 840,000 records. The pipeline team deploys short-term mitigations (prioritisation queues, data shedding for low-priority streams) but the structural problem is unresolved.
  • Weeks 6–12 (infrastructure work in progress): No capacity increase yet. Backlog continues growing. If the prioritisation interventions reduce effective ingestion of non-critical records, the growth rate may slow slightly.
  • Weeks 12–18 (new capacity deployed): Processing throughput doubles to 16,000 records/hr. Net flow is now 10,000 − 16,000 = −6,000 records/hr. Backlog begins declining rapidly.
  • Weeks 18–24 (backlog clearing): Backlog declines until it reaches near-zero. The archetype is now goal seeking: the balancing loop (excess capacity reduces backlog, which reduces the gap from zero) is operational. The backlog clears in approximately 140 hours at −6,000/hr from the 840,000+ peak.

Overall shape: rising straight line for 6 months, then declining curve. This is “goal seeking with delay” — the behaviour looks like the oscillation archetype is about to occur, but if management does not overshoot on capacity provisioning, the system settles at the balanced equilibrium without oscillation.

(c) Lowering validation strictness:

Flow affected: The processing throughput (the outflow from the backlog stock). Looser validation means fewer records are rejected or flagged for human review, increasing the rate at which records pass through all three stages.

Stock that deteriorates: The data quality stock — the accumulated integrity and reliability of records in the downstream data warehouse or feature store. Each record that bypasses strict validation introduces a small probability of schema errors, duplicate records, incorrect enrichment, or label corruption into the downstream stock.

Why it makes the long-run problem worse: The symptomatic fix reduces the backlog (short-term relief) at the cost of degrading the downstream data stock. Over time, models trained on the degraded stock will perform less well. When the data quality problem is eventually discovered, the remediation work is larger than it would have been — all records processed under loose validation may need to be re-evaluated, the downstream tables cleaned, and affected model versions retrained. The “fix” bought time at the cost of a larger, more expensive failure downstream. This is the “fixes that fail” archetype: the symptomatic fix (lower strictness) provides short-term relief while the structural problem (insufficient capacity) continues and a side effect (data quality degradation) worsens, eventually creating a second problem that may be harder to resolve than the original.


10.6.2 Exercise 6.2

Fraud detection model, 90-day retraining cycle. Fraudsters adapt every 30 days. (a) CLD with retraining loop. (b) Accuracy trajectory. (c) Risks of 30-day retraining.

Model answer:

(a) Causal loop diagram:

flowchart LR
    FP["Fraud Pattern\nComplexity"] -->|"+"| FA["Fraud Attack\nSuccess Rate"]
    FA -->|"+"| FL["Flagged\nFraud Cases"]
    FL -->|"+"| LB["Labelled\nTraining Data"]
    LB -->|"+"| MQ["Model Quality\n(detection accuracy)"]
    MQ -->|"− [B]"| FA

    FP -->|"+"| DS["Distribution\nShift"]
    DS -->|"−"| MQ

    style FP fill:#f5f5f5,stroke:#111111,stroke-width:2px
    style FA fill:#fff3f3,stroke:#d52a2a,stroke-width:2px
    style MQ fill:#f5f5f5,stroke:#111111
    style DS fill:#fff3f3,stroke:#d52a2a

Retraining balancing loop: Flagged fraud cases → human analyst review → confirmed labels → training data → model retraining → improved model quality → lower fraud attack success rate → fewer cases to flag. This is the primary corrective loop.

Delays within the loop:

  1. Detection delay: Time between a new fraud pattern appearing and the model flagging enough instances for analysts to review (days to weeks, depending on pattern prevalence).
  2. Labelling delay: Analyst review time for confirmed fraud vs. false positive (days to weeks per case).
  3. Retraining delay: Fixed at 90 days by policy — cases flagged after the last retraining window do not improve the model until the next cycle.
  4. Deployment delay: Time between retraining completion and the new model serving production traffic (hours to days, depending on infrastructure).

Total effective delay: approximately 90–120 days from pattern emergence to model improvement.

(b) Accuracy trajectory under 90-day retraining with 30-day adaptation:

The fraud adaptation cycle (30 days) is 3× faster than the retraining cycle (90 days). During the 90-day retraining window:

  • Days 0–30: The recently-retrained model is reasonably effective against patterns it was trained on.
  • Days 30–60: Fraudsters have deployed a new pattern. The model misses it. Attack success rate begins rising. A small number of missed cases are eventually flagged by analysts.
  • Days 60–90: A second new pattern may be emerging. The labelled dataset being accumulated reflects the first new pattern only partially; the second is not yet represented. Model accuracy is declining toward its nadir.
  • Day 90 (retraining): The model is retrained on cases from the past 90 days. It learns the first wave pattern effectively. It may partially learn the second.
  • Days 90–120: Accuracy recovers but does not return to the day-0 level, because fraudsters have continued adapting. Each retraining cycle captures a lagged snapshot of the attack patterns.

Over 12 months (four retraining cycles), the trajectory is a sawtooth: brief recovery at each retraining point followed by rapid decay as fraudsters adapt. The average accuracy across the year is substantially below the peak accuracy immediately after retraining. The long-run trend may be declining if fraudsters’ adaptation capability is improving faster than the model’s training efficiency.

(c) Risks of 30-day retraining:

The 30-day cycle aligns the retraining period with the fraud adaptation cycle. This is an improvement in detection latency. However, new risks emerge:

  1. Training data starvation: With 30-day windows, the labelled training set for each cycle contains fewer cases than the 90-day window. Rare fraud patterns (low volume, high value) may not appear with enough frequency in 30 days to produce a statistically reliable training signal. The model may overfit to frequent patterns and miss low-volume attacks that were detectable over the longer window.

  2. Model instability: More frequent retraining means the model’s decision boundary changes more frequently. Downstream systems (alert routing, case management workflows) calibrated to the previous model’s score distribution may experience unexpected behaviour when the distribution shifts. This requires tighter model monitoring and a more robust deployment infrastructure (canary releases, A/B testing of new vs. old model).

  3. Faster concept drift propagation: If fraudsters can observe the model’s response quickly (by testing small volumes of new patterns and observing which are flagged), a 30-day cycle gives them a shorter experiment window to identify the model’s current blind spots and develop the next adaptation. The retraining loop may be tightening an arms race rather than winning it.

Affected feedback loops: The labelled training data stock is smaller; the model quality balancing loop now has a shorter time constant; the deployment pipeline (a secondary feedback loop involving infrastructure stability) is stressed by higher update frequency.


10.6.3 Exercise 6.3

Video recommendation filter bubble. (a) CLD of content concentration. (b) “Diversity injection” intervention. (c) Detection metric.

Model answer:

(a) Causal loop diagram:

flowchart LR
    WH["Watch History\n(content mix)"] -->|"+"| RS["Recommendation\nSimilarity Score"]
    RS -->|"+"| CR["Content\nRecommended\n(same cluster)"]
    CR -->|"+"| WV["Watch Volume\n(same cluster)"]
    WV -->|"+ [R]"| WH

    WH -->|"−"| CD["Content\nDiversity\n(entropy of mix)"]

    style WH fill:#f5f5f5,stroke:#111111,stroke-width:2px
    style RS fill:#f5f5f5,stroke:#111111
    style CR fill:#fff3f3,stroke:#d52a2a
    style WV fill:#fff3f3,stroke:#d52a2a
    style CD fill:#fff3f3,stroke:#d52a2a,stroke-width:2px

The loop is reinforcing (R): all four links are positive. The sign product is (+)(+)(+)(+) = even number of minus signs (zero) → reinforcing. Content concentration is a runaway process without external intervention.

(b) Diversity injection mechanism:

The intervention modifies the link between content recommended and watch volume in the same cluster. Specifically, it modifies the recommendation generation step: instead of the top 10 recommendations all being from the same cluster, 1 recommendation (10%) is drawn from outside the current cluster at random. This is equivalent to adding a new outflow from the “content recommended same-cluster” stock: a fraction of recommendation slots is diverted to diverse content.

The loop structure after intervention: the reinforcing loop R is weakened but not converted to balancing. Watch volume in the same cluster still grows if the other 90% of recommendations remain cluster-concentrated; the loop gain is reduced by 10%. The loop is still reinforcing — just slower. To make the loop balancing (B), the diversity injection would need to be responsive to the current level of content concentration: the more concentrated the watch history, the higher the diversity injection fraction. This is a feedback rather than a fixed rule — converting from LP 12 (fixed parameter adjustment) to LP 6 (information-driven feedback).

(c) Detection metric for filter bubble formation:

Metric: Spectral entropy of the recommendation distribution

What it measures: The distribution of content categories across a user’s most recent N recommendations (e.g., N = 100 recommendations over the past 30 days). Entropy is high when recommendations are spread across many categories; entropy is low when they are concentrated in one or few.

H = -\sum_{i} p_i \log_2 p_i

where p_i is the proportion of recommendations from category i.

Change over time: - Without filter bubble: H remains relatively stable, with minor fluctuation around the user’s genuine broad interests. - With filter bubble: H declines monotonically as the reinforcing loop concentrates recommendations. H may approach zero in extreme cases (all recommendations from one category).

Threshold for intervention: H falls below a floor calculated as the expected entropy for a user with two primary interests (H_floor ≈ 1.0 bits for two equal categories). Alert triggers: H < 1.0 sustained over three consecutive weekly snapshots. At this point, the user is receiving recommendations that are more concentrated than would be consistent with any realistic two-interest profile.

This metric has the advantage of detecting the structural condition (concentration) before the user experiences its downstream effects (filter bubble isolation from broader discourse). Most platforms measure only watch time and CTR, which detect performance but not the structural driver.


10.6.4 Exercise 6.4

Sentiment model trained 2019–2021, deployed 2023. (a) Three drift mechanisms. (b) Explain sudden drop after 8 months of stability. (c) Redesign monitoring.

Model answer:

(a) Three concept drift mechanisms:

  1. Language shift (data drift): Words and phrases that were strongly positive or negative in 2019–2021 product reviews may have changed connotation by 2023. “Healthy” as a product descriptor meant something specific before the COVID-19 period; by 2023 its associations in consumer language had shifted. The model’s vocabulary associations (the mapping from token to sentiment direction) are stale. This is covariate drift: the distribution of input features (word patterns) has shifted.

  2. Platform-specific discourse shift (prior drift): The base rate of positive vs. negative reviews may have shifted. If the product category experienced significant quality issues or supply chain disruptions in 2022, the underlying distribution of sentiment in consumer reviews shifted toward more negative before the model was deployed. The model was trained on a distribution with perhaps 60% positive reviews; the 2023 distribution may be 45% positive. Even if the model’s classification boundaries were perfect for 2021, the prior shift means the model will over-predict positive sentiment. This is prior probability drift.

  3. New product features and competitive context (label drift / concept drift proper): The features that cause a product to be evaluated positively have changed. In 2019, a phone review might be positive primarily because of battery life. In 2023, it might be positive primarily because of AI feature quality. The underlying concept “positive product experience” has evolved. The model’s decision boundary, which learned the 2019–2021 features that predicted positive sentiment, misaligns with the 2023 features that actually predict it. This is concept drift in the strict sense: the mapping from features to labels has changed.

(b) Causal explanation for sudden drop after 8 months of stability:

The system was near a threshold for 8 months without triggering visible accuracy degradation, then crossed it rapidly. The structural explanation: gradual drift was accumulating in the input distribution, but the model’s errors were non-randomly distributed — they were concentrated in subcategories and product types that were underrepresented in the weekly human-labelled accuracy evaluation sample.

For example: if the weekly evaluation sample drew predominantly from stable, high-volume product categories (consumer electronics), but the gradual drift was concentrated in newly significant categories (AI software products, sustainability-labelled goods), the accuracy metric on the evaluation sample remained high even as in-category accuracy in the drifted subcategories fell significantly.

After 8 months, the drifted subcategories grew in share of total review volume (perhaps a new product launch or a seasonal trend), bringing them above the threshold where their errors began affecting the aggregate accuracy metric. The sudden drop in accuracy did not reflect a sudden change in the world — it reflected a sudden change in which portion of the world the accuracy metric was sampling.

The structural lesson: Aggregate accuracy metrics hide subcategory composition shifts. The tipping point was crossed in the subcategory distribution first; the aggregate metric was a lagging indicator.

(c) Monitoring redesign:

Additional metrics beyond aggregate accuracy:

  1. Population Stability Index (PSI) per feature and feature bucket: Track the distribution of sentiment-relevant features (most positive/negative token distributions) against the training baseline. PSI > 0.2 in any feature cluster signals significant distribution shift before accuracy is affected.

  2. Per-subcategory accuracy stratified by product volume tier: Monitor accuracy separately for high-volume legacy categories and high-growth new categories. The new categories are where drift will appear first; monitoring them explicitly prevents the aggregate metric from masking early drift signals.

  3. Confidence calibration drift: Track the distribution of the model’s confidence scores over time. A well-calibrated model has a stable confidence distribution; a drifting model tends to become over- or under-confident on the new distribution. Significant changes in the proportion of predictions near the decision boundary (confidence 0.45–0.55) signal that the model is uncertain about inputs it was previously confident about — an early warning before accuracy falls.

  4. Label-free drift indicator (embedding distance): Compute the cosine distance between the centroid of each week’s review embeddings and the centroid of the training corpus embeddings. Rising distance indicates the text is semantically drifting away from the training distribution, before any labelled data is needed.

Each metric connects to the causal chain: PSI detects covariate shift before labels are affected; stratified accuracy detects subcategory concentration effects; calibration drift detects model uncertainty under distributional shift; embedding distance detects semantic change upstream of any measurable accuracy impact.


10.6.5 Exercise 6.5

Neural network, loss landscape convex in one direction and flat in another. (a) Gradient descent trajectories. (b) Flat direction corresponds to domain-shifted feature. (c) Concept drift connection.

Model answer:

(a) Gradient descent trajectories:

The loss landscape is described as convex (bowl-shaped) along the primary feature direction and nearly flat along the deployment-relevant feature direction.

Learning rate too high: The gradient in the convex direction is large near the starting point. A high learning rate overshoots the minimum in that direction — the update step carries the parameters past the minimum and up the other side of the bowl. The loss oscillates up and down as successive updates repeatedly overshoot. In the flat direction, the gradient is near zero regardless of learning rate, so no meaningful updates occur there. Behaviour: loss oscillates, does not converge.

Learning rate too low: In the convex direction, updates are small but correctly directed. The loss decreases monotonically but very slowly — many thousands of iterations needed to approach the minimum. In the flat direction, the tiny gradient means updates are effectively zero: the model learns nothing about the deployment-relevant feature. Behaviour: loss decreases slowly and stably, but final model quality is limited by the flat direction.

Approximately optimal learning rate: Updates in the convex direction are large enough to converge in reasonable iterations and small enough not to overshoot. The gradient correctly navigates the bowl. In the flat direction, the optimal update is still effectively zero — the gradient there is nearly zero regardless of learning rate. Behaviour: loss decreases smoothly and converges. But the model’s final performance is determined by what the loss landscape encoded.

(b) Flat direction and domain shift:

The flat direction corresponds to a feature that has low predictive value in the training data but high predictive value for the deployment task. The gradient descent update rule is: move in the direction of the negative gradient of the loss. If a feature’s gradient is near zero in the training loss landscape, gradient descent assigns essentially zero weight to that feature — the algorithm has no signal that the feature matters.

When the deployment distribution makes that feature important, the model has no learned representation for it. The model will perform as if that feature is absent — producing the same prediction regardless of its value. For the deployment task, this is equivalent to ignoring the most important input. The model will fail systematically on exactly the examples where the deployment-relevant feature is the discriminating factor.

This is an instance of the broader principle: a model trained on a loss function that does not represent the deployment objective will be optimised for the wrong thing, regardless of how well the optimisation itself is performed.

(c) Concept drift connection:

The flat landscape direction represents a feature the model has not learned — it is absent from the model’s effective representation of the world. When the deployment distribution shifts to make that feature important, the model’s accuracy falls suddenly despite no change in the model itself.

The accuracy trajectory: stable (the model was never learned to use the flat-direction feature, and the training distribution did not require it), then abruptly degraded (the deployment distribution now requires it). This is the tipping point structure from Chapter 3 applied to model performance: the system appears stable right up until it tips, because the underlying mechanism (the flat-direction feature) was not reflected in any observable it was monitoring.

Retraining on the new distribution: The new training data, drawn from the deployment distribution, will have meaningful gradients in the previously-flat direction. The gradient descent will now update the weights associated with that feature. However: if the model architecture has no mechanism to represent the interaction between the flat-direction feature and other features (e.g., it is a linear model and the relationship is nonlinear), retraining on the new distribution will improve accuracy but not fully close the performance gap. Structural model change (adding representational capacity in the relevant direction) may be required — which is a higher-leverage intervention than parameter retraining.


10.6.6 Exercise 6.6

Land cover classification model for wildfire risk. (a) Three feedback loops. (b) Critical single point of failure. (c) Monitoring protocol. (d) CFS schema change.

Model answer:

(a) Three feedback loops:

Loop 1: Satellite imagery retraining loop

  • Stock maintained: Model accuracy for land cover classification
  • Corrective flow: Retraining on newly labelled Sentinel-2 imagery
  • Delay: Image acquisition (revisit time ~5 days for Sentinel-2) → atmospheric correction and preprocessing (~1–2 weeks) → human validation labelling (~4–8 weeks) → retraining and validation (~2 weeks) → deployment (~1 week). Total: approximately 8–14 weeks from real-world change to updated model.

Loop 2: Wildfire validation feedback loop

  • Stock maintained: Calibration of risk scores against actual fire occurrence
  • Corrective flow: After each fire season, actual fire locations and severities are compared to pre-season risk scores; systematic errors drive recalibration of the classification-to-risk-score mapping
  • Delay: Fire season (May–October) → post-season analysis (November–January) → recalibration and validation → deployment. Total: approximately 6–18 months from model error to correction.

Loop 3: Data freshness monitoring loop

  • Stock maintained: Recency of training data relative to current vegetation state
  • Corrective flow: Automated detection of training data age → trigger for new data acquisition and labelling when freshness threshold is exceeded
  • Delay: Time since last retraining → freshness monitoring cycle (daily or weekly check) → human decision to initiate new labelling campaign → labelling and retraining lead time. Total: 1 day to 1 week detection, plus the retraining lead time above.

(b) Critical single point of feedback starvation:

The most critical single point is the satellite imagery retraining loop (Loop 1), specifically the human validation labelling step. This loop is critical because:

  • It is the only loop that can detect and correct errors driven by actual vegetation change (fire disturbance, logging, land conversion) that occur between the training date and the deployment period.
  • Loop 2 only detects aggregate prediction error after fires have occurred — too late to prevent mis-scored risk in the current season.
  • Loop 3 monitors data age but not data accuracy; it can trigger retraining on stale or shifted data without correcting systematic errors introduced by schema or distribution shift.

If the human validation labelling step is cut (due to budget constraints or staff availability), the retraining loop still runs but on unchecked labels — degraded labelling accuracy produces models that appear to have been updated but contain systematic errors. This is worse than a clean gap: it is feedback contamination, not feedback starvation, and may take longer to detect.

(c) Monitoring protocol for Loop 1:

  • Monitoring frequency: Weekly automated distribution comparison between current Sentinel-2 spectral signatures and the training corpus spectral signatures, stratified by vegetation class.
  • Specific metric tracked: Population Stability Index (PSI) per vegetation class, computed over the spectral band distributions (NDVI, NDWI, B8/B4 ratio, etc.). PSI > 0.2 for any class indicates significant distribution shift.
  • Threshold for escalation: PSI > 0.25 for any class covering more than 5% of the total study area, or PSI > 0.15 in any class designated as high-importance for fire risk (dry grassland, lodgepole pine). Escalation action: initiate a targeted labelling campaign for the affected class within 2 weeks. Also: PSI > 0.20 sustained for 2 consecutive weeks triggers an engineering review of the upstream data pipeline for potential schema or sensor calibration issues.

(d) CFS vegetation classification schema change:

The Canadian Forest Service reclassifying its vegetation schema to add additional shrub subcategories represents label drift — specifically, a change in the label ontology (the definition of what each class means). This is distinct from covariate drift (the imagery has not changed) or prior drift (the underlying frequency of vegetation types has not changed — only the classification system has).

Expected impact without retraining within 12 months:

  • The model’s predictions will continue using the old schema. Outputs labelled as “shrubland (undifferentiated)” now correspond to what the CFS has split into three or more subcategories. Downstream wildfire risk scores that relied on the specific new subcategory distinctions (e.g., particular shrub types that are higher fire-risk) will not benefit from the CFS’s improved taxonomy.
  • Risk scores will systematically misclassify high-risk shrub subcategories as medium-risk (or vice versa), depending on the distribution of subtypes within the old “shrubland” class. This is a systematic bias, not random error — the model is consistently wrong for specific cover types.
  • Any integration between the model’s outputs and CFS databases or reporting systems that use the new schema will fail silently: the model produces outputs that do not match the expected label set.

The impact grows with time as: (a) post-disturbance vegetation recovery in fire-affected areas produces new shrub communities that are disproportionately represented in the new subcategories, and (b) the CFS’s downstream risk planning systems increasingly depend on the new classifications for resource allocation and burn probability modelling.


10.7 Chapter 7: Modelling and Simulation

10.7.1 Exercise 7.1

Emergency medical services and extreme heat events: draw the CLD, identify loops, mark delays, identify which delay reduction helps most.

Model answer:

Causal loop diagram:

flowchart LR
    CV["Call Volume"] -->|"+"| AD["Ambulances\nDeployed"]
    AD -->|"−"| AA["Available\nAmbulances"]
    AA -->|"−"| RT["Response\nTime"]
    RT -->|"+"| CS["Case Severity\non Arrival"]
    CS -->|"+"| HT["Hospital\nTurnaround Time"]
    HT -->|"− [R]"| AA

    CV -->|"+"| DLY1(["Dispatch\nDelay"])
    DLY1 -->|"+"| RT

    HT -->|"+"| DLY2(["Hospital\nHandoff Delay"])
    DLY2 -->|"−"| AA

    style CV fill:#fff3f3,stroke:#d52a2a,stroke-width:2px
    style AA fill:#f5f5f5,stroke:#111111,stroke-width:2px
    style RT fill:#fff3f3,stroke:#d52a2a

Feedback loop identification:

  • Reinforcing loop R1 (the crisis spiral): Call volume → ambulances deployed → reduced available ambulances → longer response times → higher case severity → longer hospital turnaround → further reduction in available ambulances. This is the core crisis dynamic. It is reinforcing because each element amplifies the next: the fewer ambulances available, the worse outcomes get, the longer each unit is tied up, the fewer ambulances are available. Sign product: the loop contains two negative links (deployment reduces availability; availability negatively drives response time) — but the overall circuit has an even number of minus signs (two), which actually makes it reinforcing. The loop amplifies the shortage once it begins.

Delays in the loop:

  1. Dispatch delay: Time between call receipt and ambulance arrival at the scene. Normally 6–10 minutes; can extend to 20+ minutes during surge.
  2. Hospital offload delay (ramping): Time from ambulance arrival at hospital to patient transfer accepted by the hospital team. Can extend to 60–120 minutes during surge (hospital internal capacity is the constraint). This delay keeps units unavailable long after the clinical care is complete.
  3. Call processing and triage delay: At very high call volumes, dispatch queue builds. The first queue is implicit but real.

Which delay reduction helps most:

Hospital offload delay is the highest-leverage target. The reasoning: dispatch delay adds time to each call linearly. Hospital offload delay holds the unit off the road entirely for its duration — effectively removing the ambulance from the available fleet. A 90-minute offload delay is equivalent to a unit completing 1.5 additional calls (at a 60-minute average call cycle). During a heat event, reducing offload time from 90 to 30 minutes effectively increases the functional fleet size by up to 50% without adding any vehicles. The structural intervention is hospital-specific: dedicated ambulance offload teams, advance notification protocols, or divert-to-lower-acuity pathways for stable heat patients. Reducing dispatch delay by the same absolute amount would add minutes back to each call but would not return units to service as early.


10.7.2 Exercise 7.2

Sahel desertification: vegetation-precipitation feedback. (a) Archetype. (b) Stock-flow diagram and DEs. (c) Stable vs. desert trap conditions.

Model answer:

(a) Feedback archetype:

The vegetation-precipitation feedback is a reinforcing loop: reduced vegetation → reduced evapotranspiration → reduced local rainfall → further vegetation loss. This is the “overshoot and collapse” archetype when a reinforcing collapse loop dominates after a threshold is crossed. Before the threshold, a balancing loop (vegetation recovery → evapotranspiration restoration → rainfall recovery) maintains the vegetated state. Past the threshold, the reinforcing degradation loop becomes self-sustaining.

The full archetype is the tipping point structure from Chapter 3, with two stable states: vegetated equilibrium and desert equilibrium.

(b) Stock-flow diagram and differential equations:

Stock: Vegetation cover V (fraction of ground covered, 0–1)

Inflow: Vegetation growth rate (driven by rainfall and current vegetation)

Outflow: Vegetation loss rate (grazing, drought mortality, bare soil erosion)

Exogenous forcing: Rainfall R(t) (treated as an external driver)

flowchart LR
    R_EX(["Rainfall\n(exogenous)"]) --> V1{"Growth\nvalve"}
    V1 --> VC["Vegetation\nCover V"]
    VC --> V2{"Loss\nvalve"}
    V2 --> L(["Vegetation\nloss"])
    VC -.->|evapotranspiration| LP(Local\nPrecipitation)
    LP -.->|feeds back into| V1
    R_EX -.->|also drives| V1

    style VC fill:#f5f5f5,stroke:#111111,stroke-width:2px
    style V1 fill:#ffffff,stroke:#888888
    style V2 fill:#ffffff,stroke:#888888
    style LP fill:#fff3f3,stroke:#d52a2a

Differential equations:

\frac{dV}{dt} = g(V, R_{\text{eff}}) - d \cdot V

where: - V = vegetation cover (fraction) - R_{\text{eff}}(V, R_0) = R_0 + \beta V is the effective local rainfall: exogenous rainfall R_0 plus the vegetation-driven evapotranspiration feedback term \beta V - g(V, R_{\text{eff}}) = r \cdot V \cdot (1 - V) \cdot R_{\text{eff}} is the growth rate (logistic in V, linear in rainfall) - d = vegetation loss rate (mortality + grazing, normalised) - r = intrinsic growth rate per unit rainfall - \beta = evapotranspiration feedback coefficient (how much additional rainfall each unit of vegetation generates)

Simplified form:

\frac{dV}{dt} = r V (1 - V)(R_0 + \beta V) - d V = V \left[ r(1-V)(R_0 + \beta V) - d \right]

(c) Stable vegetated equilibrium vs. desert trap:

Stable vegetated equilibrium: The equilibrium at V = V* > 0 is stable when the vegetation growth rate exceeds the loss rate at V*. The sufficient condition is that exogenous rainfall R₀ is large enough that even without the vegetation-rainfall feedback, some vegetation can establish: r \cdot R_0 > d. The vegetation-rainfall feedback (βV term) then amplifies the initial establishment into a stable high-cover equilibrium.

Formally: at the vegetated equilibrium, dV/dt = 0 and \frac{d}{dV}(dV/dt) < 0 (a stable fixed point). The non-trivial equilibrium V* satisfies:

r(1 - V^*)(R_0 + \beta V^*) = d

Desert trap: When R_0 falls below a critical value, the non-trivial equilibrium V* disappears (the equation has no positive real root). The only equilibrium is V = 0 (the bare desert state). The system cannot recover even if the external stress (drought) is removed, because V = 0 is itself an equilibrium — there is no vegetation to drive the evapotranspiration feedback, so effective rainfall remains at R₀, which is below the threshold needed to establish vegetation from bare ground. The desert state is self-maintaining: a tipping point has been crossed from the other side.

Conditions for the desert trap: R_0 < \frac{d}{r} - \beta \cdot V^*_{\text{critical}}

In practice, hysteresis means the rainfall level at which a vegetated system transitions to desert is higher than the rainfall level at which a desert system would recover to vegetated cover — because the recovery path lacks the vegetation feedback that the original system had. Policy implication: preventing the crossing is far cheaper than recovering from it.


10.7.3 Exercise 7.3

Glacier simulation with temperature forcing: T(t) = 0.025·year. Ablation L(M,T) = L₀ + α(M₀−M) + γT, γ = 2.0 Gt/yr/°C.

Model answer:

The simulation below extends the Chapter 7 glacier model with the temperature-driven ablation term described in the exercise.

"""Glacier simulation with temperature forcing — Chapter 7 Exercise 7.3.
Adds a linearly increasing temperature anomaly T(t) = 0.025 * year.
Ablation: L(M, T) = L0 + alpha*(M0 - M) + gamma * T
gamma = 2.0 Gt/yr/°C
Three scenarios from exercise text."""
import numpy as np
import matplotlib.pyplot as plt

M_0 = 1000.0    # reference ice mass (Gt)
M_INIT = 1000.0
T_END = 200.0
DT = 0.1
GAMMA = 2.0

steps = int(T_END / DT) + 1
t_arr = np.linspace(0, T_END, steps)


def run_glacier_forced(A, L0, alpha, gamma=GAMMA):
    M = np.empty(steps)
    M[0] = M_INIT
    for i in range(1, steps):
        year = t_arr[i]
        T_anom = 0.025 * year
        ablation = L0 + alpha * (M_0 - M[i-1]) + gamma * T_anom
        dM_dt = A - ablation
        M[i] = max(0.0, M[i-1] + dM_dt * DT)
    return M


# Scenario (a): accumulation-dominant (A=52, L0=45)
M_a = run_glacier_forced(A=52, L0=45, alpha=0.05)

# Scenario (b): slow retreat (A=45, L0=50, alpha=0.03)
M_b = run_glacier_forced(A=45, L0=50, alpha=0.03)

# Scenario (c1): strong feedback (alpha=0.10)
M_c1 = run_glacier_forced(A=45, L0=50, alpha=0.10)

# Scenario (c2): weak feedback (alpha=0.03, same as b)
M_c2 = M_b  # reuse

# Find year of sign change in dM/dt for scenario (a)
for i in range(1, steps):
    year = t_arr[i]
    T_anom = 0.025 * year
    dM = 52 - (45 + 0.05 * (M_0 - M_a[i-1]) + GAMMA * T_anom)
    if dM < 0:
        print(f"(a) Net change switches negative at year {year:.1f}")
        break

# Find year where M* < 0 for scenario (b): equilibrium formula
# M* = M0 - (A - L0 - gamma*T) / alpha
# M* < 0 when: M0 < (A - L0 - gamma*T) / alpha
# i.e. alpha*M0 < A - L0 - gamma*T  → gamma*T > A - L0 - alpha*M0
# T > (A - L0 - alpha*M0) / gamma
# With A=45, L0=50, alpha=0.03, M0=1000:
# T > (45 - 50 - 0.03*1000) / 2.0 = (-5 - 30) / 2.0 = -17.5
# T is always positive, so M* < 0 from year 0 in this configuration.
# More carefully: the equilibrium including T forcing:
# 0 = A - L0 - alpha*(M0 - M*) - gamma*T
# M* = M0 - (A - L0 - gamma*T) / alpha
# M* < 0 when M0 < (A - L0 - gamma*T) / alpha → (A - L0 - gamma*T)/alpha > M0
# With A=45, L0=50: A-L0 = -5. gamma*T > 0. So numerator is (-5 - gamma*T) < 0.
# Negative / positive alpha = negative M*. So M* < 0 for all T > 0.
# The glacier has no stable positive equilibrium under any temperature forcing here.
# The relevant question becomes: at what year does the simulated M reach zero?
for i in range(1, steps):
    if M_b[i] == 0.0:
        print(f"(b) Simulated mass reaches zero at year {t_arr[i]:.1f}")
        break
else:
    print(f"(b) Mass at year {T_END}: {M_b[-1]:.1f} Gt")

print(f"\n(c) Mass remaining at year 200:")
print(f"  Strong feedback (alpha=0.10): {M_c1[-1]:.1f} Gt")
print(f"  Weak feedback (alpha=0.03):   {M_c2[-1]:.1f} Gt")

Analytical answers:

(a) Year when net change switches from positive to negative (A=52, L₀=45, α=0.05):

The net flow is \dot{M} = 52 - 45 - 0.05(1000 - M) - 2.0 \cdot 0.025 \cdot t

At t=0 and M=1000: \dot{M} = 52 - 45 - 0 - 0 = +7 Gt/yr (accumulation dominant).

As t increases, the temperature forcing term 2.0 \times 0.025t = 0.05t grows linearly. Net flow = 0 when 7 - 0.05t = 0, i.e., t ≈ 140 years. (This is approximate and ignores the albedo feedback’s modification as M changes, but the linear approximation is accurate near M₀.)

(b) Year when equilibrium M* falls below zero (A=45, L₀=50, α=0.03):

The equilibrium is M^* = M_0 - \frac{A - L_0 - \gamma T}{\alpha} = 1000 - \frac{-5 - 2T}{0.03}.

At T=0: M^* = 1000 - \frac{-5}{0.03} \approx 1000 + 167 = 1167 Gt — but the glacier starts at 1000 and M* > M₀ means the glacier is already retreating. The equilibrium falls to 0 when \frac{-5 - 2T}{0.03} = 1000, i.e., -5 - 2T = 30, i.e., T = -17.5°C — a negative temperature anomaly. This means M* < 0 for all positive T, confirming that the slow-retreat scenario with temperature forcing has no stable positive equilibrium. The glacier collapses to zero; the timing depends on the initial trajectory. Simulation indicates collapse around year 80–100 with these parameters.

(c) Strong vs. weak albedo feedback with temperature forcing:

Strong feedback (α=0.10) accelerates the collapse compared to weak feedback (α=0.03). The reason: as temperature forcing pushes M below M₀, the albedo feedback term α(M₀−M) adds additional ablation. With strong feedback, this amplification is larger per unit of mass loss. The temperature forcing therefore interacts multiplicatively with the internal feedback: each degree of forcing produces more additional ablation when α is high. The timing of runaway is earlier with strong feedback — the two drivers reinforce each other. This implies that glaciers in environments with stronger albedo feedbacks (lower albedo contrast between ice and exposed terrain) are more sensitive to the same external temperature forcing.


10.7.4 Exercise 7.4

Validation of the Chapter 4 carbon cycle simulation. (a) Structural validation test. (b) Behavioural validation test. (c) Sensitivity analysis.

Model answer:

(a) Structural validation:

The three-box carbon cycle model contains three stocks (atmosphere A, surface ocean O_s, land biosphere B) with flows governed by the partial pressure difference (for ocean exchange) and net primary productivity / respiration (for land).

Feedback loops the model should reproduce:

  1. Ocean uptake balancing loop: As atmospheric CO₂ rises, the partial pressure gradient (atmosphere−ocean) increases, driving more ocean uptake, which reduces atmospheric CO₂. If this loop is present, the model should show slower atmospheric accumulation than a simple reservoir model without ocean exchange.

  2. Land biosphere CO₂ fertilisation effect (reinforcing): Higher atmospheric CO₂ increases photosynthetic uptake by some fraction (CO₂ fertilisation). This loop partially offsets anthropogenic emissions. If present, the model should show land biosphere carbon stock growing slowly as atmospheric CO₂ rises.

How to verify: The structural test is to remove each loop in turn (set ocean uptake flux to zero; set CO₂ fertilisation coefficient to zero) and observe whether the qualitative atmospheric trajectory changes as expected. Removing ocean uptake should make the atmospheric stock rise faster; removing CO₂ fertilisation should also make it rise faster (less biospheric uptake). If removing a loop has no effect, that loop is not operating in the model — a structural error.

(b) Behavioural validation:

Reference mode: The Keeling Curve — atmospheric CO₂ from 1958 to present, showing both the annual sawtooth (seasonal land biosphere breathing) and the secular long-run rise from approximately 316 ppm to 424 ppm (as of 2024).

Historical data to use: NOAA Mauna Loa monthly CO₂ measurements, 1958–present. Also: ice core CO₂ records (EPICA, Vostok, Law Dome) to validate the 1750–1958 period. Historical fossil fuel emissions inventory (Global Carbon Project).

Test: From a 1750 initialisation with pre-industrial parameters, run the model to 2023 with historical emission trajectories as forcing. The atmospheric stock should: (i) remain near 280 ppm from 1750 to 1850 (industrial emissions are small); (ii) begin rising in the late 19th century; (iii) show approximately 420 ppm by 2023. If the model only reproduces this from one specific set of parameter values (not from a range), this indicates curve-fitting, not validation.

(c) Sensitivity analysis (qualitative):

i. Doubling ocean uptake rate:

Would this change the qualitative conclusion that CO₂ continues to rise? No, if anthropogenic emissions continue at current rates. Doubling ocean uptake would slow the rate of atmospheric accumulation, but not reverse it. Anthropogenic emissions (~10 GtC/yr) currently exceed all natural sinks combined (~5 GtC/yr net). Even doubling the ocean uptake (adding ~2.5 GtC/yr) leaves a net atmospheric accumulation of ~2.5 GtC/yr. Atmospheric CO₂ continues to rise. The qualitative conclusion is not sensitive to this parameter.

ii. Halving the land biosphere carbon stock:

Would this change the qualitative conclusion? Potentially yes, as a structural change if interpreted as reducing the land biosphere’s capacity to absorb CO₂ (smaller stock → faster saturation of the CO₂ fertilisation effect → less uptake over time). In the model, if the land biosphere sink weakens because the stock is smaller, atmospheric CO₂ rises faster. This could change the quantitative trajectory but not the qualitative conclusion (still rising). However, if the halved stock represents a scenario where the land biosphere has transitioned from a carbon sink to a carbon source (Amazon dieback, permafrost emissions), the atmospheric accumulation rate would be significantly higher. The qualitative conclusion may not change (still rising) but the timing of any threshold crossings would be materially earlier.

iii. Removing the fossil fuel emission inflow entirely:

Yes, this would change the qualitative conclusion. Without fossil fuel emissions, the pre-industrial system was near equilibrium. Natural sinks (ocean uptake, biosphere uptake) were approximately balanced by natural sources (volcanic outgassing, respiration, decomposition). Removing the anthropogenic inflow returns the forcing structure to near-equilibrium. Atmospheric CO₂ would stabilise, and then decline slowly as the ocean continues absorbing the current atmospheric excess (which is approximately 130 ppm above the pre-industrial equilibrium). The system would eventually return toward ~280 ppm, though on a timescale of centuries to millennia depending on ocean circulation. The qualitative conclusion reverses: CO₂ would fall rather than continue rising.


10.7.5 Exercise 7.5

Identify the failure mode in each model scenario and describe the structural fix.

Model answer:

(a) Hospital bed capacity model missing healthcare worker availability:

Failure mode: Wrong boundary — the dominant feedback loop (worker availability → effective bed capacity) is outside the model boundary.

The model assumes bed capacity translates directly to patient throughput. In reality, beds without staff are useless. When bed capacity doubles, staffing must also double for the throughput to double. If staffing is not modelled (treated as unconstrained), the model predicts throughput ∝ beds, which fails the behavioural validation test (the administrator doubles capacity and sees no improvement).

Structural fix: Add healthcare worker availability as a second stock. Inflow: hiring and training (slow — months to years for trained clinical staff). Outflow: attrition, burnout during surge events. Add a balancing loop: bed occupancy → staff workload → staff burnout/turnover → reduced effective staffing → reduced effective throughput. The model then correctly predicts that doubling bed capacity without a proportional increase in staffing produces little improvement in throughput — because the constraint is workers, not beds.

(b) Aquifer depletion model with constant extraction and recharge rates:

Failure mode: Missing feedback loops — specifically, the feedback from water table depth to pumping costs, and the feedback from extraction to aquifer pressure (affecting recharge).

With both rates constant, the model is a simple linear stock-flow equation: water table rises if recharge exceeds extraction, falls if extraction exceeds recharge. If the rates are equal, it predicts stable water levels. But empirically, levels fall continuously.

The missing mechanisms: 1. Feedback from extraction to recharge: Heavy pumping induces land subsidence and compacts aquifer layers, permanently reducing hydraulic conductivity and therefore the recharge capacity. Recharge rate is not constant — it is a declining function of cumulative extraction. 2. Feedback from water table to extraction: As water table falls, pumping depth increases and some marginal wells become uneconomical — but modern technology and subsidies have historically offset this, making the effective extraction rate insensitive to depth (a severed balancing loop). The constant extraction assumption reflects the current institutional structure, not the physical optimum.

Structural fix: Model recharge as a function of cumulative extraction (declining with subsidence). Add a balancing loop: water table depth → pumping cost → marginal well economics → extraction rate. This loop may be structurally weak (subsidies weaken it), which the model should then represent explicitly.

(c) Social media engagement model with exogenous recommendation:

Failure mode: Missing the dominant reinforcing loop — the feedback from engagement history to recommendation is the mechanism that generates the filter bubble and engagement amplification behaviour. Treating recommendation as exogenous removes this loop from the model entirely.

Without the recommendation feedback, the model can describe how engagement responds to a given recommendation policy but cannot predict what the recommendation system will recommend, or why engagement concentrates over time. It is a model of user response to an external input, not a model of the co-evolving recommendation-engagement system.

The loop that must be added: Engagement → training signal → recommendation model update → recommended content → user exposure → engagement (the reinforcing loop from Exercise 6.3). Without this loop, the model cannot reproduce: (i) filter bubble formation, (ii) content amplification dynamics, (iii) the self-reinforcing nature of viral content spread, or (iv) the trajectory of engagement concentration over time.


10.7.6 Exercise 7.6

Design a coral reef recovery model: (a) behaviour of concern and reference mode, (b) model boundary, (c) CLD, (d) differential equations, (e) sensitive parameters.

Model answer:

(a) Behaviour of concern and reference mode:

Behaviour of concern: Under what combinations of thermal stress level, fishing pressure, and active restoration intervention does a bleached coral reef recover to high coral cover — and what fraction of bleaching events result in phase shifts to algae-dominated states rather than recovery?

Reference mode: Coral cover as a function of time following a bleaching event, under three scenarios: (1) recovery (coral cover returns to >50% within 5–10 years), (2) stalled recovery (coral cover stabilises at 20–30%), (3) phase shift (coral cover falls to <5% and algae cover rises to >60%). All three patterns have been documented in the literature (e.g., Great Barrier Reef bleaching events of 1998, 2016, 2017). The model must be able to reproduce all three from different parameter regimes.

(b) Model boundary:

Endogenous stocks (explained by the model):

  • Coral cover C (fraction of available substrate)
  • Algae cover A (fraction of substrate)
  • Grazer biomass G (herbivorous fish and urchin population)
  • Thermal stress S (degree heating weeks accumulated)

Exogenous inputs (treated as given):

  • Thermal stress forcing (SST anomaly, treated as an external climate driver)
  • Nutrient loading rate (agricultural runoff, treated as a parameter)
  • Fishing pressure on grazers (controlled externally by management)
  • Restoration intervention (larval seeding rate, modelled as an additional inflow to coral cover)

Explicitly excluded variables and justification:

  1. Oceanic circulation patterns: These affect thermal stress delivery but operate at spatial scales that dwarf the reef scale. Treating SST anomaly as exogenous is appropriate for a single-reef management model; a global model would need this but adds enormous complexity without improving the management recommendation.

  2. Coral species composition: Different coral species have different thermal tolerances and growth rates. A species-resolved model would be more accurate but requires species-level parameters that are rarely available, and the management question (restore vs. wait) does not require species-level resolution. The aggregate coral cover stock captures the load-bearing dynamics.

(c) Causal loop diagram:

flowchart LR
    C["Coral Cover C"] -->|"+"| GH["Grazer Habitat\nQuality"]
    GH -->|"+"| GB["Grazer Biomass G"]
    GB -->|"+"| AG["Algae Grazing\nRate"]
    AG -->|"−"| AL["Algae Cover A"]
    AL -->|"− [R1]"| C

    AL -->|"+"| BS["Bleaching /\nSmothering"]
    BS -->|"− [R2]"| C

    S["Thermal Stress S"] -->|"+"| BS
    S -->|"+"| CM["Coral Mortality\nRate"]
    CM -->|"−"| C

    C -->|"+"| CR["Coral Recruitment\nRate"]
    CR -->|"+ [B]"| C

    style C fill:#f5f5f5,stroke:#111111,stroke-width:2px
    style AL fill:#fff3f3,stroke:#d52a2a
    style S fill:#fff3f3,stroke:#d52a2a,stroke-width:2px
    style BS fill:#fff3f3,stroke:#d52a2a

Loops:

  • R1 (healthy state self-sustaining): Coral cover → grazer habitat → grazers → algae suppression → coral recruitment (in reality closes through: suppressed algae → open substrate for coral larvae → increased coral cover). Sign product through coral-habitat-grazer-algae-coral: even minus signs → reinforcing.
  • R2 (degraded state self-sustaining): Algae cover → bleaching/smothering → coral decline → more open substrate for algae. The degraded state is its own attractor.
  • Balancing loop B: Coral cover → recruitment rate → coral cover. Self-repair loop when stress is removed.

(d) Differential equations for the two most important stocks:

Coral cover C:

\frac{dC}{dt} = r_C \cdot C \cdot (1 - C - A) - m_C(S) \cdot C - \phi \cdot A \cdot C + \text{Restoration}

where: - r_C = coral growth rate (yr⁻¹) - (1 - C - A) = available substrate fraction - m_C(S) = m_0 + \delta \cdot S = thermal stress–dependent mortality rate - \phi = algae-mediated coral mortality coefficient (smothering, allelopathy) - Restoration = larval seeding inflow (management parameter)

Algae cover A:

\frac{dA}{dt} = r_A \cdot A \cdot (1 - C - A) - G(t) \cdot A

where: - r_A = algae growth rate (yr⁻¹) — typically faster than coral - G(t) = G_0 \cdot C / (C + k_G) = grazing rate as a function of grazer biomass (linked to habitat quality via coral cover; half-saturation constant k_G)

These two equations capture the competition for substrate (the 1 - C - A term) and the biological interactions (grazing, thermal mortality) that drive the regime shift.

(e) Most sensitive parameters:

The model is most sensitive to:

  1. Thermal stress mortality coefficient δ (in m_C(S)): This parameter determines whether a bleaching event is survivable or lethal. Small changes in δ determine whether the same thermal forcing produces a recoverable bleaching or a phase-shift collapse. If δ is wrong by a factor of two, the model’s prediction changes from “reef recovers with intervention” to “reef collapses regardless of intervention.” This parameter must be estimated from empirical bleaching-mortality relationships for the specific reef system.

  2. Grazing rate coefficient G₀: The effectiveness of grazer-mediated algae control is the primary mechanism of the healthy-state self-sustaining loop. If G₀ is overestimated, the model will predict recovery under fishing pressures where real reefs cannot recover. If underestimated, it will recommend restoration when natural recovery would have occurred. G₀ must be calibrated to the pre-disturbance grazer population and fishing history of the specific reef.

  3. Algae growth rate r_A relative to coral growth rate r_C: The ratio r_A/r_C determines which competitor wins on open substrate. If algae is too fast relative to coral, the model predicts a phase shift from any bleaching event. If too slow, the model predicts unrealistically easy recovery. Empirical estimates for Indo-Pacific reefs suggest r_A ≈ 3–5 × r_C, but this varies significantly by nutrient regime.


10.8 Chapter 8: Systems Intervention

10.8.1 Exercise 8.1

Groundwater depletion driven by irrigation. Technology reduces pumping costs faster than depletion increases them. (a) CLD. (b) Leverage point of technology improvement. (c) LP 6 information intervention.

Model answer:

(a) Causal loop diagram:

flowchart LR
    WP["Water Price\n(low)"] -->|"+"| II["Irrigation\nIntensity"]
    CP["Crop Price\n(high)"] -->|"+"| II
    II -->|"+"| AD["Aquifer\nDepletion Rate"]
    AD -->|"+"| PD["Pumping\nDepth"]
    PD -->|"+"| PC["Pumping Cost"]
    PC -->|"− [B]"| II

    TECH["Technology\nImprovement"] -->|"−"| PC

    AD -->|"−"| WT["Water Table\nLevel"]
    WT -->|"−"| PD

    style WT fill:#fff3f3,stroke:#d52a2a,stroke-width:2px
    style PC fill:#f5f5f5,stroke:#111111
    style TECH fill:#fff3f3,stroke:#d52a2a
    style II fill:#fff3f3,stroke:#d52a2a

Loop identification:

  • Balancing loop B1: Irrigation intensity → depletion → pumping depth → pumping cost → reduced irrigation intensity. This is the corrective loop that should limit extraction as the aquifer depletes.
  • Technology bypass: Technology improvement → reduced pumping cost. This severs the balancing loop by eliminating the cost signal that should reduce irrigation intensity as depth increases.

(b) Leverage point of technology improvement — and why it makes the problem worse:

Technology improvement is operating at LP 12 (parameters) — specifically, it is continuously lowering the pumping cost parameter. In Meadows’ hierarchy, LP 12 is the least effective place to intervene for structural change.

It makes the depletion problem worse because it weakens the balancing loop (B1) that is the only natural corrective mechanism for depletion. The balancing loop B1 was supposed to reduce irrigation intensity as depletion increased pumping costs. By keeping costs low regardless of depth, technology removes this corrective signal. Farmers rationally continue pumping at high intensity because the cost signal — the feedback that should tell them the aquifer is running out — has been suppressed. The result is the “tragedy of the commons” pattern: each individual farmer optimises rationally; the aggregate outcome is collective resource exhaustion.

This is an example of a well-intentioned intervention (making agriculture more efficient) inadvertently weakening the only balancing feedback that could prevent collapse. The engineer who developed the pump efficiency improvement was not operating within the systems model of the aquifer. They were solving the immediate problem (cost reduction) without awareness of the feedback structure they were changing.

(c) LP 6 information intervention:

The information structure change: Require each farm’s permitted annual irrigation volume to be automatically and publicly linked to a real-time sensor network measuring the aquifer’s piezometric surface elevation, updated monthly. When the water table falls below a threshold, the permitted volume for that extraction zone automatically declines according to a pre-published formula — not by negotiation, not by regulatory review, but algorithmically based on sensor data.

Why this is LP 6 (information structure): It changes who has access to what information, and when. Currently, farmers receive water bills at the end of the season and aquifer level data through annual reports. The gap between depletion signal and farming decision is 6–18 months. The proposed change makes the aquifer level available to every farmer in real time, embedded directly in their operating constraint (permitted volume). They receive the feedback signal immediately and at the decision point (planning the irrigation schedule), not retrospectively.

Why it does not require a government mandate: The permitted volume is already a regulatory instrument. The structural change is to make its value dynamically linked to aquifer health rather than set by annual negotiation. No new enforcement is required — the constraint is automatic. Farmers whose permitted volume decreases as the aquifer falls have no one to lobby because the number is generated by a sensor, not by a bureaucratic process. This is the LP 6 property: information embedded in the decision structure changes behaviour without requiring continued enforcement.


10.8.2 Exercise 8.2

Aral Sea: irrigation diversion as deliberate intervention. (a) LP of diversion. (b) Higher-LP alternative. (c) LP of northern dam restoration.

Model answer:

(a) Leverage point of the Soviet irrigation diversion:

The diversion of the Amu Darya and Syr Darya rivers from the Aral Sea to cotton irrigation fields was applied at LP 10 (structure of material flows). It physically changed the routing of the water flow — a material flow structure change, not a parameter adjustment (LP 12) and not a feedback structure change (LP 6–8). New canals were built; water that previously flowed to the Aral now flows to cotton fields. This is an infrastructure change, which LP 10 describes.

LP 10 is the third-lowest leverage point on Meadows’ hierarchy — structurally significant (it created a new material flow pathway that had not existed before), but still in the physical layer. It did not change the goals of the Soviet cotton production system (LP 3), the rules under which water was allocated (LP 5), or the information available to water managers about the Aral’s declining levels (LP 6). The diversion was a massive engineering intervention at low leverage for systemic sustainability because it left intact every feedback structure that would generate overconsumption.

(b) Higher-leverage alternative intervention:

LP 5 (rules): Establish a legally binding minimum environmental flow for the Amu Darya and Syr Darya before any irrigation rights are allocated.

This is a rule change — a prior-allocation rule that places the Aral Sea’s minimum inflow requirements above all irrigation allocations. Such a rule would have embedded the ecological constraint directly in the governance structure, making it resistant to individual economic pressure and removing the need for annual negotiation over water allocations.

More durably: LP 3 (goals): Redefine the regional development goal from “maximise cotton output” to “maintain the Central Asian water system in a condition that supports long-run agricultural productivity.” This goal change would have required fundamentally different decisions at every level — irrigation technology, crop mix, total irrigated area. It would have been far harder to achieve politically (LP 3 interventions require paradigm-level changes in how goals are defined), but it would have been far more durable than any flow diversion could be, because the corrective pressures from every other feedback in the system would have been aligned with rather than against the ecological goal.

(c) LP of the northern Kazakh dam restoration:

The Kok-Aral dam, completed by Kazakhstan in 2005, restored inflows to the northern (Small) Aral Sea by physically retaining water inflow with a dam structure that prevented the water from draining into the larger southern basin.

This is LP 10 (structure of material flows) — the same leverage point as the original diversion. A new physical infrastructure piece was built to restore a partial flow structure. It is more durable than the original diversion in one important sense: the dam is operated by Kazakhstan for Kazakh interests (the northern Aral is within Kazakh territory), so the political economy of its maintenance is more aligned with its conservation purpose. However, it does not change the rules (LP 5) of water allocation upstream, does not change the goals (LP 3) of Uzbek agricultural policy, and does not address the flows to the southern (Uzbek) Aral at all.

The northern restoration is less durable than a fully structural intervention (LP 5+) because it depends on continued Kazakh maintenance investment and does not prevent continued decline of the southern basin. It is a physical fix at LP 10 that addresses symptoms (water level in the north) without touching the structural cause (LP 3/5 water allocation governance for the entire basin).


10.8.3 Exercise 8.3

Add Allee effect to fishery simulation. (a) Conditions for true collapse. (b) Modified HCR with F_floor = 200. (c) HCR design requirements for depensation stocks.

Model answer:

The Allee effect (depensation) modifies the biological growth term so that below a minimum viable population F_min, effective growth rate falls toward zero:

"""Fishery simulation with Allee effect — Chapter 8 Exercise 8.3.
Modifies the Gordon-Schaefer model growth term to include depensation."""
import numpy as np
import matplotlib.pyplot as plt

R = 0.30; K = 1000.0; Q = 0.0012; PRICE = 3.0; UNIT_C = 0.50
PHI = 0.50; F_0 = 800.0; E_0 = 80.0; T_END = 80.0; DT = 0.05
F_MIN = 100.0   # Allee threshold (minimum viable population)

MSY = R * K / 4
F_MSY = K / 2
F_OA_STANDARD = UNIT_C / (PRICE * Q)

HCR_HMAX = 0.65 * MSY
HCR_FTGT = 500.0
HCR_FFLR_STANDARD = 150.0
HCR_FFLR_HIGH = 200.0   # Modified HCR floor for part (b)

STEPS = int(T_END / DT)
T = np.arange(STEPS) * DT


def growth_with_allee(F, r_eff=None):
    """Logistic growth modified by Allee effect below F_MIN."""
    if F <= F_MIN:
        # Depensation: growth rate falls to zero at F_MIN, negative below
        r_eff = R * max(0.0, (F - F_MIN) / (K / 2 - F_MIN))
    else:
        r_eff = R
    return r_eff * F * (1.0 - F / K)


def hcr_func(F, F_floor):
    if F >= HCR_FTGT:
        return HCR_HMAX
    elif F >= F_floor:
        return HCR_HMAX * (F - F_floor) / (HCR_FTGT - F_floor)
    else:
        return 0.0


def run_scenario_allee(scenario, F_floor=HCR_FFLR_STANDARD):
    """
    scenario 2 = open access, scenario 3 = HCR.
    """
    F, E = F_0, E_0
    rec_F = np.empty(STEPS); rec_F[0] = F
    rec_H = np.empty(STEPS)

    for i in range(1, STEPS):
        g = growth_with_allee(F)

        if scenario == 2:
            H = Q * E * F
            dE = PHI * E * (PRICE * Q * F - UNIT_C)
        else:  # HCR
            H = min(Q * E * F, hcr_func(F, F_floor))
            dE = PHI * E * (PRICE * Q * F - UNIT_C)

        F = max(0.0, F + (g - H) * DT)
        E = max(0.0, E + dE * DT)
        rec_F[i] = F
        rec_H[i] = H

    return rec_F, rec_H


# Run scenarios
F_open, H_open = run_scenario_allee(scenario=2)
F_hcr_std, H_hcr_std = run_scenario_allee(scenario=3, F_floor=HCR_FFLR_STANDARD)
F_hcr_high, H_hcr_high = run_scenario_allee(scenario=3, F_floor=HCR_FFLR_HIGH)

print(f"Open access final stock: {F_open[-1]:.1f} kt")
print(f"HCR standard floor (150) final stock: {F_hcr_std[-1]:.1f} kt")
print(f"HCR high floor (200) final stock: {F_hcr_high[-1]:.1f} kt")

(a) Conditions for true stock collapse to zero in open-access scenario:

True collapse (F → 0) occurs when the open-access equilibrium F_OA falls below the Allee threshold F_min. In the standard model without the Allee effect, open-access equilibrium is F_OA = UNIT_C/(PRICE × Q) ≈ 139 kt — above F_min = 100. The stock stabilises at 139, not at zero.

With the Allee effect: as F falls below F_min = 100, growth rate becomes negative (or zero), meaning the stock cannot recover even at zero harvest. If F_OA < F_min, the stock trajectories through F_min with a net negative rate and continues to zero.

The conditions: F_OA < F_min, i.e., UNIT_C/(PRICE × Q) < F_min = 100. This occurs when: - UNIT_C is lower (cheaper fishing technology): lower costs → higher effort → lower F_OA. If UNIT_C falls to 0.3 (from 0.5), F_OA = 0.3/(3.0 × 0.0012) ≈ 83 < 100. True collapse occurs. - PRICE is higher (scarcity premium during stock depletion): higher prices → more effort → lower F_OA. With PRICE = 4.0, F_OA = 0.5/(4.0 × 0.0012) ≈ 104 — still above threshold. With PRICE = 5.0: F_OA ≈ 83 < 100. True collapse.

Combined effect: With both lower UNIT_C (0.3) and the Allee effect, the open-access scenario produces complete stock collapse regardless of the initial stock level, because the equilibrium is below the minimum viable population.

(b) Modified HCR with F_floor = 200:

Setting HCR_FFLR = 200 (well above the Allee threshold of 100) means the HCR begins reducing harvest well before the stock approaches the danger zone. When F falls below 200, harvest is reduced proportionally; below 200 and above 150 in the standard HCR, the reduction begins only when the stock is dangerously close to the Allee threshold.

Does it prevent collapse where the standard HCR fails?

Yes, for moderate parameter combinations. With PHI = 0.5, UNIT_C = 0.5: the standard HCR (floor = 150) maintains the stock. With UNIT_C = 0.35 (lower cost): the standard HCR may fail because the harvest reduction signal comes too late — by the time F hits 150, the economic pressure from cheap fishing has already driven F close to the Allee threshold and the momentum of further decline carries the stock through it. The high floor (200) triggers earlier harvest reduction, giving the biological recovery loop time to operate before the depensation range is entered.

(c) HCR design requirements for stocks with depensation dynamics:

  1. F_floor must be set substantially above F_min, not at it. The standard practice of setting F_floor near the Allee threshold is structurally dangerous: it provides no buffer between the harvest cutoff and the true collapse threshold. Given the uncertainties in estimating F_min empirically, the HCR floor should be set at 2× the estimated F_min to provide a safety margin.

  2. The harvest reduction must begin early enough that the corrective feedback can operate before the Allee threshold is reached. This requires the HCR’s target stock (F_tgt) and floor to be calibrated against the biological time constant of the stock — how fast can the population recover from a given level? For slow-recovering stocks (groundfish), the biological time constant is years; the HCR must anticipate the stock’s future state, not just react to its current state.

  3. Determining F_floor empirically requires monitoring the stock’s population growth rate as a function of density at low stock levels — ideally from periods when the stock was historically low and recovered (or failed to recover). Mark-recapture studies, acoustic surveys, and egg survey data from low-stock periods are the primary sources. The key observable: if the stock fails to recover at a level where Beverton-Holt or Ricker spawner-recruit models predict it should, depensation is likely operative. The inflection point in the spawner-recruit curve is the empirical estimate of F_min.


10.8.4 Exercise 8.4

Housing price interventions. Classify on LP hierarchy. Predict unintended consequences. Describe LP 4.

Model answer:

(a) Buyers’ subsidy programme:

LP classification: LP 12 (parameters — numbers, subsidies).

The subsidy adjusts a number (the effective purchase price for buyers), not the structure of the market. It raises demand by lowering the effective entry barrier for buyers.

Unintended consequence: The subsidy is fully capitalised into prices within 2–5 years. Sellers and developers, aware that buyers have additional purchasing power, price to capture the subsidy. Median prices rise by approximately the subsidy amount. The buyers who benefit most in the long run are those who purchased before the subsidy was announced; new buyers post-announcement pay the original price plus the subsidy as a price premium. The subsidy transfers wealth to existing owners, not to aspiring purchasers. This is the standard economic prediction, well-supported empirically (see: Australian First Home Owner Grant studies).

(b) Stamp duty reduction for first-home buyers:

LP classification: LP 12 (parameters — tax rate adjustment).

Reducing a tax at a specific stage of the transaction is a parameter change. It does not change who can build, what can be built, or the information available to market participants.

Unintended consequence: Same capitalisation mechanism as (a). Additionally, stamp duty reductions often apply to properties below a price threshold, creating a cliff effect at that threshold — properties at just above the threshold become relatively disadvantaged, depressing values just above the cut-off and potentially creating a small market distortion around the threshold price.

(c) Foreign buyer tax:

LP classification: LP 12 (parameters — tax on a specific buyer class).

A tax on a class of buyers adjusts the effective price for that class. It may reduce demand from foreign purchasers at the margin.

Unintended consequence: Foreign capital finds alternative entry points (purchasing through locally incorporated entities, buying commercial property rather than residential, or shifting to jurisdictions without the tax). The demand is diverted, not destroyed. Empirical evidence from Canada’s foreign buyer taxes suggests modest short-run price effects that largely disappear as buyer behaviour adapts. Additionally, foreign buyers may be a smaller fraction of total demand than the policy implies; the price effect from their removal is therefore smaller than hoped while the adaptation cost (legal structures for circumvention) is absorbed by the market.

(d) Inclusionary zoning (affordable unit requirement):

LP classification: LP 10 (structure of material flows) transitioning toward LP 5 (rules).

Inclusionary zoning changes the rules of what must be built — any new development must include a minimum percentage of affordable units. This is more structural than LP 12 because it changes the feasibility constraint for all new developments simultaneously. However, it also has perverse structural consequences (see below).

Unintended consequence: The affordable unit requirement reduces the return on development, which reduces the rate of new construction below what it would have been without the requirement (developer feasibility is marginal in many urban markets). The intervention achieves its direct goal (some fraction of new units are affordable) while undermining its systemic goal (more affordable housing overall) by suppressing the total supply. In high-demand cities, fewer total units at mixed price levels may result in higher median prices than more total units at market rate. The quantity effect (fewer completions) can swamp the composition effect (more affordable units per development).

What a LP 4 intervention requires:

LP 4 (power to self-organise): Changing the institutional framework that determines what kinds of housing governance are possible — not setting a quota or a subsidy, but changing the range of institutional forms that can exist.

Concretely: enabling community land trusts (CLTs) to hold land in perpetuity, removing zoning powers from individual municipalities (shifting land use authority to regional bodies so that individual suburbs cannot indefinitely block density), or creating new institutional categories (community ownership models, cooperative housing with cost-price resale restrictions) that remove land value appreciation from the market system entirely.

Why LP 4 is politically harder: it requires changing the rules about who can change the rules — i.e., restructuring the governance of the housing market itself, not just adjusting parameters within it. Existing property owners, who benefit from the current system of appreciating land values, have strong incentives to oppose LP 4 changes. Municipal governments that have zoning authority over land use are unlikely to cede it voluntarily. LP 4 interventions require either a legislative mandate from a higher level of government (provincial or federal) or a crisis sufficiently severe to create political space for structural change.


10.8.5 Exercise 8.5

Social media platform hate speech regulation. Classify interventions and analyse adaptation pathways.

Model answer:

(a) Minimum confidence threshold for the classifier:

LP classification: LP 12 (numbers — a threshold parameter).

Setting a confidence threshold is adjusting a parameter in the decision function. It does not change the classifier’s architecture, the engagement algorithm’s objective, or the information structure.

Adaptation pathway: The platform’s users will produce content calibrated to fall just below the threshold — “threshold-dodging” speech that retains the substance of the prohibited content while avoiding the specific features the classifier uses for detection. Over 6–12 months, a new vocabulary and rhetorical pattern emerges in the portions of the network that were generating the flagged content. The classifier needs continuous retraining to chase the drift. This is a classic policy resistance mechanism: the balancing loop (threshold removes hate speech) is countered by a new reinforcing loop (users adapt to the threshold, producing content that evades it, which normalises the evasion strategy and teaches it to others). Net effect over 3 years: hate speech volume may fall initially (users who weren’t committed to it stop), then recover as the committed users find new forms. The most committed users remain; the distribution of remaining content may become more sophisticated and harder to classify.

(b) Shadow-banning policy for borderline content:

LP classification: LP 12–LP 9. Shadow-banning reduces the amplification parameter of flagged content (LP 12: lower recommendation probability) and introduces a delay in the feedback between content creation and audience reach (LP 9: the delay between posting and de-amplification).

Adaptation pathway: Shadow-banning is detectable by users who monitor their own engagement metrics. Once the detection method is known (engagement drops suddenly after posting certain content), creators test content variants until they find the boundary. The shadow-ban threshold becomes a signal about what the classifier is measuring, enabling adversarial optimisation. The platform gains a short-term reduction in hateful content amplification; over 12–18 months, the creators that remain (committed users) become more sophisticated at threshold avoidance. The shadow-ban delays the race, but does not change its structure.

(c) Human review queue for flagged appeals:

LP classification: LP 9 (delay length) — adding a human review stage introduces a delay in the remediation loop. Also LP 12 (rules about appeals process).

Adaptation pathway: The human review queue creates a resource constraint. If the queue is staffed for a modest volume of appeals, adversarial actors can overwhelm it with borderline content appeals. Each appeal consumes reviewer time regardless of outcome. If the queue creates a perception that appeals can succeed, it generates an incentive to appeal every removal — further overwhelming the capacity. Over time: reviewers experience burnout, quality of decisions falls, error rates increase. The platform faces pressure to auto-approve appeals to clear the backlog, which undermines the enforcement mechanism. This is the “fixes that fail” archetype: the review queue was the fix; the side effect (queue flooding as an adversarial strategy) worsens the underlying problem.

(d) Algorithm objective function change (penalise high-classifier-confidence content):

LP classification: LP 3 (goals of the system). Changing the optimisation objective from “maximise click-through rate” to “maximise click-through rate subject to a content quality constraint” is a goal change for the algorithm — the most powerful node in the platform’s feedback structure. This is LP 3 because the algorithm’s goal determines what every other system parameter is optimised toward.

Residual vulnerability: The classifier confidence score (0.4 threshold) is a proxy for hate speech, not a direct measure of harm. Sophisticated actors will produce content that scores 0.39 — high confidence of borderline classification — to maximise audience while avoiding penalisation. Over time, the content optimised to stay just below the threshold will constitute a new category that the classifier was not trained to detect: speech that the model is unsure about but that the human cognition is very sure about. The residual vulnerability is the gap between what the model measures and what the human harm actually is. As long as the objective function is defined in terms of model confidence rather than direct harm measures, the platform faces a Goodhart’s Law problem: the measure (classifier confidence) becomes a target that can be gamed, causing it to cease being a reliable proxy for the actual outcome (harmful content).


10.8.6 Exercise 8.6 — Capstone

Pacific salmon fishery: 20-year boom-bust cycle. Ocean temperature, predator dynamics, fishing pressure.

Model answer:

(a) Full causal loop diagram with four feedback loops:

flowchart LR
    SS["Salmon\nStock S"]
    RC["Recruitment\n(juvenile survival)"]
    OT["Ocean\nTemperature Cycle"]
    PR["Predator\nPopulation"]
    FE["Fishing\nEffort"]
    RV["Fisher\nRevenue"]
    HV["Harvest\nH"]
    FD["Food\nAvailability\n(prey fish)"]

    SS -->|"+"| RC
    OT -->|"+/−"| RC
    RC -->|"+"| SS

    SS -->|"+"| FD
    FD -->|"+"| PR
    PR -->|"− [R1]"| SS

    FE -->|"+"| HV
    SS -->|"+"| HV
    HV -->|"−"| SS
    RV -->|"+"| FE
    SS -->|"+"| RV

    OT -->|"−"| FD
    RV -->|"+ [R2]"| FE

    style SS fill:#f5f5f5,stroke:#111111,stroke-width:2px
    style OT fill:#fff3f3,stroke:#d52a2a,stroke-width:2px
    style PR fill:#fff3f3,stroke:#d52a2a
    style HV fill:#fff3f3,stroke:#d52a2a

Four feedback loops with type and timescale:

  1. Loop R1 — Predator-prey reinforcing cycle (10–20 year period): Salmon stock → food availability for predators → predator population → salmon predation → salmon stock. Sign product: (+)(+)(−) — one minus → balancing in isolation. However, combined with a lag (predator populations respond with a 3–7 year delay to salmon abundance), this balancing loop generates oscillation — the mechanism behind the 20-year cycle. Effective timescale: 10–20 years (half-period ≈ predator lag × π, approximately matching the Ricker model’s period).

  2. Loop R2 — Economic effort amplification (reinforcing, 1–5 year response): Salmon stock increases → higher catch per unit effort → higher revenue per vessel → new vessels enter fleet → effort increases → harvest increases. Sign product: all positive → reinforcing. This loop amplifies the boom phase and depletes the stock during bust if fleet capacity is maintained. Timescale: 1–5 years (vessel construction and licensing cycle).

  3. Loop B1 — Ocean temperature cycle (exogenous forcing, ~20-year cycle): Pacific Decadal Oscillation (PDO) and ENSO drive ocean temperature on quasi-periodic cycles. Warm phases reduce prey fish availability, reducing juvenile salmon survival and recruitment. Cold phases improve survival. This is an exogenous oscillatory forcing that interacts with and can entrain the internal predator-prey cycle. Timescale: 10–30 years (PDO cycle).

  4. Loop B2 — Biological stock-recruitment (balancing, 3–8 year response): High adult salmon returns → high spawning escapement → high recruitment of juveniles → high adult returns several years later. This is the Ricker or Beverton-Holt spawner-recruit relationship — a balancing loop that tends to maintain the stock near a biological equilibrium in the absence of other perturbations. Timescale: generation time, approximately 3–5 years for Pacific salmon species.

(b) Two most important stocks, time constants, and dominant feedback phases:

Stock 1: Adult salmon biomass (S)

Time constant: approximately 3–5 years (determined by the spawning-to-return cycle). This is the stock that harvesters see and that management directly controls through fishing permits. During the boom phase, the dominant loop is B2 (stock-recruitment balance, supporting high recruitment) combined with benign ocean conditions. During the bust phase, the dominant loop is R1 (predator population amplification) combined with economic effort amplification (R2) that harvests aggressively during the declining phase.

Stock 2: Predator population (marine mammals, larger fish species)

Time constant: approximately 5–15 years (longer-lived predators — killer whales, Pacific sleeper sharks, large halibut). The predator stock acts as a delayed amplifier of salmon abundance: it grows slowly during salmon booms, remains high during early bust (when salmon begin declining but predators have not yet declined), and continues suppressing recruitment long after the salmon stock has fallen. This is the critical delay that converts what could be a simple balancing loop into the observed oscillation.

(c) Differential equations for two most important stocks:

Using a Ricker-type spawner-recruit model with predation and fishing:

\frac{dS}{dt} = \alpha \cdot S \cdot e^{-\beta S} \cdot f_{\text{ocean}}(t) - \gamma \cdot S \cdot P - H(S, E)

\frac{dP}{dt} = \delta \cdot S \cdot P - \mu \cdot P

where: - S = adult salmon stock (biomass) - P = predator population (individuals or biomass) - \alpha = intrinsic recruitment rate (recruits per spawner at low density) - \beta = density-dependent recruitment reduction coefficient (Ricker parameter) - f_{\text{ocean}}(t) = ocean temperature forcing function (PDO index, time-varying, external) - \gamma = predation rate coefficient - H(S, E) = q \cdot E \cdot S = harvest rate (catchability × effort × stock) - \delta = predator growth rate per unit salmon biomass - \mu = predator natural mortality rate

The ratio \delta/\mu determines the predator’s equilibrium relative to salmon biomass. The delay between salmon increase and predator response is embedded in the relatively slow \delta parameter (predators reproduce slowly) — this is the structural source of the oscillation.

(d) Three interventions at LP 12, LP 6, and LP 3:

LP 12 intervention: Annual total allowable catch (TAC) adjustment

What it changes: The harvest parameter H is adjusted annually based on stock assessment. Higher TAC in boom years, lower in bust years.

Unintended consequence: TAC adjustments lag behind the actual stock by 1–2 years (assessment delay + regulatory process). By the time the TAC is reduced in response to declining stock, the economic effort loop (R2) has already expanded fleet capacity in response to the boom. Even with lower TAC, the existing fleet operates at a higher total cost basis, creating economic pressure to raise the TAC again. The delay between assessment and implementation, combined with fleet overcapacity, systematically undermines the corrective intent. Timescale of manifestation: 2–5 years.

LP 6 intervention: Real-time smolt abundance index linked to in-season harvest trigger

What it changes: Instead of setting the TAC annually based on lagged adult stock assessment, require that in-season harvest rates respond automatically to real-time smolt counting at outmigration points. When smolt abundance index falls below a threshold (indicating a poor recruitment year 3–5 years in advance), current-year harvest is automatically reduced by a defined formula.

Why this is LP 6: It changes the information structure — who has access to what, and when. Currently, harvest decisions are made based on adult returns (a lagging indicator); the smolt index is a leading indicator. Embedding the leading indicator directly into the harvest formula converts information that was available but not decision-binding into information that automatically changes behaviour.

Unintended consequence: Smolt counting is expensive and logistically difficult for distributed river systems. If the counting programme is under-resourced, the leading indicator it provides is noisy or biased, and the automatic trigger fires incorrectly — imposing harvest restrictions in good years or failing to fire in bad years. The structural fix (real-time leading indicator) is only as good as the monitoring infrastructure. Timescale of manifestation: 5–10 years (accumulation of misclassification errors).

LP 3 intervention: Redefine management goal from “sustained yield” to “ecosystem health maintenance”

What it changes: The goal of Pacific salmon management has historically been framed as maintaining maximum sustained yield (MSY) — the maximum harvest rate that the stock can sustain in the long run. This goal optimises for human extraction, not ecosystem function. An LP 3 intervention redefines the goal as maintaining the ecosystem processes that Pacific salmon support — marine nutrient cycling, bear and eagle populations, forest fertilisation by salmon carcasses, freshwater ecosystem structure. Under this goal, harvest decisions must take into account not just the salmon stock but the health of the ecological web it sustains.

What this requires institutionally: Multi-jurisdictional treaty agreements (US/Canada Pacific Salmon Treaty), First Nations consent frameworks, ecosystem assessment methodologies that value non-commercial species, and political will to set lower harvest targets than the commercial industry would accept under the MSY framework.

Unintended consequence: Ecosystem-based management targets a lower sustained harvest than MSY optimisation, which means lower average commercial yields in the short term. The commercial fishing industry — a concentrated interest group — will consistently lobby against the goal change. If the goal change is implemented without parallel economic transition support for affected communities, the political resistance may reverse the goal change within a single election cycle. LP 3 interventions require LP 5 changes (rules about who can override the goal) to be durable. Timescale of manifestation of the resistance: 2–10 years (depending on electoral cycle and industry economic conditions).

Recommendation: Implement LP 6 first. The smolt abundance index linked to in-season harvest trigger is the highest-leverage intervention that can be implemented within the current institutional framework without requiring multi-jurisdictional treaty renegotiation. It addresses the dominant source of management failure (decision delay relative to the cycle speed) without requiring the goal change that would face the heaviest political resistance. The LP 12 TAC adjustment should continue but be supplemented by the leading indicator. The LP 3 goal change should be pursued in parallel as a long-term project, but the LP 6 change can be implemented in 2–4 years and will reduce the boom-bust amplitude even without the goal change.

(e) Minimum model before recommending any intervention:

Required stocks and flows:

  • Adult salmon stock S (tonnes biomass) with Ricker-type spawner-recruit inflow, fishing harvest outflow, and natural mortality outflow
  • Predator population P with prey-dependent growth inflow and natural mortality outflow
  • Ocean temperature index (exogenous time series forcing function, parameterised from PDO data)

Required feedback loops:

  • Biological stock-recruitment loop (B2): S → spawning → recruits → S, with 4–5 year delay
  • Predator-prey loop (R1): S → prey availability → P → predation → S, with 7–10 year delay in predator response
  • Harvest feedback (LP management variant): S → stock assessment → TAC → H → S

Structural validation test:

The model must reproduce the 20-year boom-bust cycle from plausible initial conditions and parameter ranges before it can be used to evaluate management interventions. The specific validation test:

  1. Initialise with historical 1970 stock and predator estimates
  2. Drive with observed PDO forcing 1970–2024
  3. Compare simulated adult salmon returns against Pacific Salmon Commission historical catch records

The model passes structural validation if: (i) it produces oscillations with a period in the 15–25 year range, (ii) the timing of boom peaks aligns within ±5 years of historical peaks for at least 3 of the last 4 cycles, and (iii) removing either the predator-prey loop or the ocean temperature forcing individually fails to reproduce the observed cycle (demonstrating that both are load-bearing).

If the model cannot reproduce the reference mode from this validation test, return to Stage 2 of the modelling cycle before making any management recommendation. Parameter fitting that produces the correct cycle from unrealistic parameter values (e.g., a biologically implausible predator growth rate) should be treated as a structural failure, not a model success — the model is fitting data, not capturing the mechanism.